1use std::sync::Arc;
2
3use num_bigint::BigUint;
4
5pub use crate::SimulatorErrorCode;
6use crate::{AbsoluteAddr, MemoryLayout, RuntimeEventBuffer, SignalRef};
7
8pub trait EventHandle: Copy + std::fmt::Debug {
15 fn id(&self) -> usize;
17
18 fn addr(&self) -> AbsoluteAddr;
20}
21
22pub trait SimBackend {
27 type Event: EventHandle;
29
30 fn eval_comb(&mut self) -> Result<(), SimulatorErrorCode>;
32
33 fn eval_apply_ff_at(&mut self, event: Self::Event) -> Result<(), SimulatorErrorCode>;
35
36 fn eval_comb_apply_ff_at(&mut self, event: Self::Event) -> Result<(), SimulatorErrorCode> {
40 self.eval_comb()?;
41 self.eval_apply_ff_at(event)
42 }
43
44 fn eval_comb_apply_ff_many_at(
49 &mut self,
50 event: Self::Event,
51 count: u64,
52 ) -> (u64, Result<(), SimulatorErrorCode>) {
53 if count == 0 {
54 return (0, Ok(()));
55 }
56 (1, self.eval_comb_apply_ff_at(event))
57 }
58
59 fn eval_only_ff_at(&mut self, event: Self::Event) -> Result<(), SimulatorErrorCode>;
61
62 fn apply_ff_at(&mut self, event: Self::Event) -> Result<(), SimulatorErrorCode>;
64
65 fn resolve_signal(&self, addr: &AbsoluteAddr) -> SignalRef;
67 fn resolve_event(&self, addr: &AbsoluteAddr) -> Self::Event;
68 fn resolve_event_opt(&self, addr: &AbsoluteAddr) -> Option<Self::Event>;
69 fn resolve_eval_only_event(&self, addr: &AbsoluteAddr) -> Option<Self::Event>;
70 fn resolve_apply_event(&self, addr: &AbsoluteAddr) -> Option<Self::Event>;
71
72 fn set<T: Copy>(&mut self, signal: SignalRef, val: T);
74 fn set_wide(&mut self, signal: SignalRef, val: BigUint);
75 fn set_four_state(&mut self, signal: SignalRef, val: BigUint, mask: BigUint);
76 fn get(&self, signal: SignalRef) -> BigUint;
77 fn get_as<T: Default + Copy>(&self, signal: SignalRef) -> T;
78 fn get_four_state(&self, signal: SignalRef) -> (BigUint, BigUint);
79
80 fn memory_as_ptr(&self) -> (*const u8, usize);
82 fn memory_as_mut_ptr(&mut self) -> (*mut u8, usize);
83 fn runtime_event_buffer_as_ptr(&self) -> (*const u8, usize);
84 fn runtime_event_buffer(&self) -> Option<Arc<RuntimeEventBuffer>> {
85 None
86 }
87 fn set_comb_capture_event_enabled(&mut self, _active_sites: &[bool]) {}
88 fn stable_region_size(&self) -> usize;
89 fn layout(&self) -> &MemoryLayout;
90
91 fn id_to_addr_slice(&self) -> &[AbsoluteAddr];
93 fn id_to_event_slice(&self) -> &[Self::Event];
94 fn num_events(&self) -> usize;
95
96 fn clear_triggered_bits(&mut self);
98 fn mark_triggered_bit(&mut self, id: usize);
99 fn get_triggered_bits(&self) -> bit_set::BitSet;
100}