From 2acda01ec953146de0a13e2c5ebc00c96d32cc72 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 28 Mar 2024 14:10:11 +0000 Subject: [PATCH] Ensure RT_NEXT_TIME_STEP event triggers on the first cycle --- src/rt/model.c | 7 ++++--- test/test_server.c | 11 ++++++----- test/test_shell.c | 33 ++++++++++++++++++--------------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/rt/model.c b/src/rt/model.c index cf6058c8..5ec9cc25 100644 --- a/src/rt/model.c +++ b/src/rt/model.c @@ -3183,9 +3183,12 @@ static void model_cycle(rt_model_t *m) swap_deferq(&m->procq, &m->delta_procq); swap_deferq(&m->driverq, &m->delta_driverq); - if (!is_delta_cycle) { + if (m->iteration == 0) global_event(m, RT_NEXT_TIME_STEP); + global_event(m, RT_NEXT_CYCLE); + + if (!is_delta_cycle) { for (;;) { void *e = heap_extract_min(m->eventq_heap); switch (pointer_tag(e)) { @@ -3219,8 +3222,6 @@ static void model_cycle(rt_model_t *m) } } - global_event(m, RT_NEXT_CYCLE); - deferq_run(m, &m->driverq); while (heap_size(m->driving_heap) > 0) { diff --git a/test/test_server.c b/test/test_server.c index 2f66bfc8..92b77abe 100644 --- a/test/test_server.c +++ b/test/test_server.c @@ -316,11 +316,12 @@ static void wave_binary_frame(web_socket_t *ws, const void *data, size_t len, break; case 3: + case 4: ck_assert_int_eq(len, 9); ck_assert_int_eq(bytes[0], S2C_NEXT_TIME_STEP); break; - case 4: + case 5: ck_assert_int_eq(len, 9); ck_assert_int_eq(bytes[0], S2C_SIGNAL_UPDATE); ck_assert_int_eq(bytes[1] << 8 | bytes[2], 2); @@ -331,12 +332,12 @@ static void wave_binary_frame(web_socket_t *ws, const void *data, size_t len, ck_assert_int_eq(bytes[8], '1'); break; - case 5: + case 6: ck_assert_int_eq(len, 1); ck_assert_int_eq(bytes[0], S2C_RESTART_SIM); break; - case 6: + case 7: ck_assert_int_eq(len, 1); ck_assert_int_eq(bytes[0], S2C_QUIT_SIM); break; @@ -373,7 +374,7 @@ START_TEST(test_wave) ws_poll(ws); - ck_assert_int_eq(state, 5); + ck_assert_int_eq(state, 6); ws_send_text(ws, "restart; quit -sim"); ws_flush(ws); @@ -383,7 +384,7 @@ START_TEST(test_wave) shutdown_server(ws); ws_free(ws); - ck_assert_int_eq(state, 7); + ck_assert_int_eq(state, 8); close(sock); join_server(pid); diff --git a/test/test_shell.c b/test/test_shell.c index 8877cffe..9e7a8278 100644 --- a/test/test_shell.c +++ b/test/test_shell.c @@ -116,15 +116,15 @@ static void wave1_add_wave(ident_t path, const char *enc, void *user) ck_assert_str_eq(istr(path), "/x"); ck_assert_str_eq(enc, "b0"); break; - case 6: - ck_assert_str_eq(istr(path), "/x"); - ck_assert_str_eq(enc, "b1"); - break; case 2: ck_assert_str_eq(istr(path), "/b"); ck_assert_str_eq(enc, "eFALSE"); break; case 7: + ck_assert_str_eq(istr(path), "/x"); + ck_assert_str_eq(enc, "b1"); + break; + case 8: ck_assert_str_eq(istr(path), "/u/y"); ck_assert_str_eq(enc, "b1"); break; @@ -139,24 +139,24 @@ static void wave1_signal_update(ident_t path, uint64_t now, rt_signal_t *s, int *state = user; switch ((*state)++) { - case 4: + case 5: ck_assert_str_eq(istr(path), "/x"); ck_assert_int_eq(now, 1000000); ck_assert_int_eq(s->shared.data[0], 1); ck_assert_str_eq(enc, "b1"); break; - case 5: + case 6: ck_assert_str_eq(istr(path), "/b"); ck_assert_int_eq(now, 1000000); ck_assert_str_eq(enc, "eTRUE"); break; - case 9: + case 10: ck_assert_str_eq(istr(path), "/x"); ck_assert_int_eq(now, 2000000); ck_assert_int_eq(s->shared.data[0], 0); ck_assert_str_eq(enc, "b0"); break; - case 10: + case 11: ck_assert_str_eq(istr(path), "/u/y"); ck_assert_int_eq(now, 2000000); ck_assert_int_eq(s->shared.data[0], 0); @@ -187,7 +187,7 @@ static void wave1_quit_sim(void *user) int *state = user; switch ((*state)++) { - case 11: + case 12: break; default: ck_abort_msg("unexpected call to wave1_quit_sim in state %d", @@ -201,9 +201,12 @@ static void wave1_next_time_step(uint64_t now, void *user) switch ((*state)++) { case 3: + ck_assert_int_eq(now, UINT64_C(0000000)); + break; + case 4: ck_assert_int_eq(now, UINT64_C(1000000)); break; - case 8: + case 9: ck_assert_int_eq(now, UINT64_C(2000000)); break; default: @@ -242,23 +245,23 @@ START_TEST(test_wave1) shell_eval(sh, "run 1 ns", &result); ck_assert_str_eq(result, ""); - ck_assert_int_eq(state, 6); + ck_assert_int_eq(state, 7); shell_eval(sh, "add wave /x", &result); ck_assert_str_eq(result, ""); - ck_assert_int_eq(state, 7); + ck_assert_int_eq(state, 8); shell_eval(sh, "add wave /u/y", &result); ck_assert_str_eq(result, ""); - ck_assert_int_eq(state, 8); + ck_assert_int_eq(state, 9); shell_eval(sh, "run", &result); ck_assert_str_eq(result, ""); - ck_assert_int_eq(state, 11); + ck_assert_int_eq(state, 12); shell_eval(sh, "quit -sim", &result); ck_assert_str_eq(result, ""); - ck_assert_int_eq(state, 12); + ck_assert_int_eq(state, 13); shell_free(sh); -- 2.39.2