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