diff options
| -rw-r--r-- | arch/dummy/arch.c | 2 | ||||
| -rw-r--r-- | arch/v1/arch.c | 37 | ||||
| -rw-r--r-- | core/compress.c | 2 | ||||
| -rw-r--r-- | core/logger.c | 8 | ||||
| -rw-r--r-- | core/salis.c | 70 | ||||
| -rw-r--r-- | core/sql.c | 6 | ||||
| -rw-r--r-- | data/client.cpp | 24 | ||||
| -rw-r--r-- | data/server.c | 24 | ||||
| -rwxr-xr-x | salis.py | 32 | ||||
| -rw-r--r-- | ui/curses/ui.c | 9 | ||||
| -rw-r--r-- | ui/daemon/ui.c | 8 |
11 files changed, 58 insertions, 164 deletions
diff --git a/arch/dummy/arch.c b/arch/dummy/arch.c index 6f4d098..aaf0f9d 100644 --- a/arch/dummy/arch.c +++ b/arch/dummy/arch.c @@ -144,7 +144,6 @@ const char *arch_mnemonic(uint8_t inst) { return NULL; } -#if defined(DATA_PUSH) #if defined(COMMAND_NEW) void arch_push_data_header(void) { assert(g_sim_db); @@ -154,4 +153,3 @@ void arch_push_data_header(void) { void arch_push_data_line(void) { assert(g_sim_db); } -#endif diff --git a/arch/v1/arch.c b/arch/v1/arch.c index 3a43b43..e0203cb 100644 --- a/arch/v1/arch.c +++ b/arch/v1/arch.c @@ -1,13 +1,6 @@ // Based on the original salis-v1 VM architecture: // https://git.pauloliver.dev/salis-v1/about/ -enum { -#define INST(core, pref, index, label, mnemonic, symbol) label, - INST_SET(core, pref) -#undef INST -}; - -#if defined(DATA_PUSH) #define INST_EVENT_ARRAYS(core) \ INST_EVENT_ARRAY(core, 0, pop) /* instruction population */ \ INST_EVENT_ARRAY(core, 1, exe) /* instruction executions */ \ @@ -19,9 +12,14 @@ enum { ARCH_EVENT_ARRAY(core, 1, xev) /* memory block swap events array */ #define ARCH_EVENT_ARRAYS_COUNT 2 +enum { +#define INST(core, pref, index, label, mnemonic, symbol) label, + INST_SET(core, pref) +#undef INST +}; + thrd_t g_arch_eva_thrds[CORES][ARCH_EVENT_ARRAYS_COUNT]; struct DeflateParams g_arch_eva_deflate_params[CORES][ARCH_EVENT_ARRAYS_COUNT]; -#endif #if defined(COMMAND_NEW) void arch_core_init(struct Core *core) { @@ -56,7 +54,6 @@ void arch_core_save(FILE *f, const struct Core *core) { assert(f); assert(core); -#if defined(DATA_PUSH) fwrite(core->iexe, sizeof(uint64_t), INST_COUNT, f); fwrite(core->iwrt, sizeof(uint64_t), INST_COUNT, f); fwrite(&core->wmb0, sizeof(uint64_t), 1, f); @@ -66,10 +63,6 @@ void arch_core_save(FILE *f, const struct Core *core) { fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); ARCH_EVENT_ARRAYS(core) #undef ARCH_EVENT_ARRAY -#else - (void)f; - (void)core; -#endif } #endif @@ -78,7 +71,6 @@ void arch_core_load(FILE *f, struct Core *core) { assert(f); assert(core); -#if defined(DATA_PUSH) fread(core->iexe, sizeof(uint64_t), INST_COUNT, f); fread(core->iwrt, sizeof(uint64_t), INST_COUNT, f); fread(&core->wmb0, sizeof(uint64_t), 1, f); @@ -88,10 +80,6 @@ void arch_core_load(FILE *f, struct Core *core) { fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); ARCH_EVENT_ARRAYS(core) #undef ARCH_EVENT_ARRAY -#else - (void)f; - (void)core; -#endif } #endif @@ -438,7 +426,6 @@ void _bswap(struct Core *core, uint64_t pix) { proc->mb1a = tmpa; proc->mb1s = tmps; -#if defined(DATA_PUSH) // Memory block swap events mark all addresses within both blocks for (uint64_t i = 0; i < proc->mb0s; i++) { uint64_t addr = proc->mb0a + i; @@ -459,7 +446,6 @@ void _bswap(struct Core *core, uint64_t pix) { ++core->xeva[addr]; #endif } -#endif } _increment_ip(core, pix); @@ -674,8 +660,6 @@ void _write(struct Core *core, uint64_t pix) { } else { if (_is_writeable_by(core, *regs[0], pix)) { uint64_t addr = *regs[0]; - -#if defined(DATA_PUSH) uint8_t inst = *regs[1] % INST_COUNT; // Store write event @@ -689,7 +673,6 @@ void _write(struct Core *core, uint64_t pix) { } else { ++core->wdea; } -#endif // Write instruction uint8_t inst_rep = *regs[1] % INST_CAP; @@ -734,10 +717,8 @@ void arch_proc_step(struct Core *core, uint64_t pix) { struct Proc *proc = proc_fetch(core, pix); uint8_t inst = _get_inst(core, proc->ip); -#if defined(DATA_PUSH) // Store specific instruction execution event in database ++core->iexe[inst]; -#endif // Execute instruction switch (inst) { @@ -873,12 +854,11 @@ const char *arch_mnemonic(uint8_t inst) { // ---------------------------------------------------------------------------- // Data aggregation functions // ---------------------------------------------------------------------------- -#if defined(DATA_PUSH) #if defined(COMMAND_NEW) void arch_push_data_header(void) { assert(g_sim_db); - g_info("Creating arch table in SQLite database"); + log_info("Creating arch table in SQLite database"); sql_exec( 0, NULL, NULL, "create table arch (" @@ -966,7 +946,7 @@ void arch_push_data_line(void) { } } - g_info("Pushing row to arch table in SQLite database"); + log_info("Pushing row to arch table in SQLite database"); sql_exec( CORES * ARCH_EVENT_ARRAYS_COUNT, (const void **)blobs, (int *)blob_sizes, "insert into arch (" @@ -1055,4 +1035,3 @@ void arch_push_data_line(void) { #undef ARCH_EVENT_ARRAY } } -#endif diff --git a/core/compress.c b/core/compress.c index 8ef3c41..b45a583 100644 --- a/core/compress.c +++ b/core/compress.c @@ -1,5 +1,3 @@ -#pragma once - #define EVA_SIZE (sizeof(uint64_t) * MVEC_SIZE) struct DeflateParams { diff --git a/core/logger.c b/core/logger.c index 7d5b69e..2c8746f 100644 --- a/core/logger.c +++ b/core/logger.c @@ -81,7 +81,7 @@ void log_msg(enum LogLevel level, bool colored, const char *format, va_list args printf("\r%s\n", buff); } -void log_info(const char *format, ...) { +void log_info_default(const char *format, ...) { assert(format); va_list args; @@ -90,7 +90,7 @@ void log_info(const char *format, ...) { va_end(args); } -void log_warn(const char *format, ...) { +void log_warn_default(const char *format, ...) { assert(format); va_list args; @@ -100,5 +100,5 @@ void log_warn(const char *format, ...) { } // Client may install their own loggers -void (*g_info)(const char *fmt, ...) = log_info; -void (*g_warn)(const char *fmt, ...) = log_warn; +void (*log_info)(const char *fmt, ...) = log_info_default; +void (*log_warn)(const char *fmt, ...) = log_warn_default; diff --git a/core/salis.c b/core/salis.c index abed1ec..d6efcf2 100644 --- a/core/salis.c +++ b/core/salis.c @@ -1,23 +1,16 @@ #include <assert.h> +#include <sqlite3.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <threads.h> -#include "logger.c" - -#if defined(COMPRESS) #include <zlib.h> -#include "compress.c" -#endif -#if defined(DATA_PUSH) -#include <sqlite3.h> -#include <zlib.h> +#include "logger.c" #include "compress.c" #include "sql.c" -#endif #define INST_CAP 0x80 #define INST_MASK 0x7f @@ -25,13 +18,11 @@ #define MALL_FLAG 0x80 #define UINT64_HALF 0x8000000000000000ul -#if defined(DATA_PUSH) #define EVENT_ARRAYS(core) \ EVENT_ARRAY(core, 0, aev) /* allocation events array */ \ EVENT_ARRAY(core, 1, eev) /* executions events array */ \ EVENT_ARRAY(core, 2, bev) /* birth events array */ #define EVENT_ARRAYS_COUNT 3 -#endif struct Proc { #define PROC_FIELD(type, name) type name; @@ -58,7 +49,6 @@ struct Core { uint64_t *ivav; uint8_t *iviv; -#if defined(DATA_PUSH) uint64_t emb0; // executions within mb0 counter uint64_t emb1; // executions within mb1 counter uint64_t eliv; // executions within not-owned live code counter (parasites) @@ -71,7 +61,6 @@ struct Core { #define CORE_DATA_FIELD(type, name) type name; CORE_DATA_FIELDS #undef CORE_DATA_FIELD -#endif #define CORE_FIELD(type, name) type name; CORE_FIELDS @@ -92,10 +81,8 @@ const struct Proc g_dead_proc; char g_asav_pbuf[AUTOSAVE_NAME_LEN]; #endif -#if defined(DATA_PUSH) thrd_t g_eva_thrds[CORES][EVENT_ARRAYS_COUNT]; struct DeflateParams g_eva_deflate_params[CORES][EVENT_ARRAYS_COUNT]; -#endif // Each architecture must define these functions #if defined(COMMAND_NEW) @@ -163,19 +150,16 @@ void mvec_alloc(struct Core *core, uint64_t addr) { #if defined(MVEC_LOOP) core->mvec[mvec_loop(addr)] |= MALL_FLAG; -#if defined(DATA_PUSH) + // Record deallocation event ++core->aeva[mvec_loop(addr)]; -#endif #else assert(addr < MVEC_SIZE); core->mvec[addr] |= MALL_FLAG; -#if defined(DATA_PUSH) // Record deallocation event ++core->aeva[addr]; #endif -#endif core->mall++; } @@ -186,19 +170,15 @@ void mvec_free(struct Core *core, uint64_t addr) { #if defined(MVEC_LOOP) core->mvec[mvec_loop(addr)] ^= MALL_FLAG; -#if defined(DATA_PUSH) // Record deallocation event ++core->aeva[mvec_loop(addr)]; -#endif #else assert(addr < MVEC_SIZE); core->mvec[addr] ^= MALL_FLAG; -#if defined(DATA_PUSH) // Record deallocation event ++core->aeva[addr]; #endif -#endif core->mall--; } @@ -379,7 +359,6 @@ void proc_new(struct Core *core, const struct Proc *proc) { core->plst++; memcpy(&core->pvec[core->plst % core->pcap], proc, sizeof(struct Proc)); -#if defined(DATA_PUSH) // Store birth event in database uint64_t child_addr = arch_proc_mb0_addr(core, core->plst); uint64_t child_size = arch_proc_mb0_size(core, core->plst); @@ -392,7 +371,6 @@ void proc_new(struct Core *core, const struct Proc *proc) { ++core->beva[addr]; #endif } -#endif } void proc_kill(struct Core *core) { @@ -441,23 +419,19 @@ void core_save(FILE *f, const struct Core *core) { fwrite(&core->pcur, sizeof(uint64_t), 1, f); fwrite(&core->psli, sizeof(uint64_t), 1, f); fwrite(&core->ivpt, sizeof(uint64_t), 1, f); -#if defined(DATA_PUSH) fwrite(&core->emb0, sizeof(uint64_t), 1, f); fwrite(&core->emb1, sizeof(uint64_t), 1, f); fwrite(&core->eliv, sizeof(uint64_t), 1, f); fwrite(&core->edea, sizeof(uint64_t), 1, f); -#endif fwrite(core->iviv, sizeof(uint8_t), SYNC_INTERVAL, f); fwrite(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f); fwrite(core->pvec, sizeof(struct Proc), core->pcap, f); fwrite(core->mvec, sizeof(uint8_t), MVEC_SIZE, f); -#if defined(DATA_PUSH) #define EVENT_ARRAY(core, index, ev) \ fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS(core) #undef EVENT_ARRAY -#endif arch_core_save(f, core); } @@ -531,12 +505,10 @@ void core_load(FILE *f, struct Core *core) { fread(&core->pcur, sizeof(uint64_t), 1, f); fread(&core->psli, sizeof(uint64_t), 1, f); fread(&core->ivpt, sizeof(uint64_t), 1, f); -#if defined(DATA_PUSH) fread(&core->emb0, sizeof(uint64_t), 1, f); fread(&core->emb1, sizeof(uint64_t), 1, f); fread(&core->eliv, sizeof(uint64_t), 1, f); fread(&core->edea, sizeof(uint64_t), 1, f); -#endif core->iviv = calloc(SYNC_INTERVAL, sizeof(uint8_t)); core->ivav = calloc(SYNC_INTERVAL, sizeof(uint64_t)); @@ -550,12 +522,10 @@ void core_load(FILE *f, struct Core *core) { fread(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f); fread(core->pvec, sizeof(struct Proc), core->pcap, f); fread(core->mvec, sizeof(uint8_t), MVEC_SIZE, f); -#if defined(DATA_PUSH) #define EVENT_ARRAY(core, index, ev) \ fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS(core) #undef EVENT_ARRAY -#endif arch_core_load(f, core); } @@ -600,7 +570,6 @@ void core_step(struct Core *core) { if (core->psli != 0) { core_pull_ipcm(core); -#if defined(DATA_PUSH) // Save execution event locations in database assert(mvec_proc_is_live(core, core->pcur)); @@ -623,7 +592,6 @@ void core_step(struct Core *core) { core->eeva[pcur_ip]++; } #endif -#endif arch_proc_step(core, core->pcur); @@ -657,13 +625,9 @@ void core_step(struct Core *core) { // ---------------------------------------------------------------------------- #if defined(COMMAND_NEW) || defined(COMMAND_LOAD) void salis_save(const char *path) { -#if defined(COMPRESS) size_t size = 0; char *in = NULL; FILE *f = open_memstream(&in, &size); -#else - FILE *f = fopen(path, "wb"); -#endif assert(f); @@ -675,7 +639,6 @@ void salis_save(const char *path) { fwrite(&g_syncs, sizeof(uint64_t), 1, f); fclose(f); -#if defined(COMPRESS) assert(size); char *out = malloc(size); assert(out); @@ -699,7 +662,6 @@ void salis_save(const char *path) { free(in); free(out); -#endif } void salis_auto_save(void) { @@ -718,17 +680,16 @@ void salis_auto_save(void) { assert(rem >= 0); assert(rem < AUTOSAVE_NAME_LEN); - g_info("Saving simulation state on step %#lx", g_steps); + log_info("Saving simulation state on step %#lx", g_steps); salis_save(g_asav_pbuf); } #endif -#if defined(DATA_PUSH) #if defined(COMMAND_NEW) void salis_push_data_header(void) { assert(g_sim_db); - g_info("Creating core table in SQLite database"); + log_info("Creating core table in SQLite database"); sql_exec( 0, NULL, NULL, "create table core (" @@ -815,7 +776,7 @@ void salis_push_data_line(void) { } } - g_info("Pushing row to core table in SQLite database"); + log_info("Pushing row to core table in SQLite database"); sql_exec( CORES * EVENT_ARRAYS_COUNT, (const void **)blobs, (int *)blob_sizes, "insert into core (" @@ -897,13 +858,9 @@ void salis_push_data_line(void) { // Push arch-specific data arch_push_data_line(); } -#endif #if defined(COMMAND_NEW) void salis_init(void) { - assert(g_info); - assert(g_warn); - uint64_t seed = SEED; for (int i = 0; i < CORES; ++i) { @@ -914,18 +871,15 @@ void salis_init(void) { salis_auto_save(); #endif -#if defined(DATA_PUSH) // Initialize database sql_open(); salis_push_data_header(); salis_push_data_line(); -#endif } #endif #if defined(COMMAND_LOAD) void salis_load(void) { -#if defined(COMPRESS) FILE *fx = fopen(SIM_PATH, "rb"); assert(fx); @@ -956,9 +910,6 @@ void salis_load(void) { comp_inflate_end(¶ms); FILE *f = fmemopen(out, size, "rb"); -#else - FILE *f = fopen(SIM_PATH, "rb"); -#endif assert(f); @@ -969,15 +920,10 @@ void salis_load(void) { fread(&g_steps, sizeof(uint64_t), 1, f); fread(&g_syncs, sizeof(uint64_t), 1, f); fclose(f); - -#if defined(COMPRESS) free(in); free(out); -#endif -#if defined(DATA_PUSH) sql_open(); -#endif } #endif @@ -1045,11 +991,9 @@ void salis_loop(uint64_t ns, uint64_t dt) { } #endif -#if defined(DATA_PUSH) if (g_steps % DATA_PUSH_INTERVAL == 0) { salis_push_data_line(); } -#endif salis_loop(ns - dt, SYNC_INTERVAL); } @@ -1107,9 +1051,7 @@ void salis_step(uint64_t ns) { } void salis_free(void) { -#if defined(DATA_PUSH) sql_close(); -#endif for (int i = 0; i < CORES; ++i) { arch_core_free(&g_cores[i]); @@ -38,11 +38,11 @@ void sql_exec(int blob_cnt, const void **blobs, const int *blob_sizes, const cha break; } - g_warn("SQLite database returned error %d with message:", sql_res); - g_warn(sqlite3_errmsg(g_sim_db)); + log_warn("SQLite database returned error %d with message:", sql_res); + log_warn(sqlite3_errmsg(g_sim_db)); if (sql_res == SQLITE_BUSY) { - g_info("Will retry query..."); + log_info("Will retry query..."); continue; } diff --git a/data/client.cpp b/data/client.cpp index 2a162f2..65494b0 100644 --- a/data/client.cpp +++ b/data/client.cpp @@ -4,12 +4,14 @@ #include <imgui_impl_glfw.h> #include <imgui_impl_opengl3.h> #include <implot.h> -#include <initializer_list> #include <json-c/json.h> #include <limits.h> #include <math.h> #include <signal.h> #include <threads.h> + +#include <initializer_list> + #include "logger.c" #define FETCH_INTERVAL 10 @@ -185,7 +187,7 @@ void data_fetch(void) { json_object_object_add(request, "x-current", json_object_new_int(g_x_current)); const char *request_str = json_object_to_json_string(request); - g_info("Sending request to server: %s", request_str); + log_info("Sending request to server: %s", request_str); int socket_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in socket_addr; memset(&socket_addr, 0, sizeof(struct sockaddr_in)); @@ -198,7 +200,7 @@ void data_fetch(void) { struct json_object *response = json_object_from_fd(socket_fd); const char *response_str = json_object_to_json_string(response); - g_info("Server responded with: %s", response_str); + log_info("Server responded with: %s", response_str); json_object_put(request); json_object_put(response); @@ -223,14 +225,14 @@ int data_fetching_thread(void *data) { } void data_start_fetching(void) { - g_info("Starting data fetching thread"); + log_info("Starting data fetching thread"); g_status = STATUS_RUNNING; thrd_create(&g_data_fetching_thread, (thrd_start_t)data_fetching_thread, nullptr); } void data_stop_fetching(void) { assert(g_status == STATUS_RUNNING); - g_info("Stopping data fetching thread"); + log_info("Stopping data fetching thread"); g_status = STATUS_STOPPING; thrd_join(g_data_fetching_thread, nullptr); } @@ -410,13 +412,13 @@ void gui_print(void) { void sig_handler(int signo) { (void)signo; - g_warn("Signal received, will stop SALIS data client..."); + log_warn("Signal received, will stop SALIS data client..."); if (g_status == STATUS_RUNNING) data_stop_fetching(); glfwSetWindowShouldClose(g_window, GLFW_TRUE); } void glfw_error_callback(int error, const char* description) { - g_warn("GLFW error %d: %s", error, description); + log_warn("GLFW error %d: %s", error, description); } void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { @@ -504,9 +506,9 @@ int main(int argc, char **argv) { signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); - g_info("Starting SALIS data client"); + log_info("Starting SALIS data client"); - g_info("Initializing GLFW"); + log_info("Initializing GLFW"); glfwSetErrorCallback(glfw_error_callback); glfwInitHint(GLFW_WAYLAND_LIBDECOR, GLFW_WAYLAND_DISABLE_LIBDECOR); if (!glfwInit()) assert(false); @@ -518,7 +520,7 @@ int main(int argc, char **argv) { glfwMakeContextCurrent(g_window); glfwSwapInterval(1); // enable vsync - g_info("Initializing ImGui"); + log_info("Initializing ImGui"); IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImPlot::CreateContext(); @@ -567,7 +569,7 @@ int main(int argc, char **argv) { ImPlot::DestroyContext(); ImGui::DestroyContext(); - g_info("Stopping SALIS data client"); + log_info("Stopping SALIS data client"); glfwDestroyWindow(g_window); glfwTerminate(); return 0; diff --git a/data/server.c b/data/server.c index 4574415..8581b83 100644 --- a/data/server.c +++ b/data/server.c @@ -24,13 +24,13 @@ struct Socket { // ---------------------------------------------------------------------------- void sig_handler(int signo) { (void)signo; - g_warn("Signal received, will stop SALIS data server"); + log_warn("Signal received, will stop SALIS data server"); sql_close(); exit(0); } void respond_name(int socket_fd) { - g_info("Client requested simulation name"); + log_info("Client requested simulation name"); struct json_object *sim_name = json_object_new_object(); json_object_object_add(sim_name, "name", json_object_new_string(NAME)); @@ -39,7 +39,7 @@ void respond_name(int socket_fd) { } void respond_opts(int socket_fd) { - g_info("Client requested simulation options"); + log_info("Client requested simulation options"); struct json_object *sim_opts = json_object_from_file(SIM_OPTS); json_object_to_fd(socket_fd, sim_opts, 0); @@ -47,7 +47,7 @@ void respond_opts(int socket_fd) { } void respond_hash(int socket_fd) { - g_info("Client requested git hash"); + log_info("Client requested git hash"); char buff[41] = { 0 }; FILE *pipe = popen("git rev-parse HEAD", "r"); @@ -64,12 +64,12 @@ void respond_data(int socket_fd, struct json_object *request) { assert(request); const char *request_str = json_object_to_json_string(request); - g_info("Client requested simulation data with the following parameters: %s", request_str); + log_info("Client requested simulation data with the following parameters: %s", request_str); struct json_object *response = json_object_new_object(); json_object_object_add(response, "response", json_object_new_string("hello!")); const char *response_str = json_object_to_json_string(response); - g_info("Sending response to client: %s", response_str); + log_info("Sending response to client: %s", response_str); json_object_to_fd(socket_fd, response, 0); shutdown(socket_fd, SHUT_WR); @@ -81,7 +81,7 @@ int handle_client(struct Socket *socket) { char socket_ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &socket->addr.sin_addr, socket_ip, INET_ADDRSTRLEN); - g_info("Client connected: %s:%d", socket_ip, ntohs(socket->addr.sin_port)); + log_info("Client connected: %s:%d", socket_ip, ntohs(socket->addr.sin_port)); struct json_object *request_json = json_object_from_fd(socket->fd); struct json_object *request_str = NULL; @@ -105,7 +105,7 @@ int handle_client(struct Socket *socket) { json_object_put(request_json); - g_info("Client disconnected: %s:%d", socket_ip, ntohs(socket->addr.sin_port)); + log_info("Client disconnected: %s:%d", socket_ip, ntohs(socket->addr.sin_port)); close(socket->fd); free(socket); @@ -113,14 +113,14 @@ int handle_client(struct Socket *socket) { } int main(void) { - g_info("Initializing salis data server"); - g_info("Connecting to database in: %s", DATA_PUSH_PATH); + log_info("Initializing salis data server"); + log_info("Connecting to database in: %s", DATA_PUSH_PATH); sql_open(); signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); - g_info("Binding to port: %d", PORT); + log_info("Binding to port: %d", PORT); int opt = 1; int socket_fd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); @@ -130,7 +130,7 @@ int main(void) { socket_addr.sin_port = htons(PORT); bind(socket_fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)); - g_info("Listening..."); + log_info("Listening..."); listen(socket_fd, BACKLOG); while (true) { @@ -60,7 +60,7 @@ options = { (("a", "arch"), (new,), fmt_id): {"choices": architectures, "help": "VM architecture", "default": "dummy", "required": False, "type": str}, (("C", "clones"), (new,), fmt_id): {"metavar": "N", "help": "number of ancestor clones on each core", "default": 1, "required": False, "type": nat}, (("c", "cores"), (new,), fmt_id): {"metavar": "N", "help": "number of simulator cores", "default": 2, "required": False, "type": nat}, - (("d", "data-push-pow"), (new,), fmt_id): {"metavar": "POW", "help": "data aggregation interval exponent; interval = 2^{POW} >= {sync-pow}; a value of 0 disables data aggregation; requires 'sqlite' and 'zlib'", "default": 28, "required": False, "type": pos}, + (("d", "data-push-pow"), (new,), fmt_id): {"metavar": "POW", "help": "data aggregation interval exponent; interval = 2^{POW} >= {sync-pow}", "default": 28, "required": False, "type": nat}, (("f", "force"), (new,), fmt_id): {"action": "store_true", "help": "overwrite existing simulation of given name", "required": False}, (("F", "muta-flip"), (new,), fmt_id): {"action": "store_true", "help": "cosmic rays flip bits instead of randomizing whole bytes", "required": False}, (("g", "c-compiler"), (new, load, server, client), fmt_id): {"metavar": "CC", "help": "C compiler to use", "default": "gcc", "required": False, "type": str}, @@ -79,7 +79,6 @@ options = { (("T", "keep-temp-dir"), (new, load, server, client), fmt_id): {"action": "store_true", "help": "keep temporary directory on exit", "required": False}, (("t", "thread-gap"), (new, load), fmt_hex): {"metavar": "N", "help": "memory gap between core elements in bytes; may help reduce cache misses", "default": 0x100, "required": False, "type": nat}, (("u", "ui"), (new, load), fmt_id): {"choices": uis, "help": "user interface", "default": "curses", "required": False, "type": str}, - (("x", "no-compress"), (new,), fmt_id): {"action": "store_true", "help": "do not compress save files; useful if 'zlib' is unavailable", "required": False}, (("y", "sync-pow"), (new,), fmt_id): {"metavar": "POW", "help": "core sync interval exponent; sync events occur every N steps, where N = 2^{POW}", "default": 20, "required": False, "type": pos}, (("z", "auto-save-pow"), (new,), fmt_id): {"metavar": "POW", "help": "auto-save interval exponent; auto-saves occur every N steps, where N = 2^{POW}", "default": 36, "required": False, "type": pos}, } @@ -160,8 +159,8 @@ log_b.build() # This way there's only a single unified logging system to care about log = SimpleNamespace() log_dll = ctypes.CDLL(log_b.binfile) -log.info = lambda msg: log_dll.log_info(msg.encode()) -log.warn = lambda msg: log_dll.log_warn(msg.encode()) +log.info = lambda msg: log_dll.log_info_default(msg.encode()) +log.warn = lambda msg: log_dll.log_warn_default(msg.encode()) for log_level, log_msg in log_logs: getattr(log, log_level)(log_msg) @@ -330,25 +329,12 @@ def pop_ui_vars(): ns.b.defines.update({*ns.ui_vars["defines"]}) ns.b.links.update({*ns.ui_vars["links"]}) -def pop_db_vars(): +def pop_data_push_vars(): ns.sim_db = os.path.join(ns.sim_dir, f"{args.name}.sqlite3") ns.b.defines.add(f"-DDATA_PUSH_PATH=\"{ns.sim_db}\"") ns.b.links.add("-lsqlite3") ns.b.links.add("-lz") -def pop_data_push_vars(): - if args.data_push_pow: - pop_db_vars() - log.info(f"Data will be aggregated at: {ns.sim_db}") - else: - log.warn("Data aggregation disabled") - - if not args.no_compress: - ns.b.links.add("-lz") - log.info("Save file compression enabled") - else: - log.warn("Save file compression disabled") - def pop_sim_path_vars(): ns.b.defines.add(f"-DSIM_OPTS=\"{ns.sim_opts}\"") ns.b.defines.add(f"-DSIM_PATH=\"{ns.sim_path}\"") @@ -362,13 +348,6 @@ def pop_general(): ns.b.flags.add(f"-Iarch/{args.arch}") ns.b.flags.add("-Icore") - if args.data_push_pow: - ns.b.defines.add("-DDATA_PUSH") - ns.b.defines.add(f"-DDATA_PUSH_INTERVAL={2 ** args.data_push_pow}ul") - - if not args.no_compress: - ns.b.defines.add("-DCOMPRESS") - if args.muta_flip: ns.b.defines.add("-DMUTA_FLIP") @@ -386,6 +365,7 @@ def pop_general(): ns.b.defines.add(f"-DCORE_FIELD_COUNT={len(arch_vars["core_fields"])}") ns.b.defines.add(f"-DCORE_FIELDS={" ".join(f"CORE_FIELD({", ".join(field)})" for field in arch_vars["core_fields"])}") ns.b.defines.add(f"-DCORES={args.cores}") + ns.b.defines.add(f"-DDATA_PUSH_INTERVAL={2 ** args.data_push_pow}ul") ns.b.defines.add(f"-DFOR_CORES={" ".join(f"FOR_CORE({i})" for i in range(args.cores))}") ns.b.defines.add(f"-DINST_COUNT={len(arch_vars["inst_set"])}") ns.b.defines.add(f"-DINST_SET(core, pref)={" ".join(f"INST(core, pref, {index}, {"_".join(inst[0])}, \"{" ".join(inst[0])}\", L'{inst[1]}')" for index, inst in enumerate(arch_vars["inst_set"]))}") @@ -422,7 +402,7 @@ if args.command == "load": # Populate for server if args.command == "server": ns.b = Build("data/server.c", log) - pop_db_vars() + pop_data_push_vars() pop_sim_path_vars() pop_net_vars() pop_general() diff --git a/ui/curses/ui.c b/ui/curses/ui.c index 6755619..ce73c01 100644 --- a/ui/curses/ui.c +++ b/ui/curses/ui.c @@ -813,11 +813,6 @@ void tui_print(void) { #if defined(DATA_PUSH_INTERVAL) tui_ulx_field(l++, "dpsi", DATA_PUSH_INTERVAL); #endif -#if defined(COMPRESS) - tui_str_field(l++, "xsav", "enabled"); -#else - tui_str_field(l++, "xsav", "disabled"); -#endif tui_ulx_field(l++, "step", g_steps); tui_ulx_field(l++, "sync", g_syncs); tui_ulx_field(l++, "step", g_step_block); @@ -1237,8 +1232,8 @@ void init(void) { init_pair(PAIR_INFO, COLOR_GREEN, COLOR_BLACK); init_pair(PAIR_WARN, COLOR_RED, COLOR_BLACK); - g_info = tui_info_impl; - g_warn = tui_warn_impl; + log_info = tui_info_impl; + log_warn = tui_warn_impl; #if defined(COMMAND_NEW) salis_init(); diff --git a/ui/daemon/ui.c b/ui/daemon/ui.c index cec3296..93f088f 100644 --- a/ui/daemon/ui.c +++ b/ui/daemon/ui.c @@ -7,7 +7,7 @@ void sig_handler(int signo) { (void)signo; if (g_running) { - g_warn("Signal received, will stop simulator soon..."); + log_warn("Signal received, will stop simulator soon..."); g_running = false; } } @@ -28,7 +28,7 @@ void step_block(void) { float secs = (float)(end - beg) / (float)CLOCKS_PER_SEC; float steps_per_sec = (float)g_step_block / secs; - g_info("Simulator running on step %#lx @%.1f steps/s", g_steps, steps_per_sec); + log_info("Simulator running on step %#lx @%.1f steps/s", g_steps, steps_per_sec); } int main(void) { @@ -48,10 +48,10 @@ int main(void) { step_block(); } - g_info("Saving simulation..."); + log_info("Saving simulation..."); salis_save(SIM_PATH); salis_free(); - g_info("Exiting salis..."); + log_info("Exiting salis..."); return 0; } |
