Count clocks (#19)

This commit is contained in:
Patrick Stevens
2023-05-10 23:09:39 +01:00
committed by GitHub
parent 40646928dd
commit c2d09452b3
12 changed files with 975 additions and 213 deletions

View File

@@ -8,12 +8,22 @@ mod test_computer {
.replace("\r\n", "\n")
.replace(" ", "")
.replace(" \n", "\n");
// Chop the initial header on trace reports
if let Some(index) = s.find(" ---") {
s.drain(0..=index);
}
let first_newline = s.find('\n').unwrap();
s.drain(0..=first_newline);
// Chop the 8088 section on trace reports
if let Some(index) = s.find("\n******") {
s.drain(index..);
}
s
}
fn test_sim<T>(input_bytecode: T, expected_trace: &str, display_ip: bool)
fn test_sim<T>(input_bytecode: T, expected_trace: &str, display_ip: bool, show_clock: bool)
where
T: AsRef<[u8]>,
{
@@ -41,12 +51,15 @@ mod test_computer {
panic!("landed in middle of instruction")
}
Some(instruction) => {
trace.push(computer.step(instruction, display_ip));
let (trace_line, stop) = computer.step(instruction, display_ip, show_clock);
trace.push(trace_line);
if stop {
break;
}
}
}
}
trace.push("".to_owned());
trace.push("Final registers:".to_owned());
for line in computer.dump_register_state().lines() {
trace.push(line.to_string());
@@ -62,10 +75,11 @@ mod test_computer {
trace.push(format!(" flags: {}", flags));
}
trace.push("".to_owned());
let cleaned = clean_trace(expected_trace);
let expected = cleaned.lines().collect::<Vec<_>>();
let expected = cleaned
.lines()
.filter(|x| !x.is_empty())
.collect::<Vec<_>>();
assert_eq!(trace.len(), expected.len());
@@ -80,7 +94,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0043_immediate_movs");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0043_immediate_movs.txt");
test_sim(input_bytecode, expected_trace, false)
test_sim(input_bytecode, expected_trace, false, false)
}
#[test]
@@ -89,7 +103,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0044_register_movs");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0044_register_movs.txt");
test_sim(input_bytecode, expected_trace, false)
test_sim(input_bytecode, expected_trace, false, false)
}
#[test]
@@ -100,7 +114,7 @@ mod test_computer {
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0045_challenge_register_movs.txt"
);
test_sim(input_bytecode, expected_trace, false)
test_sim(input_bytecode, expected_trace, false, false)
}
#[test]
@@ -109,7 +123,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0046_add_sub_cmp");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0046_add_sub_cmp.txt");
test_sim(input_bytecode, expected_trace, false)
test_sim(input_bytecode, expected_trace, false, false)
}
#[test]
@@ -118,7 +132,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0047_challenge_flags");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0047_challenge_flags.txt");
test_sim(input_bytecode, expected_trace, false)
test_sim(input_bytecode, expected_trace, false, false)
}
#[test]
@@ -127,7 +141,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0048_ip_register");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0048_ip_register.txt");
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -137,7 +151,7 @@ mod test_computer {
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0049_conditional_jumps.txt"
);
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -146,7 +160,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0050_challenge_jumps");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0050_challenge_jumps.txt");
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -155,7 +169,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0051_memory_mov");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0051_memory_mov.txt");
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -164,7 +178,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0052_memory_add_loop");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0052_memory_add_loop.txt");
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -175,7 +189,7 @@ mod test_computer {
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0053_add_loop_challenge.txt"
);
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -184,7 +198,7 @@ mod test_computer {
include_bytes!("../../computer_enhance/perfaware/part1/listing_0054_draw_rectangle");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0054_draw_rectangle.txt");
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
@@ -195,6 +209,80 @@ mod test_computer {
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0055_challenge_rectangle.txt"
);
test_sim(input_bytecode, expected_trace, true)
test_sim(input_bytecode, expected_trace, true, false)
}
#[test]
fn test_estimating_cycles() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0056_estimating_cycles");
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0056_estimating_cycles.txt"
);
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_challenge_cycles() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0057_challenge_cycles");
let expected_trace = include_str!(
"../../computer_enhance/perfaware/part1/listing_0057_challenge_cycles.txt"
);
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_single_scalar() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0059_SingleScalar");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0059_SingleScalar.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_unroll2_scalar() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0060_Unroll2Scalar");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0060_Unroll2Scalar.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_dual_scalar() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0061_DualScalar");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0061_DualScalar.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_quad_scalar() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0062_QuadScalar");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0062_QuadScalar.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_quad_scalar_ptr() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0063_QuadScalarPtr");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0063_QuadScalarPtr.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
#[test]
fn test_tree_scalar_ptr() {
let input_bytecode =
include_bytes!("../../computer_enhance/perfaware/part1/listing_0064_TreeScalarPtr");
let expected_trace =
include_str!("../../computer_enhance/perfaware/part1/listing_0064_TreeScalarPtr.txt");
test_sim(input_bytecode, expected_trace, true, true)
}
}