if (!(ctx = calloc(1, sizeof(struct context))))
return SIGROK_ERR_MALLOC;
+
o->internal = ctx;
ctx->num_enabled_probes = 0;
+
for (l = o->device->probes; l; l = l->next) {
probe = l->data;
- if (probe->enabled)
- ctx->probelist[ctx->num_enabled_probes++] = probe->name;
+ if (!probe->enabled)
+ continue;
+ ctx->probelist[ctx->num_enabled_probes++] = probe->name;
}
ctx->probelist[ctx->num_enabled_probes] = 0;
ctx = o->internal;
switch (event_type) {
case DF_TRIGGER:
- /* TODO */
+ /* TODO: can a trigger mark be in a VCD file? */
+ *data_out = NULL;
+ *length_out = 0;
break;
case DF_END:
outlen = strlen("$dumpoff\n$end\n");
free(o->internal);
o->internal = NULL;
break;
+ default:
+ *data_out = NULL;
+ *length_out = 0;
+ break;
}
return SIGROK_OK;
unsigned int i, outsize;
int p, curbit, prevbit;
uint64_t sample, prevsample;
+ static uint64_t samplecount = 0;
char *outbuf, *c;
ctx = o->internal;
/* TODO: Are disabled probes handled correctly? */
for (i = 0; i <= length_in - ctx->unitsize; i += ctx->unitsize) {
+ samplecount++;
memcpy(&sample, data_in + i, ctx->unitsize);
+ if (i == 0)
+ prevsample = sample;
+ else
+ memcpy(&prevsample, data_in + i - 1, ctx->unitsize);
+
for (p = 0; p < ctx->num_enabled_probes; p++) {
- curbit = (sample & ((uint64_t) (1 << p))) != 0;
- if (i == 0) {
- prevbit = ~curbit;
- } else {
- memcpy(&prevsample, data_in + i - 1,
- ctx->unitsize);
- prevbit =
- (prevsample & ((uint64_t) (1 << p))) != 0;
- }
-
- /* VCD only contains deltas/changes. */
+ curbit = (sample & ((uint64_t) (1 << p))) >> p;
+ prevbit = (prevsample & ((uint64_t) (1 << p))) >> p;
+
+ /* VCD only contains deltas/changes of signals. */
if (prevbit == curbit)
continue;
- /* FIXME: Only once per sample? */
- /* TODO: Is 'i' correct here? */
+ /* Output which signal changed to which value. */
c = outbuf + strlen(outbuf);
- sprintf(c, "#%i\n%i%c\n", i, curbit, (char)('!' + p));
+ sprintf(c, "#%" PRIu64 "\n%i%c\n", samplecount,
+ curbit, (char)('!' + p));
}
/* TODO: Use realloc() if strlen(outbuf) is almost "full"... */
struct output_format output_vcd = {
"vcd",
"Value Change Dump (VCD)",
+ DF_LOGIC,
init,
data,
event,