use calyx_ir as ir;
use calyx_utils::{CalyxResult, OutputFile};
pub trait Backend {
fn name(&self) -> &'static str;
fn validate(prog: &ir::Context) -> CalyxResult<()>;
fn emit(prog: &ir::Context, write: &mut OutputFile) -> CalyxResult<()>;
fn link_externs(
prog: &ir::Context,
write: &mut OutputFile,
) -> CalyxResult<()>;
fn run(&self, prog: ir::Context, mut file: OutputFile) -> CalyxResult<()> {
Self::validate(&prog)?;
Self::link_externs(&prog, &mut file)?;
Self::emit(&prog, &mut file)
}
}