HDLRuby 2.11.10 → 2.11.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +55 -18
  3. data/ext/hruby_sim/hruby_rcsim_build.c +110 -83
  4. data/ext/hruby_sim/hruby_sim.h +3 -0
  5. data/ext/hruby_sim/hruby_sim_calc.c +14 -6
  6. data/ext/hruby_sim/hruby_sim_core.c +20 -7
  7. data/ext/hruby_sim/hruby_sim_list.c +1 -1
  8. data/ext/hruby_sim/hruby_sim_stack_calc.c +3 -2
  9. data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
  10. data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
  11. data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
  12. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
  13. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
  14. data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
  15. data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
  16. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +11 -11
  17. data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
  18. data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
  19. data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
  20. data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
  21. data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
  22. data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
  23. data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
  24. data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
  25. data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
  26. data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
  27. data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
  28. data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
  29. data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
  30. data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
  31. data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
  32. data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
  33. data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
  34. data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
  35. data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
  36. data/lib/HDLRuby/hdrcc.rb +14 -1
  37. data/lib/HDLRuby/hruby_bstr.rb +10 -5
  38. data/lib/HDLRuby/hruby_high.rb +114 -27
  39. data/lib/HDLRuby/hruby_low.rb +187 -16
  40. data/lib/HDLRuby/hruby_low2c.rb +71 -11
  41. data/lib/HDLRuby/hruby_low2vhd.rb +2 -1
  42. data/lib/HDLRuby/hruby_low_fix_types.rb +1 -0
  43. data/lib/HDLRuby/hruby_low_mutable.rb +30 -1
  44. data/lib/HDLRuby/hruby_low_resolve.rb +15 -2
  45. data/lib/HDLRuby/hruby_low_without_concat.rb +28 -8
  46. data/lib/HDLRuby/hruby_low_without_parinseq.rb +14 -4
  47. data/lib/HDLRuby/hruby_low_without_select.rb +2 -2
  48. data/lib/HDLRuby/hruby_low_without_subsignals.rb +279 -0
  49. data/lib/HDLRuby/hruby_rcsim.rb +99 -87
  50. data/lib/HDLRuby/hruby_rsim.rb +132 -7
  51. data/lib/HDLRuby/hruby_rsim_vcd.rb +99 -27
  52. data/lib/HDLRuby/hruby_values.rb +35 -31
  53. data/lib/HDLRuby/std/bram.rb +22 -0
  54. data/lib/HDLRuby/std/fixpoint.rb +2 -2
  55. data/lib/HDLRuby/std/fsm.rb +20 -3
  56. data/lib/HDLRuby/std/function_generator.rb +2 -2
  57. data/lib/HDLRuby/version.rb +1 -1
  58. metadata +7 -3
  59. data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -17,7 +17,6 @@ module HDLRuby::High
17
17
 
18
18
  ## Gives the width of an int in the current computer.
19
19
  def self.int_width
20
- # puts "int_width=#{[1.to_i].pack("i").size*8}"
21
20
  return [1.to_i].pack("i").size*8
22
21
  end
23
22
 
@@ -105,30 +104,18 @@ module HDLRuby::High
105
104
  RCSim.rcsim_set_owner(@rcsystemT,rcowner)
106
105
  end
107
106
  # Create and add the interface signals.
108
- # self.each_input do |sig|
109
- # rcsig = sig.to_rcsim(@rcsystemT)
110
- # RCSim.rcsim_add_systemT_input(@rcsystemT,rcsig)
111
- # end
112
107
  if self.each_input.any? then
113
108
  RCSim.rcsim_add_systemT_inputs(@rcsystemT,
114
109
  self.each_input.map do |sig|
115
110
  sig.to_rcsim(@rcsystemT)
116
111
  end)
117
112
  end
118
- # self.each_output do |sig|
119
- # rcsig = sig.to_rcsim(@rcsystemT)
120
- # RCSim.rcsim_add_systemT_output(@rcsystemT,rcsig)
121
- # end
122
113
  if self.each_output.any? then
123
114
  RCSim.rcsim_add_systemT_outputs(@rcsystemT,
124
115
  self.each_output.map do |sig|
125
116
  sig.to_rcsim(@rcsystemT)
126
117
  end)
127
118
  end
128
- # self.each_inout do |sig|
129
- # rcsig = sig.to_rcsim(@rcsystemT)
130
- # RCSim.rcsim_add_systemT_inout(@rcsystemT,rcsig)
131
- # end
132
119
  if self.each_inout.any? then
133
120
  RCSim.rcsim_add_systemT_inouts(@rcsystemT,
134
121
  self.each_inout.map do |sig|
@@ -174,10 +161,6 @@ module HDLRuby::High
174
161
  subowner = self.parent.is_a?(SystemT) ? rcowner : @rcscope
175
162
 
176
163
  # Create and add the inner signals.
177
- # self.each_inner do |sig|
178
- # rcsig = sig.to_rcsim(@rcscope)
179
- # RCSim.rcsim_add_scope_inner(@rcscope,rcsig)
180
- # end
181
164
  if self.each_inner.any? then
182
165
  RCSim.rcsim_add_scope_inners(@rcscope,self.each_inner.map do|sig|
183
166
  # sig.to_rcsim(@rcscope)
@@ -186,10 +169,6 @@ module HDLRuby::High
186
169
  end
187
170
 
188
171
  # Create and add the system instances.
189
- # self.each_systemI do |sys|
190
- # rcsys = sys.to_rcsim(@rcscope)
191
- # RCSim.rcsim_add_scope_systemI(@rcscope,rcsys)
192
- # end
193
172
  if self.each_systemI.any? then
194
173
  RCSim.rcsim_add_scope_systemIs(@rcscope,
195
174
  self.each_systemI.map do |sys|
@@ -198,32 +177,7 @@ module HDLRuby::High
198
177
  end)
199
178
  end
200
179
 
201
- # Create and add the behaviors.
202
- if self.each_behavior.any? then
203
- RCSim.rcsim_add_scope_behaviors(@rcscope,
204
- self.each_behavior.map do |beh|
205
- # beh.to_rcsim(@rcscope)
206
- beh.to_rcsim(subowner)
207
- end)
208
- end
209
-
210
- # Create and add the connections.
211
- if self.each_connection.any? then
212
- RCSim.rcsim_add_scope_behaviors(@rcscope,
213
- self.each_connection.map do |cxt|
214
- # cxt.to_rcsim(@rcscope)
215
- cxt.to_rcsim(subowner)
216
- end)
217
- end
218
-
219
- # Create and add the codes.
220
- # TODO!!
221
-
222
180
  # Create and add the sub scopes.
223
- # self.each_scope do |sub|
224
- # rcsub = sub.to_rcsim(@rcscope)
225
- # RCSim.rcsim_add_scope_scope(@rcscope,rcsub)
226
- # end
227
181
  if self.each_scope.any? then
228
182
  RCSim.rcsim_add_scope_scopes(@rcscope,self.each_scope.map do|sub|
229
183
  # sub.to_rcsim(@rcscope)
@@ -231,6 +185,32 @@ module HDLRuby::High
231
185
  end)
232
186
  end
233
187
 
188
+ # # Create and add the behaviors.
189
+ # if self.each_behavior.any? then
190
+ # RCSim.rcsim_add_scope_behaviors(@rcscope,
191
+ # self.each_behavior.map do |beh|
192
+ # # beh.to_rcsim(@rcscope)
193
+ # beh.to_rcsim(subowner)
194
+ # end)
195
+ # end
196
+
197
+ # # Create and add the connections.
198
+ # if self.each_connection.any? then
199
+ # RCSim.rcsim_add_scope_behaviors(@rcscope,
200
+ # self.each_connection.map do |cxt|
201
+ # # cxt.to_rcsim(@rcscope)
202
+ # cxt.to_rcsim(subowner)
203
+ # end)
204
+ # end
205
+ rcbehs = self.each_behavior.map {|beh| beh.to_rcsim(subowner)} +
206
+ self.each_connection.map {|cxt| cxt.to_rcsim(subowner) }
207
+ if rcbehs.any? then
208
+ RCSim.rcsim_add_scope_behaviors(@rcscope,rcbehs)
209
+ end
210
+
211
+ # Create and add the codes.
212
+ # TODO!!
213
+
234
214
  return @rcscope
235
215
  end
236
216
  end
@@ -317,6 +297,20 @@ module HDLRuby::High
317
297
 
318
298
  attr_reader :rcbehavior
319
299
 
300
+ # Add sub leaf events from +sig+ of +type+.
301
+ def add_sub_events(type,sig)
302
+ if sig.each_signal.any? then
303
+ # The event is hierarchical, recurse.
304
+ sig.each_signal do |sub|
305
+ self.add_sub_events(type,sub)
306
+ end
307
+ else
308
+ # Te event is not hierarchical, add it.
309
+ ref = RefObject.new(this,sig)
310
+ self.add_event(Event.new(type,ref))
311
+ end
312
+ end
313
+
320
314
  # Generate the C description of the behavior comming from object
321
315
  # whose C description is +rcowner+
322
316
  def to_rcsim(rcowner)
@@ -345,6 +339,16 @@ module HDLRuby::High
345
339
  events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
346
340
  # Add them to the behavior for further processing.
347
341
  events.each {|event| self.add_event(event) }
342
+ else
343
+ # Maybe there are event on hierachical signals.
344
+ events.each do |event|
345
+ if event.ref.object.each_signal.any? then
346
+ # This is a hierarchical event, remove it.
347
+ self.delete_event!(event)
348
+ # And replace it by event of the subs of the signal.
349
+ self.add_sub_events(event.type,event.ref)
350
+ end
351
+ end
348
352
  end
349
353
 
350
354
  # Create the behavior C object.
@@ -355,13 +359,9 @@ module HDLRuby::High
355
359
  RCSim.rcsim_set_owner(@rcbehavior,rcowner)
356
360
 
357
361
  # Create and add the events.
358
- # self.each_event do |ev|
359
- # RCSim.rcsim_add_behavior_event(@rcbehavior,ev.to_rcsim)
360
- # end
361
362
  if self.each_event.any? then
362
363
  RCSim.rcsim_add_behavior_events(@rcbehavior,
363
364
  self.each_event.map do |ev|
364
- # puts "adding event: #{ev.ref.object.name}(#{ev.type})"
365
365
  ev.to_rcsim(@rcbehavior)
366
366
  end)
367
367
  end
@@ -420,6 +420,12 @@ module HDLRuby::High
420
420
  # Set the owner.
421
421
  RCSim.rcsim_set_owner(@rcsignalI,rcowner)
422
422
 
423
+ # Create and add the sub signals if any.
424
+ RCSim.rcsim_add_signal_signals(@rcsignalI,
425
+ self.each_signal.each.map do |sig|
426
+ sig.to_rcsim(@rcsignalI)
427
+ end)
428
+
423
429
  # Set the initial value if any.
424
430
  if self.value then
425
431
  RCSim.rcsim_set_signal_value(@rcsignalI,self.value.to_rcsim)
@@ -475,10 +481,6 @@ module HDLRuby::High
475
481
  RCSim.rcsim_set_owner(@rcsystemI,rcowner)
476
482
 
477
483
  # Add the alternate system types.
478
- # self.each_systemT do |systemT|
479
- # rcsys = systemT.to_rcsim(@rcsystemI)
480
- # RCSim.rcsim_add_systemI_systemT(@rcsystemI,rcsys)
481
- # end
482
484
  if self.each_systemI.any? then
483
485
  RCSim.rcsim_add_systemI_systemTs(@rcsystemI,
484
486
  self.each_systemT.select do|sys|
@@ -542,9 +544,6 @@ module HDLRuby::High
542
544
  @rcstatement = RCSim.rcsim_make_print()
543
545
 
544
546
  # Adds the arguments.
545
- # self.each_arg do |arg|
546
- # RCSim.rcsim_add_print_arg(@rcstatement,arg.to_rcsim)
547
- # end
548
547
  if self.each_arg.any? then
549
548
  RCSim.rcsim_add_print_args(@rcstatement,
550
549
  self.each_arg.map(&:to_rcsim))
@@ -587,9 +586,6 @@ module HDLRuby::High
587
586
  self.no ? self.no.to_rcsim : nil)
588
587
 
589
588
  # Add the alternate ifs if any.
590
- # self.each_noif do |cond,stmnt|
591
- # RCSim.rcsim_add_hif_noif(@rcstatement,cond.to_rcsim,stmnt.to_rcsim)
592
- # end
593
589
  rcsim_conds = self.each_noif.map {|cond,stmnt| cond.to_rcsim }
594
590
  rcsim_stmnts = self.each_noif.map {|cond,stmnt| stmnt.to_rcsim }
595
591
  if rcsim_conds.any? then
@@ -617,10 +613,6 @@ module HDLRuby::High
617
613
  self.default ? self.default.to_rcsim : nil)
618
614
 
619
615
  # Add the hardware whens.
620
- # self.each_when do |wh|
621
- # RCSim.rcsim_add_hcase_when(@rcstatement,
622
- # wh.match.to_rcsim,wh.statement.to_rcsim)
623
- # end
624
616
  rcsim_matches = self.each_when.map {|wh| wh.match.to_rcsim }
625
617
  rcsim_stmnts = self.each_when.map {|wh| wh.statement.to_rcsim }
626
618
  if rcsim_matches.any? then
@@ -690,9 +682,6 @@ module HDLRuby::High
690
682
  end
691
683
 
692
684
  # Add the inner signals.
693
- # self.each_inner do |inner|
694
- # RCSim.rcsim_add_block_inner(@rcstatement,inner.to_rcsim(@rcstatement))
695
- # end
696
685
  if self.each_inner.any? then
697
686
  RCSim.rcsim_add_block_inners(@rcstatement,
698
687
  self.each_inner.map do |sig|
@@ -701,9 +690,6 @@ module HDLRuby::High
701
690
  end
702
691
 
703
692
  # Add the statements.
704
- # self.each_statement do |stmnt|
705
- # RCSim.rcsim_add_block_statement(@rcstatement,stmnt.to_rcsim)
706
- # end
707
693
  if self.each_statement.any? then
708
694
  RCSim.rcsim_add_block_statements(@rcstatement,
709
695
  self.each_statement.map do |stmnt|
@@ -730,6 +716,20 @@ module HDLRuby::High
730
716
  class Connection
731
717
  attr_reader :rcbehavior
732
718
 
719
+ # Add recursively any event to +rcevs+ for activativing the
720
+ # connection from signal +sig+ attached to +rcbehavior+
721
+ def self.add_rcevents(sig,rcevs,rcbehavior)
722
+ # Recurse on sub signals if any.
723
+ sig.each_signal do |sub|
724
+ Connection.add_rcevents(sub,rcevs,rcbehavior)
725
+ end
726
+ # Apply on the current node.
727
+ rcsig = sig.is_a?(SignalI) ? sig.rcsignalI : sig.rcsignalC
728
+ ev = RCSim.rcsim_make_event(:anyedge,rcsig)
729
+ RCSim.rcsim_set_owner(ev,rcbehavior)
730
+ rcevs << ev
731
+ end
732
+
733
733
  # Generate the C description of the connection.
734
734
  # +rcowner+ is a link to the C description of the owner scope.
735
735
  def to_rcsim(rcowner)
@@ -744,9 +744,10 @@ module HDLRuby::High
744
744
  rcevs = []
745
745
  self.right.each_node_deep do |node|
746
746
  if node.is_a?(RefObject) && !node.parent.is_a?(RefObject) then
747
- ev = RCSim.rcsim_make_event(:anyedge,node.to_rcsim)
748
- RCSim.rcsim_set_owner(ev,@rcbehavior)
749
- rcevs << ev
747
+ Connection.add_rcevents(node.object,rcevs,@rcbehavior)
748
+ # ev = RCSim.rcsim_make_event(:anyedge,node.to_rcsim)
749
+ # RCSim.rcsim_set_owner(ev,@rcbehavior)
750
+ # rcevs << ev
750
751
  end
751
752
  end
752
753
  if rcevs.any? then
@@ -755,9 +756,7 @@ module HDLRuby::High
755
756
 
756
757
  # Create and set the block.
757
758
  rcblock = RCSim.rcsim_make_block(:par)
758
- # RCSim.rcsim_add_block_statement(
759
- # RCSim.rcsim_make_transmit(self.left.to_rcsim,
760
- # self.right.to_rcsim))
759
+ RCSim.rcsim_set_owner(rcblock,@rcbehavior)
761
760
  # puts "self.left=#{self.left} self.right=#{self.right}"
762
761
  RCSim.rcsim_add_block_statements(rcblock,
763
762
  [RCSim.rcsim_make_transmit(self.left.to_rcsim, self.right.to_rcsim)])
@@ -889,9 +888,6 @@ module HDLRuby::High
889
888
  self.select.to_rcsim)
890
889
 
891
890
  # Add the choice expressions. */
892
- # self.each_choice do |choice|
893
- # rcsim_add_select_choice(rcexpression,choice.to_rcsim)
894
- # end
895
891
  if self.each_choice.any? then
896
892
  RCSim.rcsim_add_select_choices(rcexpression,
897
893
  self.each_choice.map(&:to_rcsim))
@@ -913,9 +909,6 @@ module HDLRuby::High
913
909
  self.type.direction)
914
910
 
915
911
  # Add the concatenated expressions. */
916
- # self.each_expression do |expr|
917
- # RCSim.rcsim_add_concat_expression(rcexpression,expr.to_rcsim)
918
- # end
919
912
  if self.each_expression.any? then
920
913
  RCSim.rcsim_add_concat_expressions(rcexpression,
921
914
  self.each_expression.map(&:to_rcsim))
@@ -951,9 +944,6 @@ module HDLRuby::High
951
944
  self.type.direction)
952
945
 
953
946
  # Add the concatenated expressions. */
954
- # self.each_ref do |ref|
955
- # RCSim.rcsim_add_refConcat_ref(rcref,ref.to_rcsim)
956
- # end
957
947
  if self.each_ref.any? then
958
948
  RCSim.rcsim_add_refConcat_refs(rcref,self.each_ref.map(&:to_rcsim))
959
949
  end
@@ -1015,14 +1005,36 @@ module HDLRuby::High
1015
1005
  class RefObject
1016
1006
  # attr_reader :rcref
1017
1007
  # alias_method :rcexpression, :rcref
1008
+
1009
+ # Generate the C description of the reference object with sub signals.
1010
+ def to_rcsim_subs
1011
+ # Create the reference concat C object.
1012
+ # The reference is always big endian, it is the sequence
1013
+ # of element which is reversed if necessary.
1014
+ rcref = RCSim.rcsim_make_refConcat(self.type.to_rcsim,:big)
1015
+ # self.type.direction)
1016
+
1017
+ # Add the concatenated expressions. */
1018
+ if self.object.each_signal.any? then
1019
+ iter = self.object.each_signal
1020
+ iter = iter.reverse_each if self.type.direction == :big
1021
+ RCSim.rcsim_add_refConcat_refs(rcref, iter.map do|sig|
1022
+ sig.is_a?(SignalI) ? sig.rcsignalI : sig.rcsignalC
1023
+ end)
1024
+ end
1025
+
1026
+ return rcref
1027
+ end
1018
1028
 
1019
1029
  # Generate the C description of the reference object.
1020
1030
  def to_rcsim
1021
1031
  # puts "object=#{self.object.name}(#{self.object})"
1022
1032
  if self.object.is_a?(SignalI)
1023
- return self.object.rcsignalI
1033
+ return self.object.each_signal.any? ? self.to_rcsim_subs :
1034
+ self.object.rcsignalI
1024
1035
  elsif self.object.is_a?(SignalC)
1025
- return self.object.rcsignalC
1036
+ return self.object.each_signal.any? ? self.to_rcsim_subs :
1037
+ self.object.rcsignalC
1026
1038
  else
1027
1039
  raise "Invalid object: #{self.object}"
1028
1040
  end
@@ -66,7 +66,6 @@ module HDLRuby::High
66
66
  @sig_active.each do |sig|
67
67
  next if (sig.c_value.eql?(sig.f_value))
68
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
69
  sig.each_anyedge { |beh| @sig_exec << beh }
71
70
  if (sig.c_value.zero?) then
72
71
  # puts "sig.c_value=#{sig.c_value.content}"
@@ -108,6 +107,8 @@ module HDLRuby::High
108
107
  HDLRuby.show "#{Time.now}#{show_mem}"
109
108
  # Merge the included.
110
109
  self.merge_included!
110
+ # Process par in seq.
111
+ self.par_in_seq2seq!
111
112
  # Initializes the time.
112
113
  @time = 0
113
114
  # Initializes the time and signals execution buffers.
@@ -131,6 +132,9 @@ module HDLRuby::High
131
132
  self.init_untimeds
132
133
  # puts "End of init_untimed."
133
134
 
135
+ # Maybe there is nothing to execute.
136
+ return if @total_timed_behaviors == 0
137
+
134
138
  # Is there more than one timed behavior.
135
139
  if @total_timed_behaviors <= 1 then
136
140
  # No, no need of multithreading.
@@ -490,6 +494,12 @@ module HDLRuby::High
490
494
 
491
495
  ## Initialize the simulation for +systemT+
492
496
  def init_sim(systemT)
497
+ # Recurse on the sub signals if any.
498
+ if self.each_signal.any? then
499
+ self.each_signal {|sig| sig.init_sim(systemT) }
500
+ return
501
+ end
502
+ # No sub signal, really initialize the current signal.
493
503
  if self.value then
494
504
  @c_value = self.value.execute(:par).to_value
495
505
  @f_value = @c_value.to_value
@@ -506,18 +516,27 @@ module HDLRuby::High
506
516
 
507
517
  ## Adds behavior +beh+ activated on a positive edge of the signal.
508
518
  def add_posedge(beh)
519
+ # Recurse on the sub signals.
520
+ self.each_signal {|sig| sig.add_posedge(beh) }
521
+ # Apply on current signal.
509
522
  @posedge_behaviors ||= []
510
523
  @posedge_behaviors << beh
511
524
  end
512
525
 
513
526
  ## Adds behavior +beh+ activated on a negative edge of the signal.
514
527
  def add_negedge(beh)
528
+ # Recurse on the sub signals.
529
+ self.each_signal {|sig| sig.add_negedge(beh) }
530
+ # Apply on current signal.
515
531
  @negedge_behaviors ||= []
516
532
  @negedge_behaviors << beh
517
533
  end
518
534
 
519
535
  ## Adds behavior +beh+ activated on a any edge of the signal.
520
536
  def add_anyedge(beh)
537
+ # Recurse on the sub signals.
538
+ self.each_signal {|sig| sig.add_anyedge(beh) }
539
+ # Apply on current signal.
521
540
  @anyedge_behaviors ||= []
522
541
  @anyedge_behaviors << beh
523
542
  end
@@ -543,9 +562,9 @@ module HDLRuby::High
543
562
 
544
563
  ## Execute the expression.
545
564
  def execute(mode)
546
- # puts "Executing signal=#{self.fullname}"
547
- # return mode == :par ? self.c_value : self.f_value
565
+ # puts "Executing signal=#{self.fullname} in mode=#{mode} with c_value=#{self.c_value} and f_value=#{self.f_value}"
548
566
  return @mode == :seq ? self.f_value : self.c_value
567
+ # return @mode == :seq || mode == :seq ? self.f_value : self.c_value
549
568
  end
550
569
 
551
570
  ## Assigns +value+ the the reference.
@@ -649,10 +668,12 @@ module HDLRuby::High
649
668
  ## Initialize the simulation for system +systemT+.
650
669
  def init_sim(systemT)
651
670
  self.left.init_sim(systemT)
671
+ self.right.init_sim(systemT)
652
672
  end
653
673
 
654
674
  ## Executes the statement.
655
675
  def execute(mode)
676
+ # puts "execute Transmit in mode=#{mode} for left=#{self.left.object.name}"
656
677
  self.left.assign(mode,self.right.execute(mode))
657
678
  end
658
679
  end
@@ -670,6 +691,7 @@ module HDLRuby::High
670
691
 
671
692
  ## Executes the statement.
672
693
  def execute(mode)
694
+ # puts "execute hif with mode=#{mode}"
673
695
  # Check the main condition.
674
696
  if !(self.condition.execute(mode).zero?) then
675
697
  self.yes.execute(mode)
@@ -848,6 +870,7 @@ module HDLRuby::High
848
870
 
849
871
  ## Executes the statement.
850
872
  def execute(mode)
873
+ # puts "execute block of mode=#{self.mode}"
851
874
  self.each_statement { |stmnt| stmnt.execute(self.mode) }
852
875
  end
853
876
 
@@ -858,6 +881,27 @@ module HDLRuby::High
858
881
  end
859
882
  end
860
883
 
884
+ class If
885
+ ## Returns the name of the signal with its hierarchy.
886
+ def fullname
887
+ return self.parent.fullname
888
+ end
889
+ end
890
+
891
+ class When
892
+ ## Returns the name of the signal with its hierarchy.
893
+ def fullname
894
+ return self.parent.fullname
895
+ end
896
+ end
897
+
898
+ class Case
899
+ ## Returns the name of the signal with its hierarchy.
900
+ def fullname
901
+ return self.parent.fullname
902
+ end
903
+ end
904
+
861
905
  # Describes a timed block.
862
906
  #
863
907
  # NOTE:
@@ -889,8 +933,9 @@ module HDLRuby::High
889
933
  def init_sim(systemT)
890
934
  # Add the connection to the list of untimed objets.
891
935
  systemT.add_untimed(self)
892
- # Recurse on the left.
936
+ # Recurse on the left and right.
893
937
  self.left.init_sim(systemT)
938
+ self.right.init_sim(systemT)
894
939
  # Process the sensitivity list.
895
940
  # Is it a clocked behavior?
896
941
  events = []
@@ -914,7 +959,7 @@ module HDLRuby::High
914
959
 
915
960
  ## Executes the statement.
916
961
  def execute(mode)
917
- # puts "connection = #{self}" if self.left.is_a?(RefObject) && self.left.object.name.to_s.include?("xnor")
962
+ # puts "connection left=#{left} right=#{right}"
918
963
  self.left.assign(mode,self.right.execute(mode))
919
964
  end
920
965
  end
@@ -926,6 +971,11 @@ module HDLRuby::High
926
971
  #
927
972
  # NOTE: this is an abstract class which is not to be used directly.
928
973
  class Expression
974
+ ## Initialize the simulation for system +systemT+.
975
+ def init_sim(systemT)
976
+ # By default: do nothing.
977
+ end
978
+
929
979
  ## Executes the expression in +mode+ (:blocking or :nonblocking)
930
980
  # NOTE: to be overrided.
931
981
  def execute(mode)
@@ -937,6 +987,11 @@ module HDLRuby::High
937
987
  ##
938
988
  # Describes a value.
939
989
  class Value
990
+ ## Initialize the simulation for system +systemT+.
991
+ def init_sim(systemT)
992
+ # Nothing to do.
993
+ end
994
+
940
995
  # include Vprocess
941
996
 
942
997
  ## Executes the expression.
@@ -949,10 +1004,16 @@ module HDLRuby::High
949
1004
  ##
950
1005
  # Describes a cast.
951
1006
  class Cast
1007
+ ## Initialize the simulation for system +systemT+.
1008
+ def init_sim(systemT)
1009
+ # Recurse on the child.
1010
+ self.child.init_sim(systemT)
1011
+ end
1012
+
952
1013
  ## Executes the expression.
953
1014
  def execute(mode)
954
- # Recurse on the child.
955
- # res = tocast.execute(mode)
1015
+ # puts "child=#{self.child}"
1016
+ # puts "child object=#{self.child.object}(#{self.child.object.name})" if self.child.is_a?(RefObject)
956
1017
  # Shall we reverse the content of a concat.
957
1018
  if self.child.is_a?(Concat) &&
958
1019
  self.type.direction != self.child.type.direction then
@@ -961,6 +1022,7 @@ module HDLRuby::High
961
1022
  else
962
1023
  res = self.child.execute(mode)
963
1024
  end
1025
+ # puts "res=#{res}"
964
1026
  # Cast it.
965
1027
  res = res.cast(self.type,true)
966
1028
  # Returns the result.
@@ -981,6 +1043,12 @@ module HDLRuby::High
981
1043
  ##
982
1044
  # Describes an unary operation.
983
1045
  class Unary
1046
+ ## Initialize the simulation for system +systemT+.
1047
+ def init_sim(systemT)
1048
+ # Recurse on the child.
1049
+ self.child.init_sim(systemT)
1050
+ end
1051
+
984
1052
  ## Execute the expression.
985
1053
  def execute(mode)
986
1054
  # puts "Unary with operator=#{self.operator}"
@@ -996,6 +1064,13 @@ module HDLRuby::High
996
1064
  ##
997
1065
  # Describes an binary operation.
998
1066
  class Binary
1067
+ ## Initialize the simulation for system +systemT+.
1068
+ def init_sim(systemT)
1069
+ # Recurse on the children.
1070
+ self.left.init_sim(systemT)
1071
+ self.right.init_sim(systemT)
1072
+ end
1073
+
999
1074
  ## Execute the expression.
1000
1075
  def execute(mode)
1001
1076
  # Recurse on the children.
@@ -1012,6 +1087,13 @@ module HDLRuby::High
1012
1087
  #
1013
1088
  # NOTE: choice is using the value of +select+ as an index.
1014
1089
  class Select
1090
+ ## Initialize the simulation for system +systemT+.
1091
+ def init_sim(systemT)
1092
+ # Recurse on the children.
1093
+ self.select.init_sim(systemT)
1094
+ self.each_choice { |choice| choice.init_sim(systemT) }
1095
+ end
1096
+
1015
1097
  ## Execute the expression.
1016
1098
  def execute(mode)
1017
1099
  unless @mask then
@@ -1033,6 +1115,12 @@ module HDLRuby::High
1033
1115
  ##
1034
1116
  # Describes a concatenation expression.
1035
1117
  class Concat
1118
+ ## Initialize the simulation for system +systemT+.
1119
+ def init_sim(systemT)
1120
+ # Recurse on the children.
1121
+ self.each_expression { |expr| expr.init_sim(systemT) }
1122
+ end
1123
+
1036
1124
  ## Execute the expression.
1037
1125
  def execute(mode, reverse=false)
1038
1126
  # Recurse on the children.
@@ -1218,7 +1306,44 @@ module HDLRuby::High
1218
1306
  class RefObject
1219
1307
  ## Initialize the simulation for system +systemT+.
1220
1308
  def init_sim(systemT)
1309
+ # puts "init_sim for RefObject=#{self}"
1221
1310
  @sim = systemT
1311
+
1312
+ # Modify the exectute and assign methods if the object has
1313
+ # sub signals (for faster execution).
1314
+ if self.object.each_signal.any? then
1315
+ ## Execute the expression.
1316
+ self.define_singleton_method(:execute) do |mode|
1317
+ # Recurse on the children.
1318
+ iter = self.object.each_signal
1319
+ iter = iter.reverse_each unless self.object.type.direction == :big
1320
+ tmpe = iter.map {|sig| sig.execute(mode) }
1321
+ # Concatenate the result.
1322
+ # return tmpe.reduce(:concat)
1323
+ return Vprocess.concat(*tmpe)
1324
+ end
1325
+ ## Assigns +value+ the the reference.
1326
+ self.define_singleton_method(:assign) do |mode,value|
1327
+ # puts "RefObject #{self} assign with object=#{self.object}"
1328
+ # Flatten the value type.
1329
+ value.type = [value.type.width].to_type
1330
+ pos = 0
1331
+ width = 0
1332
+ # Recurse on the children.
1333
+ iter = self.object.each_signal
1334
+ iter = iter.reverse_each unless self.object.type.direction == :big
1335
+ iter.each do |sig|
1336
+ width = sig.type.width
1337
+ sig.assign(mode,value[(pos+width-1).to_expr..pos.to_expr])
1338
+ # Tell the signal changed.
1339
+ if !(sig.c_value.eql?(sig.f_value)) then
1340
+ @sim.add_sig_active(sig)
1341
+ end
1342
+ # Prepare for the next reference.
1343
+ pos += width
1344
+ end
1345
+ end
1346
+ end
1222
1347
  end
1223
1348
 
1224
1349
  ## Execute the expression.