use clap::Parser;
use std::error::Error;
#[derive(Parser)]
struct ProgramOptions {
#[arg(short = 'i', long, default_value = "")]
lef: String,
#[arg(short = 'o', long, default_value = "")]
yaml: String,
#[arg(short, long)]
verbose: bool,
}
fn main() -> Result<(), Box<dyn Error>> {
let options = ProgramOptions::parse();
_main(&options)
}
fn _main(options: &ProgramOptions) -> Result<(), Box<dyn Error>> {
let lef_library = lef21::LefLibrary::open(&options.lef)?;
use layout21utils::SerializationFormat::Yaml;
Yaml.save(&lef_library, &options.yaml).unwrap();
if options.verbose {
println!("wrote {:?}", &options.yaml);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn roundtrip_to_golden_file() -> Result<(), Box<dyn Error>> {
let golden_input_path = resource("macro.lef");
let golden_output_path = resource("macro.golden.yaml");
let output_path = resource("macro.yaml");
let options = ProgramOptions {
lef: golden_input_path,
yaml: output_path.clone(),
verbose: true,
};
let result = _main(&options);
assert!(result.is_ok());
use layout21utils::SerializationFormat::Yaml;
let readback: lef21::LefLibrary = Yaml.open(&output_path)?;
let golden: lef21::LefLibrary = Yaml.open(&golden_output_path)?;
assert_eq!(readback, golden);
Ok(())
}
fn resource(rname: &str) -> String {
format!("{}/resources/{}", env!("CARGO_MANIFEST_DIR"), rname)
}
}