HDLRuby 2.11.4 → 2.11.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/hruby_sim/hruby_rcsim_build.c +87 -48
- data/ext/hruby_sim/hruby_sim.h +67 -1
- data/ext/hruby_sim/hruby_sim_calc.c +211 -28
- data/ext/hruby_sim/hruby_sim_core.c +140 -52
- data/ext/hruby_sim/hruby_sim_mute.c +65 -0
- data/ext/hruby_sim/hruby_sim_stack_calc.c +10 -0
- data/ext/hruby_sim/hruby_sim_tree_calc.c +36 -9
- data/ext/hruby_sim/hruby_sim_vcd.c +41 -23
- data/lib/HDLRuby/hdr_samples/arith_bench.rb +92 -0
- data/lib/HDLRuby/hdr_samples/constant_prop_bench.rb +58 -0
- data/lib/HDLRuby/hdrcc.rb +15 -6
- data/lib/HDLRuby/hruby_bstr.rb +15 -3
- data/lib/HDLRuby/hruby_high.rb +8 -4
- data/lib/HDLRuby/hruby_low.rb +14 -5
- data/lib/HDLRuby/hruby_low2c.rb +184 -68
- data/lib/HDLRuby/hruby_low_without_connection.rb +6 -2
- data/lib/HDLRuby/hruby_rcsim.rb +25 -15
- data/lib/HDLRuby/hruby_rsim.rb +201 -85
- data/lib/HDLRuby/hruby_rsim_mute.rb +35 -0
- data/lib/HDLRuby/hruby_rsim_vcd.rb +168 -12
- data/lib/HDLRuby/hruby_values.rb +19 -2
- data/lib/HDLRuby/hruby_verilog.rb +67 -17
- data/lib/HDLRuby/std/fsm.rb +3 -3
- data/lib/HDLRuby/version.rb +1 -1
- metadata +6 -2
@@ -29,7 +29,9 @@ module HDLRuby::Low
|
|
29
29
|
if scope.each_connection.to_a.any? then
|
30
30
|
inputs_blk = Block.new(:par)
|
31
31
|
outputs_blk = Block.new(:par)
|
32
|
-
|
32
|
+
# Timed block is not necessary anymore for initialization.
|
33
|
+
# timed_blk = TimeBlock.new(:seq)
|
34
|
+
timed_blk = Block.new(:seq)
|
33
35
|
scope.each_connection do |connection|
|
34
36
|
# puts "For connection: #{connection}"
|
35
37
|
# Check the left and right of the connection
|
@@ -134,7 +136,9 @@ module HDLRuby::Low
|
|
134
136
|
scope.add_behavior(Behavior.new(outputs_blk))
|
135
137
|
end
|
136
138
|
if timed_blk.each_statement.any? then
|
137
|
-
|
139
|
+
# No more required to be timed.
|
140
|
+
# scope.add_behavior(TimeBehavior.new(timed_blk))
|
141
|
+
scope.add_behavior(Behavior.new(timed_blk))
|
138
142
|
end
|
139
143
|
end
|
140
144
|
end
|
data/lib/HDLRuby/hruby_rcsim.rb
CHANGED
@@ -78,11 +78,13 @@ module HDLRuby::High
|
|
78
78
|
|
79
79
|
|
80
80
|
## Starts the simulation for top system +top+.
|
81
|
-
# NOTE: +name+ is the name of the simulation
|
82
|
-
# the
|
83
|
-
#
|
84
|
-
|
85
|
-
|
81
|
+
# NOTE: +name+ is the name of the simulation, +outpath+ is the path where
|
82
|
+
# the output is to save, and +outmode+ is the output mode as follows:
|
83
|
+
# 0: standard
|
84
|
+
# 1: mute
|
85
|
+
# 2: vcd
|
86
|
+
def self.rcsim(top,name,outpath,outmode)
|
87
|
+
RCSim.rcsim_main(top.rcsystemT,outpath +"/" + name,outmode)
|
86
88
|
end
|
87
89
|
|
88
90
|
|
@@ -741,7 +743,7 @@ module HDLRuby::High
|
|
741
743
|
# Create and add the events.
|
742
744
|
rcevs = []
|
743
745
|
self.right.each_node_deep do |node|
|
744
|
-
if node.is_a?(RefObject) then
|
746
|
+
if node.is_a?(RefObject) && !node.parent.is_a?(RefObject) then
|
745
747
|
ev = RCSim.rcsim_make_event(:anyedge,node.to_rcsim)
|
746
748
|
RCSim.rcsim_set_owner(ev,@rcbehavior)
|
747
749
|
rcevs << ev
|
@@ -786,16 +788,24 @@ module HDLRuby::High
|
|
786
788
|
def to_rcsim
|
787
789
|
# Create the value C object.
|
788
790
|
if self.content.is_a?(::Integer) then
|
789
|
-
|
790
|
-
|
791
|
-
|
791
|
+
# puts "self.type.width=#{self.type.width} and content=#{self.content}" ; $stdout.flush
|
792
|
+
if self.type.width <= 64 then
|
793
|
+
if self.content.bit_length <= 63 then
|
794
|
+
return RCSim.rcsim_make_value_numeric(self.type.to_rcsim,
|
795
|
+
self.content)
|
796
|
+
else
|
797
|
+
return RCSim.rcsim_make_value_numeric(self.type.to_rcsim,
|
798
|
+
self.content & 0xFFFFFFFFFFFF)
|
799
|
+
end
|
792
800
|
else
|
793
|
-
|
794
|
-
|
795
|
-
str
|
796
|
-
|
797
|
-
str =
|
801
|
+
if self.content < 0 then
|
802
|
+
str = (2**self.type.width + self.content).to_s(2)
|
803
|
+
str = "1" * (self.type.width-str.length) + str
|
804
|
+
else
|
805
|
+
str = self.content.to_s(2)
|
806
|
+
str = "0" * (self.type.width-str.length) + str
|
798
807
|
end
|
808
|
+
# puts "now str=#{str} (#{str.length})" ; $stdout.flush
|
799
809
|
return RCSim.rcsim_make_value_bitstring(self.type.to_rcsim,
|
800
810
|
str.reverse)
|
801
811
|
end
|
@@ -945,7 +955,7 @@ module HDLRuby::High
|
|
945
955
|
# RCSim.rcsim_add_refConcat_ref(rcref,ref.to_rcsim)
|
946
956
|
# end
|
947
957
|
if self.each_ref.any? then
|
948
|
-
RCSim.rcsim_add_refConcat_refs(rcref,self.each_ref(&:to_rcsim))
|
958
|
+
RCSim.rcsim_add_refConcat_refs(rcref,self.each_ref.map(&:to_rcsim))
|
949
959
|
end
|
950
960
|
|
951
961
|
return rcref
|
data/lib/HDLRuby/hruby_rsim.rb
CHANGED
@@ -16,6 +16,14 @@ module HDLRuby::High
|
|
16
16
|
# Enhance a system type with Ruby simulation.
|
17
17
|
class SystemT
|
18
18
|
|
19
|
+
# Tell if the simulation is in multithread mode or not.
|
20
|
+
attr_reader :multithread
|
21
|
+
|
22
|
+
## Add untimed objet +obj+
|
23
|
+
def add_untimed(obj)
|
24
|
+
@untimeds << obj
|
25
|
+
end
|
26
|
+
|
19
27
|
## Add timed behavior +beh+.
|
20
28
|
# Returns the id of the timed behavior.
|
21
29
|
def add_timed_behavior(beh)
|
@@ -36,6 +44,63 @@ module HDLRuby::High
|
|
36
44
|
@sig_active << sig
|
37
45
|
end
|
38
46
|
|
47
|
+
## Advance the global simulator.
|
48
|
+
def advance
|
49
|
+
# # Display the time
|
50
|
+
# self.show_time
|
51
|
+
shown_values = {}
|
52
|
+
# Get the behaviors waiting on activated signals.
|
53
|
+
until @sig_active.empty? do
|
54
|
+
# puts "sig_active.size=#{@sig_active.size}"
|
55
|
+
# puts "sig_active=#{@sig_active.map {|sig| sig.fullname}}"
|
56
|
+
# Look for the behavior sensitive to the signals.
|
57
|
+
# @sig_active.each do |sig|
|
58
|
+
# sig.each_anyedge { |beh| @sig_exec << beh }
|
59
|
+
# if (sig.c_value.zero? && !sig.f_value.zero?) then
|
60
|
+
# # puts "sig.c_value=#{sig.c_value.content}"
|
61
|
+
# sig.each_posedge { |beh| @sig_exec << beh }
|
62
|
+
# elsif (!sig.c_value.zero? && sig.f_value.zero?) then
|
63
|
+
# sig.each_negedge { |beh| @sig_exec << beh }
|
64
|
+
# end
|
65
|
+
# end
|
66
|
+
@sig_active.each do |sig|
|
67
|
+
next if (sig.c_value.eql?(sig.f_value))
|
68
|
+
# next if (sig.c_value.to_vstr == sig.f_value.to_vstr)
|
69
|
+
# puts "sig.c_value: #{sig.c_value.to_vstr}, sig.f_value=#{sig.f_value.to_vstr}"
|
70
|
+
sig.each_anyedge { |beh| @sig_exec << beh }
|
71
|
+
if (sig.c_value.zero?) then
|
72
|
+
# puts "sig.c_value=#{sig.c_value.content}"
|
73
|
+
sig.each_posedge { |beh| @sig_exec << beh }
|
74
|
+
elsif (!sig.c_value.zero?) then
|
75
|
+
sig.each_negedge { |beh| @sig_exec << beh }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
# Update the signals.
|
79
|
+
@sig_active.each { |sig| sig.c_value = sig.f_value }
|
80
|
+
# puts "first @sig_exec.size=#{@sig_exec.size}"
|
81
|
+
@sig_exec.uniq! {|beh| beh.object_id }
|
82
|
+
# Display the activated signals.
|
83
|
+
@sig_active.each do |sig|
|
84
|
+
if !shown_values[sig].eql?(sig.f_value) then
|
85
|
+
self.show_signal(sig)
|
86
|
+
shown_values[sig] = sig.f_value
|
87
|
+
end
|
88
|
+
end
|
89
|
+
# Clear the list of active signals.
|
90
|
+
@sig_active.clear
|
91
|
+
# puts "sig_exec.size=#{@sig_exec.size}"
|
92
|
+
# Execute the relevant behaviors and connections.
|
93
|
+
@sig_exec.each { |obj| obj.execute(:par) }
|
94
|
+
@sig_exec.clear
|
95
|
+
@sig_active.uniq! {|sig| sig.object_id }
|
96
|
+
# puts "@sig_active.size=#{@sig_active.size}"
|
97
|
+
# Advance time.
|
98
|
+
@time = (@timed_behaviors.min {|b0,b1| b0.time <=> b1.time }).time
|
99
|
+
end
|
100
|
+
# Display the time
|
101
|
+
self.show_time
|
102
|
+
end
|
103
|
+
|
39
104
|
## Run the simulation from the current systemT and outputs the resuts
|
40
105
|
# on simout.
|
41
106
|
def sim(simout)
|
@@ -43,20 +108,13 @@ module HDLRuby::High
|
|
43
108
|
HDLRuby.show "#{Time.now}#{show_mem}"
|
44
109
|
# Merge the included.
|
45
110
|
self.merge_included!
|
46
|
-
# Initializes the run mutex and the conditions.
|
47
|
-
@mutex = Mutex.new
|
48
|
-
@master = ConditionVariable.new
|
49
|
-
@master_flag = 0
|
50
|
-
@slave = ConditionVariable.new
|
51
|
-
@slave_flags_not = 0
|
52
|
-
@num_done = 0
|
53
|
-
# @lock = 0
|
54
|
-
# @runs = 0
|
55
111
|
# Initializes the time.
|
56
112
|
@time = 0
|
57
113
|
# Initializes the time and signals execution buffers.
|
58
114
|
@tim_exec = []
|
59
115
|
@sig_exec = []
|
116
|
+
# Initilize the list of untimed objects.
|
117
|
+
@untimeds = []
|
60
118
|
# Initialize the list of currently exisiting timed behavior.
|
61
119
|
@timed_behaviors = []
|
62
120
|
# Initialize the list of activated signals.
|
@@ -68,72 +126,97 @@ module HDLRuby::High
|
|
68
126
|
self.init_sim(self)
|
69
127
|
# Initialize the displayer.
|
70
128
|
self.show_init(simout)
|
71
|
-
|
72
|
-
#
|
73
|
-
|
74
|
-
#
|
75
|
-
|
76
|
-
#
|
77
|
-
@
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
#
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
129
|
+
|
130
|
+
# Initialize the untimed objects.
|
131
|
+
self.init_untimeds
|
132
|
+
# puts "End of init_untimed."
|
133
|
+
|
134
|
+
# Is there more than one timed behavior.
|
135
|
+
if @total_timed_behaviors <= 1 then
|
136
|
+
# No, no need of multithreading.
|
137
|
+
@multithread = false
|
138
|
+
# Simple execute the block of the behavior.
|
139
|
+
@timed_behaviors[0].block.execute(:seq)
|
140
|
+
else
|
141
|
+
# Yes, need of multithreading.
|
142
|
+
@multithread = true
|
143
|
+
# Initializes the run mutex and the conditions.
|
144
|
+
@mutex = Mutex.new
|
145
|
+
@master = ConditionVariable.new
|
146
|
+
@master_flag = 0
|
147
|
+
@slave = ConditionVariable.new
|
148
|
+
@slave_flags_not = 0
|
149
|
+
@num_done = 0
|
150
|
+
|
151
|
+
# First all the timed behaviors are to be executed.
|
152
|
+
@timed_behaviors.each {|beh| @tim_exec << beh }
|
153
|
+
# But starts locked.
|
154
|
+
@slave_flags_not = 2**@timed_behaviors.size - 1
|
155
|
+
# Starts the threads.
|
156
|
+
@timed_behaviors.each {|beh| beh.make_thread }
|
157
|
+
|
158
|
+
HDLRuby.show "Starting Ruby-level simulator..."
|
159
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
160
|
+
# Run the simulation.
|
161
|
+
self.run_init do
|
162
|
+
# # Wake the behaviors.
|
163
|
+
# @timed_behaviors.each {|beh| beh.run }
|
164
|
+
until @tim_exec.empty? do
|
165
|
+
# Execute the time behaviors that are ready.
|
166
|
+
self.run_ack
|
167
|
+
self.run_wait
|
168
|
+
# Advance the global simulator.
|
169
|
+
self.advance
|
170
|
+
# # Display the time
|
171
|
+
# self.show_time
|
172
|
+
# shown_values = {}
|
173
|
+
# # Get the behaviors waiting on activated signals.
|
174
|
+
# until @sig_active.empty? do
|
175
|
+
# # # Update the signals.
|
176
|
+
# # @sig_active.each { |sig| sig.c_value = sig.f_value }
|
177
|
+
# # puts "sig_active.size=#{@sig_active.size}"
|
178
|
+
# # Look for the behavior sensitive to the signals.
|
179
|
+
# @sig_active.each do |sig|
|
180
|
+
# sig.each_anyedge { |beh| @sig_exec << beh }
|
181
|
+
# if (sig.c_value.zero? && !sig.f_value.zero?) then
|
182
|
+
# # puts "sig.c_value=#{sig.c_value.content}"
|
183
|
+
# sig.each_posedge { |beh| @sig_exec << beh }
|
184
|
+
# elsif (!sig.c_value.zero? && sig.f_value.zero?) then
|
185
|
+
# sig.each_negedge { |beh| @sig_exec << beh }
|
186
|
+
# end
|
187
|
+
# end
|
188
|
+
# # Update the signals.
|
189
|
+
# @sig_active.each { |sig| sig.c_value = sig.f_value }
|
190
|
+
# # puts "first @sig_exec.size=#{@sig_exec.size}"
|
191
|
+
# @sig_exec.uniq! {|beh| beh.object_id }
|
192
|
+
# # Display the activated signals.
|
193
|
+
# @sig_active.each do |sig|
|
194
|
+
# if !shown_values[sig].eql?(sig.f_value) then
|
195
|
+
# self.show_signal(sig)
|
196
|
+
# shown_values[sig] = sig.f_value
|
197
|
+
# end
|
198
|
+
# end
|
199
|
+
# # Clear the list of active signals.
|
200
|
+
# @sig_active.clear
|
201
|
+
# # puts "sig_exec.size=#{@sig_exec.size}"
|
202
|
+
# # Execute the relevant behaviors and connections.
|
203
|
+
# @sig_exec.each { |obj| obj.execute(:par) }
|
204
|
+
# @sig_exec.clear
|
205
|
+
# @sig_active.uniq! {|sig| sig.object_id }
|
206
|
+
# # puts "@sig_active.size=#{@sig_active.size}"
|
207
|
+
# end
|
208
|
+
|
209
|
+
# # Advance time.
|
210
|
+
# @time = (@timed_behaviors.min {|b0,b1| b0.time <=> b1.time }).time
|
211
|
+
break if @timed_behaviors.empty?
|
212
|
+
# Schedule the next timed behavior to execute.
|
213
|
+
@tim_exec = []
|
214
|
+
@timed_behaviors.each do |beh|
|
215
|
+
@tim_exec << beh if beh.time == @time
|
117
216
|
end
|
118
|
-
#
|
119
|
-
@
|
120
|
-
# puts "sig_exec.size=#{@sig_exec.size}"
|
121
|
-
# Execute the relevant behaviors and connections.
|
122
|
-
@sig_exec.each { |obj| obj.execute(:par) }
|
123
|
-
@sig_exec.clear
|
124
|
-
@sig_active.uniq! {|sig| sig.object_id }
|
125
|
-
# puts "@sig_active.size=#{@sig_active.size}"
|
217
|
+
# puts "@tim_exec.size=#{@tim_exec.size}"
|
218
|
+
# puts "@timed_bevaviors.size=#{@timed_behaviors.size}"
|
126
219
|
end
|
127
|
-
break if @timed_behaviors.empty?
|
128
|
-
# Advance time.
|
129
|
-
@time = (@timed_behaviors.min {|b0,b1| b0.time <=> b1.time }).time
|
130
|
-
# Schedule the next timed behavior to execute.
|
131
|
-
@tim_exec = []
|
132
|
-
@timed_behaviors.each do |beh|
|
133
|
-
@tim_exec << beh if beh.time == @time
|
134
|
-
end
|
135
|
-
# puts "@tim_exec.size=#{@tim_exec.size}"
|
136
|
-
# puts "@timed_bevaviors.size=#{@timed_behaviors.size}"
|
137
220
|
end
|
138
221
|
end
|
139
222
|
end
|
@@ -146,6 +229,17 @@ module HDLRuby::High
|
|
146
229
|
# Recure on the scope.
|
147
230
|
self.scope.init_sim(systemT)
|
148
231
|
end
|
232
|
+
|
233
|
+
## Initialize the untimed objects.
|
234
|
+
def init_untimeds
|
235
|
+
@untimeds.each do |obj|
|
236
|
+
if obj.is_a?(Behavior) then
|
237
|
+
obj.block.execute(:seq)
|
238
|
+
else
|
239
|
+
obj.execute(:seq)
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
149
243
|
|
150
244
|
## Initialize run for executing +ruby_block+
|
151
245
|
def run_init(&ruby_block)
|
@@ -278,6 +372,8 @@ module HDLRuby::High
|
|
278
372
|
|
279
373
|
## Initialize the simulation for system +systemT+.
|
280
374
|
def init_sim(systemT)
|
375
|
+
# Add the behavior to the list of untimed objects.
|
376
|
+
systemT.add_untimed(self)
|
281
377
|
# Process the sensitivity list.
|
282
378
|
# Is it a clocked behavior?
|
283
379
|
events = self.each_event.to_a
|
@@ -292,6 +388,7 @@ module HDLRuby::High
|
|
292
388
|
end.to_a
|
293
389
|
# Keep only one ref per signal.
|
294
390
|
refs.uniq! { |node| node.fullname }
|
391
|
+
# puts "refs=#{refs.map {|node| node.fullname}}"
|
295
392
|
# Remove the inner signals from the list.
|
296
393
|
self.block.each_inner do |inner|
|
297
394
|
refs.delete_if {|r| r.name == inner.name }
|
@@ -358,7 +455,8 @@ module HDLRuby::High
|
|
358
455
|
begin
|
359
456
|
# puts "Starting thread"
|
360
457
|
systemT.run_req(@id)
|
361
|
-
self.block.execute(:par)
|
458
|
+
# self.block.execute(:par)
|
459
|
+
self.block.execute(:seq)
|
362
460
|
# puts "Ending thread"
|
363
461
|
rescue => e
|
364
462
|
puts "Got exception: #{e.full_message}"
|
@@ -456,8 +554,8 @@ module HDLRuby::High
|
|
456
554
|
@f_value = value
|
457
555
|
# Set the mode.
|
458
556
|
@mode = mode
|
459
|
-
# puts "assign #{value.content} (#{value.content.class}) with self.type.width=#{self.type.width} while value.type.width=#{value.type.width}" if self.name.to_s.include?("
|
460
|
-
|
557
|
+
# puts "assign #{value.content} (#{value.content.class}) with self.type.width=#{self.type.width} while value.type.width=#{value.type.width}" if self.name.to_s.include?("xnor")
|
558
|
+
@f_value = value.cast(self.type) # Cast not always inserted by HDLRuby normally
|
461
559
|
end
|
462
560
|
|
463
561
|
## Assigns +value+ at +index+ (integer or range).
|
@@ -607,7 +705,7 @@ module HDLRuby::High
|
|
607
705
|
## Initialize the simulation for system +systemT+.
|
608
706
|
def init_sim(systemT)
|
609
707
|
self.each_when { |wh| wh.init_sim(systemT) }
|
610
|
-
self.default.init_sim(systemT)
|
708
|
+
self.default.init_sim(systemT) if self.default
|
611
709
|
end
|
612
710
|
|
613
711
|
## Executes the statement.
|
@@ -618,7 +716,7 @@ module HDLRuby::High
|
|
618
716
|
return
|
619
717
|
end
|
620
718
|
end
|
621
|
-
|
719
|
+
self.default.execute(mode) if self.default
|
622
720
|
end
|
623
721
|
end
|
624
722
|
end
|
@@ -690,10 +788,16 @@ module HDLRuby::High
|
|
690
788
|
def execute(mode)
|
691
789
|
@behavior ||= self.behavior
|
692
790
|
@behavior.time += self.delay.time_ps
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
791
|
+
if @sim.multithread then
|
792
|
+
# Multi thread mode: synchronize.
|
793
|
+
# puts "Stopping #{@behavior.object_id} (@behavior.time=#{@behavior.time})..."
|
794
|
+
@sim.run_done(@behavior.id)
|
795
|
+
# puts "Rerunning #{@behavior.object_id} (@behavior.time=#{@behavior.time})..."
|
796
|
+
@sim.run_req(@behavior.id)
|
797
|
+
else
|
798
|
+
# No thread mode, need to advance the global simulator.
|
799
|
+
@sim.advance
|
800
|
+
end
|
697
801
|
end
|
698
802
|
end
|
699
803
|
|
@@ -783,6 +887,8 @@ module HDLRuby::High
|
|
783
887
|
|
784
888
|
## Initialize the simulation for system +systemT+.
|
785
889
|
def init_sim(systemT)
|
890
|
+
# Add the connection to the list of untimed objets.
|
891
|
+
systemT.add_untimed(self)
|
786
892
|
# Recurse on the left.
|
787
893
|
self.left.init_sim(systemT)
|
788
894
|
# Process the sensitivity list.
|
@@ -795,6 +901,8 @@ module HDLRuby::High
|
|
795
901
|
end.to_a
|
796
902
|
# Keep only one ref per signal.
|
797
903
|
refs.uniq! { |node| node.fullname }
|
904
|
+
# puts "connection input: #{self.left.fullname}"
|
905
|
+
# puts "connection refs=#{refs.map {|node| node.fullname}}"
|
798
906
|
# # Generate the event.
|
799
907
|
# events = refs.map {|ref| Event.new(:anyedge,ref) }
|
800
908
|
# # Add them to the behavior for further processing.
|
@@ -806,7 +914,7 @@ module HDLRuby::High
|
|
806
914
|
|
807
915
|
## Executes the statement.
|
808
916
|
def execute(mode)
|
809
|
-
# puts "connection = #{self}"
|
917
|
+
# puts "connection = #{self}" if self.left.is_a?(RefObject) && self.left.object.name.to_s.include?("xnor")
|
810
918
|
self.left.assign(mode,self.right.execute(mode))
|
811
919
|
end
|
812
920
|
end
|
@@ -906,10 +1014,18 @@ module HDLRuby::High
|
|
906
1014
|
class Select
|
907
1015
|
## Execute the expression.
|
908
1016
|
def execute(mode)
|
1017
|
+
unless @mask then
|
1018
|
+
# Need to initialize the execution of the select.
|
1019
|
+
width = (@choices.size-1).width
|
1020
|
+
width = 1 if width == 0
|
1021
|
+
@mask = 2**width - 1
|
1022
|
+
@choices.concat([@choices[-1]] * (2**width-@choices.size))
|
1023
|
+
end
|
909
1024
|
# Recurse on the select.
|
910
|
-
tmps = self.select.execute(mode)
|
1025
|
+
tmps = self.select.execute(mode).to_i & @mask
|
1026
|
+
# puts "select tmps=#{tmps}, @choices.size=#{@choices.size}"
|
911
1027
|
# Recurse on the selection result.
|
912
|
-
return @choices[tmps
|
1028
|
+
return @choices[tmps].execute(mode)
|
913
1029
|
end
|
914
1030
|
end
|
915
1031
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "HDLRuby/hruby_rsim"
|
2
|
+
|
3
|
+
##
|
4
|
+
# Library for enhancing the Ruby simulator with VCD support
|
5
|
+
#
|
6
|
+
########################################################################
|
7
|
+
module HDLRuby::High
|
8
|
+
|
9
|
+
##
|
10
|
+
# Enhance the system type class with VCD support.
|
11
|
+
class SystemT
|
12
|
+
|
13
|
+
## Initializes the displayer for generating a vcd on +vcdout+
|
14
|
+
def show_init(vcdout)
|
15
|
+
end
|
16
|
+
|
17
|
+
## Displays the time.
|
18
|
+
def show_time
|
19
|
+
end
|
20
|
+
|
21
|
+
## Displays the value of signal +sig+.
|
22
|
+
def show_signal(sig)
|
23
|
+
end
|
24
|
+
|
25
|
+
## Displays value +val+.
|
26
|
+
# NOTE: for now displays on the standard output and NOT the vcd.
|
27
|
+
def show_value(val)
|
28
|
+
end
|
29
|
+
|
30
|
+
## Displays string +str+.
|
31
|
+
def show_string(str)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|