1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use super::{Trace, Socket, Chip};
use std::cell::RefCell;
use std::rc::Rc;
#[derive(Default)]
pub struct Board {
traces: Vec<Rc<RefCell<Trace>>>,
sockets: Vec<Rc<RefCell<Socket>>>
}
impl Board {
pub fn new() -> Board {
Board {
traces: vec![],
sockets: vec![]
}
}
pub fn new_trace(&mut self) -> Rc<RefCell<Trace>> {
let trace = Rc::new(RefCell::new(Trace::new()));
self.traces.push(trace);
self.traces.last_mut().unwrap().clone()
}
pub fn new_socket(&mut self) -> Rc<RefCell<Socket>> {
let socket = Rc::new(RefCell::new(Socket::new()));
self.sockets.push(socket);
self.sockets.last_mut().unwrap().clone()
}
pub fn new_socket_with(&mut self, chip: Box<dyn Chip>) -> Rc<RefCell<Socket>> {
let socket = Rc::new(RefCell::new(Socket::new()));
socket.borrow_mut().plug(chip);
self.sockets.push(socket);
self.sockets.last_mut().unwrap().clone()
}
pub fn run(&mut self, time_elapsed : std::time::Duration) {
for trc in self.traces.iter_mut() {
trc.borrow_mut().communicate();
}
for skt in self.sockets.iter_mut() {
skt.borrow_mut().run(time_elapsed);
}
}
pub fn run_during(&mut self, duration: std::time::Duration, step: std::time::Duration) {
let mut elapsed = std::time::Duration::new(0,0);
while elapsed < duration {
self.run(step);
elapsed += step;
}
}
}