aboutsummaryrefslogtreecommitdiff
path: root/salis.py
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 /salis.py
parent54342ed0cc61585d953183ec29309eb0db846b72 (diff)
Save file compression and data aggregation always enabled
Diffstat (limited to 'salis.py')
-rwxr-xr-xsalis.py32
1 files changed, 6 insertions, 26 deletions
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()