diff options
| author | Louis Burda <quent.burda@gmail.com> | 2023-07-26 22:15:15 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2023-07-26 22:15:15 +0200 |
| commit | 33995e119a16fbf13c51cf3a72a6cc52d70a75a8 (patch) | |
| tree | 872cb861564b452468954639851635410d714697 /tpu.c | |
| parent | 0f06ef7127b669207fd8f09b88ecb660b38eb971 (diff) | |
| download | tis100-33995e119a16fbf13c51cf3a72a6cc52d70a75a8.tar.gz tis100-33995e119a16fbf13c51cf3a72a6cc52d70a75a8.zip | |
Add support for multiple input and output ports
Diffstat (limited to 'tpu.c')
| -rw-r--r-- | tpu.c | 70 |
1 files changed, 55 insertions, 15 deletions
@@ -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; } } |
