#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct DveBudget {
pub rounds: usize,
pub budget_ms: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct StageSet {
pub(crate) reduce_equivalences: bool,
pub(crate) gates: bool,
pub(crate) dve: Option<DveBudget>,
}
impl StageSet {
pub(crate) fn none() -> StageSet {
StageSet {
reduce_equivalences: false,
gates: false,
dve: None,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum SimplifyPrefix {
Disabled,
EqIter,
Backbone {
budget_ms: u64,
equivalence_budget_ms: Option<u64>,
},
}
pub(crate) struct SimplifyConfig {
pub stages: StageSet,
pub prefix: SimplifyPrefix,
pub deadline: Option<std::time::Instant>,
pub clock: crate::config::PreprocessClock,
pub frozen_vars: rustc_hash::FxHashSet<crate::cnf::VarId>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum SimplifyPurpose {
Count,
WeightedCount,
Function,
}
impl SimplifyPurpose {
pub(crate) fn stages(self) -> StageSet {
let count_only = matches!(
self,
SimplifyPurpose::Count | SimplifyPurpose::WeightedCount
);
let dve = crate::config::DvePolicy::default();
StageSet {
reduce_equivalences: true,
gates: count_only,
dve: count_only.then_some(DveBudget {
rounds: dve.rounds,
budget_ms: dve.budget_ms,
}),
}
}
}
impl SimplifyConfig {
pub(crate) fn for_purpose(purpose: SimplifyPurpose, keep_all_vars: bool) -> SimplifyConfig {
SimplifyConfig {
stages: if keep_all_vars {
StageSet::none()
} else {
purpose.stages()
},
prefix: SimplifyPrefix::Disabled,
deadline: None,
clock: crate::config::PreprocessClock::WallClock,
frozen_vars: rustc_hash::FxHashSet::default(),
}
}
}