From 945a6d6c9727fe54c213bf4b3aeb8e59c476421c Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Mon, 2 Dec 2013 13:31:36 +0000
Subject: [PATCH] Modified VCD format for variables. Modified some ITTI VCD log
 points.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4555 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 common/utils/itti/intertask_interface.c | 34 ++++++-----
 openair2/UTIL/LOG/vcd_signal_dumper.c   | 77 ++++++++++++++++++++++---
 openair2/UTIL/LOG/vcd_signal_dumper.h   |  4 +-
 3 files changed, 89 insertions(+), 26 deletions(-)

diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
index 0bb92b1909..b4690ad1b5 100644
--- a/common/utils/itti/intertask_interface.c
+++ b/common/utils/itti/intertask_interface.c
@@ -292,6 +292,10 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
     message_number_t message_number;
     uint32_t message_id;
 
+#if defined(OAI_EMU) || defined(RTAI)
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, 1L << destination_task_id);
+#endif
+
     DevAssert(message != NULL);
     DevCheck(destination_task_id < itti_desc.task_max, destination_task_id, itti_desc.task_max, 0);
 
@@ -305,11 +309,6 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
 
     origin_task_id = ITTI_MSG_ORIGIN_ID(message);
 
-#if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG,
-                                            destination_task_id);
-#endif
-
     priority = itti_get_message_priority (message_id);
 
     /* Increment the global message number */
@@ -329,6 +328,10 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
 
     if (destination_task_id != TASK_UNKNOWN)
     {
+#if defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE, VCD_FUNCTION_IN);
+#endif
+
         /* We cannot send a message if the task is not running */
         DevCheck(itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY, itti_desc.threads[destination_thread_id].task_state,
                  TASK_STATE_READY, destination_thread_id);
@@ -345,6 +348,10 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
         /* Enqueue message in destination task queue */
         lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new);
 
+#if defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE, VCD_FUNCTION_OUT);
+#endif
+
 #ifdef RTAI
         if (itti_desc.threads[TASK_GET_THREAD_ID(origin_task_id)].real_time)
         {
@@ -376,8 +383,7 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
     }
 
 #if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG_END,
-                                            destination_task_id);
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, 0);
 #endif
 
     return 0;
@@ -520,14 +526,12 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t
 void itti_receive_msg(task_id_t task_id, MessageDef **received_msg)
 {
 #if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
-                                            task_id);
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, 0);
 #endif
     itti_receive_msg_internal_event_fd(task_id, 0, received_msg);
 
-    #if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG_END,
-                                            task_id);
+#if defined(OAI_EMU) || defined(RTAI)
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, 1L << task_id);
 #endif
 }
 
@@ -538,8 +542,7 @@ void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) {
     *received_msg = NULL;
 
 #if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG,
-                                            task_id);
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, 1L << task_id);
 #endif
 
     {
@@ -557,8 +560,7 @@ void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) {
     }
 
 #if defined(OAI_EMU) || defined(RTAI)
-    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG_END,
-                                            task_id);
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, 0);
 #endif
 }
 
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 791c64858b..a462816709 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -81,11 +81,8 @@ const char* eurecomVariablesNames[] = {
     "daq_mbox",
     "diff2",
     "itti_send_msg",
-    "itti_send_msg_end",
     "itti_poll_msg",
-    "itti_poll_msg_end",
     "itti_recv_msg",
-    "itti_recv_msg_end",
     "itti_alloc_msg"
 };
  
@@ -161,12 +158,13 @@ const char* eurecomFunctionsNames[] = {
     "phy_eNB_dlsch_scramblig",
     "pdcp_apply_security",
     "pdcp_validate_security",
+    "itti_enqueue_message",
     "itti_dump_enqueue_message",
     "test"
 };
 
 struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = {
-    { "variables", VCD_SIGNAL_DUMPER_VARIABLES_END, eurecomVariablesNames, VCD_REAL, 64 },
+    { "variables", VCD_SIGNAL_DUMPER_VARIABLES_END, eurecomVariablesNames, VCD_WIRE, 64 },
     { "functions", VCD_SIGNAL_DUMPER_FUNCTIONS_END, eurecomFunctionsNames, VCD_WIRE, 1 },
 //    { "ue_procedures_functions", VCD_SIGNAL_DUMPER_UE_PROCEDURES_FUNCTIONS_END, eurecomUEFunctionsNames, VCD_WIRE, 1 },
 };
@@ -205,9 +203,65 @@ typedef struct {
 struct lfds611_queue_state *vcd_queue = NULL;
 pthread_t vcd_dumper_thread;
 
+#define BYTE_SIZE   8
+#define NIBBLE_SIZE 4
+static void uint64_to_binary(uint64_t value, char *binary)
+{
+    static const char * const nibbles_start[] =
+            {
+                 "",    "1",   "10",   "11",
+              "100",  "101",  "110",  "111",
+             "1000", "1001", "1010", "1011",
+             "1100", "1101", "1110", "1111",
+            };
+    static const char * const nibbles[] =
+            {
+             "0000", "0001", "0010", "0011",
+             "0100", "0101", "0110", "0111",
+             "1000", "1001", "1010", "1011",
+             "1100", "1101", "1110", "1111",
+            };
+    int nibble;
+    int nibble_value;
+    int nibble_size;
+    int zero = 1;
+
+    for (nibble = 0; nibble < (sizeof (uint64_t) * (BYTE_SIZE / NIBBLE_SIZE)); nibble++)
+    {
+        nibble_value = value >> ((sizeof (uint64_t) * BYTE_SIZE) - NIBBLE_SIZE);
+
+        if (zero)
+        {
+            if (nibble_value > 0)
+            {
+                zero = 0;
+                nibble_size = strlen(nibbles_start[nibble_value]);
+                memcpy (binary, nibbles_start[nibble_value], nibble_size);
+                binary += nibble_size;
+            }
+        }
+        else
+        {
+            memcpy (binary, nibbles[nibble_value], NIBBLE_SIZE);
+            binary += NIBBLE_SIZE;
+        }
+        value <<= NIBBLE_SIZE;
+    }
+    /* Add a '0' if the value was null */
+    if (zero)
+    {
+        binary[0] = '0';
+        binary ++;
+    }
+    /* Add a null value at the end of the string */
+    binary[0] = '\0';
+}
+
 void *vcd_dumper_thread_rt(void *args)
 {
     vcd_queue_user_data_t *data;
+    char binary_string[(sizeof (uint64_t) * BYTE_SIZE) + 1];
+
     while(1) {
         if (lfds611_queue_dequeue(vcd_queue, (void **) &data) == 0) {
             /* No element -> sleep a while */
@@ -221,7 +275,8 @@ void *vcd_dumper_thread_rt(void *args)
                         variable_name = (int)data->data.variable.variable_name;
                         fprintf(vcd_fd, "#%llu\n", data->time);
                         /* Set variable to value */
-                        fprintf(vcd_fd, "r%lu %s_r\n", data->data.variable.value,
+                        uint64_to_binary(data->data.variable.value, binary_string);
+                        fprintf(vcd_fd, "b%s %s_w\n", binary_string,
                                 eurecomVariablesNames[variable_name]);
                     }
                     break;
@@ -393,7 +448,12 @@ void vcd_signal_dumper_create_header(void)
                     const char *signal_name;
                     signal_name = module->signals_names[j];
                     if (VCD_WIRE == module->signal_type) {
-                        fprintf(vcd_fd, "0%s_w $end\n", signal_name);
+                        if (module->signal_size > 1) {
+                            fprintf(vcd_fd, "b0 %s_w $end\n", signal_name);
+                        }
+                        else {
+                            fprintf(vcd_fd, "0%s_w $end\n", signal_name);
+                        }
                     } else  if (VCD_REAL == module->signal_type) {
                         fprintf(vcd_fd, "r0 %s_r $end\n", signal_name);
                     } else {
@@ -426,6 +486,8 @@ void vcd_signal_dumper_dump_variable_by_name(vcd_signal_dump_variables variable_
         new_data->data.variable.value = value;
         lfds611_queue_enqueue(vcd_queue, new_data);
 #else
+        char binary_string[(sizeof (uint64_t) * BYTE_SIZE) + 1];
+
         assert(variable_name < VCD_SIGNAL_DUMPER_VARIABLES_END);
         assert(variable_name >= 0);
 
@@ -434,7 +496,8 @@ void vcd_signal_dumper_dump_variable_by_name(vcd_signal_dump_variables variable_
             vcd_signal_dumper_print_time_since_start();
 
             /* Set variable to value */
-            fprintf(vcd_fd, "r%lu %s_r\n", value, eurecomVariablesNames[variable_name]);
+            uint64_to_binary(value, binary_string);
+            fprintf(vcd_fd, "b%s %s_w\n", binary_string, eurecomVariablesNames[variable_name]);
             //fflush(vcd_fd);
         }
 #endif
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index b5e1ede512..98042f2fe7 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -50,11 +50,8 @@ typedef enum
     VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
     VCD_SIGNAL_DUMPER_VARIABLES_DIFF,
     VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG,
-    VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG_END,
     VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG,
-    VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG_END,
     VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
-    VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG_END,
     VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG,
     VCD_SIGNAL_DUMPER_VARIABLES_LAST,
     VCD_SIGNAL_DUMPER_VARIABLES_END = VCD_SIGNAL_DUMPER_VARIABLES_LAST,
@@ -133,6 +130,7 @@ typedef enum
     VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING,
     VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_APPLY_SECURITY,
     VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY,
+    VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE,
     VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE,
     VCD_SIGNAL_DUMPER_FUNCTIONS_TEST,
     VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
-- 
GitLab