aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2020-04-17 18:06:55 +0200
committerTristan Gingold <tgingold@free.fr>2020-04-17 18:30:00 +0200
commit204661e02d47a7e61a1dfb21bea901a2686b21a1 (patch)
tree7f2b51d4d4d8667ebea4215c1906b84630be454e
parent035fdddb36c73f5eb70df03f9e15565124168d94 (diff)
downloadghdl-204661e02d47a7e61a1dfb21bea901a2686b21a1.tar.gz
ghdl-204661e02d47a7e61a1dfb21bea901a2686b21a1.tar.bz2
ghdl-204661e02d47a7e61a1dfb21bea901a2686b21a1.zip
testsuite/gna: add a test for #1233
-rw-r--r--testsuite/gna/issue1233/adder.vhdl21
-rwxr-xr-xtestsuite/gna/issue1233/testsuite.sh25
-rw-r--r--testsuite/gna/issue1233/vpi_plugin.c108
3 files changed, 154 insertions, 0 deletions
diff --git a/testsuite/gna/issue1233/adder.vhdl b/testsuite/gna/issue1233/adder.vhdl
new file mode 100644
index 000000000..b2eeb3e39
--- /dev/null
+++ b/testsuite/gna/issue1233/adder.vhdl
@@ -0,0 +1,21 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+entity adder is
+ port
+ (
+ nibble1, nibble2 : in unsigned(3 downto 0);
+ sum : out unsigned(3 downto 0);
+ carry_out : out std_logic
+ );
+end entity adder;
+
+architecture behavioral of adder is
+ signal temp : unsigned(4 downto 0);
+begin
+ temp <= ("0" & nibble1) + nibble2;
+ sum <= temp(3 downto 0);
+ carry_out <= temp(4);
+end architecture behavioral;
+
diff --git a/testsuite/gna/issue1233/testsuite.sh b/testsuite/gna/issue1233/testsuite.sh
new file mode 100755
index 000000000..056c85789
--- /dev/null
+++ b/testsuite/gna/issue1233/testsuite.sh
@@ -0,0 +1,25 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+analyze adder.vhdl
+elab adder
+
+if ghdl_has_feature adder vpi; then
+ if [ "$OS" = "Windows_NT" ]; then
+ # Need to put the directory containing libghdlvpi.dll in the path.
+ vpi_lib=`$GHDL --vpi-library-dir | sed -e 's!\\\\!/!g' -e 's!^C:!/C!g'`
+ echo vpi_lib: $vpi_lib
+ PATH="$PATH:$vpi_lib"
+ fi
+
+ $GHDL --vpi-compile -v gcc -c vpi_plugin.c
+ $GHDL --vpi-link -v gcc -o vpi_plugin.vpi vpi_plugin.o
+
+ simulate adder --vpi=./vpi_plugin.vpi
+
+ rm -f vpi_plugin.vpi vpi_plugin.o
+fi
+clean
+
+echo "Test successful"
diff --git a/testsuite/gna/issue1233/vpi_plugin.c b/testsuite/gna/issue1233/vpi_plugin.c
new file mode 100644
index 000000000..dbfd0bf20
--- /dev/null
+++ b/testsuite/gna/issue1233/vpi_plugin.c
@@ -0,0 +1,108 @@
+#include<vpi_user.h>
+#include<inttypes.h>
+#include<stdio.h>
+
+//#define STOP_ITERATION 1000000000
+#define STOP_ITERATION 10000
+
+uint32_t iteration = 0;
+
+
+PLI_INT32 start_cb(p_cb_data);
+PLI_INT32 end_cb(p_cb_data);
+PLI_INT32 rw_cb(p_cb_data);
+PLI_INT32 ro_cb(p_cb_data);
+PLI_INT32 delay_rw_cb(p_cb_data);
+PLI_INT32 delay_ro_cb(p_cb_data);
+
+void register_cb(PLI_INT32(*f)(p_cb_data),
+ PLI_INT32 reason,
+ int64_t cycles){
+
+ s_cb_data cbData;
+ s_vpi_time simuTime;
+ if (cycles < 0){
+ cbData.time = NULL;
+ } else {
+ cbData.time = &simuTime;
+ simuTime.type = vpiSimTime;
+ simuTime.high = (PLI_INT32) (cycles >> 32);
+ simuTime.low = (PLI_INT32) (cycles & 0xFFFFFFFF);
+ }
+
+ cbData.reason = reason;
+ cbData.cb_rtn = f;
+ cbData.user_data = 0;
+ cbData.value = 0;
+
+ vpi_register_cb(&cbData);
+}
+
+void entry_point_cb() {
+ register_cb(start_cb, cbStartOfSimulation, -1);
+ register_cb(end_cb, cbEndOfSimulation, -1);
+ register_cb(delay_ro_cb, cbAfterDelay, 0);
+}
+
+PLI_INT32 start_cb(p_cb_data data){
+ (void) data;
+ printf("Start of simulation \n");
+ return 0;
+}
+
+PLI_INT32 end_cb(p_cb_data data){
+ (void) data;
+ printf("End of simulation %u \n", iteration);
+ return 0;
+}
+
+
+PLI_INT32 rw_cb(p_cb_data data){
+ (void) data;
+ if(iteration < STOP_ITERATION) {
+ register_cb(delay_ro_cb, cbAfterDelay, 1);
+ } else {
+ vpi_control(vpiFinish, 0);
+ }
+
+#if 0
+ vpiHandle handle_iterator;
+ handle_iterator = vpi_iterate (vpiModule, NULL) ; // <---- Here the iterator is created
+ while(vpi_scan(handle_iterator)); // <---- Here the iterator is consumed
+#else
+ vpiHandle handle_iterator;
+ vpiHandle handle_scan;
+ handle_iterator = vpi_iterate (vpiModule, NULL) ;
+
+ handle_scan=vpi_scan(handle_iterator);
+ while(handle_scan){
+ vpi_free_object(handle_scan);
+ handle_scan=vpi_scan(handle_iterator);
+ }
+#endif
+ iteration++;
+ return 0;
+}
+
+PLI_INT32 ro_cb(p_cb_data data){
+ (void) data;
+ register_cb(delay_rw_cb, cbAfterDelay, 0);
+ return 0;
+}
+
+PLI_INT32 delay_rw_cb(p_cb_data data){
+ (void) data;
+ register_cb(rw_cb, cbReadWriteSynch, 0);
+ return 0;
+}
+
+PLI_INT32 delay_ro_cb(p_cb_data data){
+ (void) data;
+ register_cb(ro_cb, cbReadOnlySynch, 0);
+ return 0;
+}
+
+void (*vlog_startup_routines[]) () = {
+ entry_point_cb,
+ 0
+};