ruby-vpi 13.0.0 → 14.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -1
- data/bin/generate_test_tpl/bench.rb +84 -1
- data/bin/generate_test_tpl/bench.v +8 -17
- data/bin/generate_test_tpl/proto.rb +1 -1
- data/doc/common.css +14 -41
- data/doc/common.tpl +1 -1
- data/doc/figures/figures.dia +274 -753
- data/doc/figures/organization_detailed.png +0 -0
- data/doc/figures/ruby_relay.png +0 -0
- data/doc/history.html +363 -276
- data/doc/history.yml +40 -0
- data/doc/intro.inc +37 -15
- data/doc/lib/doc_proxy.rb +24 -4
- data/doc/manual.doc +345 -196
- data/doc/manual.html +741 -497
- data/doc/memo.doc +15 -15
- data/doc/memo.html +28 -27
- data/doc/readme.doc +2 -2
- data/doc/readme.html +51 -15
- data/doc/rss.erb +1 -1
- data/doc/rss.xml +1624 -31
- data/ext/Rakefile +1 -6
- data/ext/main.c +8 -3
- data/ext/main.h +5 -0
- data/ext/relay.c +12 -12
- data/ext/relay.h +1 -6
- data/ext/swig_vpi.i +2 -2
- data/ext/swig_wrap.cin +37 -20
- data/ext/verilog.h +2 -2
- data/ext/vlog.c +10 -3
- data/ext/vlog.h +4 -4
- data/lib/ruby-vpi/vpi.rb +114 -0
- data/lib/ruby-vpi.rb +21 -59
- data/ref/c/annotated.html +1 -1
- data/ref/c/common_8h.html +1 -1
- data/ref/c/files.html +1 -1
- data/ref/c/functions.html +1 -1
- data/ref/c/functions_vars.html +1 -1
- data/ref/c/globals.html +1 -1
- data/ref/c/globals_0x63.html +1 -1
- data/ref/c/globals_0x65.html +1 -1
- data/ref/c/globals_0x66.html +1 -1
- data/ref/c/globals_0x6d.html +3 -2
- data/ref/c/globals_0x70.html +1 -1
- data/ref/c/globals_0x72.html +4 -5
- data/ref/c/globals_0x73.html +1 -1
- data/ref/c/globals_0x74.html +1 -1
- data/ref/c/globals_0x76.html +4 -2
- data/ref/c/globals_0x78.html +1 -1
- data/ref/c/globals_defs.html +1 -1
- data/ref/c/globals_defs_0x65.html +1 -1
- data/ref/c/globals_defs_0x70.html +1 -1
- data/ref/c/globals_defs_0x76.html +1 -1
- data/ref/c/globals_defs_0x78.html +1 -1
- data/ref/c/globals_enum.html +1 -1
- data/ref/c/globals_eval.html +1 -1
- data/ref/c/globals_func.html +8 -7
- data/ref/c/globals_type.html +1 -1
- data/ref/c/globals_vars.html +3 -2
- data/ref/c/index.html +1 -1
- data/ref/c/main_8c.html +26 -1
- data/ref/c/main_8h.html +26 -1
- data/ref/c/relay_8c.html +11 -35
- data/ref/c/relay_8h.html +3 -27
- data/ref/c/structt__cb__data.html +1 -1
- data/ref/c/structt__vpi__delay.html +1 -1
- data/ref/c/structt__vpi__error__info.html +1 -1
- data/ref/c/structt__vpi__strengthval.html +1 -1
- data/ref/c/structt__vpi__systf__data.html +1 -1
- data/ref/c/structt__vpi__time.html +1 -1
- data/ref/c/structt__vpi__value.html +1 -1
- data/ref/c/structt__vpi__vecval.html +1 -1
- data/ref/c/structt__vpi__vlog__info.html +1 -1
- data/ref/c/verilog_8h.html +5 -5
- data/ref/c/vlog_8c.html +44 -6
- data/ref/c/vlog_8h.html +7 -8
- data/ref/c/vpi__user_8h.html +1 -1
- data/ref/ruby/classes/RDoc.html +5 -5
- data/ref/ruby/classes/RDoc.src/{M000041.html → M000045.html} +0 -0
- data/ref/ruby/classes/RubyVpi.html +10 -28
- data/ref/ruby/classes/RubyVpi.src/M000029.html +101 -124
- data/ref/ruby/classes/Vpi/Handle.html +56 -56
- data/ref/ruby/classes/Vpi/Handle.src/M000034.html +5 -9
- data/ref/ruby/classes/Vpi/Handle.src/M000035.html +5 -31
- data/ref/ruby/classes/Vpi/Handle.src/M000036.html +5 -74
- data/ref/ruby/classes/Vpi/Handle.src/M000037.html +5 -17
- data/ref/ruby/classes/Vpi/Handle.src/M000038.html +9 -11
- data/ref/ruby/classes/Vpi/Handle.src/M000039.html +44 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000040.html +74 -55
- data/ref/ruby/classes/Vpi/Handle.src/M000041.html +30 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000042.html +24 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000044.html +68 -0
- data/ref/ruby/classes/Vpi.html +149 -0
- data/ref/ruby/classes/Vpi.src/M000030.html +28 -0
- data/ref/ruby/classes/Vpi.src/M000031.html +18 -0
- data/ref/ruby/classes/Vpi.src/M000032.html +39 -0
- data/ref/ruby/classes/Vpi.src/M000033.html +22 -0
- data/ref/ruby/created.rid +1 -1
- data/ref/ruby/files/lib/ruby-vpi/vpi_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi_rb.html +2 -2
- data/ref/ruby/fr_method_index.html +18 -14
- data/samp/counter/counter_rspec_bench.rb +81 -1
- data/samp/counter/counter_rspec_bench.v +5 -12
- data/samp/counter/counter_rspec_design.rb +1 -2
- data/samp/counter/counter_rspec_proto.rb +1 -1
- data/samp/counter/counter_rspec_spec.rb +3 -3
- data/samp/counter/counter_xunit_bench.rb +81 -1
- data/samp/counter/counter_xunit_bench.v +5 -12
- data/samp/counter/counter_xunit_design.rb +1 -2
- data/samp/counter/counter_xunit_proto.rb +1 -1
- data/samp/counter/counter_xunit_spec.rb +3 -3
- data/samp/pipelined_alu/hw5_unit_test_bench.rb +81 -1
- data/samp/pipelined_alu/hw5_unit_test_bench.v +11 -18
- data/samp/pipelined_alu/hw5_unit_test_design.rb +1 -1
- data/samp/pipelined_alu/hw5_unit_test_proto.rb +1 -1
- data/samp/pipelined_alu/hw5_unit_test_spec.rb +1 -1
- metadata +12 -9
- data/doc/figures/ruby_init.png +0 -0
- data/ext/swig_vpi.h +0 -924
- data/ref/ruby/classes/Vpi/Handle.src/M000030.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000031.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000032.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000033.html +0 -18
data/ext/Rakefile
CHANGED
@@ -54,12 +54,7 @@ file 'swig_wrap.cin' => 'swig_vpi.i' do |t|
|
|
54
54
|
sh %w{swig -ruby -o}, t.name, t.prerequisites[0]
|
55
55
|
end
|
56
56
|
|
57
|
-
file 'swig_vpi.i' => '
|
58
|
-
|
59
|
-
file 'swig_vpi.h' => 'vpi_user.h' do |t|
|
60
|
-
# avoid problems with SWIG-generated wrapper for VPI vprintf functions which use va_list
|
61
|
-
ruby %{-pe 'gsub /\\bva_list\\b/, "int"' #{t.prerequisites[0]} > #{t.name}}
|
62
|
-
end
|
57
|
+
file 'swig_vpi.i' => 'vpi_user.h'
|
63
58
|
|
64
59
|
# NOTE: since SWIG is not a requirement for users, we should not clobber these generated files
|
65
60
|
#CLOBBER.include 'swig_wrap.cin', 'swig_vpi.h'
|
data/ext/main.c
CHANGED
@@ -36,20 +36,21 @@ void main_init() {
|
|
36
36
|
// load the VPI interface for Ruby
|
37
37
|
Init_vpi();
|
38
38
|
rb_define_module_function(mVpi, "relay_verilog", main_relay_verilog, 0);
|
39
|
+
rb_define_module_function(mVpi, "relay_ruby_reason", main_relay_ruby_reason, 0);
|
40
|
+
|
39
41
|
|
40
42
|
// initialize the Ruby bench
|
41
43
|
char* benchFile = getenv("RUBY_VPI__RUBY_BENCH_FILE");
|
42
44
|
|
43
45
|
if (benchFile != NULL) {
|
46
|
+
ruby_script(benchFile);
|
44
47
|
rb_load_file(benchFile);
|
45
48
|
}
|
46
49
|
else {
|
47
|
-
common_printf("error: environment variable RUBY_VPI__RUBY_BENCH_FILE is
|
50
|
+
common_printf("error: environment variable RUBY_VPI__RUBY_BENCH_FILE is uninitialized.");
|
48
51
|
exit(EXIT_FAILURE);
|
49
52
|
}
|
50
53
|
|
51
|
-
ruby_script(benchFile);
|
52
|
-
|
53
54
|
// run the test bench
|
54
55
|
ruby_run();
|
55
56
|
|
@@ -60,3 +61,7 @@ VALUE main_relay_verilog(VALUE arSelf) {
|
|
60
61
|
relay_verilog();
|
61
62
|
return arSelf;
|
62
63
|
}
|
64
|
+
|
65
|
+
VALUE main_relay_ruby_reason(VALUE arSelf) {
|
66
|
+
return SWIG_NewPointerObj(vlog_relay_ruby_reason(), SWIGTYPE_p_t_cb_data, 0);
|
67
|
+
}
|
data/ext/main.h
CHANGED
data/ext/relay.c
CHANGED
@@ -28,11 +28,23 @@ pthread_t relay__rubyThread;
|
|
28
28
|
pthread_mutex_t relay__rubyLock;
|
29
29
|
pthread_mutex_t relay__verilogLock;
|
30
30
|
|
31
|
+
// Body of the ruby thread.
|
32
|
+
void* relay_ruby_thread(void* dummy) {
|
33
|
+
main_init();
|
34
|
+
return NULL;
|
35
|
+
}
|
36
|
+
|
31
37
|
void relay_init() {
|
32
38
|
pthread_mutex_init(&relay__rubyLock, NULL);
|
33
39
|
pthread_mutex_lock(&relay__rubyLock);
|
34
40
|
pthread_mutex_init(&relay__verilogLock, NULL);
|
35
41
|
pthread_mutex_lock(&relay__verilogLock);
|
42
|
+
|
43
|
+
// start the ruby thread
|
44
|
+
pthread_create(&relay__rubyThread, 0, relay_ruby_thread, NULL);
|
45
|
+
|
46
|
+
// XXX: freezee verilog because RubyVpi.init_bench will call relay_verilog (which assumes that verilog is frozen)
|
47
|
+
pthread_mutex_lock(&relay__verilogLock);
|
36
48
|
}
|
37
49
|
|
38
50
|
void relay_ruby() {
|
@@ -44,15 +56,3 @@ void relay_verilog() {
|
|
44
56
|
pthread_mutex_unlock(&relay__verilogLock);
|
45
57
|
pthread_mutex_lock(&relay__rubyLock);
|
46
58
|
}
|
47
|
-
|
48
|
-
void* relay_main_handshake(void* aDummy) {
|
49
|
-
main_init();
|
50
|
-
return NULL;
|
51
|
-
}
|
52
|
-
|
53
|
-
void relay_main() {
|
54
|
-
pthread_create(&relay__rubyThread, 0, relay_main_handshake, NULL);
|
55
|
-
|
56
|
-
// XXX: freezee verilog because RubyVpi.init_bench will call relay_verilog (which assumes that verilog is frozen)
|
57
|
-
pthread_mutex_lock(&relay__verilogLock);
|
58
|
-
}
|
data/ext/relay.h
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
#include "common.h"
|
29
29
|
|
30
30
|
/**
|
31
|
-
Initialize the relay mechanism, which enables Verilog to transfer control to Ruby and vice versa.
|
31
|
+
Initialize the relay mechanism, which enables Verilog to transfer control to Ruby and vice versa, and start Ruby.
|
32
32
|
*/
|
33
33
|
void relay_init();
|
34
34
|
|
@@ -42,9 +42,4 @@
|
|
42
42
|
*/
|
43
43
|
void relay_verilog();
|
44
44
|
|
45
|
-
/**
|
46
|
-
Transfers control to the main layer.
|
47
|
-
*/
|
48
|
-
void relay_main();
|
49
|
-
|
50
45
|
#endif
|
data/ext/swig_vpi.i
CHANGED
data/ext/swig_wrap.cin
CHANGED
@@ -1491,9 +1491,10 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
|
|
1491
1491
|
#define SWIGTYPE_p_unsigned_char swig_types[17]
|
1492
1492
|
#define SWIGTYPE_p_unsigned_int swig_types[18]
|
1493
1493
|
#define SWIGTYPE_p_unsigned_short swig_types[19]
|
1494
|
-
#define
|
1495
|
-
|
1496
|
-
static
|
1494
|
+
#define SWIGTYPE_p_va_list swig_types[20]
|
1495
|
+
#define SWIGTYPE_p_void swig_types[21]
|
1496
|
+
static swig_type_info *swig_types[23];
|
1497
|
+
static swig_module_info swig_module = {swig_types, 22, 0, 0, 0, 0};
|
1497
1498
|
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
|
1498
1499
|
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
|
1499
1500
|
|
@@ -1511,7 +1512,7 @@ static VALUE mVpi;
|
|
1511
1512
|
#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a))
|
1512
1513
|
|
1513
1514
|
|
1514
|
-
#include "
|
1515
|
+
#include "vpi_user.h"
|
1515
1516
|
|
1516
1517
|
|
1517
1518
|
#include <limits.h>
|
@@ -5943,13 +5944,13 @@ fail:
|
|
5943
5944
|
SWIGINTERN VALUE
|
5944
5945
|
_wrap_vpi_vprintf(int argc, VALUE *argv, VALUE self) {
|
5945
5946
|
PLI_BYTE8 *arg1 = (PLI_BYTE8 *) 0 ;
|
5946
|
-
|
5947
|
+
va_list arg2 ;
|
5947
5948
|
PLI_INT32 result;
|
5948
5949
|
int res1 ;
|
5949
5950
|
char *buf1 = 0 ;
|
5950
5951
|
int alloc1 = 0 ;
|
5951
|
-
|
5952
|
-
int
|
5952
|
+
void *argp2 ;
|
5953
|
+
int res2 = 0 ;
|
5953
5954
|
VALUE vresult = Qnil;
|
5954
5955
|
|
5955
5956
|
if ((argc < 2) || (argc > 2)) {
|
@@ -5960,11 +5961,17 @@ _wrap_vpi_vprintf(int argc, VALUE *argv, VALUE self) {
|
|
5960
5961
|
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vpi_vprintf" "', argument " "1"" of type '" "PLI_BYTE8 *""'");
|
5961
5962
|
}
|
5962
5963
|
arg1 = buf1;
|
5963
|
-
|
5964
|
-
|
5965
|
-
|
5966
|
-
|
5967
|
-
|
5964
|
+
{
|
5965
|
+
res2 = SWIG_ConvertPtr(argv[1], &argp2, SWIGTYPE_p_va_list, 0 );
|
5966
|
+
if (!SWIG_IsOK(res2)) {
|
5967
|
+
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vpi_vprintf" "', argument " "2"" of type '" "va_list""'");
|
5968
|
+
}
|
5969
|
+
if (!argp2) {
|
5970
|
+
SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vpi_vprintf" "', argument " "2"" of type '" "va_list""'");
|
5971
|
+
} else {
|
5972
|
+
arg2 = *((va_list *)(argp2));
|
5973
|
+
}
|
5974
|
+
}
|
5968
5975
|
result = (PLI_INT32)vpi_vprintf(arg1,arg2);
|
5969
5976
|
|
5970
5977
|
vresult = SWIG_From_int((int)(result));
|
@@ -5980,15 +5987,15 @@ SWIGINTERN VALUE
|
|
5980
5987
|
_wrap_vpi_mcd_vprintf(int argc, VALUE *argv, VALUE self) {
|
5981
5988
|
PLI_UINT32 arg1 ;
|
5982
5989
|
PLI_BYTE8 *arg2 = (PLI_BYTE8 *) 0 ;
|
5983
|
-
|
5990
|
+
va_list arg3 ;
|
5984
5991
|
PLI_INT32 result;
|
5985
5992
|
unsigned int val1 ;
|
5986
5993
|
int ecode1 = 0 ;
|
5987
5994
|
int res2 ;
|
5988
5995
|
char *buf2 = 0 ;
|
5989
5996
|
int alloc2 = 0 ;
|
5990
|
-
|
5991
|
-
int
|
5997
|
+
void *argp3 ;
|
5998
|
+
int res3 = 0 ;
|
5992
5999
|
VALUE vresult = Qnil;
|
5993
6000
|
|
5994
6001
|
if ((argc < 3) || (argc > 3)) {
|
@@ -6004,11 +6011,17 @@ _wrap_vpi_mcd_vprintf(int argc, VALUE *argv, VALUE self) {
|
|
6004
6011
|
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vpi_mcd_vprintf" "', argument " "2"" of type '" "PLI_BYTE8 *""'");
|
6005
6012
|
}
|
6006
6013
|
arg2 = buf2;
|
6007
|
-
|
6008
|
-
|
6009
|
-
|
6010
|
-
|
6011
|
-
|
6014
|
+
{
|
6015
|
+
res3 = SWIG_ConvertPtr(argv[2], &argp3, SWIGTYPE_p_va_list, 0 );
|
6016
|
+
if (!SWIG_IsOK(res3)) {
|
6017
|
+
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vpi_mcd_vprintf" "', argument " "3"" of type '" "va_list""'");
|
6018
|
+
}
|
6019
|
+
if (!argp3) {
|
6020
|
+
SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vpi_mcd_vprintf" "', argument " "3"" of type '" "va_list""'");
|
6021
|
+
} else {
|
6022
|
+
arg3 = *((va_list *)(argp3));
|
6023
|
+
}
|
6024
|
+
}
|
6012
6025
|
result = (PLI_INT32)vpi_mcd_vprintf(arg1,arg2,arg3);
|
6013
6026
|
|
6014
6027
|
vresult = SWIG_From_int((int)(result));
|
@@ -6170,6 +6183,7 @@ static swig_type_info _swigt__p_t_vpi_vlog_info = {"_p_t_vpi_vlog_info", "struct
|
|
6170
6183
|
static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "unsigned char *|PLI_UBYTE8 *", 0, 0, (void*)0, 0};
|
6171
6184
|
static swig_type_info _swigt__p_unsigned_int = {"_p_unsigned_int", "unsigned int *|vpiHandle", 0, 0, (void*)0, 0};
|
6172
6185
|
static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *|PLI_UINT16 *", 0, 0, (void*)0, 0};
|
6186
|
+
static swig_type_info _swigt__p_va_list = {"_p_va_list", "va_list *", 0, 0, (void*)0, 0};
|
6173
6187
|
static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
|
6174
6188
|
|
6175
6189
|
static swig_type_info *swig_type_initial[] = {
|
@@ -6193,6 +6207,7 @@ static swig_type_info *swig_type_initial[] = {
|
|
6193
6207
|
&_swigt__p_unsigned_char,
|
6194
6208
|
&_swigt__p_unsigned_int,
|
6195
6209
|
&_swigt__p_unsigned_short,
|
6210
|
+
&_swigt__p_va_list,
|
6196
6211
|
&_swigt__p_void,
|
6197
6212
|
};
|
6198
6213
|
|
@@ -6216,6 +6231,7 @@ static swig_cast_info _swigc__p_t_vpi_vlog_info[] = { {&_swigt__p_t_vpi_vlog_in
|
|
6216
6231
|
static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
|
6217
6232
|
static swig_cast_info _swigc__p_unsigned_int[] = { {&_swigt__p_unsigned_int, 0, 0, 0},{0, 0, 0, 0}};
|
6218
6233
|
static swig_cast_info _swigc__p_unsigned_short[] = { {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}};
|
6234
|
+
static swig_cast_info _swigc__p_va_list[] = { {&_swigt__p_va_list, 0, 0, 0},{0, 0, 0, 0}};
|
6219
6235
|
static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
|
6220
6236
|
|
6221
6237
|
static swig_cast_info *swig_cast_initial[] = {
|
@@ -6239,6 +6255,7 @@ static swig_cast_info *swig_cast_initial[] = {
|
|
6239
6255
|
_swigc__p_unsigned_char,
|
6240
6256
|
_swigc__p_unsigned_int,
|
6241
6257
|
_swigc__p_unsigned_short,
|
6258
|
+
_swigc__p_va_list,
|
6242
6259
|
_swigc__p_void,
|
6243
6260
|
};
|
6244
6261
|
|
data/ext/verilog.h
CHANGED
@@ -55,7 +55,7 @@
|
|
55
55
|
#define verilog_tf_funcPtr verilog_tf_funcPtr_strict
|
56
56
|
|
57
57
|
#define verilog_tf_funcSig(aFuncName) \
|
58
|
-
PLI_INT32 aFuncName(PLI_BYTE8*
|
58
|
+
PLI_INT32 aFuncName(PLI_BYTE8* aCallbackData)
|
59
59
|
|
60
60
|
#define verilog_tf_funcReturn(aReturnVal) \
|
61
61
|
return aReturnVal
|
@@ -66,7 +66,7 @@
|
|
66
66
|
PLI_INT32 (*aPtrName)(p_cb_data)
|
67
67
|
|
68
68
|
#define verilog_cb_funcSig(aFuncName) \
|
69
|
-
PLI_INT32 aFuncName(p_cb_data
|
69
|
+
PLI_INT32 aFuncName(p_cb_data aCallbackData)
|
70
70
|
|
71
71
|
#define verilog_cb_funcReturn(aReturnVal) \
|
72
72
|
return aReturnVal
|
data/ext/vlog.c
CHANGED
@@ -23,17 +23,24 @@
|
|
23
23
|
#include "relay.h"
|
24
24
|
|
25
25
|
|
26
|
-
|
26
|
+
s_cb_data* vlog__relayReason = NULL;
|
27
|
+
|
28
|
+
verilog_cb_funcSig(vlog_relay_init) {
|
27
29
|
relay_init();
|
28
|
-
relay_main();
|
29
30
|
verilog_cb_funcReturn(0);
|
30
31
|
}
|
31
32
|
|
32
33
|
verilog_cb_funcSig(vlog_relay_ruby) {
|
34
|
+
vlog__relayReason = aCallbackData;
|
33
35
|
relay_ruby();
|
36
|
+
|
34
37
|
verilog_cb_funcReturn(0);
|
35
38
|
}
|
36
39
|
|
40
|
+
s_cb_data* vlog_relay_ruby_reason() {
|
41
|
+
return vlog__relayReason;
|
42
|
+
}
|
43
|
+
|
37
44
|
|
38
45
|
/**
|
39
46
|
Registers a callback at start of simulation to vlog_relay_main();
|
@@ -42,7 +49,7 @@ void vlog_startup() {
|
|
42
49
|
s_cb_data call;
|
43
50
|
|
44
51
|
call.reason = cbStartOfSimulation;
|
45
|
-
call.cb_rtn =
|
52
|
+
call.cb_rtn = vlog_relay_init;
|
46
53
|
call.obj = NULL;
|
47
54
|
call.time = NULL;
|
48
55
|
call.value = NULL;
|
data/ext/vlog.h
CHANGED
@@ -28,13 +28,13 @@
|
|
28
28
|
#include "verilog.h"
|
29
29
|
|
30
30
|
/**
|
31
|
-
Relays control
|
31
|
+
Relays control from Verilog to Ruby.
|
32
32
|
*/
|
33
|
-
verilog_cb_funcSig(
|
33
|
+
verilog_cb_funcSig(vlog_relay_ruby);
|
34
34
|
|
35
35
|
/**
|
36
|
-
|
36
|
+
Returns the data corresponding to the callback that caused the relay from Verilog to Ruby.
|
37
37
|
*/
|
38
|
-
|
38
|
+
s_cb_data* vlog_relay_ruby_reason();
|
39
39
|
|
40
40
|
#endif
|
data/lib/ruby-vpi/vpi.rb
CHANGED
@@ -21,6 +21,18 @@
|
|
21
21
|
=end
|
22
22
|
|
23
23
|
module Vpi
|
24
|
+
# Number of bits in PLI_INT32.
|
25
|
+
INTEGER_BITS = 32
|
26
|
+
|
27
|
+
# Lowest upper bound of PLI_INT32.
|
28
|
+
INTEGER_LIMIT = 2 ** INTEGER_BITS
|
29
|
+
|
30
|
+
# Bit-mask capable of capturing PLI_INT32.
|
31
|
+
INTEGER_MASK = INTEGER_LIMIT - 1
|
32
|
+
|
33
|
+
|
34
|
+
## handles
|
35
|
+
|
24
36
|
Handle = SWIG::TYPE_p_unsigned_int
|
25
37
|
|
26
38
|
# An object inside a Verilog simulation (see *vpiHandle* in IEEE Std. 1364-2005).
|
@@ -214,6 +226,8 @@ module Vpi
|
|
214
226
|
alias to_s inspect
|
215
227
|
|
216
228
|
|
229
|
+
## properties
|
230
|
+
|
217
231
|
@@propCache = Hash.new {|h, k| h[k] = Property.resolve(k)}
|
218
232
|
|
219
233
|
# Provides access to this handle's
|
@@ -354,4 +368,104 @@ module Vpi
|
|
354
368
|
end
|
355
369
|
end
|
356
370
|
end
|
371
|
+
|
372
|
+
|
373
|
+
## callbacks
|
374
|
+
|
375
|
+
Callback = Struct.new :handler, :token #:nodoc:
|
376
|
+
@@callbacks = {}
|
377
|
+
|
378
|
+
alias vpi_register_cb_old vpi_register_cb
|
379
|
+
|
380
|
+
# This is a Ruby version of the vpi_register_cb C function. It is identical to the C function, except for the following differences:
|
381
|
+
# * This method accepts a block (callback handler) which is executed whenever the callback occurs.
|
382
|
+
# * This method overwrites the +cb_rtn+ and +user_data+ fields of the given +S_cb_data+ object.
|
383
|
+
def vpi_register_cb aData, &aHandler # :yields: Vpi::S_cb_data
|
384
|
+
raise ArgumentError, "block must be given" unless block_given?
|
385
|
+
|
386
|
+
key = aHandler.object_id.to_s
|
387
|
+
|
388
|
+
# register the callback with Verilog
|
389
|
+
aData.user_data = key
|
390
|
+
aData.cb_rtn = Vlog_relay_ruby
|
391
|
+
token = vpi_register_cb_old(aData)
|
392
|
+
|
393
|
+
@@callbacks[key] = Callback.new(aHandler, token)
|
394
|
+
token
|
395
|
+
end
|
396
|
+
|
397
|
+
alias vpi_remove_cb_old vpi_remove_cb
|
398
|
+
|
399
|
+
def vpi_remove_cb aData # :nodoc:
|
400
|
+
key = aData.user_data
|
401
|
+
|
402
|
+
if c = @@callbacks[key]
|
403
|
+
vpi_remove_cb_old c.token
|
404
|
+
@@callbacks.delete key
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
# Proxy for relay_verilog which supports callbacks.
|
409
|
+
# This method should NOT be invoked from callback handlers (see vpi_register_cb) and threads -- otherwise the situation will be like seven remote controls changing the channel on a single television set!
|
410
|
+
def relay_verilog_proxy # :nodoc:
|
411
|
+
loop do
|
412
|
+
relay_verilog
|
413
|
+
|
414
|
+
if reason = relay_ruby_reason # might be nil
|
415
|
+
dst = reason.user_data
|
416
|
+
|
417
|
+
if c = @@callbacks[dst]
|
418
|
+
c.handler.call reason
|
419
|
+
else
|
420
|
+
break # main thread is receiver
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
|
427
|
+
## simulation control
|
428
|
+
|
429
|
+
# Simulates the design under test according to RubyVpi.init_bench.
|
430
|
+
def simulate
|
431
|
+
# this is a dummy method!
|
432
|
+
end
|
433
|
+
|
434
|
+
# Advances the simulation by the given number of steps.
|
435
|
+
def advance_time aNumSteps = 1
|
436
|
+
# schedule wake-up callback from verilog
|
437
|
+
time = S_vpi_time.new
|
438
|
+
time.low = aNumSteps & INTEGER_MASK
|
439
|
+
time.high = (aNumSteps >> INTEGER_BITS) & INTEGER_MASK
|
440
|
+
time.type = VpiSimTime
|
441
|
+
|
442
|
+
value = S_vpi_value.new
|
443
|
+
value.format = VpiSuppressVal
|
444
|
+
|
445
|
+
alarm = S_cb_data.new
|
446
|
+
alarm.reason = CbAfterDelay
|
447
|
+
alarm.cb_rtn = Vlog_relay_ruby
|
448
|
+
alarm.obj = nil
|
449
|
+
alarm.time = time
|
450
|
+
alarm.value = value
|
451
|
+
alarm.index = 0
|
452
|
+
alarm.user_data = nil
|
453
|
+
|
454
|
+
vpi_free_object(vpi_register_cb_old(alarm))
|
455
|
+
|
456
|
+
# relay to verilog
|
457
|
+
relay_verilog_proxy
|
458
|
+
end
|
459
|
+
|
460
|
+
|
461
|
+
## utility
|
462
|
+
|
463
|
+
# Returns the current simulation time as a 64-bit integer.
|
464
|
+
def simulation_time
|
465
|
+
t = S_vpi_time.new
|
466
|
+
t.type = VpiSimTime
|
467
|
+
|
468
|
+
vpi_get_time nil, t
|
469
|
+
(t.high << INTEGER_BITS) | t.low
|
470
|
+
end
|
357
471
|
end
|
data/lib/ruby-vpi.rb
CHANGED
@@ -19,44 +19,32 @@
|
|
19
19
|
=end
|
20
20
|
|
21
21
|
module RubyVpi
|
22
|
-
# Initializes the bench by
|
23
|
-
# 1. the design.rb file
|
24
|
-
# 2. the proto.rb file if prototyping is enabled
|
25
|
-
# 3. the spec.rb file
|
22
|
+
# Initializes the bench by setting up code coverage, the interactive debugger, and so on:
|
23
|
+
# 1. loads the design.rb file
|
24
|
+
# 2. loads the proto.rb file if prototyping is enabled
|
25
|
+
# 3. loads the spec.rb file
|
26
26
|
#
|
27
|
-
# aDesignId:: The name of the Ruby design
|
28
|
-
# aSpecFormat:: The format being used by the specification.
|
29
|
-
#
|
27
|
+
# aDesignId:: The name of the Ruby object which gives access to the design under test.
|
28
|
+
# aSpecFormat:: The name of the format being used by the specification.
|
29
|
+
# aSimulationCycle:: A block that simulates the design under test by, for example, toggling the clock signal.
|
30
30
|
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# # return upon negative edge
|
37
|
-
# RubyVpi.init_bench ... do |clk|
|
38
|
-
# clk.intVal == 0
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# # return whenever clock changes
|
42
|
-
# RubyVpi.init_bench ... do |clk|
|
43
|
-
# true
|
44
|
-
# end
|
45
|
-
#
|
46
|
-
def RubyVpi.init_bench aDesignId, aSpecFormat, &aClockTrigger # :yields: clock_signal
|
31
|
+
def RubyVpi.init_bench aDesignId, aSpecFormat, &aSimulationCycle
|
32
|
+
raise ArgumentError, "block must be given" unless block_given?
|
33
|
+
|
47
34
|
if caller.find {|s| s =~ /^(.*?)_bench.rb:/}
|
48
35
|
testName = $1
|
49
36
|
else
|
50
37
|
raise 'Unable to determine name of test.'
|
51
38
|
end
|
52
39
|
|
53
|
-
aClockTrigger ||= lambda {|clk| clk.intVal == 1}
|
54
|
-
|
55
40
|
useDebugger = !(ENV['DEBUG'] || '').empty?
|
56
41
|
useCoverage = !(ENV['COVERAGE'] || '').empty?
|
57
42
|
usePrototype = !(ENV['PROTOTYPE'] || '').empty?
|
58
43
|
|
59
44
|
# set up code coverage analysis
|
45
|
+
# XXX: this is loaded *before* RCov to prevent coverage statistics about it
|
46
|
+
require 'ruby-vpi/vpi'
|
47
|
+
|
60
48
|
if useCoverage
|
61
49
|
require 'ruby-vpi/rcov'
|
62
50
|
|
@@ -104,8 +92,6 @@ module RubyVpi
|
|
104
92
|
end
|
105
93
|
|
106
94
|
# set up the VPI utility layer
|
107
|
-
require 'ruby-vpi/vpi'
|
108
|
-
|
109
95
|
Object.class_eval do
|
110
96
|
include Vpi
|
111
97
|
end
|
@@ -123,48 +109,24 @@ module RubyVpi
|
|
123
109
|
require "#{testName}_proto.rb"
|
124
110
|
|
125
111
|
Vpi.module_eval do
|
126
|
-
define_method :
|
112
|
+
define_method :simulate do
|
127
113
|
design.simulate!
|
128
114
|
end
|
115
|
+
|
116
|
+
define_method :vpi_register_cb do
|
117
|
+
warn "vpi_register_cb: callbacks not allowed when prototyping"
|
118
|
+
end
|
129
119
|
end
|
130
120
|
|
131
121
|
Vpi::vpi_printf "#{Config::PROJECT_NAME}: prototype is enabled for test #{testName.inspect}\n"
|
132
122
|
|
133
|
-
# trigger relay_verilog according to aClockTrigger
|
134
123
|
else
|
135
|
-
regs = design[VpiReg].sort_by {|h| h.lineNo}
|
136
|
-
clock = regs.first
|
137
|
-
|
138
124
|
Vpi.module_eval do
|
139
|
-
|
140
|
-
time = S_vpi_time.new
|
141
|
-
time.type = VpiSuppressTime
|
142
|
-
|
143
|
-
value = S_vpi_value.new
|
144
|
-
value.format = VpiSuppressVal
|
145
|
-
|
146
|
-
alarm = S_cb_data.new
|
147
|
-
alarm.reason = CbValueChange
|
148
|
-
alarm.cb_rtn = Vlog_relay_ruby
|
149
|
-
alarm.obj = clock
|
150
|
-
alarm.time = time
|
151
|
-
alarm.value = value
|
152
|
-
alarm.index = 0
|
153
|
-
alarm.user_data = nil
|
154
|
-
|
155
|
-
vpi_free_object(vpi_register_cb(alarm))
|
156
|
-
|
157
|
-
alias_method :relay_verilog_old, :relay_verilog
|
158
|
-
|
159
|
-
define_method :relay_verilog do
|
160
|
-
begin
|
161
|
-
relay_verilog_old
|
162
|
-
end until aClockTrigger.call(clock)
|
163
|
-
end
|
125
|
+
define_method :simulate, &aSimulationCycle
|
164
126
|
end
|
165
127
|
|
166
|
-
# XXX: this completes the handshake with pthread_mutex_lock() in relay_main() in the C extension
|
167
|
-
|
128
|
+
# XXX: this completes the handshake, by calling relay_verilog, with pthread_mutex_lock() in relay_main() in the C extension
|
129
|
+
advance_time
|
168
130
|
end
|
169
131
|
|
170
132
|
# load the design's specification
|
data/ref/c/annotated.html
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
<tr><td class="indexkey"><a class="el" href="structt__vpi__vecval.html">t_vpi_vecval</a></td><td class="indexvalue"></td></tr>
|
28
28
|
<tr><td class="indexkey"><a class="el" href="structt__vpi__vlog__info.html">t_vpi_vlog_info</a></td><td class="indexvalue"></td></tr>
|
29
29
|
</table>
|
30
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
30
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
31
31
|
<a href="http://www.doxygen.org/index.html">
|
32
32
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
33
33
|
</body>
|
data/ref/c/common_8h.html
CHANGED
@@ -140,7 +140,7 @@ Pass aroung this value instead of zero and non-zero integers. <dl compact><dt><b
|
|
140
140
|
|
141
141
|
</div>
|
142
142
|
</div><p>
|
143
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
143
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:25 2006 for Ruby-VPI by
|
144
144
|
<a href="http://www.doxygen.org/index.html">
|
145
145
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
146
146
|
</body>
|
data/ref/c/files.html
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
<tr><td class="indexkey"><a class="el" href="vlog_8h.html">vlog.h</a></td><td class="indexvalue">Interface between C and Verilog code </td></tr>
|
28
28
|
<tr><td class="indexkey"><a class="el" href="vpi__user_8h.html">vpi_user.h</a></td><td class="indexvalue"></td></tr>
|
29
29
|
</table>
|
30
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
30
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
31
31
|
<a href="http://www.doxygen.org/index.html">
|
32
32
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
33
33
|
</body>
|
data/ref/c/functions.html
CHANGED
@@ -125,7 +125,7 @@ Here is a list of all struct and union fields with links to the structures/union
|
|
125
125
|
: <a class="el" href="structt__cb__data.html#5039bb34ac75410ff93cbe44515b3543">t_cb_data</a>, <a class="el" href="structt__vpi__value.html#73c4197b95dc5a8f4e8f0754e776d796">t_vpi_value</a><li>vector
|
126
126
|
: <a class="el" href="structt__vpi__value.html#b363de5e581f84f9da4610dade8136df">t_vpi_value</a><li>version
|
127
127
|
: <a class="el" href="structt__vpi__vlog__info.html#3ff076199159904aa9869e0fb1476bad">t_vpi_vlog_info</a></ul>
|
128
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
128
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
129
129
|
<a href="http://www.doxygen.org/index.html">
|
130
130
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
131
131
|
</body>
|
data/ref/c/functions_vars.html
CHANGED
@@ -125,7 +125,7 @@
|
|
125
125
|
: <a class="el" href="structt__cb__data.html#5039bb34ac75410ff93cbe44515b3543">t_cb_data</a>, <a class="el" href="structt__vpi__value.html#73c4197b95dc5a8f4e8f0754e776d796">t_vpi_value</a><li>vector
|
126
126
|
: <a class="el" href="structt__vpi__value.html#b363de5e581f84f9da4610dade8136df">t_vpi_value</a><li>version
|
127
127
|
: <a class="el" href="structt__vpi__vlog__info.html#3ff076199159904aa9869e0fb1476bad">t_vpi_vlog_info</a></ul>
|
128
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
128
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
129
129
|
<a href="http://www.doxygen.org/index.html">
|
130
130
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
131
131
|
</body>
|
data/ref/c/globals.html
CHANGED
@@ -49,7 +49,7 @@ Here is a list of all functions, variables, defines, enums, and typedefs with li
|
|
49
49
|
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
|
50
50
|
<li>bool
|
51
51
|
: <a class="el" href="common_8h.html#f6a258d8f3ee5206d682d799316314b1">common.h</a></ul>
|
52
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
52
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
53
53
|
<a href="http://www.doxygen.org/index.html">
|
54
54
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
55
55
|
</body>
|
data/ref/c/globals_0x63.html
CHANGED
@@ -80,7 +80,7 @@ Here is a list of all functions, variables, defines, enums, and typedefs with li
|
|
80
80
|
: <a class="el" href="common_8h.html#f30d3fc89fbb3ed2aab2f5904ab76815">common.h</a><li>common_debug
|
81
81
|
: <a class="el" href="common_8h.html#fcdad79cb06a5c61737b2f434218dc95">common.h</a><li>common_printf
|
82
82
|
: <a class="el" href="common_8h.html#88235e5f8aab82571d68045e9f73fe81">common.h</a></ul>
|
83
|
-
<hr size="1"><address style="align: right;"><small>Generated on
|
83
|
+
<hr size="1"><address style="align: right;"><small>Generated on Sat Dec 30 19:26:26 2006 for Ruby-VPI by
|
84
84
|
<a href="http://www.doxygen.org/index.html">
|
85
85
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address>
|
86
86
|
</body>
|