From aaf894d5e651edd4773b0dfc45f15d7d369c1a5f Mon Sep 17 00:00:00 2001 From: tracer-ysyx Date: Wed, 10 Jan 2024 15:20:50 +0800 Subject: [PATCH] =?UTF-8?q?>=20build=5Fnpc=5FVSegHandler=5Fnvboard=20=20ys?= =?UTF-8?q?yx=5F22040000=20=E6=9D=8E=E5=BF=83=E6=9D=A8=20=20Linux=20calcit?= =?UTF-8?q?e=206.1.69=20#1-NixOS=20SMP=20PREEMPT=5FDYNAMIC=20Wed=20Dec=202?= =?UTF-8?q?0=2016:00:29=20UTC=202023=20x86=5F64=20GNU/Linux=20=20=2015:20:?= =?UTF-8?q?50=20=20up=202=20days=2014:21,=20=202=20users,=20=20load=20aver?= =?UTF-8?q?age:=200.89,=201.09,=201.23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- npc/csrc_nvboard/main.cpp | 57 ++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/npc/csrc_nvboard/main.cpp b/npc/csrc_nvboard/main.cpp index c1165d4..e9df24c 100644 --- a/npc/csrc_nvboard/main.cpp +++ b/npc/csrc_nvboard/main.cpp @@ -1,40 +1,55 @@ -#include +#include #include #include +#include #include #include -#include -#include #ifndef VERILATOR_TOPMODULE #define VERILATOR_TOPMODULE VSegHandler #endif -const int MAX_SIM_TIME=100; +const int MAX_SIM_TIME = 100; +int keycode = 0; -void nvboard_bind_all_pins(VERILATOR_TOPMODULE* top); - -static void single_cycle(VERILATOR_TOPMODULE* top) { - top->clock = 0; top->eval(); - top->clock = 1; top->eval(); +template void cycle(VERILATOR_TOPMODULE *top, F &&f) { + top->clock = 0; + top->eval(); + f(); + top->clock = 1; + top->eval(); } -static void reset(VERILATOR_TOPMODULE* top, int n) { +void nvboard_bind_all_pins(VERILATOR_TOPMODULE *top); + +static void single_cycle(VERILATOR_TOPMODULE *top) { + top->clock = 0; + top->eval(); + top->clock = 1; + top->eval(); +} + +static void reset(VERILATOR_TOPMODULE *top, int n) { top->reset = 1; - while (n -- > 0) single_cycle(top); + while (n-- > 0) + single_cycle(top); top->reset = 0; } int main(int argc, char **argv, char **env) { - VERILATOR_TOPMODULE *top = new VERILATOR_TOPMODULE; + VERILATOR_TOPMODULE *top = new VERILATOR_TOPMODULE; - nvboard_bind_all_pins(top); - nvboard_init(); - reset(top, 10); - while (true) { - nvboard_update(); - top->eval(); - single_cycle(top); - } - delete top; + nvboard_bind_all_pins(top); + nvboard_init(); + reset(top, 10); + while (true) { + nvboard_update(); + cycle(top, [&] { + if (keycode != top->io_keycode_bits) { + printf("%d\n", top->io_keycode_bits); + keycode = top->io_keycode_bits; + } + }); + } + delete top; } \ No newline at end of file