libsurfer/translation/
clock.rs

1use surfer_translation_types::{TranslationResult, Translator, VariableInfo, VariableValue};
2
3use crate::message::Message;
4use crate::translation::{AnyTranslator, BitTranslator};
5use crate::wave_container::{ScopeId, VarId, VariableMeta};
6
7pub struct ClockTranslator {
8    // In order to not duplicate logic, we reuse the bit translator internally
9    inner: AnyTranslator,
10}
11
12impl ClockTranslator {
13    pub fn new() -> Self {
14        Self {
15            inner: AnyTranslator::Basic(Box::new(BitTranslator {})),
16        }
17    }
18}
19
20impl Default for ClockTranslator {
21    fn default() -> Self {
22        Self::new()
23    }
24}
25
26impl Translator<VarId, ScopeId, Message> for ClockTranslator {
27    fn name(&self) -> String {
28        "Clock".to_string()
29    }
30
31    fn translate(
32        &self,
33        variable: &surfer_translation_types::VariableMeta<VarId, ScopeId>,
34        value: &VariableValue,
35    ) -> eyre::Result<TranslationResult> {
36        self.inner.translate(variable, value)
37    }
38
39    fn variable_info(&self, _variable: &VariableMeta) -> eyre::Result<VariableInfo> {
40        Ok(VariableInfo::Clock)
41    }
42
43    fn translates(&self, variable: &VariableMeta) -> eyre::Result<super::TranslationPreference> {
44        if variable.num_bits == Some(1) {
45            Ok(super::TranslationPreference::Yes)
46        } else {
47            Ok(super::TranslationPreference::No)
48        }
49    }
50}