New parser #2

Merged
ThePerfectComputer merged 51 commits from new_parser into main 2022-08-01 21:00:00 +00:00
2 changed files with 48 additions and 7 deletions
Showing only changes of commit 594f603cbb - Show all commits

View file

@ -3,10 +3,12 @@ PROPRIETARY - Copyright - Yehowshua Immanuel
# The Beginnings of a high-performance, low memory footprint VCD Viewer in Rust for massive multi-GB waveforms # The Beginnings of a high-performance, low memory footprint VCD Viewer in Rust for massive multi-GB waveforms
## Features ## Current Features
- very fast - very fast
- loads 200MB of VCD waveform per second on an 8 core 2017 desktop CPU with NVMe storage - loads 400MB of VCD waveform per second on an 8 core 2017 desktop CPU with NVMe storage
- consumes roughly between 10 - 50MB of memory per GB of waveform - consumes roughly between 10 - 50MB of memory per GB of waveform
## Planed Features
- elegant/pretty UI - elegant/pretty UI
- can be easily ported to work in browser via webassembly - can be easily ported to work in browser via webassembly
- allows high-performance custom Rust plugins to manipulate and - allows high-performance custom Rust plugins to manipulate and

View file

@ -52,11 +52,14 @@ struct VCD {
#[derive(Debug)] #[derive(Debug)]
enum Date_Parser_State {Weekday, Month, Day, HHMMSS, Year} enum Date_Parser_State {Weekday, Month, Day, HHMMSS, Year}
#[derive(Debug)] #[derive(Debug)]
enum VCD_Parser_State { enum VCD_Parser_State {
Begin, Begin,
Date(Date_Parser_State), Date(Date_Parser_State),
Signal_Tree, Values} Parse_Version,
Parse_Signal_Tree,
Parse_Signal_Values}
struct DateBuffer { struct DateBuffer {
Weekday : String, Weekday : String,
@ -70,7 +73,7 @@ struct VCD_Parser<'a> {
date_parser_state : Date_Parser_State, date_parser_state : Date_Parser_State,
date_buffer : DateBuffer, date_buffer : DateBuffer,
vcd : &'a VCD, vcd : &'a mut VCD,
curr_scope : &'a Scope, curr_scope : &'a Scope,
curr_parent_scope : &'a Scope} curr_parent_scope : &'a Scope}
@ -90,7 +93,7 @@ impl VCD {
all_scopes : Vec::<Scope>::new()}}} all_scopes : Vec::<Scope>::new()}}}
impl<'a> VCD_Parser<'a> { impl<'a> VCD_Parser<'a> {
pub fn new(&mut self, vcd : &'a VCD) { pub fn new(&mut self, vcd : &'a mut VCD) {
self.vcd_parser_state = VCD_Parser_State::Begin; self.vcd_parser_state = VCD_Parser_State::Begin;
self.date_parser_state = Date_Parser_State::Weekday; self.date_parser_state = Date_Parser_State::Weekday;
self.vcd = vcd;} self.vcd = vcd;}
@ -100,7 +103,11 @@ impl<'a> VCD_Parser<'a> {
match state { match state {
VCD_Parser_State::Begin => { VCD_Parser_State::Begin => {
match word { match word {
"$date" => {*state = VCD_Parser_State::Date(Date_Parser_State::Weekday); Ok(())}, "$date" =>
{
*state = VCD_Parser_State::Date(Date_Parser_State::Weekday);
Ok(())
}
// "$version" => {*state = VCD_Parser_State::VERSION_ENTER; Ok(())}, // "$version" => {*state = VCD_Parser_State::VERSION_ENTER; Ok(())},
// "$timescale" => {*state = VCD_Parser_State::TIMESCALE_ENTER; Ok(())}, // "$timescale" => {*state = VCD_Parser_State::TIMESCALE_ENTER; Ok(())},
_ => Err(format!("unsure what to do with {word:?}"))}}, _ => Err(format!("unsure what to do with {word:?}"))}},
@ -124,7 +131,39 @@ impl<'a> VCD_Parser<'a> {
*state = VCD_Parser_State::Date(Date_Parser_State::Day); *state = VCD_Parser_State::Date(Date_Parser_State::Day);
Ok(()) Ok(())
} }
_ => Err(format!("unsure what to do with {state:?}")), VCD_Parser_State::Date(Date_Parser_State::Day) =>
{
self.date_buffer.Day = word.to_string();
*state = VCD_Parser_State::Date(Date_Parser_State::HHMMSS);
Ok(())
}
VCD_Parser_State::Date(Date_Parser_State::HHMMSS) =>
{
self.date_buffer.HHMMSS = word.to_string();
*state = VCD_Parser_State::Date(Date_Parser_State::Year);
Ok(())
}
VCD_Parser_State::Date(Date_Parser_State::Year) =>
{
self.date_buffer.Year = word.to_string();
// now that we've successfully parsed all the date information,
// we store it to a d
let weekday = &self.date_buffer.Weekday;
let month = &self.date_buffer.Month;
let day = &self.date_buffer.Day;
let hhmmss = &self.date_buffer.HHMMSS;
let year = &self.date_buffer.Year;
let date = &format!("{weekday} {month} {day} {hhmmss} {year}")[..];
let dt = Utc.datetime_from_str(date, "%a %b %e %T %Y").unwrap();
self.vcd.metadata.date = dt;
*state = VCD_Parser_State::Parse_Version;
Ok(())
}
_ => Err(format!("{state:?} should be unreachable within DateParser.")),
} }
} }
} }