output/vcd: use new API
This commit is contained in:
parent
2474d87e8c
commit
d5585e32dd
81
output/vcd.c
81
output/vcd.c
|
@ -37,7 +37,6 @@
|
||||||
|
|
||||||
struct context {
|
struct context {
|
||||||
int num_enabled_probes;
|
int num_enabled_probes;
|
||||||
int unitsize;
|
|
||||||
char *probelist[SR_MAX_NUM_PROBES + 1];
|
char *probelist[SR_MAX_NUM_PROBES + 1];
|
||||||
int *prevbits;
|
int *prevbits;
|
||||||
GString *header;
|
GString *header;
|
||||||
|
@ -79,7 +78,6 @@ static int init(struct sr_output *o)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->probelist[ctx->num_enabled_probes] = 0;
|
ctx->probelist[ctx->num_enabled_probes] = 0;
|
||||||
ctx->unitsize = (ctx->num_enabled_probes + 7) / 8;
|
|
||||||
ctx->header = g_string_sized_new(512);
|
ctx->header = g_string_sized_new(512);
|
||||||
num_probes = g_slist_length(o->sdi->probes);
|
num_probes = g_slist_length(o->sdi->probes);
|
||||||
|
|
||||||
|
@ -146,59 +144,51 @@ static int init(struct sr_output *o)
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int event(struct sr_output *o, int event_type, uint8_t **data_out,
|
static GString *recv(struct sr_output *o, const struct sr_dev_inst *sdi,
|
||||||
uint64_t *length_out)
|
const struct sr_datafeed_packet *packet)
|
||||||
{
|
|
||||||
uint8_t *outbuf;
|
|
||||||
|
|
||||||
switch (event_type) {
|
|
||||||
case SR_DF_END:
|
|
||||||
outbuf = (uint8_t *)g_strdup("$dumpoff\n$end\n");
|
|
||||||
*data_out = outbuf;
|
|
||||||
*length_out = strlen((const char *)outbuf);
|
|
||||||
g_free(o->internal);
|
|
||||||
o->internal = NULL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*data_out = NULL;
|
|
||||||
*length_out = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int data(struct sr_output *o, const uint8_t *data_in,
|
|
||||||
uint64_t length_in, uint8_t **data_out, uint64_t *length_out)
|
|
||||||
{
|
{
|
||||||
|
const struct sr_datafeed_logic *logic;
|
||||||
struct context *ctx;
|
struct context *ctx;
|
||||||
|
GString *text;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int p, curbit, prevbit;
|
int p, curbit, prevbit;
|
||||||
uint64_t sample;
|
uint64_t sample;
|
||||||
static uint64_t samplecount = 0;
|
static uint64_t samplecount = 0;
|
||||||
GString *out;
|
gboolean first_sample;
|
||||||
int first_sample = 0;
|
|
||||||
|
|
||||||
|
(void)sdi;
|
||||||
|
|
||||||
|
if (!o || !o->internal)
|
||||||
|
return NULL;
|
||||||
ctx = o->internal;
|
ctx = o->internal;
|
||||||
out = g_string_sized_new(512);
|
|
||||||
|
if (packet->type == SR_DF_END) {
|
||||||
|
text = g_string_sized_new(16);
|
||||||
|
g_string_printf(text, "$dumpoff\n$end\n");
|
||||||
|
return text;
|
||||||
|
} else if (packet->type != SR_DF_LOGIC)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (ctx->header) {
|
if (ctx->header) {
|
||||||
/* The header is still here, this must be the first packet. */
|
/* The header is still here, this must be the first packet. */
|
||||||
g_string_append(out, ctx->header->str);
|
text = ctx->header;
|
||||||
g_string_free(ctx->header, TRUE);
|
|
||||||
ctx->header = NULL;
|
ctx->header = NULL;
|
||||||
first_sample = 1;
|
first_sample = TRUE;
|
||||||
|
} else {
|
||||||
|
text = g_string_sized_new(512);
|
||||||
|
first_sample = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i <= length_in - ctx->unitsize; i += ctx->unitsize) {
|
logic = packet->payload;
|
||||||
|
for (i = 0; i <= logic->length - logic->unitsize; i += logic->unitsize) {
|
||||||
samplecount++;
|
samplecount++;
|
||||||
|
|
||||||
memcpy(&sample, data_in + i, ctx->unitsize);
|
memcpy(&sample, logic->data + i, logic->unitsize);
|
||||||
|
|
||||||
if (first_sample) {
|
if (first_sample) {
|
||||||
/* First packet. We neg to make sure sample is stored. */
|
/* First packet. We neg to make sure sample is stored. */
|
||||||
ctx->prevsample = ~sample;
|
ctx->prevsample = ~sample;
|
||||||
first_sample = 0;
|
first_sample = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (p = 0; p < ctx->num_enabled_probes; p++) {
|
for (p = 0; p < ctx->num_enabled_probes; p++) {
|
||||||
|
@ -210,7 +200,7 @@ static int data(struct sr_output *o, const uint8_t *data_in,
|
||||||
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(text, "#%" PRIu64 "\n%i%c\n",
|
||||||
(uint64_t)(((float)samplecount / ctx->samplerate)
|
(uint64_t)(((float)samplecount / ctx->samplerate)
|
||||||
* ctx->period), curbit, (char)('!' + p));
|
* ctx->period), curbit, (char)('!' + p));
|
||||||
}
|
}
|
||||||
|
@ -218,9 +208,18 @@ static int data(struct sr_output *o, const uint8_t *data_in,
|
||||||
ctx->prevsample = sample;
|
ctx->prevsample = sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data_out = (uint8_t *)out->str;
|
return text;
|
||||||
*length_out = out->len;
|
}
|
||||||
g_string_free(out, FALSE);
|
|
||||||
|
static int cleanup(struct sr_output *o)
|
||||||
|
{
|
||||||
|
struct context *ctx;
|
||||||
|
|
||||||
|
if (!o || !o->internal)
|
||||||
|
return SR_ERR_ARG;
|
||||||
|
|
||||||
|
ctx = o->internal;
|
||||||
|
g_free(ctx);
|
||||||
|
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
@ -230,6 +229,6 @@ struct sr_output_format output_vcd = {
|
||||||
.description = "Value Change Dump (VCD)",
|
.description = "Value Change Dump (VCD)",
|
||||||
.df_type = SR_DF_LOGIC,
|
.df_type = SR_DF_LOGIC,
|
||||||
.init = init,
|
.init = init,
|
||||||
.data = data,
|
.recv = recv,
|
||||||
.event = event,
|
.cleanup = cleanup
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue