diff options
Diffstat (limited to 'src/crossbar_generator.c')
| -rw-r--r-- | src/crossbar_generator.c | 327 |
1 files changed, 171 insertions, 156 deletions
diff --git a/src/crossbar_generator.c b/src/crossbar_generator.c index cae05bc..3db1adc 100644 --- a/src/crossbar_generator.c +++ b/src/crossbar_generator.c @@ -1,188 +1,203 @@ -#include <stdio.h> #include "crossbar_generator.h" +#include <stdio.h> -static int validate_config(const Crossbar_Config *config) { - printf("validating configs...\n"); - if (config == NULL) { - return -1; - } - if (config->rows == 0) { - return -1; - } - if (config->columns == 0) { - return -1; - } - if (config->input_series == NULL) { - return -1; - } - if (config->num_samples == 0) { - return -1; - } - if (config->initial_resistance == NULL) { - return -1; - } - if (config->model_path == NULL) { - return -1; - } - if (config->subcircuit_name == NULL) { - return -1; - } - if (config->load_resistance <= 0.0) { - return -1; - } - if (config->time_step <= 0.0) { - return -1; - } - if (config->stop_time <= 0.0) { - return -1; - } - if (config->print_state_nodes != 0 && config->print_state_nodes != 1) { - return -1; - } - return 0; +static int validate_config(const Crossbar_Config *config) +{ + printf("validating configs...\n"); + if (config == NULL) { + return -1; + } + if (config->rows == 0) { + return -1; + } + if (config->columns == 0) { + return -1; + } + if (config->input_series == NULL) { + return -1; + } + if (config->num_samples == 0) { + return -1; + } + if (config->initial_resistance == NULL) { + return -1; + } + if (config->model_path == NULL) { + return -1; + } + if (config->subcircuit_name == NULL) { + return -1; + } + if (config->load_resistance <= 0.0) { + return -1; + } + if (config->time_step <= 0.0) { + return -1; + } + if (config->stop_time <= 0.0) { + return -1; + } + if (config->print_state_nodes != 0 && config->print_state_nodes != 1) { + return -1; + } + return 0; } -//thus starts fprintf hell... -static int write_header(FILE *file, const Crossbar_Config *config) { - if (fprintf(file, "* Generating a crossbar with:\n" - "*Rows: %zu\n" - "*Columns: %zu\n", - config->rows, config->columns ) < 0) { - fprintf(stderr, "Failed to write header at crossbar size"); - return -1; - } +// thus starts fprintf hell... +static int write_header(FILE *file, const Crossbar_Config *config) +{ + if (fprintf(file, + "* Generating a crossbar with:\n" + "*Rows: %zu\n" + "*Columns: %zu\n", + config->rows, config->columns) < 0) { + fprintf(stderr, "Failed to write header at crossbar size"); + return -1; + } - //include the memristor model - if (fprintf(file, "\n.include \"%s\"\n", config->model_path) < 0) { - fprintf(stderr, "Faile to write header at .include memristor"); - return -1; - } + // include the memristor model + if (fprintf(file, "\n.include \"%s\"\n", config->model_path) < 0) { + fprintf(stderr, "Faile to write header at .include memristor"); + return -1; + } - return 0; + return 0; } -static int write_input_series(FILE *file, const Crossbar_Config *config) { - fprintf(file, "\n* SPIRES reservoir states\n"); +static int write_input_series(FILE *file, const Crossbar_Config *config) +{ + fprintf(file, "\n* SPIRES reservoir states\n"); - for (size_t row = 0; row < config->rows; row++) { - fprintf(file, "VROW%zu row%zu 0 PWL(", row, row); + for (size_t row = 0; row < config->rows; row++) { + fprintf(file, "VROW%zu row%zu 0 PWL(", row, row); - for (size_t sample = 0; sample < config->num_samples; sample++) { - double time = sample * config->time_step; - double state = config->input_series[sample * config->rows + row]; + for (size_t sample = 0; sample < config->num_samples; + sample++) { + double time = sample * config->time_step; + double state = + config->input_series[sample * config->rows + row]; - //scale neuron states to safe read voltages - double voltage = state * 0.1; + double voltage = state; - fprintf(file, "%.17g %.17g ", time, voltage); - } - fprintf(file, ")\n"); - } - return ferror(file) ? -1 : 0; + fprintf(file, "%.17g %.17g ", time, voltage); + } + fprintf(file, ")\n"); + } + return ferror(file) ? -1 : 0; } -static int write_memristor_array(FILE *file, const Crossbar_Config *config) { - if (fprintf(file, "\n* Memristor Array\n") < 0) { - fprintf(stderr, "Failed to write memristor array comment label thing"); - return -1; - } +static int write_memristor_array(FILE *file, const Crossbar_Config *config) +{ + if (fprintf(file, "\n* Memristor Array\n") < 0) { + fprintf(stderr, + "Failed to write memristor array comment label thing"); + return -1; + } - for (size_t row = 0; row < config->rows; row++) { - for (size_t column = 0; column < config->columns; column++) { - //initial_resistance here is done wrong, need to fix - if (fprintf(file, - "X%zu%zu row%zu col%zu %s" - " PARAMS: Rinit=%.0f\n", row, column, row, column, - config->subcircuit_name, - config->initial_resistance[row * config->columns + column]) < 0) { - fprintf(stderr, "Failed to write memristor array"); - return -1; - } - } - printf("\n"); - } - return 0; + for (size_t row = 0; row < config->rows; row++) { + for (size_t column = 0; column < config->columns; column++) { + // initial_resistance here is done wrong, need to fix + if (fprintf(file, + "X%zu%zu row%zu col%zu %s" + " PARAMS: Rinit=%.12g\n", + row, column, row, column, + config->subcircuit_name, + config->initial_resistance + [row * config->columns + column]) < 0) { + fprintf(stderr, + "Failed to write memristor array"); + return -1; + } + } + } + return 0; } -static int write_column_loads(FILE *file, const Crossbar_Config *config) { - if (fprintf(file, "\n* Column Loads\n") < 0) { - fprintf(stderr, "Failed to write column loads comment label thing"); - } - - for (size_t column = 0; column < config->columns; column++) { - if (fprintf(file, "RLOAD%zu col%zu 0 %.0f\n", column, column, - config->load_resistance) < 0) { - fprintf(stderr, "Failed to write column loads"); - return -1; - } - } - return 0; +static int write_column_loads(FILE *file, const Crossbar_Config *config) +{ + if (fprintf(file, "\n* Column Loads\n") < 0) { + fprintf(stderr, + "Failed to write column loads comment label thing"); + } + + for (size_t column = 0; column < config->columns; column++) { + if (fprintf(file, "RLOAD%zu col%zu 0 %.0f\n", column, column, + config->load_resistance) < 0) { + fprintf(stderr, "Failed to write column loads"); + return -1; + } + } + return 0; } -static int write_simulation(FILE *file, const Crossbar_Config *config) { - if (fprintf(file, "\n* Simulation\n") < 0) { - fprintf(stderr, "Failed to write simulation header"); - return -1; - } - - if (fprintf(file, ".tran %.17g %.17g uic\n.control\nrun\n", - config->time_step, config->stop_time) < 0) { - fprintf(stderr, "Failed to write simulation command"); - return -1; - } - return 0; +static int write_simulation(FILE *file, const Crossbar_Config *config) +{ + if (fprintf(file, "\n* Simulation\n") < 0) { + fprintf(stderr, "Failed to write simulation header"); + return -1; + } + + if (fprintf(file, ".tran %.17g %.17g uic\n.control\nrun\n", + config->time_step, config->stop_time) < 0) { + fprintf(stderr, "Failed to write simulation command"); + return -1; + } + return 0; } -static int write_save_date(FILE *file, const Crossbar_Config *config) { - fprintf(file, "linearize"); - for (int column = 0; column < config->columns; column++) { - if (fprintf(file, " v(col%zu)", column) < 0) { - fprintf(stderr, "Failed to write linearize statements"); - return -1; - } - } +static int write_save_date(FILE *file, const Crossbar_Config *config) +{ + fprintf(file, "linearize"); + for (int column = 0; column < config->columns; column++) { + if (fprintf(file, " v(col%zu)", column) < 0) { + fprintf(stderr, "Failed to write linearize statements"); + return -1; + } + } - fprintf(file, "\nwrdata crossbar_output.dat"); - for (int column = 0; column < config->columns; column++) { - fprintf(file, " v(col%zu)", column); //ive given up on error checking - //Im doing too much of it - } + fprintf(file, "\nwrdata crossbar_output.dat"); + for (int column = 0; column < config->columns; column++) { + fprintf(file, " v(col%zu)", + column); // ive given up on error checking + // Im doing too much of it + } - if (fprintf(file, "\n.endc\n.end") < 0) { - fprintf(stderr, "Failed to write end statements"); - return -1; - } - return 0; + if (fprintf(file, "\n.endc\n.end") < 0) { + fprintf(stderr, "Failed to write end statements"); + return -1; + } + return 0; } int generate_crossbar(const char *output_filename, - const Crossbar_Config *config) { - if (validate_config(config) < 0) { - fprintf(stderr, "invalid config"); - return -1; - } + const Crossbar_Config *config) +{ + if (validate_config(config) < 0) { + fprintf(stderr, "invalid config"); + return -1; + } - FILE *file = fopen(output_filename, "w"); + FILE *file = fopen(output_filename, "w"); - if (file == NULL) { - fprintf(stderr, "could not create file"); - return -1; - } + if (file == NULL) { + fprintf(stderr, "could not create file"); + return -1; + } - if (write_header(file, config) != 0 || - write_input_series(file, config) != 0 || - write_memristor_array(file, config) != 0 || - write_column_loads(file, config) != 0 || - write_simulation(file, config) != 0 || - write_save_date(file, config) != 0) { + if (write_header(file, config) != 0 || + write_input_series(file, config) != 0 || + write_memristor_array(file, config) != 0 || + write_column_loads(file, config) != 0 || + write_simulation(file, config) != 0 || + write_save_date(file, config) != 0) { - fclose(file); - return -1; - } + fclose(file); + return -1; + } - if (fclose(file) != 0) { - fprintf(stderr, "failed to close output file"); - return -1; - } - return 0; + if (fclose(file) != 0) { + fprintf(stderr, "failed to close output file"); + return -1; + } + return 0; } |
