From d8989d9c7668a9c270ed024081b06ea193800cac Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Tue, 19 Jul 2022 22:05:00 -0400 Subject: [PATCH] I broke something --- src/main.rs | 5 ++--- src/vcd/parse.rs | 41 ++++++++++++++++++++++++++++++++++++++--- src/vcd/reader.rs | 6 +++--- src/vcd/types.rs | 4 ++-- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index e10377c..0995ccd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,12 +16,11 @@ struct Cli { fn main() -> std::io::Result<()> { let args = Cli::parse(); - let file = File::open(&args.path)?; let vcd = parse_vcd(file).unwrap(); - println!("printing signal tree"); - vcd.print_scopes(); + // println!("printing signal tree"); + // vcd.print_scopes(); Ok(()) } \ No newline at end of file diff --git a/src/vcd/parse.rs b/src/vcd/parse.rs index 4ab523c..77352b4 100644 --- a/src/vcd/parse.rs +++ b/src/vcd/parse.rs @@ -32,10 +32,44 @@ fn parse_events<'a>( // nothing left to do... if next_word.is_none() {break}; + let (word, cursor) = next_word.unwrap(); match &word[0..1] { - "$" => {continue} - "#" => {continue} + "$" => {} + "#" => { + let value = &word[1..]; + let time_cursor = BigInt::parse_bytes(value.as_bytes(), 10).ok_or( + format!("failed to parse {value} as BigInt at {cursor:?}").as_str())?; + vcd.cursor = time_cursor; + } + "0" => { + // 0 must be in the first word in the line + let Cursor(Line(_), Word(word_in_line_idx)) = cursor; + if word_in_line_idx == 1 { + let hash = &word[1..].to_string(); + let Signal_Idx(ref signal_idx) = signal_map.get(hash).ok_or( + format!("failed to lookup signal {hash} at {cursor:?}").as_str())?; + + // let value = 0.to_bigint().unwrap(); + // let pair = (TimeStamp(vcd.cursor.clone()), Sig_Value::Numeric(value)); + // timeline.push(pair); + let signal_idx = + { + let signal = vcd.all_signals.get(*signal_idx).unwrap(); + match signal { + Signal::Data {..} => {signal_idx} + Signal::Alias {name, signal_alias} => { + let Signal_Idx(ref signal_idx) = signal_alias; + signal_idx + + } + } + }; + + let signal = vcd.all_signals.get_mut(*signal_idx).unwrap(); + } + } + "1" => {} _ => {} } } @@ -59,7 +93,8 @@ pub fn parse_vcd(file : File) -> Result { }; parse_scopes(&mut word_gen, None, &mut vcd, &mut signal_map)?; - // parse_events(&mut word_gen, &mut vcd, &mut signal_map)?; + parse_events(&mut word_gen, &mut vcd, &mut signal_map)?; + dbg!(&vcd.cursor); Ok(vcd) } diff --git a/src/vcd/reader.rs b/src/vcd/reader.rs index f361716..a10c4ca 100644 --- a/src/vcd/reader.rs +++ b/src/vcd/reader.rs @@ -6,11 +6,11 @@ use std::io::prelude::*; use std::io; #[derive(Debug)] -struct Line(usize); +pub(super) struct Line(pub(super) usize); #[derive(Debug)] -struct Word(usize); +pub(super) struct Word(pub(super) usize); #[derive(Debug)] -pub struct Cursor(Line, Word); +pub(super) struct Cursor(pub(super) Line, pub(super) Word); impl Cursor { pub(super) fn error(&self, word : &str) -> Result<(), String> { diff --git a/src/vcd/types.rs b/src/vcd/types.rs index 6796179..edaec97 100644 --- a/src/vcd/types.rs +++ b/src/vcd/types.rs @@ -24,7 +24,7 @@ pub(super) struct Signal_Idx(pub(super) usize); pub(super) enum Sig_Type {Integer, Parameter, Real, Reg, Str, Wire, Tri1, Time} #[derive(Debug)] -pub(super) struct TimeStamp(BigInt); +pub(super) struct TimeStamp(pub(super) BigInt); #[derive(Debug)] pub(super) enum Sig_Value { @@ -61,7 +61,7 @@ pub(super) struct Scope { #[derive(Debug)] pub struct VCD { pub(super) metadata : Metadata, - pub(super) cursor : BigInt, + pub (super) cursor : BigInt, pub(super) all_signals : Vec, pub(super) all_scopes : Vec, pub(super) scope_roots : Vec}