use vize_l0::pass::{PassDesc, PassFailure, PassObserver, Pipeline, run_pipeline_remarked};
use crate::extract::{EXTRACT, Extraction, OptTier, extract};
use crate::op::Program;
use crate::placement::{ANNOTATE, annotate};
pub const L3_STAGE: &str = "s3";
pub const OPTIMIZE_PASSES: &[PassDesc] = &[ANNOTATE, EXTRACT];
pub const OPTIMIZE: Pipeline = Pipeline::new(L3_STAGE, OPTIMIZE_PASSES);
pub fn optimize<O: PassObserver>(
program: &mut Program<'_>,
tier: OptTier,
observer: &mut O,
) -> Result<Extraction, PassFailure> {
let mut extraction = None;
run_pipeline_remarked(&OPTIMIZE, observer, |event, remarks| {
let name = event.desc().name;
if name == ANNOTATE.name {
annotate(program);
} else if name == EXTRACT.name {
let result = extract(program, tier);
result.remark(remarks);
extraction = Some(result);
} else {
return Err(PassFailure::new(
"l3 optimization pass has no registered body",
));
}
Ok(())
})?;
extraction.ok_or(PassFailure::new(
"l3 optimization pipeline did not run extract-placements",
))
}