notable near 2x speedup in load time, and near 3x reduction in memory consumption
This commit is contained in:
parent
def4b26005
commit
fd31ec1358
|
@ -21,9 +21,11 @@ fn main() -> std::io::Result<()> {
|
||||||
|
|
||||||
let file = File::open(&args.path)?;
|
let file = File::open(&args.path)?;
|
||||||
let vcd = parse_vcd(file).unwrap();
|
let vcd = parse_vcd(file).unwrap();
|
||||||
// vcd.
|
|
||||||
let elapsed = now.elapsed();
|
let elapsed = now.elapsed();
|
||||||
println!("Elapsed: {:.2?}", elapsed);
|
println!("Elapsed: {:.2?}", elapsed);
|
||||||
|
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(10));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,6 @@ pub(super) fn parse_events<'a>(
|
||||||
vcd: &'a mut VCD,
|
vcd: &'a mut VCD,
|
||||||
signal_map: &mut HashMap<String, SignalIdx>,
|
signal_map: &mut HashMap<String, SignalIdx>,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
// let hash_time = std::time::Duration::ZERO;
|
|
||||||
// let hash_time = std::time::Duration::ZERO;
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let next_word = word_reader.next_word();
|
let next_word = word_reader.next_word();
|
||||||
|
|
||||||
|
@ -18,7 +15,7 @@ pub(super) fn parse_events<'a>(
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
let (word, cursor) = next_word.unwrap();
|
let (word, cursor) = next_word!(word_reader)?;
|
||||||
let Cursor(Line(_), Word(word_in_line_idx)) = cursor;
|
let Cursor(Line(_), Word(word_in_line_idx)) = cursor;
|
||||||
// we only want to match on the first word in a line
|
// we only want to match on the first word in a line
|
||||||
if word_in_line_idx != 1 {
|
if word_in_line_idx != 1 {
|
||||||
|
@ -29,10 +26,13 @@ pub(super) fn parse_events<'a>(
|
||||||
"#" => {
|
"#" => {
|
||||||
let value = &word[1..];
|
let value = &word[1..];
|
||||||
let (f, l) = (file!(), line!());
|
let (f, l) = (file!(), line!());
|
||||||
let value = BigInt::parse_bytes(value.as_bytes(), 10).ok_or(
|
let value = BigInt::parse_bytes(value.as_bytes(), 10)
|
||||||
format!("Error near {f}:{l}. Failed to parse {value} as BigInt at {cursor:?}")
|
.ok_or(())
|
||||||
.as_str(),
|
.map_err(|_| {
|
||||||
)?;
|
format!(
|
||||||
|
"Error near {f}:{l}. Failed to parse {value} as BigInt at {cursor:?}"
|
||||||
|
)
|
||||||
|
})?;
|
||||||
let (_, mut value) = value.to_bytes_le();
|
let (_, mut value) = value.to_bytes_le();
|
||||||
// TODO : u32 helps with less memory, but should ideally likely be
|
// TODO : u32 helps with less memory, but should ideally likely be
|
||||||
// configurable.
|
// configurable.
|
||||||
|
@ -177,6 +177,7 @@ pub(super) fn parse_events<'a>(
|
||||||
(num_bits / 8) + if (num_bits % 8) > 0 { 1 } else { 0 };
|
(num_bits / 8) + if (num_bits % 8) > 0 { 1 } else { 0 };
|
||||||
|
|
||||||
while curr_num_bytes < bytes_required {
|
while curr_num_bytes < bytes_required {
|
||||||
|
// TODO: remove once library is known to be stable
|
||||||
// useful for debugging
|
// useful for debugging
|
||||||
// let err = format!("Error at {cursor:?}.\
|
// let err = format!("Error at {cursor:?}.\
|
||||||
// num_bits = {num_bits}, \
|
// num_bits = {num_bits}, \
|
||||||
|
|
|
@ -183,8 +183,7 @@ pub(super) fn parse_timescale(
|
||||||
file!(),
|
file!(),
|
||||||
line!()
|
line!()
|
||||||
)),
|
)),
|
||||||
}
|
}?;
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
(Some(scalar), unit)
|
(Some(scalar), unit)
|
||||||
} else {
|
} else {
|
||||||
|
@ -200,8 +199,7 @@ pub(super) fn parse_timescale(
|
||||||
file!(),
|
file!(),
|
||||||
line!()
|
line!()
|
||||||
)),
|
)),
|
||||||
}
|
}?;
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
(Some(scalar), unit)
|
(Some(scalar), unit)
|
||||||
}
|
}
|
||||||
|
@ -293,7 +291,7 @@ pub(super) fn parse_metadata(word_reader: &mut WordReader) -> Result<Metadata, S
|
||||||
|
|
||||||
// store date and exit loop if a match is found
|
// store date and exit loop if a match is found
|
||||||
if parsed_date.is_ok() {
|
if parsed_date.is_ok() {
|
||||||
metadata.date = Some(parsed_date.unwrap());
|
metadata.date = Some(parsed_date?);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,42 +127,3 @@ macro_rules! curr_word {
|
||||||
|
|
||||||
pub(super) use curr_word;
|
pub(super) use curr_word;
|
||||||
pub(super) use next_word;
|
pub(super) use next_word;
|
||||||
|
|
||||||
// fn previous_symbol(level: u32) -> Option<BacktraceSymbol> {
|
|
||||||
// let (trace, curr_file, curr_line) = (Backtrace::new(), file!(), line!());
|
|
||||||
// let frames = trace.frames();
|
|
||||||
// frames
|
|
||||||
// .iter()
|
|
||||||
// .flat_map(BacktraceFrame::symbols)
|
|
||||||
// .skip_while(|s| {
|
|
||||||
// s.filename()
|
|
||||||
// .map(|p| !p.ends_with(curr_file))
|
|
||||||
// .unwrap_or(true)
|
|
||||||
// || s.lineno() != Some(curr_line)
|
|
||||||
// })
|
|
||||||
// .nth(1 + level as usize)
|
|
||||||
// .cloned()
|
|
||||||
// }
|
|
||||||
|
|
||||||
// impl From<FileStatus> for String {
|
|
||||||
// fn from(f: FileStatus) -> String {
|
|
||||||
// let sym = previous_symbol(1);
|
|
||||||
// let filename = sym
|
|
||||||
// .as_ref()
|
|
||||||
// .and_then(BacktraceSymbol::filename)
|
|
||||||
// .map_or(None, |path| path.to_str())
|
|
||||||
// .unwrap_or("(Couldn't determine filename)");
|
|
||||||
// let lineno = sym
|
|
||||||
// .as_ref()
|
|
||||||
// .and_then(BacktraceSymbol::lineno)
|
|
||||||
// .map_or(None, |path| Some(path.to_string()))
|
|
||||||
// .unwrap_or("(Couldn't determine line number)".to_string());
|
|
||||||
|
|
||||||
// match f {
|
|
||||||
// FileStatus::Eof => format!(
|
|
||||||
// "Error near {filename}:{lineno} \
|
|
||||||
// No more words left in vcd file."
|
|
||||||
// ),
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
Loading…
Reference in a new issue