use super::TransitionSystem;
use crate::btor2::{DEFAULT_INPUT_PREFIX, DEFAULT_STATE_PREFIX};
use crate::expr::*;
use rustc_hash::FxHashMap;
pub fn replace_anonymous_inputs_with_zero(ctx: &mut Context, sys: &mut TransitionSystem) {
let mut replace_map = FxHashMap::default();
sys.inputs.retain(|&input| {
let name = ctx.get_symbol_name(input).unwrap();
if name.starts_with(DEFAULT_INPUT_PREFIX) || name.starts_with(DEFAULT_STATE_PREFIX) {
let replacement = match input.get_type(ctx) {
Type::BV(width) => ctx.zero(width),
Type::Array(tpe) => ctx.zero_array(tpe),
};
replace_map.insert(input, replacement);
false
} else {
true
}
});
do_transform(
ctx,
sys,
ExprTransformMode::SingleStep,
|_ctx, expr, _children| replace_map.get(&expr).cloned(),
);
}
pub fn simplify_expressions(ctx: &mut Context, sys: &mut TransitionSystem) {
do_transform(ctx, sys, ExprTransformMode::FixedPoint, simplify);
}
pub fn do_transform(
ctx: &mut Context,
sys: &mut TransitionSystem,
mode: ExprTransformMode,
tran: impl FnMut(&mut Context, ExprRef, &[ExprRef]) -> Option<ExprRef>,
) {
let todo = sys.get_all_exprs();
let mut transformed = DenseExprMetaData::default();
do_transform_expr(ctx, mode, &mut transformed, todo, tran);
sys.update_expressions(|old_expr| {
if mode == ExprTransformMode::FixedPoint {
get_fixed_point(&mut transformed, old_expr)
} else {
transformed[old_expr]
}
});
}