vpi: patch for Icarus Verilog
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Thu, 8 Mar 2012 16:27:59 +0000 (17:27 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Thu, 8 Mar 2012 16:27:59 +0000 (17:27 +0100)
vpi/0001-Copy-vector-values-in-vpi_put_value.patch [new file with mode: 0644]

diff --git a/vpi/0001-Copy-vector-values-in-vpi_put_value.patch b/vpi/0001-Copy-vector-values-in-vpi_put_value.patch
new file mode 100644 (file)
index 0000000..292d27f
--- /dev/null
@@ -0,0 +1,63 @@
+From 6e85fad37a9d40cb02a71196fe5e6981cf255d6e Mon Sep 17 00:00:00 2001
+From: Sebastien Bourdeauducq <sebastien@milkymist.org>
+Date: Thu, 8 Mar 2012 17:13:32 +0100
+Subject: [PATCH] Copy vector values in vpi_put_value.
+
+Like it's done for strings.
+---
+ vvp/vpi_priv.cc |   22 ++++++++++++++++++++--
+ 1 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc
+index 0d82b55..be04b31 100644
+--- a/vvp/vpi_priv.cc
++++ b/vvp/vpi_priv.cc
+@@ -948,15 +948,31 @@ void vpip_put_value_event::run_run()
+         case vpiStringVal:
+           free(value.value.str);
+           break;
++        case vpiVectorVal:
++          free(value.value.vector);
++          break;
+           /* If these are ever copied then free them too. */
+         case vpiTimeVal:
+-        case vpiVectorVal:
+         case vpiStrengthVal:
+         default:
+           break;
+       }
+ }
++static t_vpi_vecval *copy_vector_for(vpiHandle obj, t_vpi_vecval *source)
++{
++      int size;
++      int nbytes;
++      t_vpi_vecval *r;
++      
++      size = vpi_get(vpiSize, obj);
++      nbytes = ((size + 31)/32)*sizeof(t_vpi_vecval);
++      r = (t_vpi_vecval *)malloc(nbytes);
++      assert(r);
++      memcpy(r, source, nbytes);
++      return r;
++}
++
+ vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp,
+                       s_vpi_time*when, PLI_INT32 flags)
+ {
+@@ -1008,9 +1024,11 @@ vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp,
+               case vpiStringVal:
+                 put->value.value.str = strdup(put->value.value.str);
+                 break;
++              case vpiVectorVal:
++                put->value.value.vector = copy_vector_for(obj, put->value.value.vector);
++                break;
+                 /* Do these also need to be copied? */
+               case vpiTimeVal:
+-              case vpiVectorVal:
+               case vpiStrengthVal:
+               default:
+                 break;
+-- 
+1.7.7.6
+