summaryrefslogtreecommitdiff
path: root/core/salis.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/salis.c')
-rw-r--r--core/salis.c67
1 files changed, 27 insertions, 40 deletions
diff --git a/core/salis.c b/core/salis.c
index 6cc0725..d5ad45b 100644
--- a/core/salis.c
+++ b/core/salis.c
@@ -37,10 +37,6 @@
// ----------------------------------------------------------------------------
// [section] macros
// ----------------------------------------------------------------------------
-#define INST_MASK 0x7f
-#define IPCM_FLAG 0x80
-#define MALL_FLAG 0x80
-
#define STEP_GROUP_TIME_MIN_MS 0x400
#define STEP_GROUP_TIME_MAX_MS 0x800
@@ -50,13 +46,13 @@
struct Core g_cores[CORES];
uint64_t g_step;
uint64_t g_sync;
-const struct Proc g_null_proc;
+static const struct Proc g_null_proc;
-char g_asav_pbuf[AUTOSAVE_NAME_LEN];
-char g_evas_pbuf[EVA_SAVE_NAME_LEN];
+static char g_asav_pbuf[AUTOSAVE_NAME_LEN];
+static char g_evas_pbuf[EVA_SAVE_NAME_LEN];
-atomic_bool g_running;
-thrd_t g_thrd;
+static atomic_bool g_running;
+static thrd_t g_thrd;
// ----------------------------------------------------------------------------
// [section] memory vector functions
@@ -71,10 +67,10 @@ bool mvec_is_alloc(const struct Core *core, uint64_t addr) {
assert(core);
#if defined(ARCH_SPEC_MVEC_LOOP)
- return core->mvec[mvec_loop(addr)] & MALL_FLAG ? true : false;
+ return core->mvec[mvec_loop(addr)] & SALIS_MALL_FLAG ? true : false;
#else
if (addr < MVEC_SIZE) {
- return core->mvec[addr] & MALL_FLAG ? true : false;
+ return core->mvec[addr] & SALIS_MALL_FLAG ? true : false;
} else {
return true;
}
@@ -92,7 +88,7 @@ void mvec_alloc(struct Core *core, uint64_t addr) {
uint64_t loop_addr = addr;
#endif
- core->mvec[loop_addr] |= MALL_FLAG;
+ core->mvec[loop_addr] |= SALIS_MALL_FLAG;
core->aeva.data[loop_addr]++;
core->mall++;
}
@@ -109,33 +105,19 @@ void mvec_free(struct Core *core, uint64_t addr) {
uint64_t loop_addr = addr;
#endif
- core->mvec[loop_addr] ^= MALL_FLAG;
+ core->mvec[loop_addr] ^= SALIS_MALL_FLAG;
core->aeva.data[loop_addr]++;
core->mall--;
}
-uint8_t mvec_get_byte(const struct Core *core, uint64_t addr) {
- assert(core);
-
-#if defined(ARCH_SPEC_MVEC_LOOP)
- return core->mvec[mvec_loop(addr)];
-#else
- if (addr < MVEC_SIZE) {
- return core->mvec[addr];
- } else {
- return 0;
- }
-#endif
-}
-
uint8_t mvec_get_inst(const struct Core *core, uint64_t addr) {
assert(core);
#if defined(ARCH_SPEC_MVEC_LOOP)
- return core->mvec[mvec_loop(addr)] & INST_MASK;
+ return core->mvec[mvec_loop(addr)] & ARCH_INST_MASK;
#else
if (addr < MVEC_SIZE) {
- return core->mvec[addr] & INST_MASK;
+ return core->mvec[addr] & ARCH_INST_MASK;
} else {
return 0;
}
@@ -144,14 +126,14 @@ uint8_t mvec_get_inst(const struct Core *core, uint64_t addr) {
void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) {
assert(core);
- assert(inst < ARCH_INST_CAP);
+ assert(inst < ARCH_INST_COUNT);
#if defined(ARCH_SPEC_MVEC_LOOP)
- core->mvec[mvec_loop(addr)] &= MALL_FLAG;
+ core->mvec[mvec_loop(addr)] &= SALIS_MALL_FLAG;
core->mvec[mvec_loop(addr)] |= inst;
#else
assert(addr < MVEC_SIZE);
- core->mvec[addr] &= MALL_FLAG;
+ core->mvec[addr] &= SALIS_MALL_FLAG;
core->mvec[addr] |= inst;
#endif
}
@@ -160,7 +142,7 @@ void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) {
void mvec_flip_bit(struct Core *core, uint64_t addr, int bit) {
assert(core);
assert(bit < 8);
- core->mvec[addr] ^= (1 << bit) & INST_MASK;
+ core->mvec[addr] ^= (1 << bit) & ARCH_INST_MASK;
}
#endif
@@ -250,7 +232,7 @@ void muta_cosmic_ray(struct Core *core) {
#if defined(ARCH_SPEC_MUTA_FLIP)
mvec_flip_bit(core, a, (int)(b % 8));
#else
- mvec_set_inst(core, a, b & INST_MASK);
+ mvec_set_inst(core, a, b & ARCH_INST_MASK);
#endif
}
}
@@ -474,8 +456,8 @@ static void core_pull_ipcm(struct Core *core) {
uint8_t *iinst = &core->iviv[core->ivpt];
uint64_t *iaddr = &core->ivav[core->ivpt];
- if ((*iinst & IPCM_FLAG) != 0) {
- mvec_set_inst(core, *iaddr, *iinst & INST_MASK);
+ if ((*iinst & SALIS_IPCM_FLAG) != 0) {
+ mvec_set_inst(core, *iaddr, *iinst & ARCH_INST_MASK);
*iinst = 0;
*iaddr = 0;
}
@@ -487,12 +469,12 @@ static void core_pull_ipcm(struct Core *core) {
void core_push_ipcm(struct Core *core, uint8_t inst, uint64_t addr) {
assert(core);
assert(core->ivpt < SYNC_INTERVAL);
- assert((inst & IPCM_FLAG) == 0);
+ assert((inst & SALIS_IPCM_FLAG) == 0);
uint8_t *iinst = &core->iviv[core->ivpt];
uint64_t *iaddr = &core->ivav[core->ivpt];
assert(*iinst == 0);
assert(*iaddr == 0);
- *iinst = inst | IPCM_FLAG;
+ *iinst = inst | SALIS_IPCM_FLAG;
*iaddr = addr;
}
@@ -622,7 +604,7 @@ static void core_validate(struct Core *core) {
for (uint64_t i = 0; i < SYNC_INTERVAL; i++) {
uint8_t iinst = core->iviv[i];
- if ((iinst & IPCM_FLAG) == 0) {
+ if ((iinst & SALIS_IPCM_FLAG) == 0) {
uint64_t iaddr = core->ivav[i];
assert(iinst == 0);
assert(iaddr == 0);
@@ -1067,6 +1049,12 @@ void salis_join(void) {
thrd_join(g_thrd, NULL);
}
+void salis_wait(void) {
+ assert(!atomic_load_explicit(&g_running, memory_order_relaxed));
+ log_trace("Waiting for main thread");
+ thrd_join(g_thrd, NULL);
+}
+
void salis_signal_stop(void) {
assert(atomic_load_explicit(&g_running, memory_order_relaxed));
log_trace("Signaling main thread to stop");
@@ -1083,7 +1071,6 @@ void salis_step(uint64_t steps) {
}
g_step++;
-
salis_check_intervals();
}