use sha2::{Digest, Sha256};
use std::process::exit;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use isla_lib::bitvector::b64::B64;
use isla_lib::executor;
use isla_lib::executor::{LocalFrame, TaskState};
use isla_lib::init::{initialize_architecture, Initialized};
use isla_lib::ir::*;
use isla_lib::zencode;
mod opts;
use opts::CommonOpts;
fn main() {
let code = isla_main();
unsafe { isla_lib::smt::finalize_solver() };
exit(code)
}
#[allow(clippy::mutex_atomic)]
fn isla_main() -> i32 {
let mut opts = opts::common_opts();
opts.reqopt("p", "property", "check property in architecture", "<id>");
opts.optflag("", "optimistic", "assume assertions succeed");
let mut hasher = Sha256::new();
let (matches, arch) = opts::parse::<B64>(&mut hasher, &opts);
let CommonOpts { num_threads, mut arch, symtab, isa_config } =
opts::parse_with_arch(&mut hasher, &opts, &matches, &arch);
let assertion_mode =
if matches.opt_present("optimistic") { AssertionMode::Optimistic } else { AssertionMode::Pessimistic };
let Initialized { regs, lets, shared_state } =
initialize_architecture(&mut arch, symtab, &isa_config, assertion_mode);
let property = zencode::encode(&matches.opt_str("property").unwrap());
let function_id = shared_state.symtab.lookup(&property);
let (args, _, instrs) = shared_state.functions.get(&function_id).unwrap();
let task_state = TaskState::new();
let task = LocalFrame::new(function_id, args, None, instrs).add_lets(&lets).add_regs(®s).task(0, &task_state);
let result = Arc::new(AtomicBool::new(true));
executor::start_multi(num_threads, None, vec![task], &shared_state, result.clone(), &executor::all_unsat_collector);
if result.load(Ordering::Acquire) {
println!("ok");
0
} else {
println!("fail");
1
}
}