From 1752c92980e60cb2558a796d46da591f6705b13a Mon Sep 17 00:00:00 2001 From: Cedric Roux <cedric.roux@eurecom.fr> Date: Mon, 6 Aug 2018 11:27:02 +0200 Subject: [PATCH] T: update 'to_vcd' tracer to trace all VCD variables and functions Pass the command line arguemnt -vcd to trace all VCD variables and functions. --- common/utils/T/tracer/to_vcd.c | 61 ++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c index 097fdce932..049282f890 100644 --- a/common/utils/T/tracer/to_vcd.c +++ b/common/utils/T/tracer/to_vcd.c @@ -174,7 +174,8 @@ void usage(void) " -ip <host> connect to given IP address (default %s)\n" " -p <port> connect to given port (default %d)\n" " -b <event> <arg> <vcd name> trace as binary (0 off, anything else on)\n" -" -l <event> <arg> <vcd name> trace as uint64_t\n", +" -l <event> <arg> <vcd name> trace as uint64_t\n" +" -vcd trace all VCD variables and functions\n", DEFAULT_REMOTE_IP, DEFAULT_REMOTE_PORT ); @@ -192,6 +193,20 @@ void force_stop(int x) run = 0; } +vcd_vars *add_var(vcd_vars *vars, int nvars, + char *event, char *arg, char *vcd_name, int is_boolean) +{ + if (nvars % 64 == 0) { + vars = realloc(vars, (nvars+64) * sizeof(vcd_vars)); + if (vars == NULL) abort(); + } + vars[nvars].event = event; + vars[nvars].arg = arg; + vars[nvars].vcd_name = vcd_name; + vars[nvars].boolean = is_boolean; + return vars; +} + int main(int n, char **v) { char *output_filename = NULL; @@ -202,11 +217,12 @@ int main(int n, char **v) int *is_on; int number_of_events; int i; - vcd_vars vars[n]; + vcd_vars *vars = NULL; int nvars = 0; view *vcd_view; event_handler *h; logger *textlog; + int all_vcd = 0; /* write on a socket fails if the other end is closed and we get SIGPIPE */ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); @@ -221,19 +237,22 @@ int main(int n, char **v) if (!strcmp(v[i], "-p")) { if (i > n-2) usage(); port = atoi(v[++i]); continue; } if (!strcmp(v[i], "-b")) { if(i>n-4)usage(); - vars[nvars].event = v[++i]; - vars[nvars].arg = v[++i]; - vars[nvars].vcd_name = v[++i]; - vars[nvars++].boolean = 1; + char *event = v[++i]; + char *arg = v[++i]; + char *vcd_name = v[++i]; + vars = add_var(vars, nvars, event, arg, vcd_name, 1); + nvars++; continue; } if (!strcmp(v[i], "-l")) { if(i>n-4)usage(); - vars[nvars].event = v[++i]; - vars[nvars].arg = v[++i]; - vars[nvars].vcd_name = v[++i]; - vars[nvars++].boolean = 0; + char *event = v[++i]; + char *arg = v[++i]; + char *vcd_name = v[++i]; + vars = add_var(vars, nvars, event, arg, vcd_name, 0); + nvars++; continue; } + if (!strcmp(v[i], "-vcd")) { all_vcd = 1; continue; } usage(); } @@ -260,6 +279,28 @@ int main(int n, char **v) /* create the view */ vcd_view = new_view_vcd(); + if (all_vcd) { + /* activate all VCD traces */ + for (i = 0; i < number_of_events; i++) { + int is_boolean; + int prefix_length; + char *name = event_name_from_id(database, i); + char *var_prefix = "VCD_VARIABLE_"; + char *fun_prefix = "VCD_FUNCTION_"; + if (!strncmp(name, var_prefix, strlen(var_prefix))) { + prefix_length = strlen(var_prefix); + is_boolean = 0; + } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) { + prefix_length = strlen(fun_prefix); + is_boolean = 1; + } else + continue; + vars = add_var(vars, nvars, + name, "value", name+prefix_length, is_boolean); + nvars++; + } + } + /* setup traces */ for (i = 0; i < nvars; i++) { char format[256]; -- 2.26.2