#[macro_use]
extern crate clap;
use clap::Arg;
use llhd::{assembly::parse_module, verifier::Verifier};
use std::{fs::File, io::Read};
fn main() {
let matches = app_from_crate!()
.arg(Arg::with_name("input").required(true))
.get_matches();
let module = {
let path = matches.value_of("input").unwrap();
let mut input = File::open(path).unwrap();
let mut contents = String::new();
input.read_to_string(&mut contents).unwrap();
let module = parse_module(&contents).unwrap();
let mut verifier = Verifier::new();
verifier.verify_module(&module);
verifier.finish().unwrap();
module
};
let mut num_bytes = 0;
for unit in module.units() {
eprintln!("Estimating {}", unit.name());
let mut insts = vec![];
let mut blocks = vec![];
for b in unit.blocks() {
blocks.push(b);
insts.extend(unit.insts(b));
}
num_bytes += unit.name().to_string().len();
let sig = unit.sig();
num_bytes += sig.args().count() * 8;
for &_ in &blocks {
num_bytes += 16; num_bytes += 2; num_bytes += 4; }
for &inst in &insts {
num_bytes += 2; num_bytes += 2; num_bytes += unit[inst].args().len() * 2;
num_bytes += unit[inst].blocks().len() * 2;
num_bytes += unit[inst].imms().len() * 4; }
}
println!("{} bytes", num_bytes);
}