pub mod solver;
pub mod term;
pub mod traits;
pub mod wasm_semantics;
#[cfg(feature = "arm")]
pub mod arm_semantics;
#[cfg(feature = "arm")]
pub mod translation_validator;
#[cfg(feature = "arm")]
pub mod validator_pattern;
#[cfg(feature = "arm")]
pub mod properties;
#[cfg(feature = "arm")]
pub use properties::CompilerProperties;
#[cfg(feature = "arm")]
pub use arm_semantics::{ArmSemantics, ArmState};
pub use solver::{BvSolver, CheckOutcome, OrdealSolver, new_solver};
pub use term::{BV, Bool};
#[cfg(feature = "arm")]
pub use translation_validator::{TranslationValidator, ValidationResult, VerificationError};
#[cfg(feature = "arm")]
pub use validator_pattern::{
CertifiedSelection, SolverResultKind, ValidationError as PatternValidationError, Validator,
Witness, Z3ArmValidator,
};
pub use wasm_semantics::WasmSemantics;
pub fn with_verification_context<F, R>(f: F) -> R
where
F: FnOnce() -> R + Send + Sync,
R: Send + Sync,
{
#[cfg(feature = "z3-solver")]
{
with_z3_context(f)
}
#[cfg(not(feature = "z3-solver"))]
{
f()
}
}
#[cfg(feature = "z3-solver")]
pub fn with_z3_context<F, R>(f: F) -> R
where
F: FnOnce() -> R + Send + Sync,
R: Send + Sync,
{
let mut cfg = z3::Config::new();
cfg.set_timeout_msec(30000); cfg.set_model_generation(true);
z3::with_z3_config(&cfg, f)
}
#[cfg(feature = "z3-solver")]
pub fn create_solver() -> z3::Solver {
z3::Solver::new()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_solver_decides() {
with_verification_context(|| {
let mut solver = new_solver();
let x = BV::new_const("x", 32);
solver.assert(&x.eq(&x).not());
assert_eq!(solver.check(), CheckOutcome::Unsat);
});
}
#[cfg(feature = "z3-solver")]
#[test]
fn test_z3_context_creation() {
with_z3_context(|| {
let solver = create_solver();
assert_eq!(solver.check(), z3::SatResult::Sat);
});
}
}