vcd: Fix output for more than 8 channels.
(receive): Use probe index for sample byte selection too, not just for bit selection. Also simplify the indexing expressions a bit. This fixes the problem of incorrect output for probes indices 8 to 31. Also, use double rather than float in the timestamp calculation, and format the result directly as floating point number rather than converting it back to uint64_t. Additionally, make sure that the state of all signals is written for the very first sample in the stream. This fixes the problem that signals would be displayed as indeterminate until the first change. (context.samplecount): Make the sample counter part of the context struct, rather than keeping it as a global static.
This commit is contained in:
parent
a6c12f3f70
commit
563080a8d1
18
output/vcd.c
18
output/vcd.c
|
@ -35,6 +35,7 @@ struct context {
|
||||||
uint8_t *prevsample;
|
uint8_t *prevsample;
|
||||||
int period;
|
int period;
|
||||||
uint64_t samplerate;
|
uint64_t samplerate;
|
||||||
|
uint64_t samplecount;
|
||||||
unsigned int unitsize;
|
unsigned int unitsize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -155,7 +156,6 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int p, curbit, prevbit, index;
|
int p, curbit, prevbit, index;
|
||||||
uint8_t *sample;
|
uint8_t *sample;
|
||||||
static uint64_t samplecount = 0;
|
|
||||||
|
|
||||||
(void)sdi;
|
(void)sdi;
|
||||||
|
|
||||||
|
@ -174,31 +174,31 @@ static int receive(struct sr_output *o, const struct sr_dev_inst *sdi,
|
||||||
/* The header is still here, this must be the first packet. */
|
/* The header is still here, this must be the first packet. */
|
||||||
*out = ctx->header;
|
*out = ctx->header;
|
||||||
ctx->header = NULL;
|
ctx->header = NULL;
|
||||||
|
ctx->samplecount = 0;
|
||||||
} else {
|
} else {
|
||||||
*out = g_string_sized_new(512);
|
*out = g_string_sized_new(512);
|
||||||
}
|
}
|
||||||
|
|
||||||
logic = packet->payload;
|
logic = packet->payload;
|
||||||
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
|
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
|
||||||
samplecount++;
|
|
||||||
|
|
||||||
sample = logic->data + i;
|
sample = logic->data + i;
|
||||||
|
|
||||||
for (p = 0; p < ctx->num_enabled_probes; p++) {
|
for (p = 0; p < ctx->num_enabled_probes; p++) {
|
||||||
index = g_array_index(ctx->probeindices, int, p);
|
index = g_array_index(ctx->probeindices, int, p);
|
||||||
curbit = (sample[p / 8] & (((uint8_t) 1) << index)) >> index;
|
curbit = ((unsigned)sample[index / 8] >> (index % 8)) & 1;
|
||||||
prevbit = (ctx->prevsample[p / 8] & (((uint8_t) 1) << index)) >> index;
|
prevbit = ((unsigned)ctx->prevsample[index / 8] >> (index % 8)) & 1;
|
||||||
|
|
||||||
/* VCD only contains deltas/changes of signals. */
|
/* VCD only contains deltas/changes of signals. */
|
||||||
if (prevbit == curbit)
|
if (prevbit == curbit && ctx->samplecount > 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Output which signal changed to which value. */
|
/* Output which signal changed to which value. */
|
||||||
g_string_append_printf(*out, "#%" PRIu64 "\n%i%c\n",
|
g_string_append_printf(*out, "#%.0f\n%i%c\n",
|
||||||
(uint64_t)(((float)samplecount / ctx->samplerate)
|
(double)ctx->samplecount / ctx->samplerate * ctx->period,
|
||||||
* ctx->period), curbit, (char)('!' + p));
|
curbit, (char)('!' + p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx->samplecount++;
|
||||||
memcpy(ctx->prevsample, sample, ctx->unitsize);
|
memcpy(ctx->prevsample, sample, ctx->unitsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue