diff --git a/src/lib.rs b/src/lib.rs index fc306fc..c4caa1f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ mod vcd; pub use vcd::parse::parse_vcd; -pub use vcd::signal::{Signal, SignalValue}; +pub use vcd::signal::{Signal, SignalType, SignalValue}; pub use vcd::types::{Metadata, Timescale, Version}; pub use vcd::types::{ScopeIdx, SignalIdx, VCD}; diff --git a/src/vcd/parse/events.rs b/src/vcd/parse/events.rs index 53793a8..32c8f7a 100644 --- a/src/vcd/parse/events.rs +++ b/src/vcd/parse/events.rs @@ -130,7 +130,7 @@ pub(super) fn parse_events( match signal { SignalEnum::Data { name, - sig_type, + signal_type, ref mut signal_error, num_bits, num_bytes, @@ -158,7 +158,7 @@ pub(super) fn parse_events( let (f, l) = (file!(), line!()); let msg = format!("\ Error near {f}:{l}. The bitwidth for signal {name} \ - of sig_type {sig_type:?} is expected to be `{num_bits}` not \ + of signal_type {signal_type:?} is expected to be `{num_bits}` not \ `{observed_num_bits}`. \ This error occurred while parsing the vcd file at \ {cursor:?}"); @@ -171,7 +171,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - must be specified for a signal of type {sig_type:?}. \ + must be specified for a signal of type {signal_type:?}. \ This error occurred while parsing the vcd file at \ {cursor:?}" ); @@ -245,7 +245,7 @@ pub(super) fn parse_events( match signal { SignalEnum::Data { name, - sig_type, + signal_type, ref mut signal_error, num_bits, num_bytes, @@ -268,7 +268,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - of sig_type {sig_type:?} is expected to be `1` not \ + of signal_type {signal_type:?} is expected to be `1` not \ `{num_bits}`. \ This error occurred while parsing the vcd file at \ {cursor:?}" @@ -282,7 +282,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - must be specified for a signal of type {sig_type:?}. \ + must be specified for a signal of type {signal_type:?}. \ This error occurred while parsing the vcd file at \ {cursor:?}" ); @@ -336,7 +336,7 @@ pub(super) fn parse_events( match signal { SignalEnum::Data { name, - sig_type, + signal_type, ref mut signal_error, num_bits, num_bytes, @@ -359,7 +359,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - of sig_type {sig_type:?} is expected to be `1` not \ + of signal_type {signal_type:?} is expected to be `1` not \ `{num_bits}`. \ This error occurred while parsing the vcd file at \ {cursor:?}" @@ -373,7 +373,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - must be specified for a signal of type {sig_type:?}. \ + must be specified for a signal of type {signal_type:?}. \ This error occurred while parsing the vcd file at \ {cursor:?}" ); @@ -430,7 +430,7 @@ pub(super) fn parse_events( match signal { SignalEnum::Data { name, - sig_type, + signal_type, ref mut signal_error, num_bits, string_vals, @@ -452,7 +452,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - of sig_type {sig_type:?} is expected to be `1` not \ + of signal_type {signal_type:?} is expected to be `1` not \ `{num_bits}`. \ This error occurred while parsing the vcd file at \ {cursor:?}" @@ -466,7 +466,7 @@ pub(super) fn parse_events( let msg = format!( "\ Error near {f}:{l}. The bitwidth for signal {name} \ - must be specified for a signal of type {sig_type:?}. \ + must be specified for a signal of type {signal_type:?}. \ This error occurred while parsing the vcd file at \ {cursor:?}" ); diff --git a/src/vcd/parse/scopes.rs b/src/vcd/parse/scopes.rs index 40b3cce..a84a282 100644 --- a/src/vcd/parse/scopes.rs +++ b/src/vcd/parse/scopes.rs @@ -8,7 +8,7 @@ use std::collections::HashMap; use super::super::reader::{curr_word, next_word, WordReader}; -use super::super::signal::{SigType, SignalEnum}; +use super::super::signal::{SignalEnum, SignalType}; use super::super::types::{Scope, ScopeIdx, SignalIdx, VCD}; use super::combinator_atoms::{ident, tag}; @@ -47,25 +47,25 @@ pub(super) fn parse_var( // $var parameter 3 a IDLE $end // ^^^^^^^^^ - var_type let var_type = match word { - "event" => Ok(SigType::Event), - "integer" => Ok(SigType::Integer), - "parameter" => Ok(SigType::Parameter), - "real" => Ok(SigType::Real), - "realtime" => Ok(SigType::RealTime), - "reg" => Ok(SigType::Reg), - "string" => Ok(SigType::Str), - "supply0" => Ok(SigType::Supply0), - "supply1" => Ok(SigType::Supply1), - "tri" => Ok(SigType::Tri), - "triand" => Ok(SigType::TriAnd), - "trior" => Ok(SigType::TriOr), - "trireg" => Ok(SigType::TriReg), - "tri0" => Ok(SigType::Tri0), - "tri1" => Ok(SigType::Tri1), - "time" => Ok(SigType::Time), - "wand" => Ok(SigType::WAnd), - "wire" => Ok(SigType::Wire), - "wor" => Ok(SigType::WOr), + "event" => Ok(SignalType::Event), + "integer" => Ok(SignalType::Integer), + "parameter" => Ok(SignalType::Parameter), + "real" => Ok(SignalType::Real), + "realtime" => Ok(SignalType::RealTime), + "reg" => Ok(SignalType::Reg), + "string" => Ok(SignalType::Str), + "supply0" => Ok(SignalType::Supply0), + "supply1" => Ok(SignalType::Supply1), + "tri" => Ok(SignalType::Tri), + "triand" => Ok(SignalType::TriAnd), + "trior" => Ok(SignalType::TriOr), + "trireg" => Ok(SignalType::TriReg), + "tri0" => Ok(SignalType::Tri0), + "tri1" => Ok(SignalType::Tri1), + "time" => Ok(SignalType::Time), + "wand" => Ok(SignalType::WAnd), + "wire" => Ok(SignalType::Wire), + "wor" => Ok(SignalType::WOr), _ => { let err = format!( "Error near {}:{} \ @@ -85,13 +85,22 @@ pub(super) fn parse_var( // $var parameter 3 a IDLE $end // ^ - num_bits let num_bits = match var_type { - SigType::Integer - | SigType::Parameter - | SigType::Real - | SigType::Reg - | SigType::Wire - | SigType::Tri1 - | SigType::Time => { + SignalType::Event + | SignalType::Integer + | SignalType::Parameter + | SignalType::Reg + | SignalType::Supply0 + | SignalType::Supply1 + | SignalType::Tri + | SignalType::TriAnd + | SignalType::TriOr + | SignalType::TriReg + | SignalType::Tri0 + | SignalType::Tri1 + | SignalType::Time + | SignalType::WAnd + | SignalType::Wire + | SignalType::WOr => { let num_bits = word .parse::() .unwrap_or_else(|_| panic!("{}", parse_err)); @@ -105,7 +114,7 @@ pub(super) fn parse_var( })?; Some(num_bits) } - // for strings, we don't really care what the number of bits is + // for strings, reals, and realtimes we don't really care what the number of bits is _ => None, }; @@ -160,7 +169,7 @@ pub(super) fn parse_var( .cloned() .chain([full_signal_name]) .collect::>(), - sig_type: var_type, + signal_type: var_type, signal_error: None, num_bits, num_bytes, diff --git a/src/vcd/signal.rs b/src/vcd/signal.rs index ad20e74..e498bfb 100644 --- a/src/vcd/signal.rs +++ b/src/vcd/signal.rs @@ -11,8 +11,8 @@ use num::BigUint; #[derive(Debug, Copy, Clone)] pub struct LsbIdxOfTmstmpValOnTmln(pub(super) u32); -#[derive(Debug)] -pub enum SigType { +#[derive(Debug, Eq, PartialEq)] +pub enum SignalType { Event, Integer, Parameter, @@ -55,6 +55,11 @@ impl<'a> Signal<'a> { } } + pub fn signal_type(&self) -> Option<&SignalType> { + let Signal(signal_enum) = &self; + signal_enum.signal_type() + } + pub fn real_idx(&self) -> SignalIdx { match self.0 { SignalEnum::Data { self_idx, .. } => *self_idx, @@ -129,7 +134,7 @@ pub(super) enum SignalEnum { Data { name: String, path: Vec, - sig_type: SigType, + signal_type: SignalType, /// I've seen a 0 bit signal parameter in a xilinx /// simulation before that gets assigned 1 bit values. /// I consider this to be bad behavior. We capture such @@ -204,6 +209,15 @@ impl SignalEnum { } .clone() } + + pub fn signal_type(&self) -> Option<&SignalType> { + match self { + SignalEnum::Data { signal_type, .. } => Some(signal_type), + // TODO: Follow aliases? + SignalEnum::Alias { .. } => None, + } + .clone() + } } // helper functions ultimately used by Signal's query functions later on