mod cmdline;
use calyx_backend::BackendOpt;
use calyx_frontend as frontend;
use calyx_ir as ir;
use calyx_opt::pass_manager::PassManager;
use calyx_utils::CalyxResult;
use cmdline::{CompileMode, Opts};
use itertools::Itertools;
fn main() -> CalyxResult<()> {
let mut opts = Opts::get_opts()?;
if opts.version {
println!("Calyx compiler version {}", env!("CARGO_PKG_VERSION"));
println!(
"Library location: {}",
option_env!("CALYX_PRIMITIVES_DIR").unwrap_or(".")
);
return Ok(());
}
env_logger::Builder::new()
.format_timestamp(None)
.filter_level(opts.log_level)
.target(env_logger::Target::Stderr)
.init();
let pm = PassManager::default_passes()?;
if let Some(sub) = opts.sub {
match sub {
cmdline::Subcommand::Help(cmdline::Help { name }) => {
match name {
Some(n) => {
if let Some(help) = pm.specific_help(&n) {
println!("{}", help);
} else {
println!("Unknown pass or alias: {}", n);
}
}
None => println!("{}", pm.complete_help()),
}
return Ok(());
}
}
}
let mut ws = frontend::Workspace::construct(&opts.file, &opts.lib_path)?;
let imports = ws.original_imports.drain(..).collect_vec();
let mut ctx = ir::from_ast::ast_to_ir(ws)?;
ctx.bc = ir::BackendConf {
synthesis_mode: opts.enable_synthesis,
enable_verification: !opts.disable_verify,
flat_assign: !opts.nested_assign,
emit_primitive_extmodules: opts.emit_primitive_extmodules,
};
ctx.extra_opts = opts.extra_opts.drain(..).collect();
pm.execute_plan(&mut ctx, &opts.pass, &opts.disable_pass, opts.dump_ir)?;
if opts.backend == BackendOpt::Calyx {
let out = &mut opts.output.get_write();
if opts.compile_mode == CompileMode::File {
for import in imports {
writeln!(out, "import \"{}\";", import)?;
}
}
ir::Printer::write_context(
&ctx,
opts.compile_mode == CompileMode::File,
out,
)?;
Ok(())
} else {
opts.run_backend(ctx)
}
}