bitsy_lang/sim/ext/
terminal.rs1use 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}