HDLRuby 2.4.26 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  require "HDLRuby/hruby_bstr"
2
2
  require "HDLRuby/hruby_error"
3
+ require "HDLRuby/hruby_decorator"
3
4
  require 'forwardable'
4
5
 
5
6
 
@@ -34,6 +35,9 @@ module HDLRuby::Low
34
35
  alias_method :each, :each_value
35
36
  end
36
37
 
38
+
39
+ Hdecorator = HDLRuby::Hdecorator
40
+
37
41
  ##
38
42
  # Gives parent definition and access properties to an hardware object.
39
43
  module Hparent
@@ -62,6 +66,7 @@ module HDLRuby::Low
62
66
  end
63
67
 
64
68
 
69
+
65
70
  ##
66
71
  # Describes a system type.
67
72
  #
@@ -113,6 +118,9 @@ module HDLRuby::Low
113
118
  end
114
119
  end
115
120
 
121
+ # Add decorator capability (modifies intialize to put after).
122
+ include Hdecorator
123
+
116
124
  # Comparison for hash: structural comparison.
117
125
  def eql?(obj)
118
126
  return false unless obj.is_a?(SystemT)
@@ -376,8 +384,28 @@ module HDLRuby::Low
376
384
  # end
377
385
  # signal
378
386
  # end
387
+
388
+ # Iterates over each object deeply.
389
+ #
390
+ # Returns an enumerator if no ruby block is given.
391
+ def each_deep(&ruby_block)
392
+ # No ruby block? Return an enumerator.
393
+ return to_enum(:each_deep) unless ruby_block
394
+ # A ruby block? First apply it to current.
395
+ ruby_block.call(self)
396
+ # Then apply on each signal.
397
+ self.each_signal do |signal|
398
+ signal.each_deep(&ruby_block)
399
+ end
400
+ # Then apply on each scope.
401
+ self.each_scope do |scope|
402
+ scope.each_deep(&ruby_block)
403
+ end
404
+ end
379
405
 
380
406
  # Iterates over the systemT deeply if any.
407
+ #
408
+ # Returns an enumerator if no ruby block is given.
381
409
  def each_systemT_deep(&ruby_block)
382
410
  # No ruby block? Return an enumerator.
383
411
  return to_enum(:each_systemT_deep) unless ruby_block
@@ -427,6 +455,9 @@ module HDLRuby::Low
427
455
  @behaviors = []
428
456
  end
429
457
 
458
+ # Add decorator capability (modifies intialize to put after).
459
+ include Hdecorator
460
+
430
461
  # Comparison for hash: structural comparison.
431
462
  def eql?(obj)
432
463
  return false unless obj.is_a?(Scope)
@@ -1117,6 +1148,50 @@ module HDLRuby::Low
1117
1148
  # systemI.each_sensitive_deep(&ruby_block)
1118
1149
  # end
1119
1150
  # end
1151
+
1152
+ # Iterates over each object deeply.
1153
+ #
1154
+ # Returns an enumerator if no ruby block is given.
1155
+ def each_deep(&ruby_block)
1156
+ # No ruby block? Return an enumerator.
1157
+ return to_enum(:each_deep) unless ruby_block
1158
+ # A ruby block? First apply it to current.
1159
+ ruby_block.call(self)
1160
+ # The apply on each type.
1161
+ self.each_type do |type|
1162
+ type.each_deep(&ruby_block)
1163
+ end
1164
+ # Then apply on each systemT.
1165
+ self.each_systemT do |systemT|
1166
+ systemT.each_deep(&ruby_block)
1167
+ end
1168
+ # Then apply on each scope.
1169
+ self.each_scope do |scope|
1170
+ scope.each_deep(&ruby_block)
1171
+ end
1172
+ # Then apply on each inner signal.
1173
+ self.each_inner do |inner|
1174
+ inner.each_deep(&ruby_block)
1175
+ end
1176
+ # Then apply on each systemI.
1177
+ self.each_systemI do |systemI|
1178
+ systemI.each_deep(&ruby_block)
1179
+ end
1180
+ # Then apply on each code.
1181
+ self.each_code do |code|
1182
+ code.each_deep(&ruby_block)
1183
+ end
1184
+ # Then apply on each connection.
1185
+ self.each_connection do |connection|
1186
+ connection.each_deep(&ruby_block)
1187
+ end
1188
+ # Then apply on each behavior.
1189
+ self.each_behavior do |behavior|
1190
+ behavior.each_deep(&ruby_block)
1191
+ end
1192
+ end
1193
+
1194
+
1120
1195
 
1121
1196
  # Gets the top scope, i.e. the first scope of the current system.
1122
1197
  def top_scope
@@ -1146,6 +1221,9 @@ module HDLRuby::Low
1146
1221
  @name = name.to_sym
1147
1222
  end
1148
1223
 
1224
+ # Add decorator capability (modifies intialize to put after).
1225
+ include Hdecorator
1226
+
1149
1227
  # Comparison for hash: structural comparison.
1150
1228
  def eql?(obj)
1151
1229
  return false unless obj.is_a?(Type)
@@ -1256,6 +1334,7 @@ module HDLRuby::Low
1256
1334
  ruby_block.call(self)
1257
1335
  # And that's all by default.
1258
1336
  end
1337
+ alias_method :each_deep, :each_type_deep
1259
1338
 
1260
1339
  # Converts to a bit vector.
1261
1340
  def to_vector
@@ -1452,6 +1531,8 @@ module HDLRuby::Low
1452
1531
  @def.each_type_deep(&ruby_block)
1453
1532
  end
1454
1533
 
1534
+ alias_method :each_deep, :each_type_deep
1535
+
1455
1536
  # Moved to constructor
1456
1537
  # # Delegate the type methods to the ref.
1457
1538
  # def_delegators :@def,
@@ -1601,6 +1682,8 @@ module HDLRuby::Low
1601
1682
  # And recurse on the base.
1602
1683
  @base.each_type_deep(&ruby_block)
1603
1684
  end
1685
+
1686
+ alias_method :each_deep, :each_type_deep
1604
1687
  end
1605
1688
 
1606
1689
 
@@ -1756,6 +1839,8 @@ module HDLRuby::Low
1756
1839
  @types.each { |type| type.each_type_deep(&ruby_block) }
1757
1840
  end
1758
1841
 
1842
+ alias_method :each_deep, :each_type_deep
1843
+
1759
1844
  # Tell if the tuple is regular, i.e., all its sub types are equivalent.
1760
1845
  #
1761
1846
  # NOTE: empty tuples are assumed not to be regular.
@@ -1927,6 +2012,8 @@ module HDLRuby::Low
1927
2012
  @types.each_value { |type| type.each_type_deep(&ruby_block) }
1928
2013
  end
1929
2014
 
2015
+ alias_method :each_deep, :each_type_deep
2016
+
1930
2017
  # Gets the bitwidth of the type, nil for undefined.
1931
2018
  #
1932
2019
  # NOTE: must be redefined for specific types.
@@ -2012,6 +2099,9 @@ module HDLRuby::Low
2012
2099
  # @block = block
2013
2100
  end
2014
2101
 
2102
+ # Add decorator capability (modifies intialize to put after).
2103
+ include Hdecorator
2104
+
2015
2105
  # Sets the block if not already set.
2016
2106
  def block=(block)
2017
2107
  # Check the block.
@@ -2134,6 +2224,22 @@ module HDLRuby::Low
2134
2224
  @block.reverse_each_statement(&ruby_block)
2135
2225
  end
2136
2226
 
2227
+ # Iterates over each object deeply.
2228
+ #
2229
+ # Returns an enumerator if no ruby block is given.
2230
+ def each_deep(&ruby_block)
2231
+ # No ruby block? Return an enumerator.
2232
+ return to_enum(:each_deep) unless ruby_block
2233
+ # A ruby block? First apply it to current.
2234
+ ruby_block.call(self)
2235
+ # Then apply on each event.
2236
+ self.each_event do |event|
2237
+ event.each_deep(&ruby_block)
2238
+ end
2239
+ # Then apply on the block.
2240
+ self.block.each_deep(&ruby_block)
2241
+ end
2242
+
2137
2243
  # Returns the last statement.
2138
2244
  def last_statement
2139
2245
  @block.last_statement
@@ -2217,6 +2323,9 @@ module HDLRuby::Low
2217
2323
  ref.parent = self
2218
2324
  end
2219
2325
 
2326
+ # Add decorator capability (modifies intialize to put after).
2327
+ include Hdecorator
2328
+
2220
2329
  # Comparison for hash: structural comparison.
2221
2330
  def eql?(obj)
2222
2331
  return false unless obj.is_a?(Event)
@@ -2236,6 +2345,20 @@ module HDLRuby::Low
2236
2345
  def on_edge?
2237
2346
  return (@type == :posedge or @type == :negedge)
2238
2347
  end
2348
+
2349
+ # Iterates over each object deeply.
2350
+ #
2351
+ # Returns an enumerator if no ruby block is given.
2352
+ def each_deep(&ruby_block)
2353
+ # No ruby block? Return an enumerator.
2354
+ return to_enum(:each_deep) unless ruby_block
2355
+ # A ruby block? First apply it to current.
2356
+ ruby_block.call(self)
2357
+ # Then apply on the type.
2358
+ self.type.each_deep(&ruby_block)
2359
+ # Then apply on the reference.
2360
+ self.ref.each_deep(&ruby_block)
2361
+ end
2239
2362
  end
2240
2363
 
2241
2364
 
@@ -2278,6 +2401,23 @@ module HDLRuby::Low
2278
2401
  end
2279
2402
  end
2280
2403
 
2404
+ # Add decorator capability (modifies intialize to put after).
2405
+ include Hdecorator
2406
+
2407
+ # Iterates over each object deeply.
2408
+ #
2409
+ # Returns an enumerator if no ruby block is given.
2410
+ def each_deep(&ruby_block)
2411
+ # No ruby block? Return an enumerator.
2412
+ return to_enum(:each_deep) unless ruby_block
2413
+ # A ruby block? First apply it to current.
2414
+ ruby_block.call(self)
2415
+ # Then apply on the type.
2416
+ self.type.each_deep(&ruby_block)
2417
+ # Then apply on the value.
2418
+ self.value.each_deep(&ruby_block) if self.value
2419
+ end
2420
+
2281
2421
  # Comparison for hash: structural comparison.
2282
2422
  def eql?(obj)
2283
2423
  return false unless obj.is_a?(SignalI)
@@ -2341,6 +2481,22 @@ module HDLRuby::Low
2341
2481
  @systemTs = [ @systemT ]
2342
2482
  end
2343
2483
 
2484
+ # Add decorator capability (modifies intialize to put after).
2485
+ include Hdecorator
2486
+
2487
+ # Iterates over each object deeply.
2488
+ #
2489
+ # Returns an enumerator if no ruby block is given.
2490
+ def each_deep(&ruby_block)
2491
+ # No ruby block? Return an enumerator.
2492
+ return to_enum(:each_deep) unless ruby_block
2493
+ # A ruby block? First apply it to current.
2494
+ ruby_block.call(self)
2495
+
2496
+ # Do not recurse on the systemTs since necesarily processed
2497
+ # before!
2498
+ end
2499
+
2344
2500
  # Comparison for hash: structural comparison.
2345
2501
  def eql?(obj)
2346
2502
  return false unless obj.is_a?(SystemI)
@@ -2457,6 +2613,9 @@ module HDLRuby::Low
2457
2613
  lumps.each { |lump| self.add_lump(lump) }
2458
2614
  end
2459
2615
 
2616
+ # Add decorator capability (modifies intialize to put after).
2617
+ include Hdecorator
2618
+
2460
2619
  # Adds a +lump+ of code, it is ment to become an expression or
2461
2620
  # some text.
2462
2621
  def add_lump(lump)
@@ -2476,6 +2635,16 @@ module HDLRuby::Low
2476
2635
  # A ruby block? Apply it on each lump.
2477
2636
  @lumps.each(&ruby_block)
2478
2637
  end
2638
+
2639
+ # Iterates over each object deeply.
2640
+ #
2641
+ # Returns an enumerator if no ruby block is given.
2642
+ def each_deep(&ruby_block)
2643
+ # No ruby block? Return an enumerator.
2644
+ return to_enum(:each_deep) unless ruby_block
2645
+ # A ruby block? First apply it to current.
2646
+ ruby_block.call(self)
2647
+ end
2479
2648
  end
2480
2649
 
2481
2650
 
@@ -2493,6 +2662,9 @@ module HDLRuby::Low
2493
2662
  @chunks = HashName.new
2494
2663
  end
2495
2664
 
2665
+ # Add decorator capability (modifies intialize to put after).
2666
+ include Hdecorator
2667
+
2496
2668
  # Adds a +chunk+ to the sensitivity list.
2497
2669
  def add_chunk(chunk)
2498
2670
  # Check and add the chunk.
@@ -2555,6 +2727,24 @@ module HDLRuby::Low
2555
2727
  return false
2556
2728
  end
2557
2729
 
2730
+ # Iterates over each object deeply.
2731
+ #
2732
+ # Returns an enumerator if no ruby block is given.
2733
+ def each_deep(&ruby_block)
2734
+ # No ruby block? Return an enumerator.
2735
+ return to_enum(:each_deep) unless ruby_block
2736
+ # A ruby block? First apply it to current.
2737
+ ruby_block.call(self)
2738
+ # Then apply on each chunk.
2739
+ self.each_chunk do |chunk|
2740
+ chunk.each_deep(&ruby_block)
2741
+ end
2742
+ # Then apply on each event.
2743
+ self.each_event do |event|
2744
+ event.each_deep(&ruby_block)
2745
+ end
2746
+ end
2747
+
2558
2748
  # Comparison for hash: structural comparison.
2559
2749
  def eql?(obj)
2560
2750
  return false unless obj.is_a?(Code)
@@ -2584,6 +2774,7 @@ module HDLRuby::Low
2584
2774
  # NOTE: this is an abstract class which is not to be used directly.
2585
2775
  class Statement
2586
2776
  include Hparent
2777
+ include Hdecorator
2587
2778
 
2588
2779
  # Clones (deeply)
2589
2780
  def clone
@@ -2591,6 +2782,14 @@ module HDLRuby::Low
2591
2782
  "Internal error: clone is not defined for class: #{self.class}"
2592
2783
  end
2593
2784
 
2785
+ # Iterates over each object deeply.
2786
+ #
2787
+ # Returns an enumerator if no ruby block is given.
2788
+ def each_deep(&ruby_block)
2789
+ raise AnyError,
2790
+ "Internal error: each_deep is not defined for class: #{self.class}"
2791
+ end
2792
+
2594
2793
  # Comparison for hash: structural comparison.
2595
2794
  def eql?(obj)
2596
2795
  raise AnyError,
@@ -2692,6 +2891,7 @@ module HDLRuby::Low
2692
2891
  raise AnyError,
2693
2892
  "Invalid class for a reference (left value): #{left.class}"
2694
2893
  end
2894
+ super()
2695
2895
  @left = left
2696
2896
  # and set its parent.
2697
2897
  left.parent = self
@@ -2704,6 +2904,20 @@ module HDLRuby::Low
2704
2904
  right.parent = self
2705
2905
  end
2706
2906
 
2907
+ # Iterates over each object deeply.
2908
+ #
2909
+ # Returns an enumerator if no ruby block is given.
2910
+ def each_deep(&ruby_block)
2911
+ # No ruby block? Return an enumerator.
2912
+ return to_enum(:each_deep) unless ruby_block
2913
+ # A ruby block? First apply it to current.
2914
+ ruby_block.call(self)
2915
+ # Then apply on the left.
2916
+ self.left.each_deep(&ruby_block)
2917
+ # Then apply on the right.
2918
+ self.right.each_deep(&ruby_block)
2919
+ end
2920
+
2707
2921
  # Comparison for hash: structural comparison.
2708
2922
  def eql?(obj)
2709
2923
  return false unless obj.is_a?(Transmit)
@@ -2793,6 +3007,7 @@ module HDLRuby::Low
2793
3007
  raise AnyError,
2794
3008
  "Invalid class for a condition: #{condition.class}"
2795
3009
  end
3010
+ super()
2796
3011
  @condition = condition
2797
3012
  # And set its parent.
2798
3013
  condition.parent = self
@@ -2815,6 +3030,27 @@ module HDLRuby::Low
2815
3030
  @noifs = []
2816
3031
  end
2817
3032
 
3033
+ # Iterates over each object deeply.
3034
+ #
3035
+ # Returns an enumerator if no ruby block is given.
3036
+ def each_deep(&ruby_block)
3037
+ # No ruby block? Return an enumerator.
3038
+ return to_enum(:each_deep) unless ruby_block
3039
+ # A ruby block? First apply it to current.
3040
+ ruby_block.call(self)
3041
+ # Then apply on the condition.
3042
+ self.condition.each_deep(&ruby_block)
3043
+ # Then apply on the yes.
3044
+ self.yes.each_deep(&ruby_block)
3045
+ # The apply on the no.
3046
+ self.no.each_deep(&ruby_block)
3047
+ # Then apply on the alternate ifs.
3048
+ self.each_noif do |cond,stmnt|
3049
+ cond.each_deep(&ruby_block)
3050
+ stmnt.each_deep(&ruby_block)
3051
+ end
3052
+ end
3053
+
2818
3054
  # Comparison for hash: structural comparison.
2819
3055
  def eql?(obj)
2820
3056
  return false unless obj.is_a?(If)
@@ -3000,6 +3236,23 @@ module HDLRuby::Low
3000
3236
  match.parent = statement.parent = self
3001
3237
  end
3002
3238
 
3239
+ # Add decorator capability (modifies intialize to put after).
3240
+ include Hdecorator
3241
+
3242
+ # Iterates over each object deeply.
3243
+ #
3244
+ # Returns an enumerator if no ruby block is given.
3245
+ def each_deep(&ruby_block)
3246
+ # No ruby block? Return an enumerator.
3247
+ return to_enum(:each_deep) unless ruby_block
3248
+ # A ruby block? First apply it to current.
3249
+ ruby_block.call(self)
3250
+ # Then apply on the match.
3251
+ self.match.each_deep(&ruby_block)
3252
+ # Then apply on the statement.
3253
+ self.statement.each_deep(&ruby_block)
3254
+ end
3255
+
3003
3256
  # Comparison for hash: structural comparison.
3004
3257
  def eql?(obj)
3005
3258
  return false unless obj.is_a?(When)
@@ -3096,6 +3349,7 @@ module HDLRuby::Low
3096
3349
  unless value.is_a?(Expression)
3097
3350
  raise AnyError, "Invalid class for a value: #{value.class}"
3098
3351
  end
3352
+ super()
3099
3353
  @value = value
3100
3354
  # And set its parent.
3101
3355
  value.parent = self
@@ -3106,6 +3360,22 @@ module HDLRuby::Low
3106
3360
  whens.each { |w| self.add_when(w) }
3107
3361
  end
3108
3362
 
3363
+ # Iterates over each object deeply.
3364
+ #
3365
+ # Returns an enumerator if no ruby block is given.
3366
+ def each_deep(&ruby_block)
3367
+ # No ruby block? Return an enumerator.
3368
+ return to_enum(:each_deep) unless ruby_block
3369
+ # A ruby block? First apply it to current.
3370
+ ruby_block.call(self)
3371
+ # Then apply on the value.
3372
+ self.value.each_deep(&ruby_block)
3373
+ # Then apply on the whens.
3374
+ self.each_when do |w|
3375
+ w.each_deep(&ruby_block)
3376
+ end
3377
+ end
3378
+
3109
3379
  # Comparison for hash: structural comparison.
3110
3380
  def eql?(obj)
3111
3381
  return false unless obj.is_a?(Case)
@@ -3266,6 +3536,21 @@ module HDLRuby::Low
3266
3536
  @unit = unit.to_sym
3267
3537
  end
3268
3538
 
3539
+ # Add decorator capability (modifies intialize to put after).
3540
+ include Hdecorator
3541
+
3542
+ # Iterates over each object deeply.
3543
+ #
3544
+ # Returns an enumerator if no ruby block is given.
3545
+ def each_deep(&ruby_block)
3546
+ # No ruby block? Return an enumerator.
3547
+ return to_enum(:each_deep) unless ruby_block
3548
+ # A ruby block? First apply it to current.
3549
+ ruby_block.call(self)
3550
+ # Then apply on the value.
3551
+ self.value.each_deep(&ruby_block)
3552
+ end
3553
+
3269
3554
  # Comparison for hash: structural comparison.
3270
3555
  def eql?(obj)
3271
3556
  return false unless obj.is_a?(Delay)
@@ -3298,6 +3583,7 @@ module HDLRuby::Low
3298
3583
  unless delay.is_a?(Delay)
3299
3584
  raise AnyError, "Invalid class for a delay: #{delay.class}."
3300
3585
  end
3586
+ super()
3301
3587
  @delay = delay
3302
3588
  # And set its parent.
3303
3589
  delay.parent = self
@@ -3310,6 +3596,18 @@ module HDLRuby::Low
3310
3596
  return true
3311
3597
  end
3312
3598
 
3599
+ # Iterates over each object deeply.
3600
+ #
3601
+ # Returns an enumerator if no ruby block is given.
3602
+ def each_deep(&ruby_block)
3603
+ # No ruby block? Return an enumerator.
3604
+ return to_enum(:each_deep) unless ruby_block
3605
+ # A ruby block? First apply it to current.
3606
+ ruby_block.call(self)
3607
+ # Then apply on the delay.
3608
+ self.delay.each_deep(&ruby_block)
3609
+ end
3610
+
3313
3611
  # Hash function.
3314
3612
  def hash
3315
3613
  return [@delay].hash
@@ -3381,6 +3679,7 @@ module HDLRuby::Low
3381
3679
  raise AnyError,
3382
3680
  "Invalid class for a statement: #{statement.class}."
3383
3681
  end
3682
+ super()
3384
3683
  @statement = statement
3385
3684
  # And set its parent.
3386
3685
  statement.parent = self
@@ -3394,6 +3693,20 @@ module HDLRuby::Low
3394
3693
  delay.parent = self
3395
3694
  end
3396
3695
 
3696
+ # Iterates over each object deeply.
3697
+ #
3698
+ # Returns an enumerator if no ruby block is given.
3699
+ def each_deep(&ruby_block)
3700
+ # No ruby block? Return an enumerator.
3701
+ return to_enum(:each_deep) unless ruby_block
3702
+ # A ruby block? First apply it to current.
3703
+ ruby_block.call(self)
3704
+ # Then apply on the statement.
3705
+ self.statement.each_deep(&ruby_block)
3706
+ # Then apply on the delay.
3707
+ self.delay.each_deep(&ruby_block)
3708
+ end
3709
+
3397
3710
  # Comparison for hash: structural comparison.
3398
3711
  def eql?(obj)
3399
3712
  return false unless obj.is_a?(TimeRepeat)
@@ -3473,6 +3786,7 @@ module HDLRuby::Low
3473
3786
 
3474
3787
  # Creates a new +mode+ sort of block with possible +name+.
3475
3788
  def initialize(mode, name = :"")
3789
+ super()
3476
3790
  # puts "new block with mode=#{mode} and name=#{name}"
3477
3791
  # Check and set the type.
3478
3792
  @mode = mode.to_sym
@@ -3485,6 +3799,24 @@ module HDLRuby::Low
3485
3799
  @statements = []
3486
3800
  end
3487
3801
 
3802
+ # Iterates over each object deeply.
3803
+ #
3804
+ # Returns an enumerator if no ruby block is given.
3805
+ def each_deep(&ruby_block)
3806
+ # No ruby block? Return an enumerator.
3807
+ return to_enum(:each_deep) unless ruby_block
3808
+ # A ruby block? First apply it to current.
3809
+ ruby_block.call(self)
3810
+ # Then apply on the inners.
3811
+ self.each_inner do |inner|
3812
+ inner.each_deep(&ruby_block)
3813
+ end
3814
+ # Then apply on the statements.
3815
+ self.each_statement do |stmnt|
3816
+ stmnt.each_deep(&ruby_block)
3817
+ end
3818
+ end
3819
+
3488
3820
  # Comparison for hash: structural comparison.
3489
3821
  def eql?(obj)
3490
3822
  return false unless obj.is_a?(Block)
@@ -3810,6 +4142,9 @@ module HDLRuby::Low
3810
4142
  end
3811
4143
  end
3812
4144
 
4145
+ # Add decorator capability (modifies intialize to put after).
4146
+ include Hdecorator
4147
+
3813
4148
  # Comparison for hash: structural comparison.
3814
4149
  def eql?(obj)
3815
4150
  return false unless obj.is_a?(Expression)
@@ -3925,6 +4260,22 @@ module HDLRuby::Low
3925
4260
  @content = content
3926
4261
  end
3927
4262
 
4263
+ # Iterates over each object deeply.
4264
+ #
4265
+ # Returns an enumerator if no ruby block is given.
4266
+ def each_deep(&ruby_block)
4267
+ # No ruby block? Return an enumerator.
4268
+ return to_enum(:each_deep) unless ruby_block
4269
+ # A ruby block? First apply it to current.
4270
+ ruby_block.call(self)
4271
+ # Then apply on the type.
4272
+ self.type.each_deep(&ruby_block)
4273
+ # Then apply on the content if possible.
4274
+ if self.content.respond_to?(:each_deep) then
4275
+ self.content.each_deep(&ruby_block)
4276
+ end
4277
+ end
4278
+
3928
4279
  # Comparison for hash: structural comparison.
3929
4280
  def eql?(obj)
3930
4281
  # General comparison.
@@ -3994,6 +4345,20 @@ module HDLRuby::Low
3994
4345
  child.parent = self
3995
4346
  end
3996
4347
 
4348
+ # Iterates over each object deeply.
4349
+ #
4350
+ # Returns an enumerator if no ruby block is given.
4351
+ def each_deep(&ruby_block)
4352
+ # No ruby block? Return an enumerator.
4353
+ return to_enum(:each_deep) unless ruby_block
4354
+ # A ruby block? First apply it to current.
4355
+ ruby_block.call(self)
4356
+ # Then apply on the type.
4357
+ self.type.each_deep(&ruby_block)
4358
+ # Then apply on the child.
4359
+ self.child.each_deep(&ruby_block)
4360
+ end
4361
+
3997
4362
  # Comparison for hash: structural comparison.
3998
4363
  def eql?(obj)
3999
4364
  # General comparison.
@@ -4110,6 +4475,20 @@ module HDLRuby::Low
4110
4475
  child.parent = self
4111
4476
  end
4112
4477
 
4478
+ # Iterates over each object deeply.
4479
+ #
4480
+ # Returns an enumerator if no ruby block is given.
4481
+ def each_deep(&ruby_block)
4482
+ # No ruby block? Return an enumerator.
4483
+ return to_enum(:each_deep) unless ruby_block
4484
+ # A ruby block? First apply it to current.
4485
+ ruby_block.call(self)
4486
+ # Then apply on the type.
4487
+ self.type.each_deep(&ruby_block)
4488
+ # Then apply on the child.
4489
+ self.child.each_deep(&ruby_block)
4490
+ end
4491
+
4113
4492
  # Comparison for hash: structural comparison.
4114
4493
  def eql?(obj)
4115
4494
  # General comparison.
@@ -4198,6 +4577,22 @@ module HDLRuby::Low
4198
4577
  left.parent = right.parent = self
4199
4578
  end
4200
4579
 
4580
+ # Iterates over each object deeply.
4581
+ #
4582
+ # Returns an enumerator if no ruby block is given.
4583
+ def each_deep(&ruby_block)
4584
+ # No ruby block? Return an enumerator.
4585
+ return to_enum(:each_deep) unless ruby_block
4586
+ # A ruby block? First apply it to current.
4587
+ ruby_block.call(self)
4588
+ # Then apply on the type.
4589
+ self.type.each_deep(&ruby_block)
4590
+ # Then apply on the left.
4591
+ self.left.each_deep(&ruby_block)
4592
+ # Then apply on the right.
4593
+ self.right.each_deep(&ruby_block)
4594
+ end
4595
+
4201
4596
  # Comparison for hash: structural comparison.
4202
4597
  def eql?(obj)
4203
4598
  # General comparison.
@@ -4293,6 +4688,24 @@ module HDLRuby::Low
4293
4688
  end
4294
4689
  end
4295
4690
 
4691
+ # Iterates over each object deeply.
4692
+ #
4693
+ # Returns an enumerator if no ruby block is given.
4694
+ def each_deep(&ruby_block)
4695
+ # No ruby block? Return an enumerator.
4696
+ return to_enum(:each_deep) unless ruby_block
4697
+ # A ruby block? First apply it to current.
4698
+ ruby_block.call(self)
4699
+ # Then apply on the type.
4700
+ self.type.each_deep(&ruby_block)
4701
+ # Then apply on the select.
4702
+ self.select.each_deep(&ruby_block)
4703
+ # Then apply on the choices.
4704
+ self.each_choice do |choice|
4705
+ choice.each_deep(&ruby_block)
4706
+ end
4707
+ end
4708
+
4296
4709
  # Comparison for hash: structural comparison.
4297
4710
  def eql?(obj)
4298
4711
  # General comparison.
@@ -4409,6 +4822,22 @@ module HDLRuby::Low
4409
4822
  expressions.each { |expression| self.add_expression(expression) }
4410
4823
  end
4411
4824
 
4825
+ # Iterates over each object deeply.
4826
+ #
4827
+ # Returns an enumerator if no ruby block is given.
4828
+ def each_deep(&ruby_block)
4829
+ # No ruby block? Return an enumerator.
4830
+ return to_enum(:each_deep) unless ruby_block
4831
+ # A ruby block? First apply it to current.
4832
+ ruby_block.call(self)
4833
+ # Then apply on the type.
4834
+ self.type.each_deep(&ruby_block)
4835
+ # Then apply on the expressions.
4836
+ self.each_expression do |expr|
4837
+ expr.each_deep(&ruby_block)
4838
+ end
4839
+ end
4840
+
4412
4841
  # Comparison for hash: structural comparison.
4413
4842
  def eql?(obj)
4414
4843
  # General comparison.
@@ -4556,6 +4985,22 @@ module HDLRuby::Low
4556
4985
  refs.each { |ref| ref.parent = self }
4557
4986
  end
4558
4987
 
4988
+ # Iterates over each object deeply.
4989
+ #
4990
+ # Returns an enumerator if no ruby block is given.
4991
+ def each_deep(&ruby_block)
4992
+ # No ruby block? Return an enumerator.
4993
+ return to_enum(:each_deep) unless ruby_block
4994
+ # A ruby block? First apply it to current.
4995
+ ruby_block.call(self)
4996
+ # Then apply on the type.
4997
+ self.type.each_deep(&ruby_block)
4998
+ # Then apply on the sub references.
4999
+ self.each_ref do |ref|
5000
+ ref.each_deep(&ruby_block)
5001
+ end
5002
+ end
5003
+
4559
5004
  # Comparison for hash: structural comparison.
4560
5005
  def eql?(obj)
4561
5006
  # General comparison.
@@ -4657,6 +5102,24 @@ module HDLRuby::Low
4657
5102
  index.parent = self
4658
5103
  end
4659
5104
 
5105
+ # Iterates over each object deeply.
5106
+ #
5107
+ # Returns an enumerator if no ruby block is given.
5108
+ def each_deep(&ruby_block)
5109
+ # No ruby block? Return an enumerator.
5110
+ return to_enum(:each_deep) unless ruby_block
5111
+ # A ruby block? First apply it to current.
5112
+ ruby_block.call(self)
5113
+ # Then apply on the type.
5114
+ self.type.each_deep(&ruby_block)
5115
+ # Then apply on the reference.
5116
+ self.ref.each_deep(&ruby_block)
5117
+ # Then apply on the index if possible.
5118
+ if self.index.respond_to?(:each_deep) then
5119
+ self.index.each_deep(&ruby_block)
5120
+ end
5121
+ end
5122
+
4660
5123
  # Comparison for hash: structural comparison.
4661
5124
  def eql?(obj)
4662
5125
  # General comparison.
@@ -4752,6 +5215,27 @@ module HDLRuby::Low
4752
5215
  first.parent = last.parent = self
4753
5216
  end
4754
5217
 
5218
+ # Iterates over each object deeply.
5219
+ #
5220
+ # Returns an enumerator if no ruby block is given.
5221
+ def each_deep(&ruby_block)
5222
+ # No ruby block? Return an enumerator.
5223
+ return to_enum(:each_deep) unless ruby_block
5224
+ # A ruby block? First apply it to current.
5225
+ ruby_block.call(self)
5226
+ # Then apply on the type.
5227
+ self.type.each_deep(&ruby_block)
5228
+ # Then apply on the reference.
5229
+ self.ref.each_deep(&ruby_block)
5230
+ # Then apply on the range if possible.
5231
+ if self.range.first.respond_to?(:each_deep) then
5232
+ self.range.first.each_deep(&ruby_block)
5233
+ end
5234
+ if self.range.last.respond_to?(:each_deep) then
5235
+ self.range.last.each_deep(&ruby_block)
5236
+ end
5237
+ end
5238
+
4755
5239
  # Comparison for hash: structural comparison.
4756
5240
  #
4757
5241
  # NOTE: ranges are assumed to be flattened (a range of range is
@@ -4843,6 +5327,20 @@ module HDLRuby::Low
4843
5327
  @name = name.to_sym
4844
5328
  end
4845
5329
 
5330
+ # Iterates over each object deeply.
5331
+ #
5332
+ # Returns an enumerator if no ruby block is given.
5333
+ def each_deep(&ruby_block)
5334
+ # No ruby block? Return an enumerator.
5335
+ return to_enum(:each_deep) unless ruby_block
5336
+ # A ruby block? First apply it to current.
5337
+ ruby_block.call(self)
5338
+ # Then apply on the type.
5339
+ self.type.each_deep(&ruby_block)
5340
+ # Then apply on the reference.
5341
+ self.ref.each_deep(&ruby_block)
5342
+ end
5343
+
4846
5344
  # Get the full name of the reference, i.e. including the sub ref
4847
5345
  # names if any.
4848
5346
  def full_name
@@ -4918,6 +5416,19 @@ module HDLRuby::Low
4918
5416
  #
4919
5417
  # This is the current system.
4920
5418
  class RefThis < Ref
5419
+
5420
+ # Iterates over each object deeply.
5421
+ #
5422
+ # Returns an enumerator if no ruby block is given.
5423
+ def each_deep(&ruby_block)
5424
+ # No ruby block? Return an enumerator.
5425
+ return to_enum(:each_deep) unless ruby_block
5426
+ # A ruby block? First apply it to current.
5427
+ ruby_block.call(self)
5428
+ # Then apply on the type.
5429
+ self.type.each_deep(&ruby_block)
5430
+ end
5431
+
4921
5432
  # Clones this.
4922
5433
  def clone
4923
5434
  return RefThis.new