summaryrefslogtreecommitdiffstats
path: root/tpu.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-07-26 22:15:15 +0200
committerLouis Burda <quent.burda@gmail.com>2023-07-26 22:15:15 +0200
commit33995e119a16fbf13c51cf3a72a6cc52d70a75a8 (patch)
tree872cb861564b452468954639851635410d714697 /tpu.c
parent0f06ef7127b669207fd8f09b88ecb660b38eb971 (diff)
downloadtis100-33995e119a16fbf13c51cf3a72a6cc52d70a75a8.tar.gz
tis100-33995e119a16fbf13c51cf3a72a6cc52d70a75a8.zip
Add support for multiple input and output ports
Diffstat (limited to 'tpu.c')
-rw-r--r--tpu.c70
1 files changed, 55 insertions, 15 deletions
diff --git a/tpu.c b/tpu.c
index 3e8dee6..dca2a72 100644
--- a/tpu.c
+++ b/tpu.c
@@ -151,6 +151,26 @@ tpu_port_deinit(struct tpu_port *port)
}
void
+tpu_io_port_init(struct tpu_io_port *io_port, char c, enum tpu_port_dir dir,
+ enum tpu_port_type type, int x, int y)
+{
+ tpu_port_init(&io_port->port);
+ io_port->type = type;
+ io_port->file = NULL;
+ io_port->dir = dir;
+ io_port->c = c;
+ io_port->x = x;
+ io_port->y = y;
+}
+
+void
+tpu_io_port_deinit(struct tpu_io_port *io_port)
+{
+ tpu_port_deinit(&io_port->port);
+ if (io_port->file) fclose(io_port->file);
+}
+
+void
tpu_init(struct tpu *tpu)
{
size_t i;
@@ -611,16 +631,26 @@ void
tis_init(struct tis *tis)
{
tpu_map_init(&tis->tpu_map);
- tpu_port_init(&tis->stdin_port);
- tpu_port_init(&tis->stdout_port);
+ memset(&tis->in_ports, 0, TIS_MAX_IO_PORTS * sizeof(void *));
+ memset(&tis->out_ports, 0, TIS_MAX_IO_PORTS * sizeof(void *));
}
void
tis_deinit(struct tis *tis)
{
+ int i;
+
tpu_map_deinit(&tis->tpu_map);
- tpu_port_deinit(&tis->stdin_port);
- tpu_port_deinit(&tis->stdout_port);
+ for (i = 0; i < TIS_MAX_IO_PORTS; i++) {
+ if (tis->in_ports[i]) {
+ tpu_io_port_deinit(tis->in_ports[i]);
+ free(tis->in_ports[i]);
+ }
+ if (tis->out_ports[i]) {
+ tpu_io_port_deinit(tis->out_ports[i]);
+ free(tis->out_ports[i]);
+ }
+ }
}
bool
@@ -647,27 +677,37 @@ tis_step(struct tis *tis)
}
void
-tis_communicate(struct tis *tis, FILE *tis_stdin, FILE *tis_stdout)
+tis_communicate(struct tis *tis)
{
+ struct tpu_io_port *io_port;
char buf[16], *s;
- int val;
-
- if (tis_stdin && tis->stdin_port.attached && !tis->stdin_port.out_set) {
- while ((s = fgets(buf, sizeof(buf), tis_stdin))) {
+ int val, i;
+
+ for (i = 0; i < TIS_MAX_IO_PORTS; i++) {
+ io_port = tis->in_ports[i];
+ if (!io_port) continue;
+ if (!io_port->port.attached || io_port->port.out_set)
+ continue;
+ if (!io_port->file) continue;
+ while ((s = fgets(buf, sizeof(buf), io_port->file))) {
if ((s = strchr(buf, '\n'))) *s = '\0';
if (!*buf) continue;
val = (int) strtol(buf, &s, 10);
if (!s || *s != '\0')
die("communicate: invalid input '%s'", buf);
- tis->stdin_port.out = val;
- tis->stdin_port.out_set = true;
+ io_port->port.out = val;
+ io_port->port.out_set = true;
break;
}
}
- if (tis->stdout_port.attached && tis->stdout_port.in_set) {
- if (tis_stdout)
- fprintf(tis_stdout, "%i\n", tis->stdout_port.in);
- tis->stdout_port.in_set = false;
+ for (i = 0; i < TIS_MAX_IO_PORTS; i++) {
+ io_port = tis->out_ports[i];
+ if (!io_port) continue;
+ if (!io_port->port.attached || !io_port->port.in_set)
+ continue;
+ if (io_port->file)
+ fprintf(io_port->file, "%i\n", io_port->port.in);
+ io_port->port.in_set = false;
}
}