diff options
Diffstat (limited to 'src/crossbar_generator.c')
| -rw-r--r-- | src/crossbar_generator.c | 140 |
1 files changed, 62 insertions, 78 deletions
diff --git a/src/crossbar_generator.c b/src/crossbar_generator.c index 4bf6746..2633230 100644 --- a/src/crossbar_generator.c +++ b/src/crossbar_generator.c @@ -3,47 +3,19 @@ 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) { + if (!config || config->rows == 0 || config->columns == 0 || + !config->input_series || config->num_samples == 0 || + !config->initial_resistance || !config->model_path || + !config->subcircuit_name || config->load_resistance <= 0.0 || + config->time_step <= 0.0 || config->stop_time <= 0.0 || + (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, @@ -51,13 +23,12 @@ static int write_header(FILE *file, const Crossbar_Config *config) "*Rows: %zu\n" "*Columns: %zu\n", config->rows, config->columns) < 0) { - fprintf(stderr, "Failed to write header at crossbar size"); + fprintf(stderr, "Failed to write crossbar header\n"); 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"); + fprintf(stderr, "Failed to write model include\n"); return -1; } @@ -66,35 +37,42 @@ static int write_header(FILE *file, const Crossbar_Config *config) static int write_input_series(FILE *file, const Crossbar_Config *config) { - fprintf(file, "\n* SPIRES reservoir states\n"); + if (fprintf(file, "\n* SPIRES reservoir states\n") < 0) { + return -1; + } for (size_t row = 0; row < config->rows; row++) { - fprintf(file, "VROW%zu row%zu 0 PWL(", row, row); + if (fprintf(file, "VROW%zu row%zu 0 PWL(", row, row) < 0) { + return -1; + } for (size_t sample = 0; sample < config->num_samples; sample++) { double time = sample * config->time_step; - double state = + double voltage = config->input_series[sample * config->rows + row]; - - double voltage = state; - - fprintf(file, "%.17g %.17g ", time, voltage); + if (fprintf(file, "%.17g %.17g ", time, voltage) < 0) { + return -1; + } + } + if (fprintf(file, ")\n") < 0) { + return -1; } - fprintf(file, ")\n"); } - return ferror(file) ? -1 : 0; + return 0; } static int write_external_inputs(FILE *file, const Crossbar_Config *config) { - if (fprintf(file, "\n* Online SPIRES reservoir states\n") < 0) + if (fprintf(file, "\n* Online SPIRES reservoir states\n") < 0) { return -1; + } for (size_t row = 0; row < config->rows; row++) { if (fprintf(file, "VROW%zu row%zu 0 dc 0 external\n", row, - row) < 0) + row) < 0) { return -1; + } } return 0; } @@ -102,14 +80,12 @@ static int write_external_inputs(FILE *file, const Crossbar_Config *config) 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"); + fprintf(stderr, "Failed to write memristor array header\n"); 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=%.12g\n", @@ -118,7 +94,7 @@ static int write_memristor_array(FILE *file, const Crossbar_Config *config) config->initial_resistance [row * config->columns + column]) < 0) { fprintf(stderr, - "Failed to write memristor array"); + "Failed to write memristor array\n"); return -1; } } @@ -129,14 +105,14 @@ static int write_memristor_array(FILE *file, const Crossbar_Config *config) 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"); + fprintf(stderr, "Failed to write column-load header\n"); + return -1; } 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"); + fprintf(stderr, "Failed to write column loads\n"); return -1; } } @@ -146,37 +122,44 @@ static int write_column_loads(FILE *file, const Crossbar_Config *config) static int write_simulation(FILE *file, const Crossbar_Config *config) { if (fprintf(file, "\n* Simulation\n") < 0) { - fprintf(stderr, "Failed to write simulation header"); + fprintf(stderr, "Failed to write simulation header\n"); 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"); + fprintf(stderr, "Failed to write simulation command\n"); return -1; } return 0; } -static int write_save_date(FILE *file, const Crossbar_Config *config) +static int write_save_data(FILE *file, const Crossbar_Config *config) { - fprintf(file, "linearize"); - for (int column = 0; column < config->columns; column++) { + if (fprintf(file, "linearize") < 0) { + return -1; + } + for (size_t column = 0; column < config->columns; column++) { if (fprintf(file, " v(col%zu)", column) < 0) { - fprintf(stderr, "Failed to write linearize statements"); + fprintf(stderr, + "Failed to write linearize statement\n"); return -1; } } - fprintf(file, "\nwrdata output/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, "\nwrdata output/crossbar_output.dat") < 0) { + return -1; + } + for (size_t column = 0; column < config->columns; column++) { + if (fprintf(file, " v(col%zu)", column) < 0) { + fprintf(stderr, + "Failed to write output-data statement\n"); + return -1; + } } if (fprintf(file, "\n.endc\n.end") < 0) { - fprintf(stderr, "Failed to write end statements"); + fprintf(stderr, "Failed to write closing statements\n"); return -1; } return 0; @@ -185,15 +168,15 @@ static int write_save_date(FILE *file, const Crossbar_Config *config) int generate_crossbar(const char *output_filename, const Crossbar_Config *config) { - if (validate_config(config) < 0) { - fprintf(stderr, "invalid config"); + if (!output_filename || validate_config(config) < 0) { + fprintf(stderr, "Invalid crossbar configuration\n"); return -1; } FILE *file = fopen(output_filename, "w"); if (file == NULL) { - fprintf(stderr, "could not create file"); + fprintf(stderr, "Could not create crossbar netlist\n"); return -1; } @@ -202,14 +185,14 @@ int generate_crossbar(const char *output_filename, write_memristor_array(file, config) != 0 || write_column_loads(file, config) != 0 || write_simulation(file, config) != 0 || - write_save_date(file, config) != 0) { + write_save_data(file, config) != 0) { fclose(file); return -1; } if (fclose(file) != 0) { - fprintf(stderr, "failed to close output file"); + fprintf(stderr, "Failed to close crossbar netlist\n"); return -1; } return 0; @@ -218,14 +201,14 @@ int generate_crossbar(const char *output_filename, int generate_online_crossbar(const char *output_filename, const Crossbar_Config *config) { - if (validate_config(config) < 0) { - fprintf(stderr, "invalid config"); + if (!output_filename || validate_config(config) < 0) { + fprintf(stderr, "Invalid online crossbar configuration\n"); return -1; } FILE *file = fopen(output_filename, "w"); if (file == NULL) { - fprintf(stderr, "could not create online crossbar file"); + fprintf(stderr, "Could not create online crossbar netlist\n"); return -1; } @@ -247,7 +230,8 @@ int generate_online_crossbar(const char *output_filename, } } - if (fprintf(file, "\n.end\n") < 0 || fclose(file) != 0) + if (fprintf(file, "\n.end\n") < 0 || fclose(file) != 0) { return -1; + } return 0; } |
