};
const char *vcd_header = "\
-$date\n %s\n$end\n\
+$date\n %s$end\n\
$version\n %s\n$end\n%s\
$timescale\n %i %s\n$end\n\
$scope module %s $end\n\
int i, b, num_probes;
char *c, *samplerate_s;
char wbuf[1000], comment[128];
+ time_t t;
if (!(ctx = calloc(1, sizeof(struct context))))
return SIGROK_ERR_MALLOC;
}
/* TODO: Date: File or signals? Make y/n configurable. */
- b = snprintf(ctx->header, MAX_HEADER_LEN, vcd_header, "TODO: Date",
+ t = time(NULL);
+ b = snprintf(ctx->header, MAX_HEADER_LEN, vcd_header, ctime(&t),
PACKAGE_STRING, comment, 1, "ns", PACKAGE, (char *)&wbuf);
/* TODO: Handle snprintf() errors. */
char **data_out, uint64_t *length_out)
{
struct context *ctx;
- unsigned int offset, outsize;
+ 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 (offset = 0; offset <= length_in - ctx->unitsize;
- offset += ctx->unitsize) {
- memcpy(&sample, data_in + offset, ctx->unitsize);
+ 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 (offset == 0) {
- prevbit = ~curbit;
- } else {
- memcpy(&prevsample, data_in + offset - 1,
- ctx->unitsize);
- prevbit =
- (prevsample & ((uint64_t) (1 << p))) != 0;
- }
-
- if (prevbit != curbit) {
- /* FIXME: Only once per sample? */
- c = outbuf + strlen(outbuf);
- sprintf(c, "#%i\n", offset * 1 /* TODO */);
-
- c = outbuf + strlen(outbuf);
- sprintf(c, "%i%c\n", curbit, (char)('!' + p));
- }
+ 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;
+
+ /* Output which signal changed to which value. */
+ c = outbuf + strlen(outbuf);
+ sprintf(c, "#%" PRIu64 "\n%i%c\n", samplecount,
+ curbit, (char)('!' + p));
}
/* TODO: Use realloc() if strlen(outbuf) is almost "full"... */