HDLRuby 2.10.5 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/HDLRuby.gemspec +1 -0
  3. data/README.md +8 -4
  4. data/Rakefile +8 -0
  5. data/{lib/HDLRuby/sim/Makefile → ext/hruby_sim/Makefile_csim} +0 -0
  6. data/ext/hruby_sim/extconf.rb +13 -0
  7. data/ext/hruby_sim/hruby_rcsim_build.c +1188 -0
  8. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim.h +255 -16
  9. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_calc.c +310 -181
  10. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_core.c +34 -17
  11. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_list.c +0 -0
  12. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c +4 -1
  13. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c.sav +0 -0
  14. data/ext/hruby_sim/hruby_sim_tree_calc.c +375 -0
  15. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vcd.c +5 -5
  16. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vizualize.c +2 -2
  17. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_value_pool.c +4 -1
  18. data/lib/HDLRuby/hdr_samples/bstr_bench.rb +2 -0
  19. data/lib/HDLRuby/hdr_samples/case_bench.rb +2 -2
  20. data/lib/HDLRuby/hdr_samples/counter_bench.rb +0 -1
  21. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +46 -0
  22. data/lib/HDLRuby/hdr_samples/dff_bench.rb +1 -1
  23. data/lib/HDLRuby/hdr_samples/print_bench.rb +62 -0
  24. data/lib/HDLRuby/hdr_samples/rom.rb +5 -3
  25. data/lib/HDLRuby/hdr_samples/simple_counter_bench.rb +43 -0
  26. data/lib/HDLRuby/hdrcc.rb +54 -8
  27. data/lib/HDLRuby/hruby_bstr.rb +1175 -917
  28. data/lib/HDLRuby/hruby_high.rb +200 -90
  29. data/lib/HDLRuby/hruby_high_fullname.rb +82 -0
  30. data/lib/HDLRuby/hruby_low.rb +41 -23
  31. data/lib/HDLRuby/hruby_low2c.rb +7 -0
  32. data/lib/HDLRuby/hruby_rcsim.rb +978 -0
  33. data/lib/HDLRuby/hruby_rsim.rb +1134 -0
  34. data/lib/HDLRuby/hruby_rsim_vcd.rb +322 -0
  35. data/lib/HDLRuby/hruby_values.rb +362 -18
  36. data/lib/HDLRuby/hruby_verilog.rb +21 -3
  37. data/lib/HDLRuby/version.rb +1 -1
  38. metadata +24 -13
@@ -0,0 +1,322 @@
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
+ ## Converts a HDLRuby name to a VCD name.
10
+ def self.vcd_name(name)
11
+ return name.to_s.gsub(/[^a-zA-Z0-9_$]/,"$")
12
+ end
13
+
14
+ ##
15
+ # Enhance the system type class with VCD support.
16
+ class SystemT
17
+
18
+ ## Initializes the displayer for generating a vcd on +vcdout+
19
+ def show_init(vcdout)
20
+ # puts "show_init"
21
+ @vcdout = vcdout
22
+ # Show the date.
23
+ @vcdout << "$date\n"
24
+ @vcdout << " #{Time.now}\n"
25
+ @vcdout << "$end\n"
26
+ # Show the version.
27
+ @vcdout << "$version\n"
28
+ @vcdout << " #{VERSION}\n"
29
+ @vcdout << "$end\n"
30
+ # Show the comment section.
31
+ @vcdout << "$comment\n"
32
+ @vcdout << " Generated from HDLRuby Ruby simulator\n"
33
+ @vcdout << "$end\n"
34
+ # Show the time scale.
35
+ @vcdout << "$timescale\n"
36
+ @vcdout << " 1ps\n"
37
+ @vcdout << "$end\n"
38
+ # Displays the hierarchy of the variables.
39
+ self.show_hierarchy(@vcdout)
40
+ # Closes the header.
41
+ @vcdout << "$enddefinitions $end\n"
42
+ # Initializes the variables with their name.
43
+ @vars_with_fullname = self.get_vars_with_fullname
44
+ @vcdout << "$dumpvars\n"
45
+ @vars_with_fullname.each_pair do |sig,fullname|
46
+ if sig.f_value then
47
+ @vcdout << " b#{sig.f_value.to_vstr} #{fullname}\n"
48
+ else
49
+ # @vcdout << " b#{"x"*sig.type.width} #{fullname}\n"
50
+ @vcdout << " b#{"x"} #{fullname}\n"
51
+ end
52
+ end
53
+ @vcdout << "$end\n"
54
+ end
55
+
56
+ ## Gets the VCD variables with their long name.
57
+ def get_vars_with_fullname(vars_with_fullname = {})
58
+ # Adds the signals of the interface of the system.
59
+ self.each_signal do |sig|
60
+ vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
61
+ end
62
+ # Recurse on the scope.
63
+ return self.scope.get_vars_with_fullname(vars_with_fullname)
64
+ end
65
+
66
+ ## Shows the hierarchy of the variables.
67
+ def show_hierarchy(vcdout)
68
+ # puts "show_hierarchy for module #{self} (#{self.name})"
69
+ # Shows the current level of hierarchy.
70
+ vcdout << "$scope module #{HDLRuby::High.vcd_name(self.name)} $end\n"
71
+ # Shows the interface signals.
72
+ self.each_signal do |sig|
73
+ # puts "showing signal #{HDLRuby::High.vcd_name(sig.fullname)}"
74
+ vcdout << "$var wire #{sig.type.width} "
75
+ vcdout << "#{HDLRuby::High.vcd_name(sig.fullname)} "
76
+ vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
77
+ end
78
+ # Recurse on the scope.
79
+ self.scope.show_hierarchy(vcdout)
80
+ # Close the current level of hierarchy.
81
+ vcdout << "$upscope $end\n"
82
+ end
83
+
84
+ ## Displays the time.
85
+ def show_time
86
+ @vcdout << "##{@time}\n"
87
+ end
88
+
89
+ ## Displays the value of signal +sig+.
90
+ def show_signal(sig)
91
+ @vcdout << "b#{sig.f_value.to_vstr} "
92
+ @vcdout << "#{@vars_with_fullname[sig]}\n"
93
+ end
94
+
95
+ ## Displays value +val+.
96
+ # NOTE: for now displays on the standard output and NOT the vcd.
97
+ def show_value(val)
98
+ $stdout << val.to_vstr
99
+ end
100
+
101
+ ## Displays string +str+.
102
+ def show_string(str)
103
+ $stdout << str.to_s
104
+ end
105
+ end
106
+
107
+
108
+ ##
109
+ # Enhance the scope class with VCD support.
110
+ class Scope
111
+ ## Shows the hierarchy of the variables.
112
+ def show_hierarchy(vcdout)
113
+ # puts "show_hierarchy for scope=#{self}"
114
+ # Shows the current level of hierarchy if there is a name.
115
+ ismodule = false
116
+ if !self.name.empty? && !self.parent.is_a?(SystemT) then
117
+ vcdout << "$scope module #{HDLRuby::High.vcd_name(self.fullname)} $end\n"
118
+ ismodule = true
119
+ end
120
+ # Shows the inner signals.
121
+ self.each_inner do |sig|
122
+ # puts "showing inner signal #{HDLRuby::High.vcd_name(sig.fullname)}"
123
+ vcdout << "$var wire #{sig.type.width} "
124
+ vcdout << "#{HDLRuby::High.vcd_name(sig.fullname)} "
125
+ vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
126
+ end
127
+ # Recurse on the behaviors' blocks
128
+ self.each_behavior do |beh|
129
+ beh.block.show_hierarchy(vcdout)
130
+ end
131
+ # Recurse on the systemI's Eigen system.
132
+ self.each_systemI do |sys|
133
+ sys.systemT.show_hierarchy(vcdout)
134
+ end
135
+ # Recurse on the subscopes.
136
+ self.each_scope do |scope|
137
+ scope.show_hierarchy(vcdout)
138
+ end
139
+ # Close the current level of hierarchy if there is a name.
140
+ if ismodule then
141
+ vcdout << "$upscope $end\n"
142
+ end
143
+ end
144
+
145
+ ## Gets the VCD variables with their long name.
146
+ def get_vars_with_fullname(vars_with_fullname = {})
147
+ # Adds the inner signals.
148
+ self.each_inner do |sig|
149
+ vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
150
+ end
151
+ # Recurse on the behaviors' blocks
152
+ self.each_behavior do |beh|
153
+ beh.block.get_vars_with_fullname(vars_with_fullname)
154
+ end
155
+ # Recurse on the systemI's Eigen system.
156
+ self.each_systemI do |sys|
157
+ sys.systemT.get_vars_with_fullname(vars_with_fullname)
158
+ end
159
+ # Recurse on the subscopes.
160
+ self.each_scope do |scope|
161
+ scope.get_vars_with_fullname(vars_with_fullname)
162
+ end
163
+ return vars_with_fullname
164
+ end
165
+ end
166
+
167
+
168
+ ##
169
+ # Enhance the Transmit class with VCD support.
170
+ class Transmit
171
+ ## Shows the hierarchy of the variables.
172
+ def show_hierarchy(vcdout)
173
+ # By default: nothing to do.
174
+ end
175
+
176
+ ## Gets the VCD variables with their long name.
177
+ def get_vars_with_fullname(vars_with_fullname = {})
178
+ # By default: nothing to do
179
+ end
180
+ end
181
+
182
+ ##
183
+ # Enhance the TimeWait class with VCD support.
184
+ class TimeWait
185
+ ## Shows the hierarchy of the variables.
186
+ def show_hierarchy(vcdout)
187
+ # By default: nothing to do.
188
+ end
189
+
190
+ ## Gets the VCD variables with their long name.
191
+ def get_vars_with_fullname(vars_with_fullname = {})
192
+ # By default: nothing to do
193
+ end
194
+ end
195
+
196
+ ##
197
+ # Enhance the Print class with VCD support.
198
+ class Print
199
+ ## Shows the hierarchy of the variables.
200
+ def show_hierarchy(vcdout)
201
+ # By default: nothing to do.
202
+ end
203
+
204
+ ## Gets the VCD variables with their long name.
205
+ def get_vars_with_fullname(vars_with_fullname = {})
206
+ # By default: nothing to do
207
+ end
208
+ end
209
+
210
+
211
+ ## Module adding show_hierarchyto block objects.
212
+ module BlockHierarchy
213
+ ## Shows the hierarchy of the variables.
214
+ def show_hierarchy(vcdout)
215
+ # puts "show_hierarchy for block=#{self}"
216
+ # Shows the current level of hierarchy if there is a name.
217
+ ismodule = false
218
+ unless self.name.empty?
219
+ vcdout << "$scope module #{HDLRuby::High.vcd_name(self.name)} $end\n"
220
+ ismodule = true
221
+ end
222
+ # Shows the inner signals.
223
+ self.each_inner do |sig|
224
+ # puts "showing inner signal #{HDLRuby::High.vcd_name(sig.fullname)}"
225
+ vcdout << "$var wire #{sig.type.width} "
226
+ vcdout << "#{HDLRuby::High.vcd_name(sig.fullname)} "
227
+ vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
228
+ end
229
+ # Recurse on the statements
230
+ self.each_statement do |stmnt|
231
+ stmnt.show_hierarchy(vcdout)
232
+ end
233
+ # Close the current level of hierarchy if there is a name.
234
+ if ismodule then
235
+ vcdout << "$upscope $end\n"
236
+ end
237
+ end
238
+
239
+ ## Gets the VCD variables with their long name.
240
+ def get_vars_with_fullname(vars_with_fullname = {})
241
+ # Adds the inner signals.
242
+ self.each_inner do |sig|
243
+ vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
244
+ end
245
+ # Recurse on the statements.
246
+ self.each_statement do |stmnt|
247
+ stmnt.get_vars_with_fullname(vars_with_fullname)
248
+ end
249
+ return vars_with_fullname
250
+ end
251
+ end
252
+
253
+
254
+ ##
255
+ # Enhance the block class with VCD support.
256
+ class Block
257
+ include HDLRuby::High::BlockHierarchy
258
+ end
259
+
260
+
261
+ ##
262
+ # Enhance the block class with VCD support.
263
+ class TimeBlock
264
+ include HDLRuby::High::BlockHierarchy
265
+ end
266
+
267
+
268
+ ##
269
+ # Enhance the if class with VCD support.
270
+ class If
271
+ ## Shows the hierarchy of the variables.
272
+ def show_hierarchy(vcdout)
273
+ # Recurse on the yes.
274
+ self.yes.show_hierarchy(vcdout)
275
+ # Recurse on the noifs.
276
+ self.each_noif do |cond,stmnt|
277
+ stmnt.show_hierarchy(vcdout)
278
+ end
279
+ # Recure on the no if any.
280
+ self.no.show_hierarchy(vcdout) if self.no
281
+ end
282
+
283
+ ## Gets the VCD variables with their long name.
284
+ def get_vars_with_fullname(vars_with_fullname = {})
285
+ # Recurse on the yes.
286
+ self.yes.get_vars_with_fullname(vars_with_fullname)
287
+ # Recurse on the noifs.
288
+ self.each_noif do |cond,stmnt|
289
+ stmnt.get_vars_with_fullname(vars_with_fullname)
290
+ end
291
+ # Recure on the no if any.
292
+ self.no.get_vars_with_fullname(vars_with_fullname) if self.no
293
+ return vars_with_fullname
294
+ end
295
+ end
296
+
297
+
298
+ ##
299
+ # Enhance the Case class with VCD support.
300
+ class Case
301
+ ## Shows the hierarchy of the variables.
302
+ def show_hierarchy(vcdout)
303
+ # Recurse on each when.
304
+ self.each_when do |w|
305
+ w.statement.show_hierarchy(vcdout)
306
+ end
307
+ # Recurse on the default if any.
308
+ self.default.show_hierarchy(vcdout)
309
+ end
310
+
311
+ ## Gets the VCD variables with their long name.
312
+ def get_vars_with_fullname(vars_with_fullname = {})
313
+ # Recurse on each when.
314
+ self.each_when do |w|
315
+ w.statement.get_vars_with_fullname(vars_with_fullname)
316
+ end
317
+ # Recurse on the default if any.
318
+ self.default.get_vars_with_fullname(vars_with_fullname)
319
+ return vars_with_fullname
320
+ end
321
+ end
322
+ end