From 8671410a0f9bdd4b405762ad4790c15d601b0fba Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 28 Aug 2026 13:42:10 -0700 Subject: online crossbar inputs --- src/benchmark.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) (limited to 'src/benchmark.c') 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 #include @@ -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}; -- cgit v1.2.3