pub mod file_parser;
pub mod display_elements;
pub mod tcl_generator;
use std::{path::PathBuf, fs::File, io::Write};
use clap::{arg, Parser};
use file_parser::FileParser;
use glob::glob;
use tcl_generator::TclGenerator;
use vhdl_lang::{syntax::Symbols, Source};
use crate::display_elements::{Signal, DisplayOption, DisplayColor};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(short = 'f', long = "folder")]
folder: PathBuf,
#[arg(short = 't', long = "testbench")]
testbench: String,
#[arg(short = 'o', long = "output")]
output: PathBuf,
}
fn main() {
let cli = Cli::parse();
let find_wildcard = cli.folder.to_str().unwrap().to_owned() + "/**/*.vhd";
println!("Going to look into {find_wildcard}");
let matching_files = glob(&find_wildcard).unwrap();
let symbols = Symbols::default();
let mut found = false;
for file_result in matching_files {
let file = file_result.unwrap();
let source = Source::from_latin1_file(file.as_path()).unwrap();
let contents = source.contents();
let mut parser = FileParser::new(&source, &contents, &symbols);
match parser.find_next_entity() {
Ok(entity) => {
if entity.name() != &cli.testbench[..] {
continue;
}
found = true;
println!("Found the testbench.");
let entity = parser.parse_entity_architecture(entity).unwrap();
let architecture = entity.architecture().unwrap();
let mut generator = TclGenerator::new("top.".to_owned() + &cli.testbench + ".");
generator.add_signal(&Signal::new("clk".to_owned(), vec![DisplayOption::Color(DisplayColor::Indigo)]))
.add_signal(&Signal::new("rst".to_owned(), vec![DisplayOption::Color(DisplayColor::Indigo)]))
.add_empty()
.zoom_out();
for signal in architecture.signals() {
if signal.name() == "clk" || signal.name() == "rst" {
continue;
}
generator.add_signal(signal);
}
let generated = generator.generate();
let mut file = File::create(&cli.output).unwrap();
file.write_all(generated.as_bytes()).unwrap();
break;
},
Err(err) => {
println!("{:?}", err);
}
}
if found {
break;
}
}
if !found {
println!("Could not find the entity.")
}
}