add assert_formal helper for running formal proofs in rust tests

This commit is contained in:
Jacob Lifshay 2024-09-25 01:54:07 -07:00
parent 45dbb554d0
commit 5fc7dbd6e9
Signed by: programmerjake
SSH key fingerprint: SHA256:B1iRVvUJkvd7upMIiMqn6OyxvD2SgJkAH3ZnUOj6z+c
2 changed files with 37 additions and 0 deletions

View file

@ -50,4 +50,5 @@ pub mod ty;
pub mod util; pub mod util;
//pub mod valueless; //pub mod valueless;
pub mod prelude; pub mod prelude;
pub mod testing;
pub mod wire; pub mod wire;

View file

@ -0,0 +1,36 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information
use crate::{
cli::{FormalArgs, FormalMode, FormalOutput, RunPhase},
firrtl::ExportOptions,
};
use clap::Parser;
use std::sync::OnceLock;
fn assert_formal_helper() -> FormalArgs {
static FORMAL_ARGS: OnceLock<FormalArgs> = OnceLock::new();
// ensure we only run parsing once, so errors from env vars don't produce overlapping output if we're called on multiple threads
FORMAL_ARGS
.get_or_init(|| FormalArgs::parse_from(["fayalite::testing::assert_formal"]))
.clone()
}
#[track_caller]
pub fn assert_formal<M>(
module: M,
mode: FormalMode,
depth: u64,
solver: Option<&str>,
export_options: ExportOptions,
) where
FormalArgs: RunPhase<M, Output = FormalOutput>,
{
let mut args = assert_formal_helper();
args.verilog.firrtl.base.redirect_output_for_rust_test = true;
args.verilog.firrtl.export_options = export_options;
args.verilog.debug = true;
args.mode = mode;
args.depth = depth;
args.solver = solver.map(String::from);
args.run(module).expect("testing::assert_formal() failed");
}