summaryrefslogtreecommitdiff
path: root/src/benchmark.c
diff options
context:
space:
mode:
authorYour Name <[email protected]>2026-08-28 13:42:10 -0700
committerYour Name <[email protected]>2026-08-28 13:42:10 -0700
commit8671410a0f9bdd4b405762ad4790c15d601b0fba (patch)
tree988a4169f731e680fa01d813b5be7294f1965339 /src/benchmark.c
parent50dbc1066944263e43c0bf4bc62f8a848e1e6eba (diff)
online crossbar inputs
Diffstat (limited to 'src/benchmark.c')
-rw-r--r--src/benchmark.c67
1 files changed, 65 insertions, 2 deletions
diff --git a/src/benchmark.c b/src/benchmark.c
index 0e667f2..d3427e4 100644
--- a/src/benchmark.c
+++ b/src/benchmark.c
@@ -2,6 +2,7 @@
#include "crossbar_generator.h"
#include "read_crossbar.h"
#include "spires_interface.h"
+#include "online_crossbar.h"
#include <math.h>
#include <plplot/plplot.h>
@@ -13,6 +14,68 @@
#define SPIKE_THRESHOLD 0.1
#define SPIKE_AMPLITUDE 0.1
+int run_online_benchmark(const spires_reservoir_config *config,
+ spires_reservoir *reservoir,
+ const double *input_series, size_t num_timesteps,
+ const char *model_path, const char *subcircuit_name,
+ double *predictions_out)
+{
+ if (!config || !reservoir || !input_series || num_timesteps == 0 ||
+ !model_path || !subcircuit_name || !predictions_out)
+ return -1;
+
+ Online_Crossbar_Config online_config = {
+ .num_neurons = config->num_neurons,
+ .num_outputs = config->num_outputs,
+ .num_timesteps = num_timesteps,
+ .time_step = 1.0e-6,
+ .spike_amplitude = SPIKE_AMPLITUDE,
+ .load_resistance = 50.0,
+ .r_on = 1000.0,
+ .r_off = 100000.0,
+ .model_path = model_path,
+ .subcircuit_name = subcircuit_name,
+ .netlist_path = "output/online_crossbar.cir"};
+
+ Online_Crossbar *crossbar = NULL;
+ double *state = malloc(config->num_neurons * sizeof(*state));
+ if (!state)
+ return -1;
+ if (spires_reservoir_reset(reservoir) != SPIRES_OK ||
+ online_crossbar_init(&online_config, reservoir, &crossbar) != 0 ||
+ online_crossbar_start(crossbar) != 0) {
+ free(state);
+ online_crossbar_destroy(crossbar);
+ return -1;
+ }
+
+ for (size_t timestep = 0; timestep < num_timesteps; timestep++) {
+ const double *input =
+ input_series + timestep * config->num_inputs;
+ int output_ready = 0;
+ double *previous = timestep == 0
+ ? NULL
+ : predictions_out +
+ (timestep - 1) * config->num_outputs;
+ if (spires_step(reservoir, input) != SPIRES_OK ||
+ spires_read_reservoir_state(reservoir, state) != SPIRES_OK ||
+ online_crossbar_submit(crossbar, timestep, state, previous,
+ &output_ready) != 0 ||
+ output_ready != (timestep != 0)) {
+ free(state);
+ online_crossbar_destroy(crossbar);
+ return -1;
+ }
+ }
+
+ int status = online_crossbar_finish(
+ crossbar, predictions_out +
+ (num_timesteps - 1) * config->num_outputs);
+ free(state);
+ online_crossbar_destroy(crossbar);
+ return status;
+}
+
int run_benchmark(const spires_reservoir_config *config,
spires_reservoir *reservoir,
Reservoir_State_Matrix *state_matrix, const char *model_path,
@@ -81,8 +144,8 @@ int run_benchmark(const spires_reservoir_config *config,
// crossbar parameters needed for reading
Crossbar_Output_Matrix crossbar_output = {
- .num_samples = state_matrix->num_samples,
- .num_outputs = config->num_outputs * 2,
+ // .num_samples = state_matrix->num_samples,
+ // .num_outputs = config->num_outputs * 2,
.time = NULL,
.voltages = NULL};