Restructuring into multiple crates and projects

This commit is contained in:
Henrik Böving
2021-03-05 19:10:18 +01:00
parent 00d0d7aba3
commit d67eda2edc
26 changed files with 6467 additions and 76 deletions

31
hm-asm-cli/src/html.rs Normal file
View File

@@ -0,0 +1,31 @@
use hm_asm_simulator::simulate::State;
use std::fmt::Write;
static TABLE_HEADER: &str = "
<table>
<thead>
<tr>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Schritt</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">clk</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">PC<br></th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Addressbus</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Datenbus</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">IR</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">DR</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">A</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">SR</th>
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Bei Befehlen, die aus dem Speicher laden<br>bzw. in Speicher schreiben (LDA n, ADD n, STA n)</th>
</tr>
</thead>\n";
pub fn html_state_table(states: Vec<State>) -> String {
let mut result = String::from(TABLE_HEADER);
result.push_str("<tbody>\n");
for state in states.iter() {
write!(result, "{}", state).unwrap();
}
result.push_str("</tbody>\n</table>");
result
}

50
hm-asm-cli/src/main.rs Normal file
View File

@@ -0,0 +1,50 @@
use std::env;
use std::fs;
use hm_asm_simulator::{
generate::generate_binary,
parse::{parse_asm, AsmParser, Rule},
simulate::simulate
};
use pest::Parser;
mod html;
use html::html_state_table;
fn main() {
let sub_cmd = env::args().nth(1);
let file_name = env::args().nth(2);
let steps = env::args().nth(3);
if let Some(sub_cmd) = sub_cmd {
let file_content = match file_name {
Some(file_name) => {
fs::read_to_string(file_name).expect("Could not read the provided asm file")
}
None => {
println!("No input file was provided");
return;
}
};
let instructions = parse_asm(
AsmParser::parse(Rule::program, &file_content).unwrap_or_else(|e| panic!("{}", e)),
);
if sub_cmd == "generate" {
let binary = generate_binary(instructions);
println!("{}", binary);
}
else if sub_cmd == "simulate" {
if let Some(steps) = steps {
let states = simulate(instructions, steps.parse::<usize>().unwrap());
//println!("{:#?}", states);
println!("{}", html_state_table(states));
}
}
} else {
println!("No argument was passed, exiting");
}
}