summaryrefslogtreecommitdiff
path: root/src/crossbar_generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/crossbar_generator.c')
-rw-r--r--src/crossbar_generator.c140
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;
}