From 68bdebd8cae39c30acc384664faa136aeaa9bb84 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 5 Nov 2022 16:59:17 -0700 Subject: Add initial uarch model --- main.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 7a8d161..4fec1f4 100644 --- a/main.cpp +++ b/main.cpp @@ -6,10 +6,12 @@ #include #include +#include "infra/sim.h" #include "isa/checker.h" #include "programs/programs.h" +#include "uarch/core.h" -int load_program(checker &checker, const std::uint8_t *program) { +int load_program(core &core, const std::uint8_t *program) { bool seen_non_leader = false; bool comment = false; unsigned int field = 0; @@ -31,8 +33,10 @@ int load_program(checker &checker, const std::uint8_t *program) { address = ((b1 & 0077) << 6) | *program++; } else if ((b1 & 0300) == 0000) { seen_non_leader = true; - if (data.has_value()) - checker.mem.store(data->first, data->second); + if (data.has_value()) { + core.checker.mem.store(data->first, data->second); + core.mem.store(data->first, data->second); + } auto a = field | address++; auto d = ((b1 & 0077) << 6) | *program++; data = std::make_pair(a, d); @@ -57,12 +61,14 @@ int main(int argc, const char *argv[]) { return 1; } + init_disasm_tables(); + iomodel system; - checker checker(system); + core core(system); for (--argc, ++argv; argc; --argc, ++argv) { if (auto program = programs.find(*argv); program != programs.end()) { - if (auto err = load_program(checker, program->second)) + if (auto err = load_program(core, program->second)) return err; } else { std::ifstream fh(*argv); @@ -70,12 +76,21 @@ int main(int argc, const char *argv[]) { } } - while (!checker.done()) { -// if (!checker.ctlregs[HALTED]) -// std::cout << fmt::format("\t{:9} {:04o}\n", system.time, checker.pc); - checker.execute(); + std::ofstream pt("bug.pt"); + infra::pt::ptfile = &pt; + + while (!core.checker.done()) { +// if (!checker.ctlregs[HALTED]) { +// if (checker.inst.final_address.has_value()) +// std::cout << fmt::format("{:05o} {:01o} {:04o} {:04o} {:005o}\n", checker.pc, checker.link, checker.acc, checker.mq, *checker.inst.final_address); +// else +// std::cout << fmt::format("{:05o} {:01o} {:04o} {:04o} \n", checker.pc, checker.link, checker.acc, checker.mq); +// } + infra::sim::advance(); } + pt << fmt::format("# icount={} cycles={} ipc={:.04}\n", core.checker.icount, infra::sim::now, (float)core.checker.icount / (float)infra::sim::now); + // std::ofstream fh("trace.evt"); // system.write_evt(fh); -- cgit v1.2.3