use std::num::NonZeroU32;
use std::sync::Arc;
use anyhow::Result;
use crate::engine::generalized::{EngineIdentity, GeneralizedMockerEngine, RankIdentity};
use crate::engine::scheduler::{SchedulerRank, engine_seed_offset};
use crate::engine::{EngineConfig, TimingModel};
pub type Engine = GeneralizedMockerEngine<SchedulerRank>;
#[derive(Clone)]
pub struct EngineFactory {
config: EngineConfig,
timing: Arc<dyn TimingModel>,
}
impl EngineFactory {
pub fn new(config: EngineConfig) -> Result<Self> {
config.validate()?;
let timing = config.built_in_timing_model()?;
Ok(Self { config, timing })
}
pub fn with_timing_model(config: EngineConfig, timing: Arc<dyn TimingModel>) -> Result<Self> {
config.validate()?;
Ok(Self { config, timing })
}
pub fn build_rank(&self, identity: RankIdentity) -> Result<SchedulerRank> {
let seed_offset = engine_seed_offset(identity)?;
SchedulerRank::new_with_timing_model(
identity,
&self.config,
Arc::clone(&self.timing),
seed_offset,
)
}
pub fn build(&self, identity: EngineIdentity, dp_size: NonZeroU32) -> Result<Engine> {
GeneralizedMockerEngine::new_with_rank_factory(identity, dp_size, |rank_identity| {
self.build_rank(rank_identity)
})
}
}