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.)
unsigned int i;
int p, curbit, prevbit, index;
uint8_t *sample;
unsigned int i;
int p, curbit, prevbit, index;
uint8_t *sample;
+ gboolean timestamp_written;
logic = packet->payload;
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
sample = logic->data + i;
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);
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;
/* 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. */
/* 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);
}
ctx->samplecount++;
memcpy(ctx->prevsample, sample, ctx->unitsize);
}