bitsy_lang/sim/ext/
terminal.rs

1use super::*;
2use std::io::Write;
3
4#[derive(Debug)]
5pub struct Terminal(char, std::fs::File, bool);
6
7impl Terminal {
8  pub fn new() -> Terminal {
9      let file = std::fs::File::create("terminal.txt").unwrap();
10      Terminal('\0', file, false)
11  }
12}
13
14impl ExtInstance for Terminal {
15    fn incoming_ports(&self) -> Vec<PortName> { vec!["out_data".to_string(), "out_valid".to_string()] }
16    fn outgoing_ports(&self) -> Vec<PortName> { vec![] }
17
18    fn update(&mut self, port: &PortName, value: Value) -> Vec<(PortName, Value)> {
19        if value.is_x() {
20            return vec![];
21        }
22        if port == "out_valid" {
23            self.2 = value.to_bool().unwrap();
24        } else if port == "out_data" {
25            if let Some(n) = value.to_u64() {
26                if n < 256 {
27                    if let Ok(k) = n.try_into() {
28                        if let Some(ch) = char::from_u32(k) {
29                            self.0 = ch;
30                        }
31                    }
32                }
33            }
34        }
35        vec![]
36    }
37
38    fn clock(&mut self) -> Vec<(PortName, Value)> {
39        if self.2 {
40            let s = self.0;
41            eprintln!("TERMINAL OUTPUT: {}", s as u32);
42            write!(self.1, "{s}").unwrap();
43            self.1.flush().unwrap();
44        }
45        vec![]
46    }
47
48    fn reset(&mut self) -> Vec<(PortName, Value)> {
49        if self.2 {
50            let s = self.0;
51            write!(self.1, "{s}").unwrap();
52            self.1.flush().unwrap();
53        }
54        vec![]
55    }
56}