input/vcd: unbreak U and - values for single bit input data
authorGerhard Sittig <gerhard.sittig@gmx.net>
Sat, 17 Oct 2020 08:42:56 +0000 (10:42 +0200)
committerGerhard Sittig <gerhard.sittig@gmx.net>
Sun, 18 Oct 2020 19:19:07 +0000 (21:19 +0200)
The previous implementation already mapped L/H/U/- literals for input
data values to the 0/1/0/0 logic levels which sigrok can handle. But
missed these literals in the condition which dispatches real/integer,
bit vector, and single bit data types. Which made VCD import fail for
some of the files in the SpinalWorkshop repo.

Extend the test condition for single bit values. This unbreaks the
import of the Apb3TimerTester.vcd and ApbPwmTester.vcd files, which
contained phrases like these:

  ...
  $var reg 1 % io_apb_pwrite $end
  ...
  #0
  bUUUUUUUU !
  b0 "
  0#
  1$
  U%

and

  ...
  $var reg 8 # io_apb_paddr[7:0] $end
  $var reg 1 $ io_apb_pwrite $end
  ...
  #0
  b0 !
  0"
  b-------- #
  -$
  b-------------------------------- %
  b00000000000000000000000000000000 &
  1'

src/input/vcd.c

index e1224be0db1eefd164557936696e2b6a713d51a4..59015055e5e600c69deb4c6b6377d63308afddc8 100644 (file)
@@ -1235,6 +1235,8 @@ static uint8_t vcd_char_to_value(char bit_char, int *warn)
                return 0;
        if (bit_char == 'u')
                return 0;
+       if (bit_char == '-')
+               return 0;
 
        /* Unhandled input text. */
        return ~0;
@@ -1449,7 +1451,9 @@ static int parse_textline(const struct sr_input *in, char *lines)
                is_real = curr_first == 'r' && curr_word[1];
                is_multibit = curr_first == 'b' && curr_word[1];
                is_singlebit = curr_first == '0' || curr_first == '1';
+               is_singlebit |= curr_first == 'l' || curr_first == 'h';
                is_singlebit |= curr_first == 'x' || curr_first == 'z';
+               is_singlebit |= curr_first == 'u' || curr_first == '-';
                if (is_real) {
                        char *real_text;
                        float real_val;