summaryrefslogtreecommitdiff
path: root/src/crossbar_generator.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/crossbar_generator.c
parent50dbc1066944263e43c0bf4bc62f8a848e1e6eba (diff)
online crossbar inputs
Diffstat (limited to 'src/crossbar_generator.c')
-rw-r--r--src/crossbar_generator.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/crossbar_generator.c b/src/crossbar_generator.c
index 4e0b935..4bf6746 100644
--- a/src/crossbar_generator.c
+++ b/src/crossbar_generator.c
@@ -86,6 +86,19 @@ static int write_input_series(FILE *file, const Crossbar_Config *config)
return ferror(file) ? -1 : 0;
}
+static int write_external_inputs(FILE *file, const Crossbar_Config *config)
+{
+ 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)
+ return -1;
+ }
+ return 0;
+}
+
static int write_memristor_array(FILE *file, const Crossbar_Config *config)
{
if (fprintf(file, "\n* Memristor Array\n") < 0) {
@@ -201,3 +214,40 @@ int generate_crossbar(const char *output_filename,
}
return 0;
}
+
+int generate_online_crossbar(const char *output_filename,
+ const Crossbar_Config *config)
+{
+ if (validate_config(config) < 0) {
+ fprintf(stderr, "invalid config");
+ return -1;
+ }
+
+ FILE *file = fopen(output_filename, "w");
+ if (file == NULL) {
+ fprintf(stderr, "could not create online crossbar file");
+ return -1;
+ }
+
+ if (write_header(file, config) != 0 ||
+ write_external_inputs(file, config) != 0 ||
+ write_memristor_array(file, config) != 0 ||
+ write_column_loads(file, config) != 0 ||
+ fprintf(file, "\n* Online simulation\n.tran %.17g %.17g uic\n",
+ config->time_step, config->stop_time) < 0 ||
+ fprintf(file, ".save time") < 0) {
+ fclose(file);
+ return -1;
+ }
+
+ for (size_t column = 0; column < config->columns; column++) {
+ if (fprintf(file, " v(col%zu)", column) < 0) {
+ fclose(file);
+ return -1;
+ }
+ }
+
+ if (fprintf(file, "\n.end\n") < 0 || fclose(file) != 0)
+ return -1;
+ return 0;
+}