ruby-vpi 18.0.2 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +15 -19
- data/bin/generate/proto.rb +15 -10
- data/bin/ruby-vpi +2 -0
- data/doc/README +3 -5
- data/doc/Rakefile +3 -3
- data/doc/common.css +24 -136
- data/doc/common.tpl +48 -37
- data/doc/figures/figures.dia +19 -19
- data/doc/figures/ruby_relay.png +0 -0
- data/doc/history.html +252 -67
- data/doc/history.inc +98 -1
- data/doc/history.yaml +105 -0
- data/doc/intro.inc +43 -32
- data/doc/lib/doc_format.rb +19 -13
- data/doc/lib/doc_proxy.rb +7 -7
- data/doc/manual.doc +156 -117
- data/doc/manual.html +601 -560
- data/doc/memo.html +29 -25
- data/doc/print.css +63 -4
- data/doc/readme.doc +4 -6
- data/doc/readme.html +129 -111
- data/doc/rss.xml +168 -7
- data/doc/screen.css +146 -0
- data/doc/spacing.css +57 -0
- data/{samp → examples}/counter/RSpec/Rakefile +0 -0
- data/{samp → examples}/counter/RSpec/counter_design.rb +0 -0
- data/examples/counter/RSpec/counter_proto.rb +9 -0
- data/{samp → examples}/counter/RSpec/counter_runner.rake +0 -0
- data/{samp → examples}/counter/RSpec/counter_spec.rb +0 -0
- data/{samp → examples}/counter/Rakefile +0 -0
- data/{samp → examples}/counter/counter.v +0 -0
- data/{samp → examples}/counter/xUnit/Rakefile +0 -0
- data/{samp → examples}/counter/xUnit/counter_bench.rb +0 -0
- data/{samp → examples}/counter/xUnit/counter_bench.v +0 -0
- data/{samp → examples}/counter/xUnit/counter_design.rb +0 -0
- data/examples/counter/xUnit/counter_proto.rb +9 -0
- data/{samp → examples}/counter/xUnit/counter_runner.rake +0 -0
- data/{samp → examples}/counter/xUnit/counter_spec.rb +0 -0
- data/{samp → examples}/pipelined_alu/Hw5UnitModel.rb +0 -0
- data/{samp → examples}/pipelined_alu/README +0 -0
- data/{samp → examples}/pipelined_alu/Rakefile +0 -0
- data/{samp → examples}/pipelined_alu/TestHw5UnitModel.rb +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit.v +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_design.rb +0 -7
- data/examples/pipelined_alu/hw5_unit_proto.rb +2 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_runner.rake +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_spec.rb +0 -0
- data/{samp → examples}/pipelined_alu/int_gen.rb +0 -0
- data/{samp → examples}/register_file/LICENSE +0 -0
- data/{samp → examples}/register_file/README +0 -0
- data/{samp → examples}/register_file/Rakefile +0 -0
- data/{samp → examples}/register_file/register_file.v +0 -0
- data/{samp → examples}/register_file/register_file_design.rb +0 -0
- data/examples/register_file/register_file_proto.rb +11 -0
- data/{samp → examples}/register_file/register_file_runner.rake +0 -0
- data/{samp → examples}/register_file/register_file_spec.rb +0 -0
- data/ext/main.c +5 -5
- data/ext/swig_vpi.i +6 -2
- data/lib/ruby-vpi/core/callback.rb +142 -0
- data/lib/ruby-vpi/core/edge.rb +128 -0
- data/lib/ruby-vpi/core/handle.rb +421 -0
- data/lib/ruby-vpi/core/scheduler.rb +244 -0
- data/lib/ruby-vpi/core/struct.rb +123 -0
- data/lib/ruby-vpi/core.rb +41 -0
- data/lib/ruby-vpi/rcov.rb +25 -12
- data/lib/ruby-vpi/runner.rb +30 -26
- data/lib/ruby-vpi/runner_boot_loader.rb +67 -37
- data/lib/ruby-vpi.rb +2 -2
- 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 +1 -1
- data/ref/c/globals_0x70.html +1 -1
- data/ref/c/globals_0x72.html +1 -1
- data/ref/c/globals_0x73.html +1 -1
- data/ref/c/globals_0x74.html +1 -1
- data/ref/c/globals_0x76.html +1 -1
- 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 +1 -1
- data/ref/c/globals_type.html +1 -1
- data/ref/c/globals_vars.html +1 -1
- data/ref/c/index.html +1 -1
- data/ref/c/main_8c.html +1 -1
- data/ref/c/main_8h.html +1 -1
- data/ref/c/relay_8c.html +1 -1
- data/ref/c/relay_8h.html +1 -1
- 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 +1 -1
- data/ref/c/vlog_8c.html +1 -1
- data/ref/c/vlog_8h.html +1 -1
- data/ref/c/vpi__user_8h.html +1 -1
- data/ref/ruby/classes/ERB.html +7 -5
- data/ref/ruby/classes/ERB.src/{M000026.html → M000024.html} +0 -0
- data/ref/ruby/classes/FileUtils.html +11 -11
- data/ref/ruby/classes/FileUtils.src/{M000027.html → M000025.html} +0 -0
- data/ref/ruby/classes/FileUtils.src/{M000028.html → M000026.html} +0 -0
- data/ref/ruby/classes/Float.html +8 -6
- data/ref/ruby/classes/Float.src/{M000021.html → M000019.html} +0 -0
- data/ref/ruby/classes/Integer.html +67 -65
- data/ref/ruby/classes/Integer.src/M000007.html +25 -0
- data/ref/ruby/classes/Integer.src/{M000014.html → M000008.html} +5 -5
- data/ref/ruby/classes/Integer.src/M000009.html +5 -12
- data/ref/ruby/classes/Integer.src/M000010.html +5 -5
- data/ref/ruby/classes/Integer.src/M000011.html +5 -5
- data/ref/ruby/classes/Integer.src/M000012.html +5 -5
- data/ref/ruby/classes/Integer.src/M000015.html +25 -0
- data/ref/ruby/classes/Integer.src/M000016.html +31 -0
- data/ref/ruby/classes/Integer.src/M000017.html +12 -12
- data/ref/ruby/classes/Integer.src/M000018.html +17 -18
- data/ref/ruby/classes/Object.html +126 -0
- data/ref/ruby/classes/RDoc.html +5 -5
- data/ref/ruby/classes/RDoc.src/{M000061.html → M000081.html} +0 -0
- data/ref/ruby/classes/RubyVPI.html +50 -9
- data/ref/ruby/classes/String.html +22 -20
- data/ref/ruby/classes/String.src/M000020.html +36 -0
- data/ref/ruby/classes/String.src/M000021.html +41 -0
- data/ref/ruby/classes/String.src/M000022.html +5 -23
- data/ref/ruby/classes/String.src/M000023.html +5 -28
- data/ref/ruby/classes/{Vpi → VPI}/Handle.html +442 -140
- data/ref/ruby/classes/{Vpi/Handle.src/M000042.html → VPI/Handle.src/M000037.html} +4 -4
- data/ref/ruby/classes/VPI/Handle.src/M000038.html +21 -0
- data/ref/ruby/classes/VPI/Handle.src/M000039.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000036.html → VPI/Handle.src/M000040.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000045.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000038.html → VPI/Handle.src/M000046.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000057.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000040.html → VPI/Handle.src/M000058.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000061.html +18 -0
- data/ref/ruby/classes/VPI/Handle.src/M000062.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000054.html → VPI/Handle.src/M000065.html} +11 -11
- data/ref/ruby/classes/VPI/Handle.src/M000067.html +21 -0
- data/ref/ruby/classes/VPI/Handle.src/M000068.html +28 -0
- data/ref/ruby/classes/VPI/Handle.src/M000069.html +50 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000048.html → VPI/Handle.src/M000070.html} +6 -6
- data/ref/ruby/classes/{Vpi/Handle.src/M000049.html → VPI/Handle.src/M000071.html} +6 -6
- data/ref/ruby/classes/{Vpi/Handle.src/M000050.html → VPI/Handle.src/M000072.html} +5 -5
- data/ref/ruby/classes/{Vpi/Handle.src/M000051.html → VPI/Handle.src/M000073.html} +17 -17
- data/ref/ruby/classes/VPI/Handle.src/M000075.html +18 -0
- data/ref/ruby/classes/VPI/Handle.src/M000076.html +40 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000056.html → VPI/Handle.src/M000077.html} +18 -18
- data/ref/ruby/classes/{Vpi → VPI}/S_vpi_time.html +22 -20
- data/ref/ruby/classes/VPI/S_vpi_time.src/M000078.html +18 -0
- data/ref/ruby/classes/VPI/S_vpi_time.src/M000079.html +19 -0
- data/ref/ruby/classes/{Vpi → VPI}/S_vpi_value.html +37 -23
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000034.html +35 -0
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000035.html +42 -0
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000036.html +42 -0
- data/ref/ruby/classes/{Vpi.html → VPI.html} +129 -34
- data/ref/ruby/classes/VPI.src/M000027.html +19 -0
- data/ref/ruby/classes/VPI.src/M000028.html +18 -0
- data/ref/ruby/classes/VPI.src/M000029.html +19 -0
- data/ref/ruby/classes/VPI.src/M000031.html +25 -0
- data/ref/ruby/classes/VPI.src/M000032.html +26 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.html +17 -15
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000004.html +23 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000007.html → M000005.html} +0 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000006.html +5 -10
- data/ref/ruby/classes/VerilogParser/Module.html +7 -5
- data/ref/ruby/classes/VerilogParser/Module.src/{M000005.html → M000003.html} +0 -0
- data/ref/ruby/classes/VerilogParser.html +7 -5
- data/ref/ruby/classes/VerilogParser.src/{M000004.html → M000002.html} +0 -0
- data/ref/ruby/created.rid +1 -1
- data/ref/ruby/files/bin/generate_rb.html +2 -2
- data/ref/ruby/files/lib/ruby-vpi/{vpi_rb.html → core/callback_rb.html} +7 -8
- data/ref/ruby/files/lib/ruby-vpi/core/edge_rb.html +114 -0
- data/ref/ruby/files/lib/ruby-vpi/core/handle_rb.html +107 -0
- data/ref/ruby/files/lib/ruby-vpi/core/scheduler_rb.html +114 -0
- data/ref/ruby/files/lib/ruby-vpi/core/struct_rb.html +108 -0
- data/ref/ruby/files/lib/ruby-vpi/core_rb.html +121 -0
- data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.html +5 -41
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000001.html +3 -3
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi_rb.html +1 -1
- data/ref/ruby/fr_class_index.html +5 -4
- data/ref/ruby/fr_file_index.html +6 -1
- data/ref/ruby/fr_method_index.html +80 -60
- metadata +126 -103
- data/ext/swig_vpi.h +0 -924
- data/ext/swig_wrap.cin +0 -7083
- data/lib/ruby-vpi/vpi.rb +0 -651
- data/ref/ruby/classes/Integer.src/M000013.html +0 -18
- data/ref/ruby/classes/Integer.src/M000019.html +0 -25
- data/ref/ruby/classes/Integer.src/M000020.html +0 -30
- data/ref/ruby/classes/String.src/M000024.html +0 -18
- data/ref/ruby/classes/String.src/M000025.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000035.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000037.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000039.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000041.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000043.html +0 -21
- data/ref/ruby/classes/Vpi/Handle.src/M000044.html +0 -21
- data/ref/ruby/classes/Vpi/Handle.src/M000045.html +0 -22
- data/ref/ruby/classes/Vpi/Handle.src/M000046.html +0 -50
- data/ref/ruby/classes/Vpi/Handle.src/M000047.html +0 -91
- data/ref/ruby/classes/Vpi/Handle.src/M000053.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000057.html +0 -40
- data/ref/ruby/classes/Vpi/S_vpi_time.src/M000058.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_time.src/M000059.html +0 -19
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000032.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000033.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000034.html +0 -18
- data/ref/ruby/classes/Vpi.src/M000029.html +0 -28
- data/ref/ruby/classes/Vpi.src/M000030.html +0 -39
- data/ref/ruby/classes/Vpi.src/M000031.html +0 -20
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000002.html +0 -18
- data/samp/counter/RSpec/counter_proto.rb +0 -10
- data/samp/counter/xUnit/counter_proto.rb +0 -10
- data/samp/pipelined_alu/hw5_unit_proto.rb +0 -4
- data/samp/register_file/register_file_proto.rb +0 -11
data/lib/ruby-vpi/vpi.rb
DELETED
|
@@ -1,651 +0,0 @@
|
|
|
1
|
-
# A utility layer which transforms the VPI interface
|
|
2
|
-
# into one that is more suitable for Ruby.
|
|
3
|
-
#--
|
|
4
|
-
# Copyright 2006 Suraj N. Kurapati
|
|
5
|
-
# See the file named LICENSE for details.
|
|
6
|
-
|
|
7
|
-
require 'ruby-vpi/util'
|
|
8
|
-
|
|
9
|
-
module Vpi
|
|
10
|
-
# Number of bits in PLI_INT32.
|
|
11
|
-
INTEGER_BITS = 32
|
|
12
|
-
|
|
13
|
-
# Lowest upper bound of PLI_INT32.
|
|
14
|
-
INTEGER_LIMIT = 2 ** INTEGER_BITS
|
|
15
|
-
|
|
16
|
-
# Bit-mask capable of capturing PLI_INT32.
|
|
17
|
-
INTEGER_MASK = INTEGER_LIMIT - 1
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
##############################################################################
|
|
21
|
-
# handles
|
|
22
|
-
##############################################################################
|
|
23
|
-
|
|
24
|
-
Handle = SWIG::TYPE_p_unsigned_int
|
|
25
|
-
|
|
26
|
-
# A handle is an object inside a Verilog simulation (see
|
|
27
|
-
# *vpiHandle* in IEEE Std. 1364-2005). VPI types and
|
|
28
|
-
# properties listed in ext/vpi_user.h can be specified by
|
|
29
|
-
# their names (strings or symbols) or integer constants.
|
|
30
|
-
#
|
|
31
|
-
# = Example names
|
|
32
|
-
# * "intVal"
|
|
33
|
-
# * :intVal
|
|
34
|
-
# * "vpiIntVal"
|
|
35
|
-
# * :vpiIntVal
|
|
36
|
-
# * "VpiIntVal"
|
|
37
|
-
# * :VpiIntVal
|
|
38
|
-
#
|
|
39
|
-
# = Example constants
|
|
40
|
-
# * VpiIntVal
|
|
41
|
-
# * VpiModule
|
|
42
|
-
# * VpiReg
|
|
43
|
-
#
|
|
44
|
-
class Handle
|
|
45
|
-
undef type # used to access vpiType
|
|
46
|
-
include Vpi
|
|
47
|
-
|
|
48
|
-
# Tests if the logic value of this handle is unknown (x).
|
|
49
|
-
def x?
|
|
50
|
-
self.hexStrVal =~ /x/i
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Sets the logic value of this handle to unknown (x).
|
|
54
|
-
def x!
|
|
55
|
-
self.hexStrVal = 'x'
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Tests if the logic value of this handle is high impedance (z).
|
|
59
|
-
def z?
|
|
60
|
-
self.hexStrVal =~ /z/i
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Sets the logic value of this handle to high impedance (z).
|
|
64
|
-
def z!
|
|
65
|
-
self.hexStrVal = 'z'
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Tests if the logic value of this handle is at "logic high" level.
|
|
69
|
-
def high?
|
|
70
|
-
self.intVal != 0
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Sets the logic value of this handle to "logic high" level.
|
|
74
|
-
def high!
|
|
75
|
-
self.intVal = 1
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Tests if the logic value of this handle is at "logic low" level.
|
|
79
|
-
def low?
|
|
80
|
-
self.hexStrVal =~ /^0+$/
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Sets the logic value of this handle to "logic low" level.
|
|
84
|
-
def low!
|
|
85
|
-
self.intVal = 0
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# Tests if the logic value of this handle is currently at a positive edge.
|
|
89
|
-
def posedge?
|
|
90
|
-
old = @lastVal
|
|
91
|
-
new = @lastVal = self.intVal
|
|
92
|
-
|
|
93
|
-
old == 0 && new == 1
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Tests if the logic value of this handle is currently at a negative edge.
|
|
97
|
-
def negedge?
|
|
98
|
-
old = @lastVal
|
|
99
|
-
new = @lastVal = self.intVal
|
|
100
|
-
|
|
101
|
-
old == 1 && new == 0
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Reads the value using the given
|
|
105
|
-
# format (integer constant) and
|
|
106
|
-
# returns a +S_vpi_value+ object.
|
|
107
|
-
def get_value_wrapper aFormat
|
|
108
|
-
val = S_vpi_value.new
|
|
109
|
-
val.format = aFormat
|
|
110
|
-
|
|
111
|
-
vpi_get_value self, val
|
|
112
|
-
val
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Reads the value using the given format (name or
|
|
116
|
-
# integer constant) and returns it. If a format is
|
|
117
|
-
# not given, then it is assumed to be VpiIntVal.
|
|
118
|
-
def get_value aFormat = VpiIntVal
|
|
119
|
-
val = get_value_wrapper(resolve_prop_type(aFormat))
|
|
120
|
-
|
|
121
|
-
case val.format
|
|
122
|
-
when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal, VpiStringVal
|
|
123
|
-
val.value.str.to_s
|
|
124
|
-
|
|
125
|
-
when VpiScalarVal
|
|
126
|
-
val.value.scalar.to_i
|
|
127
|
-
|
|
128
|
-
when VpiIntVal
|
|
129
|
-
@size ||= vpi_get(VpiSize, self)
|
|
130
|
-
|
|
131
|
-
if @size < INTEGER_BITS
|
|
132
|
-
val.value.integer.to_i
|
|
133
|
-
else
|
|
134
|
-
get_value_wrapper(VpiHexStrVal).value.str.to_s.to_i(16)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
when VpiRealVal
|
|
138
|
-
val.value.real.to_f
|
|
139
|
-
|
|
140
|
-
when VpiTimeVal
|
|
141
|
-
val.value.time
|
|
142
|
-
|
|
143
|
-
when VpiVectorVal
|
|
144
|
-
val.value.vector
|
|
145
|
-
|
|
146
|
-
when VpiStrengthVal
|
|
147
|
-
val.value.strength
|
|
148
|
-
|
|
149
|
-
else
|
|
150
|
-
raise "unknown S_vpi_value.format: #{val.format.inspect}"
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
# Writes the given value using the given format (name or integer
|
|
155
|
-
# constant), time, and delay, and then returns the written value.
|
|
156
|
-
#
|
|
157
|
-
# * If a format is not given, then the Verilog simulator
|
|
158
|
-
# will attempt to determine the correct format.
|
|
159
|
-
#
|
|
160
|
-
def put_value aValue, aFormat = nil, aTime = nil, aDelay = VpiNoDelay
|
|
161
|
-
if vpi_get(VpiType, self) == VpiNet
|
|
162
|
-
aDelay = VpiForceFlag
|
|
163
|
-
|
|
164
|
-
if driver = self[VpiDriver].find {|d| d.vpiType != VpiForce}
|
|
165
|
-
warn "forcing value #{aValue.inspect} onto wire #{self} that is already driven by #{driver.inspect}"
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
aFormat =
|
|
170
|
-
if aFormat
|
|
171
|
-
resolve_prop_type(aFormat)
|
|
172
|
-
|
|
173
|
-
elsif aValue.respond_to? :to_int
|
|
174
|
-
VpiIntVal
|
|
175
|
-
|
|
176
|
-
elsif aValue.respond_to? :to_float
|
|
177
|
-
VpiRealVal
|
|
178
|
-
|
|
179
|
-
elsif aValue.respond_to? :to_str
|
|
180
|
-
VpiStringVal
|
|
181
|
-
|
|
182
|
-
elsif aValue.is_a? S_vpi_time
|
|
183
|
-
VpiTimeVal
|
|
184
|
-
|
|
185
|
-
elsif aValue.is_a? S_vpi_vecval
|
|
186
|
-
VpiVectorVal
|
|
187
|
-
|
|
188
|
-
elsif aValue.is_a? S_vpi_strengthval
|
|
189
|
-
VpiStrengthVal
|
|
190
|
-
|
|
191
|
-
else
|
|
192
|
-
get_value_wrapper(VpiObjTypeVal).format
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
newVal = S_vpi_value.new(:format => aFormat)
|
|
196
|
-
|
|
197
|
-
writtenVal =
|
|
198
|
-
case aFormat
|
|
199
|
-
when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal, VpiStringVal
|
|
200
|
-
newVal.value.str = aValue.to_s
|
|
201
|
-
|
|
202
|
-
when VpiScalarVal
|
|
203
|
-
newVal.value.scalar = aValue.to_i
|
|
204
|
-
|
|
205
|
-
when VpiIntVal
|
|
206
|
-
@size ||= vpi_get(VpiSize, self)
|
|
207
|
-
|
|
208
|
-
if @size < INTEGER_BITS
|
|
209
|
-
newVal.format = VpiIntVal
|
|
210
|
-
newVal.value.integer = aValue.to_i
|
|
211
|
-
else
|
|
212
|
-
newVal.format = VpiHexStrVal
|
|
213
|
-
newVal.value.str = aValue.to_i.to_s(16)
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
when VpiRealVal
|
|
217
|
-
newVal.value.real = aValue.to_f
|
|
218
|
-
|
|
219
|
-
when VpiTimeVal
|
|
220
|
-
newVal.value.time = aValue
|
|
221
|
-
|
|
222
|
-
when VpiVectorVal
|
|
223
|
-
newVal.value.vector = aValue
|
|
224
|
-
|
|
225
|
-
when VpiStrengthVal
|
|
226
|
-
newVal.value.strength = aValue
|
|
227
|
-
|
|
228
|
-
else
|
|
229
|
-
raise "unknown S_vpi_value.format: #{newVal.format.inspect}"
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
vpi_put_value(self, newVal, aTime, aDelay)
|
|
233
|
-
|
|
234
|
-
writtenVal
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
# Forces the given value (see arguments for #put_value) onto this handle.
|
|
238
|
-
def force_value *args
|
|
239
|
-
args[3] = VpiForceFlag
|
|
240
|
-
put_value(*args)
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
# Releases a previously forced value on this handle.
|
|
244
|
-
def release_value
|
|
245
|
-
# this doesn't really change the value, it only removes the force flag
|
|
246
|
-
put_value(0, VpiIntVal, nil, VpiReleaseFlag)
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
# Tests if there is currently a value forced onto this handle.
|
|
250
|
-
def value_forced?
|
|
251
|
-
self[VpiDriver].any? {|d| d.vpiType == VpiForce}
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
# Returns an array of child handles of the
|
|
256
|
-
# given types (name or integer constant).
|
|
257
|
-
def [] *aTypes
|
|
258
|
-
handles = []
|
|
259
|
-
|
|
260
|
-
aTypes.each do |arg|
|
|
261
|
-
t = resolve_prop_type(arg)
|
|
262
|
-
|
|
263
|
-
if itr = vpi_iterate(t, self)
|
|
264
|
-
while h = vpi_scan(itr)
|
|
265
|
-
handles << h
|
|
266
|
-
end
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
handles
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# inherit Enumerable methods, such as #each, #map, #select, etc.
|
|
274
|
-
Enumerable.instance_methods.push('each').each do |meth|
|
|
275
|
-
# using a string because define_method
|
|
276
|
-
# does not accept a block until Ruby 1.9
|
|
277
|
-
class_eval %{
|
|
278
|
-
def #{meth}(*args, &block)
|
|
279
|
-
if ary = self[*args]
|
|
280
|
-
ary.#{meth}(&block)
|
|
281
|
-
end
|
|
282
|
-
end
|
|
283
|
-
}, __FILE__, __LINE__
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
# bypass Enumerable's #to_a method, which relies on #each
|
|
287
|
-
alias to_a []
|
|
288
|
-
|
|
289
|
-
# Sort by absolute VPI path.
|
|
290
|
-
def <=> other
|
|
291
|
-
self.fullName <=> other.fullName
|
|
292
|
-
end
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
# Inspects the given VPI property names, in
|
|
296
|
-
# addition to those common to all handles.
|
|
297
|
-
def inspect *aPropNames
|
|
298
|
-
aPropNames.unshift :name, :fullName, :size, :file, :lineNo, :hexStrVal
|
|
299
|
-
|
|
300
|
-
aPropNames.map! do |name|
|
|
301
|
-
"#{name}=#{self.send(name.to_sym).inspect}"
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
"#<Vpi::Handle #{vpiType_s} #{aPropNames.join(', ')}>"
|
|
305
|
-
end
|
|
306
|
-
|
|
307
|
-
alias to_s inspect
|
|
308
|
-
|
|
309
|
-
# Registers a callback that is invoked
|
|
310
|
-
# whenever the value of this object changes.
|
|
311
|
-
def cbValueChange aOptions = {}, &aHandler
|
|
312
|
-
raise ArgumentError unless block_given?
|
|
313
|
-
|
|
314
|
-
aOptions[:time] ||= S_vpi_time.new(:type => VpiSuppressTime)
|
|
315
|
-
aOptions[:value] ||= S_vpi_value.new(:format => VpiSuppressVal)
|
|
316
|
-
|
|
317
|
-
alarm = S_cb_data.new(
|
|
318
|
-
:reason => CbValueChange,
|
|
319
|
-
:obj => self,
|
|
320
|
-
:time => aOptions[:time],
|
|
321
|
-
:value => aOptions[:value],
|
|
322
|
-
:index => 0
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
vpi_register_cb alarm, &aHandler
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
@@propCache = Hash.new {|h, k| h[k] = Property.new(k)}
|
|
330
|
-
|
|
331
|
-
# Provides access to this handle's (1) child handles
|
|
332
|
-
# and (2) VPI properties through method calls. In the
|
|
333
|
-
# case that a child handle has the same name as a VPI
|
|
334
|
-
# property, the child handle will be accessed instead
|
|
335
|
-
# of the VPI property. However, you can still access
|
|
336
|
-
# the VPI property via #get_value and #put_value.
|
|
337
|
-
def method_missing aMeth, *aArgs, &aBlockArg
|
|
338
|
-
# cache the result for future accesses, in order
|
|
339
|
-
# to cut down number of calls to method_missing()
|
|
340
|
-
eigen_class = (class << self; self; end)
|
|
341
|
-
|
|
342
|
-
if child = vpi_handle_by_name(aMeth.to_s, self)
|
|
343
|
-
eigen_class.class_eval do
|
|
344
|
-
define_method aMeth do
|
|
345
|
-
child
|
|
346
|
-
end
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
child
|
|
350
|
-
else
|
|
351
|
-
# XXX: using a string because define_method() does
|
|
352
|
-
# not support a block argument until Ruby 1.9
|
|
353
|
-
eigen_class.class_eval %{
|
|
354
|
-
def #{aMeth}(*a, &b)
|
|
355
|
-
@@propCache[#{aMeth.inspect}].execute(self, *a, &b)
|
|
356
|
-
end
|
|
357
|
-
}, __FILE__, __LINE__
|
|
358
|
-
|
|
359
|
-
self.__send__(aMeth, *aArgs, &aBlockArg)
|
|
360
|
-
end
|
|
361
|
-
end
|
|
362
|
-
|
|
363
|
-
private
|
|
364
|
-
|
|
365
|
-
class Property # :nodoc:
|
|
366
|
-
def initialize aMethName
|
|
367
|
-
@methName = aMethName.to_s
|
|
368
|
-
|
|
369
|
-
# parse property information from the given method name
|
|
370
|
-
tokens = @methName.split('_')
|
|
371
|
-
|
|
372
|
-
tokens.last.sub!(/[\?!=]$/, '')
|
|
373
|
-
addendum = $&
|
|
374
|
-
@isAssign = $& == '='
|
|
375
|
-
isQuery = $& == '?'
|
|
376
|
-
|
|
377
|
-
tokens.last =~ /^[a-z]$/ && tokens.pop
|
|
378
|
-
@accessor = $&
|
|
379
|
-
|
|
380
|
-
@name = tokens.pop
|
|
381
|
-
|
|
382
|
-
@operation = unless tokens.empty?
|
|
383
|
-
tokens.join('_') << (addendum || '')
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
# determine the VPI integer type for the property
|
|
387
|
-
@name = @name.to_ruby_const_name
|
|
388
|
-
@name.insert 0, 'Vpi' unless @name =~ /^[Vv]pi/
|
|
389
|
-
|
|
390
|
-
begin
|
|
391
|
-
@type = Vpi.const_get(@name)
|
|
392
|
-
rescue NameError
|
|
393
|
-
raise ArgumentError, "#{@name.inspect} is not a valid VPI property"
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
@accessor = if @accessor
|
|
397
|
-
@accessor.to_sym
|
|
398
|
-
else
|
|
399
|
-
# infer accessor from VPI property @name
|
|
400
|
-
if isQuery
|
|
401
|
-
:b
|
|
402
|
-
else
|
|
403
|
-
case @name
|
|
404
|
-
when /Time$/
|
|
405
|
-
:d
|
|
406
|
-
|
|
407
|
-
when /Val$/
|
|
408
|
-
:l
|
|
409
|
-
|
|
410
|
-
when /Type$/, /Direction$/, /Index$/, /Size$/, /Strength\d?$/, /Polarity$/, /Edge$/, /Offset$/, /Mode$/, /LineNo$/
|
|
411
|
-
:i
|
|
412
|
-
|
|
413
|
-
when /Is[A-Z]/, /ed$/
|
|
414
|
-
:b
|
|
415
|
-
|
|
416
|
-
when /Name$/, /File$/, /Decompile$/
|
|
417
|
-
:s
|
|
418
|
-
|
|
419
|
-
when /Parent$/, /Inst$/, /Range$/, /Driver$/, /Net$/, /Load$/, /Conn$/, /Bit$/, /Word$/, /[LR]hs$/, /(In|Out)$/, /Term$/, /Argument$/, /Condition$/, /Use$/, /Operand$/, /Stmt$/, /Expr$/, /Scope$/, /Memory$/, /Delay$/
|
|
420
|
-
:h
|
|
421
|
-
end
|
|
422
|
-
end
|
|
423
|
-
end
|
|
424
|
-
end
|
|
425
|
-
|
|
426
|
-
def execute aHandle, *aArgs, &aBlockArg
|
|
427
|
-
if @operation
|
|
428
|
-
aHandle.__send__(@operation, @type, *aArgs, &aBlockArg)
|
|
429
|
-
else
|
|
430
|
-
case @accessor
|
|
431
|
-
when :d # delay values
|
|
432
|
-
raise NotImplementedError, 'processing of delay values is not yet implemented.'
|
|
433
|
-
# TODO: vpi_put_delays
|
|
434
|
-
# TODO: vpi_get_delays
|
|
435
|
-
|
|
436
|
-
when :l # logic values
|
|
437
|
-
if @isAssign
|
|
438
|
-
value = aArgs.shift
|
|
439
|
-
aHandle.put_value(value, @type, *aArgs)
|
|
440
|
-
else
|
|
441
|
-
aHandle.get_value(@type)
|
|
442
|
-
end
|
|
443
|
-
|
|
444
|
-
when :i # integer values
|
|
445
|
-
if @isAssign
|
|
446
|
-
raise NotImplementedError
|
|
447
|
-
else
|
|
448
|
-
vpi_get(@type, aHandle)
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
when :b # boolean values
|
|
452
|
-
if @isAssign
|
|
453
|
-
raise NotImplementedError
|
|
454
|
-
else
|
|
455
|
-
value = vpi_get(@type, aHandle)
|
|
456
|
-
value && (value != 0) # zero is false in C
|
|
457
|
-
end
|
|
458
|
-
|
|
459
|
-
when :s # string values
|
|
460
|
-
if @isAssign
|
|
461
|
-
raise NotImplementedError
|
|
462
|
-
else
|
|
463
|
-
vpi_get_str(@type, aHandle)
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
when :h # handle values
|
|
467
|
-
if @isAssign
|
|
468
|
-
raise NotImplementedError
|
|
469
|
-
else
|
|
470
|
-
vpi_handle(@type, aHandle)
|
|
471
|
-
end
|
|
472
|
-
|
|
473
|
-
when :a # array of child handles
|
|
474
|
-
if @isAssign
|
|
475
|
-
raise NotImplementedError
|
|
476
|
-
else
|
|
477
|
-
aHandle[@type]
|
|
478
|
-
end
|
|
479
|
-
|
|
480
|
-
else
|
|
481
|
-
raise NoMethodError, "cannot access VPI property #{@name.inspect} for handle #{aHandle.inspect} through method #{@methName.inspect} with arguments #{aArgs.inspect}"
|
|
482
|
-
end
|
|
483
|
-
end
|
|
484
|
-
end
|
|
485
|
-
end
|
|
486
|
-
|
|
487
|
-
# resolve type names into type constants
|
|
488
|
-
def resolve_prop_type aNameOrType
|
|
489
|
-
if aNameOrType.respond_to? :to_int
|
|
490
|
-
aNameOrType.to_int
|
|
491
|
-
else
|
|
492
|
-
@@propCache[aNameOrType.to_sym].type
|
|
493
|
-
end
|
|
494
|
-
end
|
|
495
|
-
end
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
##############################################################################
|
|
499
|
-
# callbacks
|
|
500
|
-
##############################################################################
|
|
501
|
-
|
|
502
|
-
Callback = Struct.new :handler, :token #:nodoc:
|
|
503
|
-
@@callbacks = {}
|
|
504
|
-
|
|
505
|
-
alias vpi_register_cb_old vpi_register_cb
|
|
506
|
-
|
|
507
|
-
# This is a Ruby version of the vpi_register_cb C function. It is
|
|
508
|
-
# identical to the C function, except for the following differences:
|
|
509
|
-
#
|
|
510
|
-
# * This method accepts a block (callback handler)
|
|
511
|
-
# which is executed whenever the callback occurs.
|
|
512
|
-
#
|
|
513
|
-
# * This method overwrites the +cb_rtn+ and +user_data+
|
|
514
|
-
# fields of the given +S_cb_data+ object.
|
|
515
|
-
#
|
|
516
|
-
def vpi_register_cb aData, &aHandler # :yields: Vpi::S_cb_data
|
|
517
|
-
raise ArgumentError, "block must be given" unless block_given?
|
|
518
|
-
|
|
519
|
-
key = aHandler.object_id.to_s
|
|
520
|
-
|
|
521
|
-
# register the callback with Verilog
|
|
522
|
-
aData.user_data = key
|
|
523
|
-
aData.cb_rtn = Vlog_relay_ruby
|
|
524
|
-
token = vpi_register_cb_old(aData)
|
|
525
|
-
|
|
526
|
-
@@callbacks[key] = Callback.new(aHandler, token)
|
|
527
|
-
token
|
|
528
|
-
end
|
|
529
|
-
|
|
530
|
-
alias vpi_remove_cb_old vpi_remove_cb
|
|
531
|
-
|
|
532
|
-
def vpi_remove_cb aData # :nodoc:
|
|
533
|
-
key = aData.user_data
|
|
534
|
-
|
|
535
|
-
if c = @@callbacks[key]
|
|
536
|
-
vpi_remove_cb_old c.token
|
|
537
|
-
@@callbacks.delete key
|
|
538
|
-
end
|
|
539
|
-
end
|
|
540
|
-
|
|
541
|
-
# Proxy for relay_verilog which supports callbacks. This method
|
|
542
|
-
# should NOT be invoked from callback handlers (see vpi_register_cb)
|
|
543
|
-
# and threads -- otherwise the situation will be like seven remote
|
|
544
|
-
# controls changing the channel on a single television set!
|
|
545
|
-
def relay_verilog_proxy # :nodoc:
|
|
546
|
-
loop do
|
|
547
|
-
relay_verilog
|
|
548
|
-
|
|
549
|
-
if reason = relay_ruby_reason # might be nil
|
|
550
|
-
dst = reason.user_data
|
|
551
|
-
|
|
552
|
-
if c = @@callbacks[dst]
|
|
553
|
-
c.handler.call reason
|
|
554
|
-
else
|
|
555
|
-
break # main thread is receiver
|
|
556
|
-
end
|
|
557
|
-
end
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
##############################################################################
|
|
563
|
-
# simulation control
|
|
564
|
-
##############################################################################
|
|
565
|
-
|
|
566
|
-
# Advances the simulation by the given number of steps.
|
|
567
|
-
def advance_time aNumSteps = 1
|
|
568
|
-
# schedule wake-up callback from verilog
|
|
569
|
-
time = S_vpi_time.new
|
|
570
|
-
time.integer = aNumSteps
|
|
571
|
-
time.type = VpiSimTime
|
|
572
|
-
|
|
573
|
-
value = S_vpi_value.new
|
|
574
|
-
value.format = VpiSuppressVal
|
|
575
|
-
|
|
576
|
-
alarm = S_cb_data.new
|
|
577
|
-
alarm.reason = CbAfterDelay
|
|
578
|
-
alarm.cb_rtn = Vlog_relay_ruby
|
|
579
|
-
alarm.obj = nil
|
|
580
|
-
alarm.time = time
|
|
581
|
-
alarm.value = value
|
|
582
|
-
alarm.index = 0
|
|
583
|
-
alarm.user_data = nil
|
|
584
|
-
|
|
585
|
-
vpi_free_object(vpi_register_cb_old(alarm))
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
# transfer control to verilog
|
|
589
|
-
relay_verilog_proxy
|
|
590
|
-
end
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
##############################################################################
|
|
594
|
-
# utility
|
|
595
|
-
##############################################################################
|
|
596
|
-
|
|
597
|
-
# Returns the current simulation time as an integer.
|
|
598
|
-
def simulation_time
|
|
599
|
-
t = S_vpi_time.new :type => VpiSimTime
|
|
600
|
-
vpi_get_time nil, t
|
|
601
|
-
t.to_i
|
|
602
|
-
end
|
|
603
|
-
|
|
604
|
-
class S_vpi_time
|
|
605
|
-
# Returns the high and low portions of
|
|
606
|
-
# this time as a single 64-bit integer.
|
|
607
|
-
def integer
|
|
608
|
-
(self.high << INTEGER_BITS) | self.low
|
|
609
|
-
end
|
|
610
|
-
|
|
611
|
-
# Sets the high and low portions of this
|
|
612
|
-
# time from the given 64-bit integer.
|
|
613
|
-
def integer= aValue
|
|
614
|
-
self.low = aValue & INTEGER_MASK
|
|
615
|
-
self.high = (aValue >> INTEGER_BITS) & INTEGER_MASK
|
|
616
|
-
end
|
|
617
|
-
|
|
618
|
-
alias to_i integer
|
|
619
|
-
alias to_f real
|
|
620
|
-
end
|
|
621
|
-
|
|
622
|
-
class S_vpi_value
|
|
623
|
-
def to_i
|
|
624
|
-
value.integer
|
|
625
|
-
end
|
|
626
|
-
|
|
627
|
-
def to_f
|
|
628
|
-
value.real
|
|
629
|
-
end
|
|
630
|
-
|
|
631
|
-
def to_s
|
|
632
|
-
value.str
|
|
633
|
-
end
|
|
634
|
-
end
|
|
635
|
-
|
|
636
|
-
# make VPI structs more accessible by allowing their
|
|
637
|
-
# members to be initialized through the constructor
|
|
638
|
-
constants.grep(/^S_/).each do |s|
|
|
639
|
-
const_get(s).class_eval do
|
|
640
|
-
alias old_initialize initialize
|
|
641
|
-
|
|
642
|
-
def initialize aMembers = {} #:nodoc:
|
|
643
|
-
old_initialize
|
|
644
|
-
|
|
645
|
-
aMembers.each_pair do |k, v|
|
|
646
|
-
__send__ "#{k}=", v
|
|
647
|
-
end
|
|
648
|
-
end
|
|
649
|
-
end
|
|
650
|
-
end
|
|
651
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<!DOCTYPE html
|
|
3
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
-
|
|
6
|
-
<html>
|
|
7
|
-
<head>
|
|
8
|
-
<title>mask (Integer)</title>
|
|
9
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
10
|
-
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
-
</head>
|
|
12
|
-
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/ruby-vpi/integer.rb, line 40</span>
|
|
14
|
-
40: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">mask</span>
|
|
15
|
-
41: <span class="ruby-identifier">length</span>.<span class="ruby-identifier">to_mask</span>
|
|
16
|
-
42: <span class="ruby-keyword kw">end</span></pre>
|
|
17
|
-
</body>
|
|
18
|
-
</html>
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<!DOCTYPE html
|
|
3
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
-
|
|
6
|
-
<html>
|
|
7
|
-
<head>
|
|
8
|
-
<title>extend_sign (Integer)</title>
|
|
9
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
10
|
-
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
-
</head>
|
|
12
|
-
<body class="standalone-code">
|
|
13
|
-
<pre> <span class="ruby-comment cmt"># File lib/ruby-vpi/integer.rb, line 97</span>
|
|
14
|
-
97: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">extend_sign</span> <span class="ruby-identifier">aOrigWidth</span>, <span class="ruby-identifier">aExtWidth</span>
|
|
15
|
-
98: <span class="ruby-identifier">result</span> = <span class="ruby-keyword kw">self</span>
|
|
16
|
-
99: <span class="ruby-identifier">maskWidth</span> = <span class="ruby-identifier">aExtWidth</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">aOrigWidth</span>
|
|
17
|
-
100:
|
|
18
|
-
101: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">maskWidth</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">result</span>[<span class="ruby-identifier">aOrigWidth</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
|
|
19
|
-
102: <span class="ruby-identifier">result</span> <span class="ruby-operator">|=</span> (<span class="ruby-identifier">maskWidth</span>.<span class="ruby-identifier">to_mask</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">aOrigWidth</span>)
|
|
20
|
-
103: <span class="ruby-keyword kw">end</span>
|
|
21
|
-
104:
|
|
22
|
-
105: <span class="ruby-identifier">result</span> <span class="ruby-operator">&</span> <span class="ruby-identifier">aExtWidth</span>.<span class="ruby-identifier">to_mask</span>
|
|
23
|
-
106: <span class="ruby-keyword kw">end</span></pre>
|
|
24
|
-
</body>
|
|
25
|
-
</html>
|