add html status table generation
This commit is contained in:
31
src/html.rs
Normal file
31
src/html.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
use crate::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
|
||||
}
|
||||
@@ -10,9 +10,12 @@ mod asm;
|
||||
mod generate;
|
||||
mod parse;
|
||||
mod simulate;
|
||||
mod html;
|
||||
|
||||
use generate::generate_binary;
|
||||
use parse::{parse_asm, AsmParser};
|
||||
use html::html_state_table;
|
||||
|
||||
|
||||
fn main() {
|
||||
let sub_cmd = env::args().nth(1);
|
||||
@@ -41,7 +44,8 @@ fn main() {
|
||||
else if sub_cmd == "simulate" {
|
||||
if let Some(steps) = steps {
|
||||
let states = simulate::simulate(instructions, steps.parse::<usize>().unwrap());
|
||||
println!("{:#?}", states);
|
||||
//println!("{:#?}", states);
|
||||
println!("{}", html_state_table(states));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ use crate::asm::*;
|
||||
use crate::generate::generate_binary;
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub struct StateRegister {
|
||||
@@ -31,6 +32,29 @@ pub struct State {
|
||||
opcode_info: Option<OpcodeInfo>
|
||||
}
|
||||
|
||||
|
||||
impl fmt::Display for State {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
writeln!(f, "<tr>")?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.step)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.clk as u8)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.pc)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.addr_bus)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.data_bus)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.ir)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.dr)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.akku)?;
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">C: {}, Z: {}, N: {}</td>", self.sr.carry as u8, self.sr.zero as u8, self.sr.negative as u8)?;
|
||||
if let Some(opcode_info) = self.opcode_info {
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">addr: {}, val: {}</td>", opcode_info.addr, opcode_info.content)?;
|
||||
} else {
|
||||
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\"></td>")?;
|
||||
}
|
||||
writeln!(f, "</tr>")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub fn simulate<'a>(instructions: Vec<Instruction<'a>>, max_steps: usize) -> Vec<State> {
|
||||
let mut data_memory = generate_binary(instructions.clone()).data_memory;
|
||||
|
||||
@@ -38,13 +62,13 @@ pub fn simulate<'a>(instructions: Vec<Instruction<'a>>, max_steps: usize) -> Vec
|
||||
|
||||
let mut states: Vec<State> = Vec::new();
|
||||
let mut step: usize = 0;
|
||||
let mut clk: bool = false;
|
||||
let mut pc: u8 = 0;
|
||||
let mut addr_bus: u8 = 0;
|
||||
let mut data_bus: u8 = 0;
|
||||
let mut clk: bool;
|
||||
let mut pc: u8;
|
||||
let mut addr_bus: u8;
|
||||
let mut data_bus: u8;
|
||||
let mut ir : u8 = 0;
|
||||
let mut dr : u8 = 0;
|
||||
let mut akku : u8 = 0;
|
||||
let mut akku : u8;
|
||||
let mut sr: StateRegister = StateRegister {
|
||||
carry: false,
|
||||
zero: false,
|
||||
|
||||
Reference in New Issue
Block a user