HDLRuby 2.11.2 → 2.11.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -107,26 +107,32 @@ module HDLRuby::High
107
107
  # rcsig = sig.to_rcsim(@rcsystemT)
108
108
  # RCSim.rcsim_add_systemT_input(@rcsystemT,rcsig)
109
109
  # end
110
- RCSim.rcsim_add_systemT_inputs(@rcsystemT,
111
- self.each_input.map do |sig|
112
- sig.to_rcsim(@rcsystemT)
113
- end)
110
+ if self.each_input.any? then
111
+ RCSim.rcsim_add_systemT_inputs(@rcsystemT,
112
+ self.each_input.map do |sig|
113
+ sig.to_rcsim(@rcsystemT)
114
+ end)
115
+ end
114
116
  # self.each_output do |sig|
115
117
  # rcsig = sig.to_rcsim(@rcsystemT)
116
118
  # RCSim.rcsim_add_systemT_output(@rcsystemT,rcsig)
117
119
  # end
118
- RCSim.rcsim_add_systemT_outputs(@rcsystemT,
119
- self.each_output.map do |sig|
120
- sig.to_rcsim(@rcsystemT)
121
- end)
120
+ if self.each_output.any? then
121
+ RCSim.rcsim_add_systemT_outputs(@rcsystemT,
122
+ self.each_output.map do |sig|
123
+ sig.to_rcsim(@rcsystemT)
124
+ end)
125
+ end
122
126
  # self.each_inout do |sig|
123
127
  # rcsig = sig.to_rcsim(@rcsystemT)
124
128
  # RCSim.rcsim_add_systemT_inout(@rcsystemT,rcsig)
125
129
  # end
126
- RCSim.rcsim_add_systemT_inouts(@rcsystemT,
127
- self.each_inout.map do |sig|
128
- sig.to_rcsim(@rcsystemT)
129
- end)
130
+ if self.each_inout.any? then
131
+ RCSim.rcsim_add_systemT_inouts(@rcsystemT,
132
+ self.each_inout.map do |sig|
133
+ sig.to_rcsim(@rcsystemT)
134
+ end)
135
+ end
130
136
  # Create and add the scope.
131
137
  RCSim.rcsim_set_systemT_scope(@rcsystemT,
132
138
  self.scope.to_rcsim(@rcsystemT))
@@ -170,44 +176,43 @@ module HDLRuby::High
170
176
  # rcsig = sig.to_rcsim(@rcscope)
171
177
  # RCSim.rcsim_add_scope_inner(@rcscope,rcsig)
172
178
  # end
173
- RCSim.rcsim_add_scope_inners(@rcscope,self.each_inner.map do |sig|
174
- # sig.to_rcsim(@rcscope)
175
- sig.to_rcsim(subowner)
176
- end)
179
+ if self.each_inner.any? then
180
+ RCSim.rcsim_add_scope_inners(@rcscope,self.each_inner.map do|sig|
181
+ # sig.to_rcsim(@rcscope)
182
+ sig.to_rcsim(subowner)
183
+ end)
184
+ end
177
185
 
178
186
  # Create and add the system instances.
179
187
  # self.each_systemI do |sys|
180
188
  # rcsys = sys.to_rcsim(@rcscope)
181
189
  # RCSim.rcsim_add_scope_systemI(@rcscope,rcsys)
182
190
  # end
183
- RCSim.rcsim_add_scope_systemIs(@rcscope,
184
- self.each_systemI.map do |sys|
185
- # sys.to_rcsim(@rcscope)
186
- sys.to_rcsim(subowner)
187
- end)
191
+ if self.each_systemI.any? then
192
+ RCSim.rcsim_add_scope_systemIs(@rcscope,
193
+ self.each_systemI.map do |sys|
194
+ # sys.to_rcsim(@rcscope)
195
+ sys.to_rcsim(subowner)
196
+ end)
197
+ end
188
198
 
189
199
  # Create and add the behaviors.
190
- # self.each_behavior do |beh|
191
- # rcbeh = beh.to_rcsim(@rcscope)
192
- # RCSim.rcsim_add_scope_behavior(@rcscope,rcbeh)
193
- # end
194
- RCSim.rcsim_add_scope_behaviors(@rcscope,
195
- self.each_behavior.map do |beh|
196
- # beh.to_rcsim(@rcscope)
197
- beh.to_rcsim(subowner)
198
- end)
200
+ if self.each_behavior.any? then
201
+ RCSim.rcsim_add_scope_behaviors(@rcscope,
202
+ self.each_behavior.map do |beh|
203
+ # beh.to_rcsim(@rcscope)
204
+ beh.to_rcsim(subowner)
205
+ end)
206
+ end
199
207
 
200
208
  # Create and add the connections.
201
- # self.each_connection do |cnx|
202
- # rccnx = cnx.to_rcsim(@rcscope)
203
- # # Connections are actually converted to behaviors.
204
- # RCSim.rcsim_add_scope_behavior(@rcscope,rccnx)
205
- # end
206
- RCSim.rcsim_add_scope_behaviors(@rcscope,
207
- self.each_connection.map do |cxt|
208
- # cxt.to_rcsim(@rcscope)
209
- cxt.to_rcsim(subowner)
210
- end)
209
+ if self.each_connection.any? then
210
+ RCSim.rcsim_add_scope_behaviors(@rcscope,
211
+ self.each_connection.map do |cxt|
212
+ # cxt.to_rcsim(@rcscope)
213
+ cxt.to_rcsim(subowner)
214
+ end)
215
+ end
211
216
 
212
217
  # Create and add the codes.
213
218
  # TODO!!
@@ -217,10 +222,12 @@ module HDLRuby::High
217
222
  # rcsub = sub.to_rcsim(@rcscope)
218
223
  # RCSim.rcsim_add_scope_scope(@rcscope,rcsub)
219
224
  # end
220
- RCSim.rcsim_add_scope_scopes(@rcscope,self.each_scope.map do |sub|
221
- # sub.to_rcsim(@rcscope)
222
- sub.to_rcsim(subowner)
223
- end)
225
+ if self.each_scope.any? then
226
+ RCSim.rcsim_add_scope_scopes(@rcscope,self.each_scope.map do|sub|
227
+ # sub.to_rcsim(@rcscope)
228
+ sub.to_rcsim(subowner)
229
+ end)
230
+ end
224
231
 
225
232
  return @rcscope
226
233
  end
@@ -349,11 +356,13 @@ module HDLRuby::High
349
356
  # self.each_event do |ev|
350
357
  # RCSim.rcsim_add_behavior_event(@rcbehavior,ev.to_rcsim)
351
358
  # end
352
- RCSim.rcsim_add_behavior_events(@rcbehavior,
353
- self.each_event.map do |ev|
354
- # puts "adding event: #{ev.ref.object.name}(#{ev.type})"
355
- ev.to_rcsim(@rcbehavior)
356
- end)
359
+ if self.each_event.any? then
360
+ RCSim.rcsim_add_behavior_events(@rcbehavior,
361
+ self.each_event.map do |ev|
362
+ # puts "adding event: #{ev.ref.object.name}(#{ev.type})"
363
+ ev.to_rcsim(@rcbehavior)
364
+ end)
365
+ end
357
366
 
358
367
  # Create and add the block.
359
368
  RCSim.rcsim_set_behavior_block(@rcbehavior,self.block.to_rcsim)
@@ -468,12 +477,15 @@ module HDLRuby::High
468
477
  # rcsys = systemT.to_rcsim(@rcsystemI)
469
478
  # RCSim.rcsim_add_systemI_systemT(@rcsystemI,rcsys)
470
479
  # end
471
- RCSim.rcsim_add_systemI_systemTs(@rcsystemI,
472
- self.each_systemT.select do |sys|
473
- sys != self.systemT
474
- end.map do |sys|
475
- sys.to_rcsim(@rcsystemI)
476
- end)
480
+ if self.each_systemI.any? then
481
+ RCSim.rcsim_add_systemI_systemTs(@rcsystemI,
482
+ self.each_systemT.select do|sys|
483
+ sys != self.systemT
484
+ end.map do |sys|
485
+ # sys.to_rcsim(@rcsystemI)
486
+ sys.to_rcsim(rcowner)
487
+ end)
488
+ end
477
489
 
478
490
  return @rcsystemI
479
491
  end
@@ -531,8 +543,10 @@ module HDLRuby::High
531
543
  # self.each_arg do |arg|
532
544
  # RCSim.rcsim_add_print_arg(@rcstatement,arg.to_rcsim)
533
545
  # end
534
- RCSim.rcsim_add_print_args(@rcstatement,
535
- self.each_arg.map(&:to_rcsim))
546
+ if self.each_arg.any? then
547
+ RCSim.rcsim_add_print_args(@rcstatement,
548
+ self.each_arg.map(&:to_rcsim))
549
+ end
536
550
 
537
551
  return @rcstatement
538
552
  end
@@ -576,7 +590,9 @@ module HDLRuby::High
576
590
  # end
577
591
  rcsim_conds = self.each_noif.map {|cond,stmnt| cond.to_rcsim }
578
592
  rcsim_stmnts = self.each_noif.map {|cond,stmnt| stmnt.to_rcsim }
579
- RCSim.rcsim_add_hif_noifs(@rcstatement,rcsim_conds,rcsim_stmnts)
593
+ if rcsim_conds.any? then
594
+ RCSim.rcsim_add_hif_noifs(@rcstatement,rcsim_conds,rcsim_stmnts)
595
+ end
580
596
 
581
597
  return @rcstatement
582
598
  end
@@ -605,7 +621,10 @@ module HDLRuby::High
605
621
  # end
606
622
  rcsim_matches = self.each_when.map {|wh| wh.match.to_rcsim }
607
623
  rcsim_stmnts = self.each_when.map {|wh| wh.statement.to_rcsim }
608
- RCSim.rcsim_add_hcase_whens(@rcstatement,rcsim_matches,rcsim_stmnts)
624
+ if rcsim_matches.any? then
625
+ RCSim.rcsim_add_hcase_whens(@rcstatement,rcsim_matches,
626
+ rcsim_stmnts)
627
+ end
609
628
 
610
629
  return @rcstatement
611
630
  end
@@ -635,7 +654,21 @@ module HDLRuby::High
635
654
  ## Extends the TimeRepeat class for hybrid Ruby-C simulation.
636
655
  class TimeRepeat
637
656
  attr_reader :rcstatement
638
- # TODO!!!
657
+
658
+ # Generate the C description of the hardware case.
659
+ # +owner+ is a link to the C description of the owner behavior if any.
660
+ def to_rcsim(owner = nil)
661
+ # Create the timeRepeat C object.
662
+ @rcstatement = RCSim.rcsim_make_timeRepeat(self.number,
663
+ self.statement.to_rcsim)
664
+
665
+ # Sets the owner if any.
666
+ if owner then
667
+ RCSim.rcsim_set_owner(@rcstatement,owner)
668
+ end
669
+
670
+ return @rcstatement
671
+ end
639
672
  end
640
673
 
641
674
 
@@ -651,26 +684,30 @@ module HDLRuby::High
651
684
 
652
685
  # Sets the owner if any.
653
686
  if owner then
654
- RCSim.rcsim_set_block_owner(@rcstatement,owner)
687
+ RCSim.rcsim_set_owner(@rcstatement,owner)
655
688
  end
656
689
 
657
690
  # Add the inner signals.
658
691
  # self.each_inner do |inner|
659
692
  # RCSim.rcsim_add_block_inner(@rcstatement,inner.to_rcsim(@rcstatement))
660
693
  # end
661
- RCSim.rcsim_add_block_inners(@rcstatement,
662
- self.each_inner.map do |sig|
663
- sig.to_rcsim(@rcstatement)
664
- end)
694
+ if self.each_inner.any? then
695
+ RCSim.rcsim_add_block_inners(@rcstatement,
696
+ self.each_inner.map do |sig|
697
+ sig.to_rcsim(@rcstatement)
698
+ end)
699
+ end
665
700
 
666
701
  # Add the statements.
667
702
  # self.each_statement do |stmnt|
668
703
  # RCSim.rcsim_add_block_statement(@rcstatement,stmnt.to_rcsim)
669
704
  # end
670
- RCSim.rcsim_add_block_statements(@rcstatement,
671
- self.each_statement.map do |stmnt|
672
- stmnt.to_rcsim
673
- end)
705
+ if self.each_statement.any? then
706
+ RCSim.rcsim_add_block_statements(@rcstatement,
707
+ self.each_statement.map do |stmnt|
708
+ stmnt.to_rcsim
709
+ end)
710
+ end
674
711
 
675
712
  return @rcstatement
676
713
  end
@@ -710,7 +747,9 @@ module HDLRuby::High
710
747
  rcevs << ev
711
748
  end
712
749
  end
713
- RCSim.rcsim_add_behavior_events(@rcbehavior,rcevs)
750
+ if rcevs.any? then
751
+ RCSim.rcsim_add_behavior_events(@rcbehavior,rcevs)
752
+ end
714
753
 
715
754
  # Create and set the block.
716
755
  rcblock = RCSim.rcsim_make_block(:par)
@@ -843,8 +882,10 @@ module HDLRuby::High
843
882
  # self.each_choice do |choice|
844
883
  # rcsim_add_select_choice(rcexpression,choice.to_rcsim)
845
884
  # end
846
- RCSim.rcsim_add_select_choices(rcexpression,
847
- self.each_choice.map(&:to_rcsim))
885
+ if self.each_choice.any? then
886
+ RCSim.rcsim_add_select_choices(rcexpression,
887
+ self.each_choice.map(&:to_rcsim))
888
+ end
848
889
 
849
890
  return rcexpression
850
891
  end
@@ -865,8 +906,10 @@ module HDLRuby::High
865
906
  # self.each_expression do |expr|
866
907
  # RCSim.rcsim_add_concat_expression(rcexpression,expr.to_rcsim)
867
908
  # end
868
- RCSim.rcsim_add_concat_expressions(rcexpression,
909
+ if self.each_expression.any? then
910
+ RCSim.rcsim_add_concat_expressions(rcexpression,
869
911
  self.each_expression.map(&:to_rcsim))
912
+ end
870
913
 
871
914
  return rcexpression
872
915
  end
@@ -901,7 +944,9 @@ module HDLRuby::High
901
944
  # self.each_ref do |ref|
902
945
  # RCSim.rcsim_add_refConcat_ref(rcref,ref.to_rcsim)
903
946
  # end
904
- RCSim.rcsim_add_refConcat_refs(rcref,self.each_ref(&:to_rcsim))
947
+ if self.each_ref.any? then
948
+ RCSim.rcsim_add_refConcat_refs(rcref,self.each_ref(&:to_rcsim))
949
+ end
905
950
 
906
951
  return rcref
907
952
  end
@@ -701,7 +701,16 @@ module HDLRuby::High
701
701
  ##
702
702
  # Describes a timed loop statement: not synthesizable!
703
703
  class TimeRepeat
704
- ## Deprecated
704
+ ## Initialize the simulation for system +systemT+.
705
+ def init_sim(systemT)
706
+ # Recurde on the statement.
707
+ self.statement.init_sim(systemT)
708
+ end
709
+
710
+ ## Executes the statement.
711
+ def execute(mode)
712
+ self.number.times { self.statement.execute(mode) }
713
+ end
705
714
  end
706
715
 
707
716
 
@@ -179,6 +179,21 @@ module HDLRuby::High
179
179
  end
180
180
  end
181
181
 
182
+ ##
183
+ # Enhance the TimeRepeat class with VCD support.
184
+ class TimeRepeat
185
+ ## Shows the hierarchy of the variables.
186
+ def show_hierarchy(vcdout)
187
+ # Recurse on the statement.
188
+ self.statement.show_hierarchy(vcdout)
189
+ end
190
+
191
+ ## Gets the VCD variables with their long name.
192
+ def get_vars_with_fullname(vars_with_fullname = {})
193
+ # By default: nothing to do
194
+ end
195
+ end
196
+
182
197
  ##
183
198
  # Enhance the TimeWait class with VCD support.
184
199
  class TimeWait
@@ -254,60 +254,62 @@ module HDLRuby::Low
254
254
 
255
255
 
256
256
 
257
- # Extract and convert to verilog the TimeRepeat statements.
258
- # NOTE: work only on the current level of the block (should be called
259
- # through each_block_deep).
260
- def repeat_to_verilog!
261
- code = ""
262
- # Gather the TimeRepeat statements.
263
- repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
264
- # Remove them from the block.
265
- repeats.each { |st| self.delete_statement!(st) }
266
- # Generate them separately in timed always processes.
267
- repeats.each do |st|
268
- code << " always #{st.delay.to_verilog} begin\n"
269
-
270
- # Perform "scheduling" using the method "flatten".
271
- block = st.statement.flatten(st.statement.mode.to_s)
272
-
273
- # Declaration of "inner" part within "always".
274
- block.each_inner do |inner|
275
- # if regs.include?(inner.name) then
276
- if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
277
- code << " reg"
278
- else
279
- code << " wire"
280
- end
281
-
282
- # Variable has "base", but if there is width etc, it is not in "base".
283
- # It is determined by an if.
284
- if inner.type.base?
285
- if inner.type.base.base?
286
- code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
287
- else
288
- code << "#{inner.type.to_verilog} #{inner.to_verilog}"
289
- end
290
- else
291
- code << " #{inner.type.to_verilog}#{inner.to_verilog}"
292
- end
293
- if inner.value then
294
- # There is an initial value.
295
- code << " = #{inner.value.to_verilog}"
296
- end
297
- code << ";\n"
298
- end
299
-
300
- # Translate the block that finished scheduling.
301
- block.each_statement do |statement|
302
- code << "\n #{statement.to_verilog(block.mode.to_s)}"
303
- end
304
-
305
- FmI.fm_par.clear()
306
-
307
- code << "\n end\n\n"
308
- end
309
- return code
310
- end
257
+ # Deprecated with new TimeRepeat!
258
+ #
259
+ # # Extract and convert to verilog the TimeRepeat statements.
260
+ # # NOTE: work only on the current level of the block (should be called
261
+ # # through each_block_deep).
262
+ # def repeat_to_verilog!
263
+ # code = ""
264
+ # # Gather the TimeRepeat statements.
265
+ # repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
266
+ # # Remove them from the block.
267
+ # repeats.each { |st| self.delete_statement!(st) }
268
+ # # Generate them separately in timed always processes.
269
+ # repeats.each do |st|
270
+ # code << " always #{st.delay.to_verilog} begin\n"
271
+
272
+ # # Perform "scheduling" using the method "flatten".
273
+ # block = st.statement.flatten(st.statement.mode.to_s)
274
+
275
+ # # Declaration of "inner" part within "always".
276
+ # block.each_inner do |inner|
277
+ # # if regs.include?(inner.name) then
278
+ # if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
279
+ # code << " reg"
280
+ # else
281
+ # code << " wire"
282
+ # end
283
+
284
+ # # Variable has "base", but if there is width etc, it is not in "base".
285
+ # # It is determined by an if.
286
+ # if inner.type.base?
287
+ # if inner.type.base.base?
288
+ # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
289
+ # else
290
+ # code << "#{inner.type.to_verilog} #{inner.to_verilog}"
291
+ # end
292
+ # else
293
+ # code << " #{inner.type.to_verilog}#{inner.to_verilog}"
294
+ # end
295
+ # if inner.value then
296
+ # # There is an initial value.
297
+ # code << " = #{inner.value.to_verilog}"
298
+ # end
299
+ # code << ";\n"
300
+ # end
301
+
302
+ # # Translate the block that finished scheduling.
303
+ # block.each_statement do |statement|
304
+ # code << "\n #{statement.to_verilog(block.mode.to_s)}"
305
+ # end
306
+
307
+ # FmI.fm_par.clear()
308
+
309
+ # code << "\n end\n\n"
310
+ # end
311
+ # return code
312
+ # end
311
313
 
312
314
 
313
315
  # Process top layer of Block.
@@ -1814,6 +1816,15 @@ module HDLRuby::Low
1814
1816
  end
1815
1817
  end
1816
1818
 
1819
+
1820
+ # Generate verilog code for the TimeRepeat.
1821
+ class TimeRepeat
1822
+ def to_verilog(spc = 3)
1823
+ result = (" " * spc) + "repeat(#{self.number})" + "\n"
1824
+ result << self.statement.to_verilog(spc+3)
1825
+ end
1826
+ end
1827
+
1817
1828
  # Those who disappeared.
1818
1829
  #class SystemI
1819
1830
  #class TypeTuple
@@ -2137,10 +2148,12 @@ module HDLRuby::Low
2137
2148
  if behavior.block.is_a?(TimeBlock) then
2138
2149
  # Tell it is a time behavior for further processing.
2139
2150
  timebeh = true
2140
- # Extract and translate the TimeRepeat separately.
2141
- behavior.each_block_deep do |blk|
2142
- codeC << blk.repeat_to_verilog!
2143
- end
2151
+ # Deprecated with new TimeRepeat.
2152
+ #
2153
+ # # Extract and translate the TimeRepeat separately.
2154
+ # behavior.each_block_deep do |blk|
2155
+ # codeC << blk.repeat_to_verilog!
2156
+ # end
2144
2157
  # And generate an initial block.
2145
2158
  codeC << " initial "
2146
2159
  else
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.11.2"
2
+ VERSION = "2.11.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HDLRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.2
4
+ version: 2.11.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-01 00:00:00.000000000 Z
11
+ date: 2022-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -148,6 +148,7 @@ files:
148
148
  - lib/HDLRuby/hdr_samples/ram.rb
149
149
  - lib/HDLRuby/hdr_samples/range_bench.rb
150
150
  - lib/HDLRuby/hdr_samples/register_with_code_bench.rb
151
+ - lib/HDLRuby/hdr_samples/repeat_bench.rb
151
152
  - lib/HDLRuby/hdr_samples/rom.rb
152
153
  - lib/HDLRuby/hdr_samples/rom_nest.rb
153
154
  - lib/HDLRuby/hdr_samples/ruby_fir_hw.rb