HDLRuby 2.7.11 → 2.10.2

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.
@@ -344,6 +344,7 @@ module HDLRuby::High
344
344
  def initialize(name, *mixins, &ruby_block)
345
345
  # Initialize the system type structure.
346
346
  super(name,Scope.new(name,self))
347
+ # puts "new systemT=#{self}"
347
348
 
348
349
  # Initialize the set of extensions to transmit to the instances'
349
350
  # eigen class
@@ -373,6 +374,28 @@ module HDLRuby::High
373
374
  make_instantiater(name,SystemI,&ruby_block)
374
375
  end
375
376
 
377
+
378
+ # Tell if the current system is a descedent of +system+
379
+ def of?(system)
380
+ # Maybe self is system.
381
+ if (self == system) then
382
+ # Yes, consider it is adescendent of system.
383
+ return true
384
+ else
385
+ # Look into the generators.
386
+ @generators.each do |generator|
387
+ return true if generator.of?(system)
388
+ end
389
+ # Look into the included systems.
390
+ @to_includes.each do |included|
391
+ return true if included.of?(system)
392
+ end
393
+ end
394
+ # Not found.
395
+ return false
396
+ end
397
+
398
+
376
399
  # Converts to a namespace user.
377
400
  def to_user
378
401
  # Returns the scope.
@@ -418,9 +441,9 @@ module HDLRuby::High
418
441
  res = self.add_output(SignalI.new(name,type,:output))
419
442
  elsif name.is_a?(Hash) then
420
443
  # Names associated with values.
421
- names.each do |name,value|
422
- res = self.add_inner(
423
- SignalI.new(name,type,:inner,value))
444
+ name.each do |key,value|
445
+ res = self.add_output(
446
+ SignalI.new(key,type,:output,value))
424
447
  end
425
448
  else
426
449
  raise AnyError, "Invalid class for a name: #{name.class}"
@@ -451,6 +474,21 @@ module HDLRuby::High
451
474
  end
452
475
 
453
476
 
477
+ # Gets an input signal by +name+ considering also the included
478
+ # systems
479
+ def get_input_with_included(name)
480
+ # Look in self.
481
+ found = self.get_input(name)
482
+ return found if found
483
+ # Not in self, look in the included systems.
484
+ self.scope.each_included do |included|
485
+ found = included.get_input_with_included(name)
486
+ return found if found
487
+ end
488
+ # Not found
489
+ return nil
490
+ end
491
+
454
492
  # Gets an output signal by +name+ considering also the included
455
493
  # systems
456
494
  def get_output_with_included(name)
@@ -466,6 +504,36 @@ module HDLRuby::High
466
504
  return nil
467
505
  end
468
506
 
507
+ # Gets an inout signal by +name+ considering also the included
508
+ # systems
509
+ def get_inout_with_included(name)
510
+ # Look in self.
511
+ found = self.get_inout(name)
512
+ return found if found
513
+ # Not in self, look in the included systems.
514
+ self.scope.each_included do |included|
515
+ found = included.get_inout_with_included(name)
516
+ return found if found
517
+ end
518
+ # Not found
519
+ return nil
520
+ end
521
+
522
+ # Iterates over the all signals (input, output, inout, inner, constant),
523
+ # i.e, also the ones of the included systems.
524
+ #
525
+ # Returns an enumerator if no ruby block is given.
526
+ def each_signal_all_with_included(&ruby_block)
527
+ # No ruby block? Return an enumerator.
528
+ return to_enum(:each_signal_all_with_included) unless ruby_block
529
+ # Iterate on all the signals of the current system.
530
+ self.each_signal_all(&ruby_block)
531
+ # Recurse on the included systems.
532
+ self.scope.each_included do |included|
533
+ included.each_signal_all_with_included(&ruby_block)
534
+ end
535
+ end
536
+
469
537
  # Iterates over the all interface signals, i.e, also the ones of
470
538
  # the included systems.
471
539
  #
@@ -473,7 +541,7 @@ module HDLRuby::High
473
541
  def each_signal_with_included(&ruby_block)
474
542
  # No ruby block? Return an enumerator.
475
543
  return to_enum(:each_signal_with_included) unless ruby_block
476
- # Iterate on the signals of the current system.
544
+ # Iterate on all the signals of the current system.
477
545
  self.each_signal(&ruby_block)
478
546
  # Recurse on the included systems.
479
547
  self.scope.each_included do |included|
@@ -487,6 +555,14 @@ module HDLRuby::High
487
555
  return each_signal_with_included.to_a[i]
488
556
  end
489
557
 
558
+ # Gets a signal by +name+ considering also the included
559
+ # systems
560
+ def get_signal_with_included(name)
561
+ return get_input_with_included(name) ||
562
+ get_output_with_included(name) ||
563
+ get_inout_with_included(name)
564
+ end
565
+
490
566
  # Iterates over the exported constructs
491
567
  #
492
568
  # NOTE: look into the scope.
@@ -571,6 +647,7 @@ module HDLRuby::High
571
647
 
572
648
  # Sets the generators of the expanded result.
573
649
  expanded.add_generator(self)
650
+ # puts "expanded=#{expanded}"
574
651
  @to_includes.each { |system| expanded.add_generator(system) }
575
652
  # Also for the previously includeds. */
576
653
  self.scope.each_included.each { |system| expanded.add_generator(system) }
@@ -634,9 +711,8 @@ module HDLRuby::High
634
711
 
635
712
  # Create the instance and sets its eigen system to +eigen+.
636
713
  instance = @instance_class.new(i_name,eigen)
714
+ # puts "instance=#{instance}"
637
715
  eigen.eigenize(instance)
638
- # puts "instance interface=#{instance.each_signal.to_a.size}"
639
- # puts "eigen interface=#{eigen.each_signal.to_a.size}"
640
716
 
641
717
  # Extend the instance.
642
718
  instance.eigen_extend(@singleton_instanceO)
@@ -846,7 +922,8 @@ module HDLRuby::High
846
922
  # Initialize the set of exported inner signals and instances
847
923
  @exports = {}
848
924
  # Initialize the set of included systems.
849
- @includes = {}
925
+ # @includes = {}
926
+ @includes = []
850
927
 
851
928
  # Builds the scope if a ruby block is provided.
852
929
  self.build(&ruby_block) if block_given?
@@ -933,7 +1010,8 @@ module HDLRuby::High
933
1010
  # No ruby block? Return an enumerator.
934
1011
  return to_enum(:each_included) unless ruby_block
935
1012
  # A block? Apply it on each included system.
936
- @includes.each_value(&ruby_block)
1013
+ # @includes.each_value(&ruby_block)
1014
+ @includes.each(&ruby_block)
937
1015
  # And apply on the sub scopes if any.
938
1016
  @scopes.each {|scope| scope.each_included(&ruby_block) }
939
1017
  end
@@ -1226,13 +1304,16 @@ module HDLRuby::High
1226
1304
  # Include a +system+ type with possible +args+ instanciation
1227
1305
  # arguments.
1228
1306
  def include(system,*args)
1229
- if @includes.key?(system.name) then
1230
- raise AnyError, "Cannot include twice the same system."
1307
+ # if @includes.key?(system.name) then
1308
+ # raise AnyError, "Cannot include twice the same system: #{system}"
1309
+ # end
1310
+ if @includes.include?(system) then
1311
+ raise AnyError, "Cannot include twice the same system: #{system}"
1231
1312
  end
1232
- # puts "Include system=#{system.name}"
1233
- # Save the name of the included system, it will serve as key
1234
- # for looking for the included expanded version.
1235
- include_name = system.name
1313
+ # # puts "Include system=#{system.name}"
1314
+ # # Save the name of the included system, it will serve as key
1315
+ # # for looking for the included expanded version.
1316
+ # include_name = system.name
1236
1317
  # Expand the system to include
1237
1318
  system = system.expand(:"",*args)
1238
1319
  # Add the included system interface to the current one.
@@ -1240,7 +1321,8 @@ module HDLRuby::High
1240
1321
  space = self.namespace
1241
1322
  # Interface signals
1242
1323
  # puts "i_name=#{i_name} @to_includes=#{@to_includes.size}"
1243
- system.each_signal_with_included do |signal|
1324
+ # system.each_signal_with_included do |signal|
1325
+ system.each_signal_all_with_included do |signal|
1244
1326
  # puts "signal=#{signal.name}"
1245
1327
  space.send(:define_singleton_method,signal.name) do
1246
1328
  signal
@@ -1259,18 +1341,20 @@ module HDLRuby::High
1259
1341
  end
1260
1342
  end
1261
1343
  # Adds it the list of includeds
1262
- @includes[include_name] = system
1344
+ # @includes[include_name] = system
1345
+ @includes << system
1346
+
1263
1347
  # puts "@includes=#{@includes}"
1264
1348
 
1265
1349
  end
1266
1350
 
1267
- # Casts as an included +system+.
1268
- def as(system)
1269
- # puts "as with name: #{system.name}"
1270
- system = system.name if system.respond_to?(:name)
1271
- # puts "includes are: #{@includes.keys}"
1272
- return @includes[system].namespace
1273
- end
1351
+ # Obsolete
1352
+ # # Casts as an included +system+.
1353
+ # def as(system)
1354
+ # # puts "as with name: #{system.name}"
1355
+ # system = system.name if system.respond_to?(:name)
1356
+ # return @includes[system].namespace
1357
+ # end
1274
1358
 
1275
1359
 
1276
1360
  # Gets the current system.
@@ -1285,7 +1369,8 @@ module HDLRuby::High
1285
1369
  # NOTE: name conflicts are treated in the current NameStack state.
1286
1370
  def fill_low(scopeL)
1287
1371
  # Adds the content of its included systems.
1288
- @includes.each_value {|system| system.scope.fill_low(scopeL) }
1372
+ # @includes.each_value {|system| system.scope.fill_low(scopeL) }
1373
+ @includes.each {|system| system.scope.fill_low(scopeL) }
1289
1374
  # Adds the declared local system types.
1290
1375
  # NOTE: in the current version of HDLRuby::High, there should not
1291
1376
  # be any of them (only eigen systems are real system types).
@@ -2051,26 +2136,28 @@ module HDLRuby::High
2051
2136
  # Performs the connections.
2052
2137
  connects.each do |key,value|
2053
2138
  # Gets the signal corresponding to connect.
2054
- signal = self.get_signal(key)
2055
- unless signal then
2056
- # Look into the included systems.
2057
- self.systemT.scope.each_included do |included|
2058
- signal = included.get_signal(key)
2059
- break if signal
2060
- end
2061
- end
2139
+ # signal = self.get_signal(key)
2140
+ # unless signal then
2141
+ # # Look into the included systems.
2142
+ # self.systemT.scope.each_included do |included|
2143
+ # signal = included.get_signal(key)
2144
+ # break if signal
2145
+ # end
2146
+ # end
2147
+ signal = self.systemT.get_signal_with_included(key)
2062
2148
  # Check if it is an output.
2063
- isout = self.get_output(key)
2064
- unless isout then
2065
- # Look into the inlucded systems.
2066
- self.systemT.scope.each_included do |included|
2067
- isout = included.get_output(key)
2068
- break if isout
2069
- end
2070
- end
2149
+ # isout = self.get_output(key)
2150
+ # unless isout then
2151
+ # # Look into the inlucded systems.
2152
+ # self.systemT.scope.each_included do |included|
2153
+ # isout = included.get_output(key)
2154
+ # break if isout
2155
+ # end
2156
+ # end
2157
+ isout = self.systemT.get_output_with_included(key)
2071
2158
  # Convert it to a reference.
2159
+ # puts "key=#{key} value=#{value} signal=#{signal}"
2072
2160
  ref = RefObject.new(self.to_ref,signal)
2073
- # puts "key=#{key} value=#{value} signal=#{signal} ref=#{ref}"
2074
2161
  # Make the connection.
2075
2162
  if isout then
2076
2163
  value <= ref
@@ -2119,6 +2206,54 @@ module HDLRuby::High
2119
2206
  self.eigen_extend(@systemT.public_namespace)
2120
2207
  end
2121
2208
 
2209
+ # Adds alternative system +systemT+
2210
+ def choice(configuration = {})
2211
+ # Process the argument.
2212
+ configuration.each do |k,v|
2213
+ k = k.to_sym
2214
+ unless v.is_a?(SystemT) then
2215
+ raise "Invalid class for a system type: #{v.class}"
2216
+ end
2217
+ # Create an eigen system.
2218
+ eigen = v.instantiate(HDLRuby.uniq_name(self.name)).systemT
2219
+ # Ensure its interface corresponds.
2220
+ my_signals = self.each_signal.to_a
2221
+ if (eigen.each_signal.with_index.find { |sig,i|
2222
+ !sig.eql?(my_signals[i])
2223
+ }) then
2224
+ raise "Invalid system for configuration: #{systemT.name}."
2225
+ end
2226
+ # Add it.
2227
+ # At the HDLRuby::High level
2228
+ @choices = { self.name => self.systemT } unless @choices
2229
+ @choices[k] = eigen
2230
+ # At the HDLRuby::Low level
2231
+ self.add_systemT(eigen)
2232
+ end
2233
+ end
2234
+
2235
+ # (Re)Configuration of system instance to systemT designated by +sys+.
2236
+ # +sys+ may be the index or the name of the configuration, the first
2237
+ # configuration being named by the systemI name.
2238
+ def configure(sys)
2239
+ if sys.respond_to?(:to_i) then
2240
+ # The argument is an index.
2241
+ # Create the (re)configuration node.
2242
+ High.top_user.add_statement(
2243
+ Configure.new(RefObject.new(RefThis.new,self),sys.to_i))
2244
+ else
2245
+ # The argument is a name (should be).
2246
+ # Get the index corresponding to the name.
2247
+ num = @choices.find_index { |k,_| k == sys.to_sym }
2248
+ unless num then
2249
+ raise "Invalid name for configuration: #{sys.to_s}"
2250
+ end
2251
+ # Create the (re)configuration node.
2252
+ High.top_user.add_statement(
2253
+ Configure.new(RefObject.new(RefThis.new,self),num))
2254
+ end
2255
+ end
2256
+
2122
2257
  # include Hmissing
2123
2258
 
2124
2259
  # Missing methods are looked for in the public namespace of the
@@ -2155,8 +2290,11 @@ module HDLRuby::High
2155
2290
  # systemIL.properties[:low2high] = self.hdr_id
2156
2291
  # self.properties[:high2low] = systemIL
2157
2292
  # Adds the other systemTs.
2158
- self.each_systemT do |systemT|
2159
- systemIL.add_systemT(systemT.to_low) unless systemT == self.systemT
2293
+ self.each_systemT do |systemTc|
2294
+ if systemTc != self.systemT
2295
+ systemTcL = systemTc.to_low
2296
+ systemIL.add_systemT(systemTcL)
2297
+ end
2160
2298
  end
2161
2299
  return systemIL
2162
2300
  end
@@ -2433,6 +2571,18 @@ module HDLRuby::High
2433
2571
  end
2434
2572
  end
2435
2573
 
2574
+ ##
2575
+ # Describes a timed terminate statement: not synthesizable!
2576
+ class TimeTerminate < Low::TimeTerminate
2577
+ include HStatement
2578
+
2579
+ # Converts the repeat statement to HDLRuby::Low.
2580
+ def to_low
2581
+ return HDLRuby::Low::TimeTerminate.new
2582
+ end
2583
+ end
2584
+
2585
+
2436
2586
 
2437
2587
  ##
2438
2588
  # Module giving high-level expression properties
@@ -3072,7 +3222,8 @@ module HDLRuby::High
3072
3222
 
3073
3223
  # Converts the name reference to a HDLRuby::Low::RefName.
3074
3224
  def to_low
3075
- # puts "to_low with base=#{@base} @object=#{@object.name}"
3225
+ # puts "to_low with base=#{@base} @object=#{@object}"
3226
+ # puts "@object.name=#{@object.name}"
3076
3227
  refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3077
3228
  @base.to_ref.to_low,@object.name)
3078
3229
  # # For debugging: set the source high object
@@ -3369,6 +3520,27 @@ module HDLRuby::High
3369
3520
  end
3370
3521
 
3371
3522
 
3523
+ ##
3524
+ # Describes a systemI (re)configure statement: not synthesizable!
3525
+ class Configure < Low::Configure
3526
+ High = HDLRuby::High
3527
+
3528
+ include HStatement
3529
+
3530
+ # Creates a new (re)configure statement for system instance refered
3531
+ # by +ref+ with system number +num+.
3532
+ def initialize(ref,num)
3533
+ super(ref,num)
3534
+ end
3535
+
3536
+ # Converts the connection to HDLRuby::Low.
3537
+ def to_low
3538
+ return HDLRuby::Low::Configure.new(self.ref.to_low, self.index)
3539
+ end
3540
+
3541
+ end
3542
+
3543
+
3372
3544
  ##
3373
3545
  # Describes a connection.
3374
3546
  class Connection < Low::Connection
@@ -3802,6 +3974,11 @@ module HDLRuby::High
3802
3974
  def hprint(*args)
3803
3975
  self.add_statement(Print.new(*args))
3804
3976
  end
3977
+
3978
+ # Terminate the simulation.
3979
+ def terminate
3980
+ self.add_statement(TimeTerminate.new)
3981
+ end
3805
3982
  end
3806
3983
 
3807
3984
 
@@ -164,12 +164,27 @@ module HDLRuby::Low
164
164
  end
165
165
 
166
166
 
167
+ # Handling the (re)configuration.
168
+
169
+ # Gets the configuration wrapper if any.
170
+ def wrapper
171
+ return defined? @wrapper ? @wrapper : nil
172
+ end
173
+
174
+ # Sets the configuration wrapper to +systemT+.
175
+ def wrapper=(systemT)
176
+ unless systemT.is_a?(SystemT) then
177
+ raise "Invalid class for a wrapper system type: #{systemT}."
178
+ end
179
+ @wrapper = systemT
180
+ end
181
+
167
182
 
168
183
  # Handling the signals.
169
184
 
170
185
  # Adds input +signal+.
171
186
  def add_input(signal)
172
- # print "add_input with signal: #{signal.name}\n"
187
+ # print "In #{self} add_input with signal: #{signal.name}\n"
173
188
  # Check and add the signal.
174
189
  unless signal.is_a?(SignalI)
175
190
  raise AnyError,
@@ -274,6 +289,8 @@ module HDLRuby::Low
274
289
  @inputs.each(&ruby_block)
275
290
  @outputs.each(&ruby_block)
276
291
  @inouts.each(&ruby_block)
292
+ # And each signal of the direct scope.
293
+ @scope.each_signal(&ruby_block)
277
294
  end
278
295
 
279
296
  # Iterates over all the signals of the system type and its scope.
@@ -282,7 +299,8 @@ module HDLRuby::Low
282
299
  return to_enum(:each_signal_deep) unless ruby_block
283
300
  # A ruby block?
284
301
  # First iterate over the current system type's signals.
285
- self.each_signal_all(&ruby_block)
302
+ # self.each_signal_all(&ruby_block)
303
+ self.each_signal(&ruby_block)
286
304
  # Then apply on the behaviors (since in HDLRuby:High, blocks can
287
305
  # include signals).
288
306
  @scope.each_signal_deep(&ruby_block)
@@ -432,6 +450,27 @@ module HDLRuby::Low
432
450
  end
433
451
  end
434
452
  end
453
+
454
+ # Iterates over the systemT deeply if any in order of reference
455
+ # to ensure the refered elements are processed first.
456
+ #
457
+ # Returns an enumerator if no ruby block is given.
458
+ def each_systemT_deep_ref(&ruby_block)
459
+ # No ruby block? Return an enumerator.
460
+ return to_enum(:each_systemT_deep_ref) unless ruby_block
461
+ # A ruby block?
462
+ # Recurse on the systemT accessible through the instances.
463
+ self.scope.each_scope_deep do |scope|
464
+ scope.each_systemI do |systemI|
465
+ # systemI.systemT.each_systemT_deep(&ruby_block)
466
+ systemI.each_systemT do |systemT|
467
+ systemT.each_systemT_deep_ref(&ruby_block)
468
+ end
469
+ end
470
+ end
471
+ # Finally apply it to current.
472
+ ruby_block.call(self)
473
+ end
435
474
  end
436
475
 
437
476
 
@@ -2500,8 +2539,8 @@ module HDLRuby::Low
2500
2539
  # NOTE: an instance can actually represented muliple layers
2501
2540
  # of systems, the first one being the one actually instantiated
2502
2541
  # in the final RTL code.
2503
- # This layring can be used for describing software or partial
2504
- # reconfiguration.
2542
+ # This layering can be used for describing software or partial
2543
+ # (re)configuration.
2505
2544
  class SystemI
2506
2545
 
2507
2546
  include Hparent
@@ -2564,13 +2603,16 @@ module HDLRuby::Low
2564
2603
  @name = name.to_sym
2565
2604
  end
2566
2605
 
2567
- ## Adds a system layer.
2606
+ ## Adds a system configuration.
2568
2607
  def add_systemT(systemT)
2569
2608
  # puts "add_systemT #{systemT.name} to systemI #{self.name}"
2570
2609
  # Check and add the systemT.
2571
2610
  if !systemT.is_a?(SystemT) then
2572
2611
  raise AnyError, "Invalid class for a system type: #{systemT.class}"
2573
2612
  end
2613
+ # Set the base configuration of the added system.
2614
+ systemT.wrapper = self.systemT
2615
+ # Add it.
2574
2616
  @systemTs << systemT
2575
2617
  end
2576
2618
 
@@ -3781,6 +3823,93 @@ module HDLRuby::Low
3781
3823
  end
3782
3824
  end
3783
3825
  end
3826
+ end
3827
+
3828
+
3829
+ ##
3830
+ # Describes a system instance (re)configuration statement: not synthesizable!
3831
+ class Configure < Statement
3832
+
3833
+ # attr_reader :systemI, :systemT, :index
3834
+ attr_reader :ref, :index
3835
+
3836
+ # Creates a new (re)configure statement of system instance refered by
3837
+ # +ref+ with system number +index+
3838
+ def initialize(ref,index)
3839
+ super()
3840
+ # Process the arguments.
3841
+ index = index.to_i
3842
+ unless ref.is_a?(Ref) then
3843
+ raise "Invalid class for a reference: #{ref.class}."
3844
+ end
3845
+ # Sets the arguments.
3846
+ @ref = ref
3847
+ ref.parent = self
3848
+ @index = index
3849
+ # @systemT = systemI.each_systemT.to_a[index]
3850
+ # # Check the systemT is valid.
3851
+ # unless @systemT then
3852
+ # raise "Invalid configuration index: #{index}."
3853
+ # end
3854
+ end
3855
+
3856
+ # Comparison for hash: structural comparison.
3857
+ def eql?(obj)
3858
+ return false unless obj.is_a?(Configure)
3859
+ return false unless @ref.eql?(obj.ref)
3860
+ return false unless @index.eql?(obj.index)
3861
+ return true
3862
+ end
3863
+
3864
+ # Iterates over each object deeply.
3865
+ #
3866
+ # Returns an enumerator if no ruby block is given.
3867
+ def each_deep(&ruby_block)
3868
+ # No ruby block? Return an enumerator.
3869
+ return to_enum(:each_deep) unless ruby_block
3870
+ # A ruby block? First apply it to current.
3871
+ ruby_block.call(self)
3872
+ # Then apply on the reference.
3873
+ @ref.each_deep(&ruby_block)
3874
+ end
3875
+
3876
+ # Hash function.
3877
+ def hash
3878
+ return (@ref.hash + @index.hash).hash
3879
+ end
3880
+
3881
+ # Clones (deeply)
3882
+ def clone
3883
+ return Configure.new(@ref.clone,@index)
3884
+ end
3885
+
3886
+ # Iterates over the nodes deeply if any.
3887
+ def each_node_deep(&ruby_block)
3888
+ # No ruby block? Return an enumerator.
3889
+ return to_enum(:each_node_deep) unless ruby_block
3890
+ # A ruby block? First apply it to current.
3891
+ ruby_block.call(self)
3892
+ # And recurse on the reference.
3893
+ @ref.each_node_deep(&ruby_block)
3894
+ end
3895
+
3896
+ # Iterates over all the blocks contained in the current block.
3897
+ def each_block_deep(&ruby_block)
3898
+ # No ruby block? Return an enumerator.
3899
+ return to_enum(:each_block_deep) unless ruby_block
3900
+ # A ruby block?
3901
+ # Nothing more to do anyway.
3902
+ end
3903
+
3904
+ # Iterates over all the statements contained in the current block.
3905
+ def each_statement_deep(&ruby_block)
3906
+ # No ruby block? Return an enumerator.
3907
+ return to_enum(:each_statement_deep) unless ruby_block
3908
+ # A ruby block?
3909
+ # Apply it on self.
3910
+ ruby_block.call(self)
3911
+ # And that's all.
3912
+ end
3784
3913
 
3785
3914
  end
3786
3915
 
@@ -3989,6 +4118,82 @@ module HDLRuby::Low
3989
4118
  end
3990
4119
 
3991
4120
 
4121
+ ##
4122
+ # Describes a timed terminate statement: not synthesizable!
4123
+ class TimeTerminate < Statement
4124
+
4125
+ # Creates a new timed terminate statement that terminate execution.
4126
+ def initialize
4127
+ super()
4128
+ end
4129
+
4130
+ # Iterates over each object deeply.
4131
+ #
4132
+ # Returns an enumerator if no ruby block is given.
4133
+ def each_deep(&ruby_block)
4134
+ # No ruby block? Return an enumerator.
4135
+ return to_enum(:each_deep) unless ruby_block
4136
+ # A ruby block? First apply it to current.
4137
+ ruby_block.call(self)
4138
+ # And that's all.
4139
+ end
4140
+
4141
+ # Iterates over all the nodes.
4142
+ def each_node(&ruby_block)
4143
+ # No ruby block? Return an enumerator.
4144
+ return to_enum(:each_node) unless ruby_block
4145
+ # A ruby block?
4146
+ # Nothing to do anyway.
4147
+ end
4148
+
4149
+ # Iterates over all the nodes deeply.
4150
+ def each_node_deep(&ruby_block)
4151
+ # No ruby block? Return an enumerator.
4152
+ return to_enum(:each_node_deep) unless ruby_block
4153
+ # A ruby block?
4154
+ # Apply of current node.
4155
+ ruby_block.call(self)
4156
+ # And that's all.
4157
+ end
4158
+
4159
+ # Iterates over all the statements deeply.
4160
+ def each_statement_deep(&ruby_block)
4161
+ # No ruby block? Return an enumerator.
4162
+ return to_enum(:each_statement_deep) unless ruby_block
4163
+ # A ruby block?
4164
+ # Apply of current node.
4165
+ ruby_block.call(self)
4166
+ # And that's all.
4167
+ end
4168
+
4169
+ # Iterates over all the blocks contained in the current block.
4170
+ def each_block_deep(&ruby_block)
4171
+ # No ruby block? Return an enumerator.
4172
+ return to_enum(:each_block_deep) unless ruby_block
4173
+ # A ruby block?
4174
+ # Nothing to do anyway.
4175
+ end
4176
+
4177
+ # Comparison for hash: structural comparison.
4178
+ def eql?(obj)
4179
+ return false unless obj.is_a?(TimeTerminate)
4180
+ return true
4181
+ end
4182
+
4183
+ # Hash function.
4184
+ def hash
4185
+ return TimeTerminate.hash
4186
+ end
4187
+
4188
+ # Clones the TimeRepeat (deeply)
4189
+ def clone
4190
+ return TimeTerminate.new
4191
+ end
4192
+ end
4193
+
4194
+
4195
+
4196
+
3992
4197
  ##
3993
4198
  # Describes a block.
3994
4199
  class Block < Statement