aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2026-05-25 21:36:50 +0200
committerPaul Oliver <contact@pauloliver.dev>2026-05-25 21:38:20 +0200
commitbace2d7f20acc609d552a80bb018939d5e8afab8 (patch)
tree0525710979c3342a2ed74fc675c192cb9b0c7870
parent54342ed0cc61585d953183ec29309eb0db846b72 (diff)
Save file compression and data aggregation always enabled
-rw-r--r--arch/dummy/arch.c2
-rw-r--r--arch/v1/arch.c37
-rw-r--r--core/compress.c2
-rw-r--r--core/logger.c8
-rw-r--r--core/salis.c70
-rw-r--r--core/sql.c6
-rw-r--r--data/client.cpp24
-rw-r--r--data/server.c24
-rwxr-xr-xsalis.py32
-rw-r--r--ui/curses/ui.c9
-rw-r--r--ui/daemon/ui.c8
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(&params);
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]);
diff --git a/core/sql.c b/core/sql.c
index fab6eeb..4cfa1b0 100644
--- a/core/sql.c
+++ b/core/sql.c
@@ -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) {
diff --git a/salis.py b/salis.py
index a33e0a4..bb2f35a 100755
--- a/salis.py
+++ b/salis.py
@@ -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;
}