use crate::analysis::cpa::residue::Residue;
use crate::analysis::cpa::state::LocationState;
use crate::analysis::cpa::{
ConfigurableProgramAnalysis, IntoState, RunnableConfigurableProgramAnalysis,
};
use crate::analysis::pcode_store::{EntryPoint, PcodeStore};
use crate::modeling::machine::cpu::concrete::ConcretePcodeAddress;
mod bmc;
pub mod cfg;
pub mod compound;
pub mod cpa;
pub mod ctl;
pub mod location;
#[expect(unused)]
mod path;
pub mod pcode_store;
pub mod valuation;
pub mod varnode;
pub mod varnode_map;
pub trait Analysis
where
Self: RunnableConfigurableProgramAnalysis,
Self::State: LocationState,
{
fn run<T: PcodeStore, I: IntoState<Self>>(
&mut self,
store: T,
initial_state: I,
) -> <Self::Reducer as Residue<Self::State>>::Output {
let initial = initial_state.into_state(self);
self.run_cpa(initial, &store)
}
}
impl<T> Analysis for T
where
T: RunnableConfigurableProgramAnalysis,
T::State: LocationState,
{
}
pub trait AnalyzableEntry: PcodeStore + EntryPoint + Sized {
fn run_analysis<T: Analysis>(&self, mut t: T) -> <T::Reducer as Residue<T::State>>::Output
where
<T as ConfigurableProgramAnalysis>::State: LocationState,
ConcretePcodeAddress: IntoState<T>,
{
let state = self.get_entry();
t.run(self, state)
}
}
impl<T: PcodeStore + EntryPoint> AnalyzableEntry for T {}