From af86ead5c75e612d664b9f74e851475e25255e02 Mon Sep 17 00:00:00 2001 From: Andrea Bellizzi Date: Mon, 10 Jul 2023 12:39:30 +0200 Subject: [PATCH 1/2] handle [ in var declaration and ( in scope declaration some var are declared like: $var integer 32 p&! varname [1423][2] $end some scope are declared like: $scope begin scope_name(432) $end which is out of spec but seen in vcd dump --- vcd/reader.py | 59 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/vcd/reader.py b/vcd/reader.py index 59bc107..eaf4916 100644 --- a/vcd/reader.py +++ b/vcd/reader.py @@ -433,26 +433,37 @@ def take_escaped_identifier(self) -> List[int]: return identifier - def take_bit_index(self) -> Union[int, Tuple[int, int]]: + def take_bit_index(self) -> Tuple[int, Union[None, str, int, Tuple[int, int]]]: self.skip_ws() - index0 = self.take_decimal() - index1: Optional[int] - - c = self.skip_ws() - if c == 58: # ':' - self.advance() - self.skip_ws() - index1 = self.take_decimal() + c = self.buf[self.pos] + ident = None + if ( + 65 <= c <= 90 # 'A' <= c <= 'Z' + or 97 <= c <= 122 # 'a' - 'z' + or c == 95 # '_' + ): + ident = self.take_identifier() else: - index1 = None + index0 = self.take_decimal() + index1: Optional[int] + + c = self.skip_ws() + if c == 58: # ':' + self.advance() + self.skip_ws() + index1 = self.take_decimal() + else: + index1 = None c = self.skip_ws() if c == 93: # ']' - self.advance(raise_on_eof=False) - if index1 is None: - return index0 + c = self.advance(raise_on_eof=False) + if ident: + return [c, ident] + elif index1 is None: + return [c, index0] else: - return (index0, index1) + return [c, (index0, index1)] else: raise VCDParseError(self.loc, 'Expected bit index to terminate with "]"') @@ -599,6 +610,12 @@ def _parse_token(s: _TokenizerState) -> Token: s.skip_ws() scope_ident = s.take_identifier() + if s.buf[s.pos] == 40: # ( + # get scope like this $scope begin scope_name(432) $end which is out of spec but seen in vcd dump + s.advance() + dec = s.take_decimal() + s.advance() #skip ) + scope_ident += str(dec) s.take_end() @@ -661,13 +678,23 @@ def _parse_token(s: _TokenizerState) -> Token: ident = s.take_identifier() bit_index: Union[None, int, Tuple[int, int]] + bit_index_and_char: Tuple[int, Union[None, str, int, Tuple[int, int]]] c = s.skip_ws() if c == 91: # '[' s.advance() - bit_index = s.take_bit_index() + bit_index_and_char = s.take_bit_index() + bit_index = bit_index_and_char[1] + c = bit_index_and_char[0] else: bit_index = None - + + while c == 91: + #format is like $var integer 32 p&! varname [1423][2] $end + ident += f'[{bit_index}]' + s.advance() + bit_index_and_char = s.take_bit_index() + bit_index = bit_index_and_char[1] + c = bit_index_and_char[0] s.take_end() var_decl = VarDecl(type_, size, id_code, ident, bit_index) return Token(TokenKind.VAR, s.span(start), var_decl) From be9ddeaa3215afa97bc57a4f4c0d86179cf66675 Mon Sep 17 00:00:00 2001 From: Andrea Bellizzi Date: Tue, 18 Jul 2023 08:13:03 +0200 Subject: [PATCH 2/2] Update reader.py to handle [ in scope identifier --- vcd/reader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vcd/reader.py b/vcd/reader.py index eaf4916..d65aa04 100644 --- a/vcd/reader.py +++ b/vcd/reader.py @@ -610,8 +610,8 @@ def _parse_token(s: _TokenizerState) -> Token: s.skip_ws() scope_ident = s.take_identifier() - if s.buf[s.pos] == 40: # ( - # get scope like this $scope begin scope_name(432) $end which is out of spec but seen in vcd dump + if s.buf[s.pos] in [40, 91]: # ( [ + # get scope like this $scope begin scope_name(432) or scope_name[432] $end which is out of spec but seen in vcd dump s.advance() dec = s.take_decimal() s.advance() #skip )