//! Traits to define semantics for temporal logic specifications use argus_core::prelude::*; /// A trace is a collection of signals /// /// # Example /// /// An example of a `Trace` may be: /// /// ```rust /// use argus_core::signals::{Signal, AnySignal}; /// use argus_semantics::Trace; /// /// struct MyTrace { /// x: Signal, /// y: Signal, /// } /// /// impl Trace for MyTrace { /// fn signal_names(&self) -> Vec<&str> { /// vec!["x", "y"] /// } /// /// fn get(&self, name: &str) -> Option<&Signal> { /// let sig: &dyn AnySignal = match name { /// "x" => &self.x, /// "y" => &self.y, /// _ => return None, /// }; /// sig.as_any().downcast_ref::>() /// } /// } /// /// let trace = MyTrace { /// x: Signal::constant(true), /// y: Signal::constant(2), /// }; /// let names = trace.signal_names(); /// /// assert!(names == &["x", "y"] || names == &["y", "x"]); /// assert!(matches!(trace.get::("x"), Some(Signal::Constant { value: true }))); /// assert!(matches!(trace.get::("y"), Some(Signal::Constant { value: 2 }))); /// ``` pub trait Trace { /// Get the list of signal names contained within the trace. fn signal_names(&self) -> Vec<&str>; /// Query a signal using its name fn get(&self, name: &str) -> Option<&Signal>; }