From: Daniel Elstner Date: Thu, 30 Jan 2014 20:57:49 +0000 (+0100) Subject: vcd: Output timestamp only once per change. X-Git-Tag: libsigrok-0.3.0~169 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=2b6363b433683dfc9bedb678dfe854a56b776d4d vcd: Output timestamp only once per change. 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.) --- diff --git a/output/vcd.c b/output/vcd.c index ffc75328..49d2d195 100644 --- a/output/vcd.c +++ b/output/vcd.c @@ -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); }