Skip to content

Commit 75e4913

Browse files
committed
refactor: change collect APIs to use mcycle_end instead of mcycle_count
1 parent 9eca13c commit 75e4913

14 files changed

+196
-132
lines changed

src/clua-i-machine.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -991,13 +991,15 @@ static int machine_obj_index_create(lua_State *L) {
991991
/// \brief This is the machine:collect_mcycle_root_hashes() method implementation.
992992
/// \param L Lua state.
993993
static int machine_obj_index_collect_mcycle_root_hashes(lua_State *L) {
994-
lua_settop(L, 4);
994+
lua_settop(L, 5);
995995
auto &m = clua_check<clua_managed_cm_ptr<cm_machine>>(L, 1);
996-
const uint64_t mcycle_phase = luaL_checkinteger(L, 2);
996+
const uint64_t mcycle_end = luaL_checkinteger(L, 2);
997997
const uint64_t mcycle_period = luaL_checkinteger(L, 3);
998-
const uint64_t period_count = luaL_checkinteger(L, 4);
998+
const uint64_t mcycle_phase = luaL_optinteger(L, 4, 0);
999+
const auto log2_bundle_uarch_cycle_count = static_cast<uint32_t>(luaL_optinteger(L, 5, 0));
9991000
const char *result = nullptr;
1000-
if (cm_collect_mcycle_root_hashes(m.get(), mcycle_phase, mcycle_period, period_count, &result) != 0) {
1001+
if (cm_collect_mcycle_root_hashes(m.get(), mcycle_end, mcycle_period, mcycle_phase, log2_bundle_uarch_cycle_count,
1002+
&result) != 0) {
10011003
return luaL_error(L, "%s", cm_get_last_error_message());
10021004
}
10031005
clua_push_schemed_json_table(L, result, "McycleRootHashes");
@@ -1007,11 +1009,12 @@ static int machine_obj_index_collect_mcycle_root_hashes(lua_State *L) {
10071009
/// \brief This is the machine:collect_uarch_cycle_root_hashes() method implementation.
10081010
/// \param L Lua state.
10091011
static int machine_obj_index_collect_uarch_cycle_root_hashes(lua_State *L) {
1010-
lua_settop(L, 2);
1012+
lua_settop(L, 3);
10111013
auto &m = clua_check<clua_managed_cm_ptr<cm_machine>>(L, 1);
1012-
const uint64_t mcycle_count = luaL_checkinteger(L, 2);
1014+
const uint64_t mcycle_end = luaL_checkinteger(L, 2);
1015+
const auto log2_bundle_uarch_cycle_count = static_cast<uint32_t>(luaL_optinteger(L, 3, 0));
10131016
const char *result = nullptr;
1014-
if (cm_collect_uarch_cycle_root_hashes(m.get(), mcycle_count, &result) != 0) {
1017+
if (cm_collect_uarch_cycle_root_hashes(m.get(), mcycle_end, log2_bundle_uarch_cycle_count, &result) != 0) {
10151018
return luaL_error(L, "%s", cm_get_last_error_message());
10161019
}
10171020
clua_push_schemed_json_table(L, result, "UarchCycleRootHashes");

src/i-machine.h

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ class i_machine {
8787
return do_run(mcycle_end);
8888
}
8989

90-
/// \brief Collects the root hashes after every \p mcycle_period machine cycles, for \p period_count periods.
91-
/// Returns when done, or if the machine halts or yields.
92-
void collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period, uint64_t period_count,
93-
mcycle_root_hashes &result) {
94-
do_collect_mcycle_root_hashes(mcycle_phase, mcycle_period, period_count, result);
90+
/// \brief Collects the root hashes after every \p mcycle_period machine cycles until mcycle reaches \p mcycle_end,
91+
/// or if the machine halts or yields.
92+
void collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
93+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) {
94+
do_collect_mcycle_root_hashes(mcycle_end, mcycle_period, mcycle_phase, log2_bundle_mcycle_count, result);
9595
}
9696

9797
/// \brief Serialize entire state to directory
@@ -227,10 +227,11 @@ class i_machine {
227227
return do_run_uarch(uarch_cycle_end);
228228
}
229229

230-
/// \brief Collects the root hashes after every \p uarch_cycle, for \p mcycle_count machine cycles, implicitly
230+
/// \brief Collects the root hashes after every \p uarch_cycle until \p mcycle_end machine cycle, implicitly
231231
/// resetting the uarch between mcycles.
232-
void collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) {
233-
do_collect_uarch_cycle_root_hashes(mcycle_count, result);
232+
void collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
233+
uarch_cycle_root_hashes &result) {
234+
do_collect_uarch_cycle_root_hashes(mcycle_end, log2_bundle_uarch_cycle_count, result);
234235
}
235236

236237
/// \brief Returns a list of descriptions for all PMA entries registered in the machine, sorted by start
@@ -295,8 +296,8 @@ class i_machine {
295296
const std::string &dir) = 0;
296297
virtual void do_load(const std::string &directory, const machine_runtime_config &runtime, sharing_mode sharing) = 0;
297298
virtual interpreter_break_reason do_run(uint64_t mcycle_end) = 0;
298-
virtual void do_collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period, uint64_t period_count,
299-
mcycle_root_hashes &result) = 0;
299+
virtual void do_collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
300+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) = 0;
300301
virtual void do_store(const std::string &dir, sharing_mode sharing) const = 0;
301302
virtual void do_clone_stored(const std::string &from_dir, const std::string &to_dir) const = 0;
302303
virtual interpreter_break_reason do_log_step(uint64_t mcycle_count, const std::string &filename) = 0;
@@ -322,7 +323,8 @@ class i_machine {
322323
virtual void do_reset_uarch() = 0;
323324
virtual access_log do_log_reset_uarch(const access_log::type &log_type) = 0;
324325
virtual uarch_interpreter_break_reason do_run_uarch(uint64_t uarch_cycle_end) = 0;
325-
virtual void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) = 0;
326+
virtual void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
327+
uarch_cycle_root_hashes &result) = 0;
326328
virtual address_range_descriptions do_get_address_ranges() const = 0;
327329
virtual void do_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length) = 0;
328330
virtual access_log do_log_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length,

src/jsonrpc-discover.json

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,8 @@
280280
"summary": "Collect root hashes periodically while running the emulator",
281281
"params": [
282282
{
283-
"name": "mcycle_phase",
284-
"description": "Number of machine cycles elapsed since last root hash collected",
283+
"name": "mcycle_end",
284+
"description": "End machine cycle value",
285285
"required": true,
286286
"schema": {
287287
"$ref": "#/components/schemas/UnsignedInteger"
@@ -296,8 +296,16 @@
296296
}
297297
},
298298
{
299-
"name": "period_count",
300-
"description": "Number of hashes to collect",
299+
"name": "mcycle_phase",
300+
"description": "Number of machine cycles elapsed since last root hash collected",
301+
"required": true,
302+
"schema": {
303+
"$ref": "#/components/schemas/UnsignedInteger"
304+
}
305+
},
306+
{
307+
"name": "log2_bundle_mcycle_count",
308+
"description": "Log base 2 of the amount of mcycle root hashes to bundle",
301309
"required": true,
302310
"schema": {
303311
"$ref": "#/components/schemas/UnsignedInteger"
@@ -338,8 +346,16 @@
338346
"summary": "Collect root hashes while running the emulator's uarch",
339347
"params": [
340348
{
341-
"name": "mcycle_count",
342-
"description": "Number of machine cycles to execute, uarch cycle by uarch cycle",
349+
"name": "mcycle_end",
350+
"description": "End machine cycle value to execute, uarch cycle by uarch cycle",
351+
"required": true,
352+
"schema": {
353+
"$ref": "#/components/schemas/UnsignedInteger"
354+
}
355+
},
356+
{
357+
"name": "log2_bundle_uarch_cycle_count",
358+
"description": "Log base 2 of the amount of uarch cycle root hashes to bundle",
343359
"required": true,
344360
"schema": {
345361
"$ref": "#/components/schemas/UnsignedInteger"

src/jsonrpc-machine.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -645,9 +645,10 @@ interpreter_break_reason jsonrpc_machine::do_run(uint64_t mcycle_end) {
645645
return result;
646646
}
647647

648-
void jsonrpc_machine::do_collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period,
649-
uint64_t period_count, mcycle_root_hashes &result) {
650-
request("machine.collect_mcycle_root_hashes", std::tie(mcycle_phase, mcycle_period, period_count), result);
648+
void jsonrpc_machine::do_collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
649+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) {
650+
request("machine.collect_mcycle_root_hashes",
651+
std::tie(mcycle_end, mcycle_period, mcycle_phase, log2_bundle_mcycle_count), result);
651652
}
652653

653654
interpreter_break_reason jsonrpc_machine::do_log_step(uint64_t mcycle_count, const std::string &filename) {
@@ -816,8 +817,9 @@ uarch_interpreter_break_reason jsonrpc_machine::do_run_uarch(uint64_t uarch_cycl
816817
return result;
817818
}
818819

819-
void jsonrpc_machine::do_collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) {
820-
request("machine.collect_uarch_cycle_root_hashes", std::tie(mcycle_count), result);
820+
void jsonrpc_machine::do_collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
821+
uarch_cycle_root_hashes &result) {
822+
request("machine.collect_uarch_cycle_root_hashes", std::tie(mcycle_end, log2_bundle_uarch_cycle_count), result);
821823
}
822824

823825
address_range_descriptions jsonrpc_machine::do_get_address_ranges() const {

src/jsonrpc-machine.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ class jsonrpc_machine final : public i_machine {
108108
const std::string &dir) override;
109109
void do_load(const std::string &directory, const machine_runtime_config &runtime, sharing_mode sharing) override;
110110
interpreter_break_reason do_run(uint64_t mcycle_end) override;
111-
void do_collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period, uint64_t period_count,
112-
mcycle_root_hashes &result) override;
111+
void do_collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
112+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) override;
113113
interpreter_break_reason do_log_step(uint64_t mcycle_count, const std::string &filename) override;
114114
void do_store(const std::string &dir, sharing_mode sharing) const override;
115115
void do_clone_stored(const std::string &from_dir, const std::string &to_dir) const override;
@@ -136,7 +136,8 @@ class jsonrpc_machine final : public i_machine {
136136
hash_tree_stats do_get_hash_tree_stats(bool clear) override;
137137
bool do_verify_hash_tree() const override;
138138
uarch_interpreter_break_reason do_run_uarch(uint64_t uarch_cycle_end) override;
139-
void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) override;
139+
void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
140+
uarch_cycle_root_hashes &result) override;
140141
address_range_descriptions do_get_address_ranges() const override;
141142
void do_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length) override;
142143
access_log do_log_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length,

src/jsonrpc-remote-machine.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -909,13 +909,15 @@ static json jsonrpc_machine_collect_mcycle_root_hashes(const json &j, const std:
909909
if (!session->handler->machine) {
910910
return jsonrpc_response_invalid_request(j, "no machine");
911911
}
912-
static const char *param_name[] = {"mcycle_phase", "mcycle_period", "period_count"};
913-
auto args = parse_args<uint64_t, uint64_t, uint64_t>(j, param_name);
914-
auto mcycle_phase = std::get<0>(args);
912+
static const char *param_name[] = {"mcycle_end", "mcycle_period", "mcycle_phase", "log2_bundle_mcycle_count"};
913+
auto args = parse_args<uint64_t, uint64_t, uint64_t, uint64_t>(j, param_name);
914+
auto mcycle_end = std::get<0>(args);
915915
auto mcycle_period = std::get<1>(args);
916-
auto period_count = std::get<2>(args);
916+
auto mcycle_phase = std::get<2>(args);
917+
auto log2_bundle_mcycle_count = std::get<3>(args);
917918
cartesi::mcycle_root_hashes result;
918-
session->handler->machine->collect_mcycle_root_hashes(mcycle_phase, mcycle_period, period_count, result);
919+
session->handler->machine->collect_mcycle_root_hashes(mcycle_end, mcycle_period, mcycle_phase,
920+
log2_bundle_mcycle_count, result);
919921
return jsonrpc_response_ok(j, result);
920922
}
921923

@@ -928,11 +930,12 @@ static json jsonrpc_machine_collect_uarch_cycle_root_hashes(const json &j,
928930
if (!session->handler->machine) {
929931
return jsonrpc_response_invalid_request(j, "no machine");
930932
}
931-
static const char *param_name[] = {"mcycle_count"};
932-
auto args = parse_args<uint64_t>(j, param_name);
933-
auto mcycle_count = std::get<0>(args);
933+
static const char *param_name[] = {"mcycle_end", "log2_bundle_uarch_cycle_count"};
934+
auto args = parse_args<uint64_t, uint64_t>(j, param_name);
935+
auto mcycle_end = std::get<0>(args);
936+
auto log2_bundle_uarch_cycle_count = std::get<1>(args);
934937
cartesi::uarch_cycle_root_hashes result;
935-
session->handler->machine->collect_uarch_cycle_root_hashes(mcycle_count, result);
938+
session->handler->machine->collect_uarch_cycle_root_hashes(mcycle_end, log2_bundle_uarch_cycle_count, result);
936939
return jsonrpc_response_ok(j, result);
937940
}
938941

src/local-machine.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ interpreter_break_reason local_machine::do_run(uint64_t mcycle_end) {
7878
return get_machine()->run(mcycle_end);
7979
}
8080

81-
void local_machine::do_collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period, uint64_t period_count,
82-
mcycle_root_hashes &result) {
83-
get_machine()->collect_mcycle_root_hashes(mcycle_phase, mcycle_period, period_count, result);
81+
void local_machine::do_collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
82+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) {
83+
get_machine()->collect_mcycle_root_hashes(mcycle_end, mcycle_period, mcycle_phase, log2_bundle_mcycle_count,
84+
result);
8485
}
8586

8687
interpreter_break_reason local_machine::do_log_step(uint64_t mcycle_count, const std::string &filename) {
@@ -180,8 +181,9 @@ uarch_interpreter_break_reason local_machine::do_run_uarch(uint64_t uarch_cycle_
180181
return get_machine()->run_uarch(uarch_cycle_end);
181182
}
182183

183-
void local_machine::do_collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) {
184-
get_machine()->collect_uarch_cycle_root_hashes(mcycle_count, result);
184+
void local_machine::do_collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
185+
uarch_cycle_root_hashes &result) {
186+
get_machine()->collect_uarch_cycle_root_hashes(mcycle_end, log2_bundle_uarch_cycle_count, result);
185187
}
186188

187189
address_range_descriptions local_machine::do_get_address_ranges() const {

src/local-machine.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class local_machine : public i_machine {
5050
const std::string &dir) override;
5151
void do_load(const std::string &directory, const machine_runtime_config &runtime, sharing_mode sharing) override;
5252
interpreter_break_reason do_run(uint64_t mcycle_end) override;
53-
void do_collect_mcycle_root_hashes(uint64_t mcycle_phase, uint64_t mcycle_period, uint64_t period_count,
54-
mcycle_root_hashes &result) override;
53+
void do_collect_mcycle_root_hashes(uint64_t mcycle_end, uint64_t mcycle_period, uint64_t mcycle_phase,
54+
uint32_t log2_bundle_mcycle_count, mcycle_root_hashes &result) override;
5555
interpreter_break_reason do_log_step(uint64_t mcycle_count, const std::string &filename) override;
5656
void do_store(const std::string &directory, sharing_mode sharing) const override;
5757
void do_clone_stored(const std::string &from_dir, const std::string &to_dir) const override;
@@ -78,7 +78,8 @@ class local_machine : public i_machine {
7878
void do_reset_uarch() override;
7979
access_log do_log_reset_uarch(const access_log::type &log_type) override;
8080
uarch_interpreter_break_reason do_run_uarch(uint64_t uarch_cycle_end) override;
81-
void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_count, uarch_cycle_root_hashes &result) override;
81+
void do_collect_uarch_cycle_root_hashes(uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
82+
uarch_cycle_root_hashes &result) override;
8283
address_range_descriptions do_get_address_ranges() const override;
8384
void do_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length) override;
8485
access_log do_log_send_cmio_response(uint16_t reason, const unsigned char *data, uint64_t length,

src/machine-c-api.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -645,14 +645,14 @@ cm_error cm_run(cm_machine *m, uint64_t mcycle_end, cm_break_reason *break_reaso
645645
return cm_result_failure();
646646
}
647647

648-
cm_error cm_collect_mcycle_root_hashes(cm_machine *m, uint64_t mcycle_phase, uint64_t mcycle_period,
649-
uint64_t period_count, const char **result) try {
648+
cm_error cm_collect_mcycle_root_hashes(cm_machine *m, uint64_t mcycle_end, uint64_t mcycle_period,
649+
uint64_t mcycle_phase, uint32_t log2_bundle_mcycle_count, const char **result) try {
650650
if (result == nullptr) {
651651
throw std::invalid_argument("invalid result output");
652652
}
653653
auto *cpp_m = convert_from_c(m);
654654
cartesi::mcycle_root_hashes cpp_res;
655-
cpp_m->collect_mcycle_root_hashes(mcycle_phase, mcycle_period, period_count, cpp_res);
655+
cpp_m->collect_mcycle_root_hashes(mcycle_end, mcycle_period, mcycle_phase, log2_bundle_mcycle_count, cpp_res);
656656
*result = cm_set_temp_string(cartesi::to_json(cpp_res).dump());
657657
return cm_result_success();
658658
} catch (...) {
@@ -662,13 +662,14 @@ cm_error cm_collect_mcycle_root_hashes(cm_machine *m, uint64_t mcycle_phase, uin
662662
return cm_result_failure();
663663
}
664664

665-
cm_error cm_collect_uarch_cycle_root_hashes(cm_machine *m, uint64_t mcycle_count, const char **result) try {
665+
cm_error cm_collect_uarch_cycle_root_hashes(cm_machine *m, uint64_t mcycle_end, uint32_t log2_bundle_uarch_cycle_count,
666+
const char **result) try {
666667
if (result == nullptr) {
667668
throw std::invalid_argument("invalid result output");
668669
}
669670
auto *cpp_m = convert_from_c(m);
670671
cartesi::uarch_cycle_root_hashes cpp_res;
671-
cpp_m->collect_uarch_cycle_root_hashes(mcycle_count, cpp_res);
672+
cpp_m->collect_uarch_cycle_root_hashes(mcycle_end, log2_bundle_uarch_cycle_count, cpp_res);
672673
*result = cm_set_temp_string(cartesi::to_json(cpp_res).dump());
673674
return cm_result_success();
674675
} catch (...) {

0 commit comments

Comments
 (0)