Skip to main content

libsurfer/translation/
clock.rs

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