- 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 = (ctx->prevsample & ((uint64_t) (1 << p))) >> p;
+
+ /* VCD only contains deltas/changes of signals. */
+ if (prevbit == curbit)
+ continue;
+
+ /* Output which signal changed to which value. */
+ g_string_append_printf(out, "#%" PRIu64 "\n%i%c\n",
+ (uint64_t)(((float)samplecount / ctx->samplerate)
+ * ctx->period), curbit, (char)('!' + p));