]> sigrok.org Git - libsigrok.git/commitdiff
vcd: Output timestamp only once per change.
authorDaniel Elstner <redacted>
Thu, 30 Jan 2014 20:57:49 +0000 (21:57 +0100)
committerDaniel Elstner <redacted>
Thu, 30 Jan 2014 20:57:49 +0000 (21:57 +0100)
Avoid writing a new timestamp for every changed signal if multiple
signals change state simultaneously.  Also, keep signal transitions
on the same line with their timestamp to make the output easier to
inspect in a text editor.  (VCD does not care whether newlines or
spaces are used to separate tokens.)

output/vcd.c

index ffc753281a53f0f0b45c1bea8f2a53ae95da4546..49d2d195a409e5da702de6d2b00729ff9a1c4348 100644 (file)
@@ -156,6 +156,7 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
        unsigned int i;
        int p, curbit, prevbit, index;
        uint8_t *sample;
+       gboolean timestamp_written;
 
        (void)sdi;
 
@@ -182,22 +183,37 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
        logic = packet->payload;
        for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
                sample = logic->data + i;
+               timestamp_written = FALSE;
 
                for (p = 0; p < ctx->num_enabled_probes; p++) {
                        index = g_array_index(ctx->probeindices, int, p);
-                       curbit = ((unsigned)sample[index / 8] >> (index % 8)) & 1;
-                       prevbit = ((unsigned)ctx->prevsample[index / 8] >> (index % 8)) & 1;
+
+                       curbit = ((unsigned)sample[index / 8]
+                                       >> (index % 8)) & 1;
+                       prevbit = ((unsigned)ctx->prevsample[index / 8]
+                                       >> (index % 8)) & 1;
 
                        /* VCD only contains deltas/changes of signals. */
                        if (prevbit == curbit && ctx->samplecount > 0)
                                continue;
 
+                       /* Output timestamp of subsequent signal changes. */
+                       if (!timestamp_written)
+                               g_string_append_printf(*out, "#%.0f",
+                                       (double)ctx->samplecount /
+                                               ctx->samplerate * ctx->period);
+
                        /* Output which signal changed to which value. */
-                       g_string_append_printf(*out, "#%.0f\n%i%c\n",
-                               (double)ctx->samplecount / ctx->samplerate * ctx->period,
-                               curbit, (char)('!' + p));
+                       g_string_append_c(*out, ' ');
+                       g_string_append_c(*out, '0' + curbit);
+                       g_string_append_c(*out, '!' + p);
+
+                       timestamp_written = TRUE;
                }
 
+               if (timestamp_written)
+                       g_string_append_c(*out, '\n');
+
                ctx->samplecount++;
                memcpy(ctx->prevsample, sample, ctx->unitsize);
        }