HDLRuby 2.7.1 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -647,12 +647,19 @@ elsif $options[:clang] then
647
647
  init_visualizer = $options[:vcd] ? "init_vcd_visualizer" :
648
648
  "init_default_visualizer"
649
649
 
650
+ # Gather the system to generate and sort them in the right order
651
+ # to ensure references are generated before being used.
652
+ # Base: reverse order of the tree.
653
+ # Then, multiple configuration of a system instance must be
654
+ # reverversed so that the base configuration is generated first.
655
+ c_systems = $top_system.each_systemT_deep_ref
650
656
  # Generate the code of the main function.
651
657
  # HDLRuby start code
652
658
  $main << HDLRuby::Low::Low2C.main("hruby_simulator",
653
659
  init_visualizer,
654
660
  $top_system,
655
- $top_system.each_systemT_deep.to_a.reverse,$hnames)
661
+ c_systems,
662
+ $hnames)
656
663
  $main.close
657
664
 
658
665
  $top_system.each_systemT_deep do |systemT|
@@ -133,6 +133,8 @@ module HDLRuby::High
133
133
  module Hmissing
134
134
  High = HDLRuby::High
135
135
 
136
+ NAMES = { }
137
+
136
138
  # Missing methods may be immediate values, if not, they are looked up
137
139
  # in the upper level of the namespace if any.
138
140
  def method_missing(m, *args, &ruby_block)
@@ -140,6 +142,20 @@ module HDLRuby::High
140
142
  # Is the missing method an immediate value?
141
143
  value = m.to_value
142
144
  return value if value and args.empty?
145
+ # Or is it a uniq name generator?
146
+ if (m[-1] == '?') then
147
+ # Yes
148
+ m = m[0..-2]
149
+ return NAMES[m] = HDLRuby.uniq_name(m)
150
+ end
151
+ # Is in a previous uniq name?
152
+ if (m[-1] == '!') then
153
+ pm = m[0..-2]
154
+ if NAMES.key?(pm) then
155
+ # Yes, returns the current corresponding uniq name.
156
+ return self.send(NAMES[pm],*args,&ruby_block)
157
+ end
158
+ end
143
159
  # No, is there an upper namespace, i.e. is the current object
144
160
  # present in the space?
145
161
  if High.space_index(self) then
@@ -256,9 +272,9 @@ module HDLRuby::High
256
272
  SignalI.new(name,type,:inner))
257
273
  elsif name.is_a?(Hash) then
258
274
  # Names associated with values.
259
- names.each do |name,value|
275
+ name.each do |key,value|
260
276
  res = self.add_inner(
261
- SignalI.new(name,type,:inner,value))
277
+ SignalI.new(key,type,:inner,value))
262
278
  end
263
279
  else
264
280
  raise AnyError,
@@ -550,10 +566,14 @@ module HDLRuby::High
550
566
  expanded = self.class.new(name.to_s) {}
551
567
  # Include the mixin systems given when declaring the system.
552
568
  @to_includes.each { |system| expanded.scope.include(system) }
569
+ # Include the previously includeds. */
570
+ self.scope.each_included { |system| expanded.scope.include(system) }
553
571
 
554
572
  # Sets the generators of the expanded result.
555
573
  expanded.add_generator(self)
556
574
  @to_includes.each { |system| expanded.add_generator(system) }
575
+ # Also for the previously includeds. */
576
+ self.scope.each_included.each { |system| expanded.add_generator(system) }
557
577
 
558
578
  # Fills the scope of the expanded class.
559
579
  # puts "Build top with #{self.name} for #{name}"
@@ -828,8 +848,7 @@ module HDLRuby::High
828
848
  # Initialize the set of included systems.
829
849
  @includes = {}
830
850
 
831
- # Builds the scope if a ruby block is provided
832
- # (which means the scope is not the top of a system).
851
+ # Builds the scope if a ruby block is provided.
833
852
  self.build(&ruby_block) if block_given?
834
853
  end
835
854
 
@@ -940,18 +959,20 @@ module HDLRuby::High
940
959
  # Set the namespace for buidling the scope.
941
960
  High.space_push(@namespace)
942
961
  # Build the scope.
943
- # @return_value = High.top_user.instance_eval(&ruby_block)
944
- res = High.top_user.instance_eval(&ruby_block)
962
+ @return_value = High.top_user.instance_eval(&ruby_block)
963
+ # res = High.top_user.instance_eval(&ruby_block)
945
964
  High.space_pop
946
- # Now gain access to the result within the sub scope.
947
- if (res.is_a?(HRef)) then
948
- @return_value = res.type.inner(HDLRuby.uniq_name)
949
- High.space_push(@namespace)
950
- @return_value <= res
951
- High.space_pop
952
- else
953
- @return_value = res
954
- end
965
+ # # Now gain access to the result within the sub scope.
966
+ # # if (res.is_a?(HRef)) then
967
+ # if (res.is_a?(HExpression)) then
968
+ # High.space_push(@namespace)
969
+ # @return_value = res.type.inner(HDLRuby.uniq_name)
970
+ # @return_value <= res
971
+ # High.space_pop
972
+ # @return_value = RefObject.new(self,@return_value)
973
+ # else
974
+ # @return_value = res
975
+ # end
955
976
  # This will be the return value.
956
977
  @return_value
957
978
  end
@@ -1083,10 +1104,12 @@ module HDLRuby::High
1083
1104
  # Declares a sub scope with possible +name+ and built from +ruby_block+.
1084
1105
  def sub(name = :"", &ruby_block)
1085
1106
  # Creates the new scope.
1086
- scope = Scope.new(name,&ruby_block)
1087
- # puts "new scope=#{scope}"
1107
+ # scope = Scope.new(name,&ruby_block)
1108
+ scope = Scope.new(name)
1088
1109
  # Add it
1089
1110
  self.add_scope(scope)
1111
+ # Build it.
1112
+ scope.build(&ruby_block)
1090
1113
  # puts "self=#{self}"
1091
1114
  # puts "self scopes=#{self.each_scope.to_a.join(",")}"
1092
1115
  # Use its return value
@@ -1237,6 +1260,7 @@ module HDLRuby::High
1237
1260
  end
1238
1261
  # Adds it the list of includeds
1239
1262
  @includes[include_name] = system
1263
+ # puts "@includes=#{@includes}"
1240
1264
 
1241
1265
  end
1242
1266
 
@@ -1960,9 +1984,6 @@ module HDLRuby::High
1960
1984
  &ruby_block)
1961
1985
  # ruby_block.call(*args)
1962
1986
  end
1963
- # sub do
1964
- # ruby_block.call(*args,*other_block)
1965
- # end
1966
1987
  end
1967
1988
  else
1968
1989
  define_method(name.to_sym) do |*args,&other_block|
@@ -1970,10 +1991,8 @@ module HDLRuby::High
1970
1991
  sub(HDLRuby.uniq_name(name)) do
1971
1992
  HDLRuby::High.top_user.instance_exec(*args,*other_block,
1972
1993
  &ruby_block)
1994
+ # ruby_block.call(*args,*other_block)
1973
1995
  end
1974
- # sub do
1975
- # ruby_block.call(*args,*other_block)
1976
- # end
1977
1996
  end
1978
1997
  end
1979
1998
  end
@@ -2033,10 +2052,25 @@ module HDLRuby::High
2033
2052
  connects.each do |key,value|
2034
2053
  # Gets the signal corresponding to connect.
2035
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
2036
2062
  # Check if it is an output.
2037
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
2038
2071
  # Convert it to a reference.
2039
2072
  ref = RefObject.new(self.to_ref,signal)
2073
+ # puts "key=#{key} value=#{value} signal=#{signal} ref=#{ref}"
2040
2074
  # Make the connection.
2041
2075
  if isout then
2042
2076
  value <= ref
@@ -2085,6 +2119,54 @@ module HDLRuby::High
2085
2119
  self.eigen_extend(@systemT.public_namespace)
2086
2120
  end
2087
2121
 
2122
+ # Adds alternative system +systemT+
2123
+ def choice(configuration = {})
2124
+ # Process the argument.
2125
+ configuration.each do |k,v|
2126
+ k = k.to_sym
2127
+ unless v.is_a?(SystemT) then
2128
+ raise "Invalid class for a system type: #{v.class}"
2129
+ end
2130
+ # Create an eigen system.
2131
+ eigen = v.instantiate(HDLRuby.uniq_name(self.name)).systemT
2132
+ # Ensure its interface corresponds.
2133
+ my_signals = self.each_signal.to_a
2134
+ if (eigen.each_signal.with_index.find { |sig,i|
2135
+ !sig.eql?(my_signals[i])
2136
+ }) then
2137
+ raise "Invalid system for configuration: #{systemT.name}."
2138
+ end
2139
+ # Add it.
2140
+ # At the HDLRuby::High level
2141
+ @choices = { self.name => self.systemT } unless @choices
2142
+ @choices[k] = eigen
2143
+ # At the HDLRuby::Low level
2144
+ self.add_systemT(eigen)
2145
+ end
2146
+ end
2147
+
2148
+ # (Re)Configuration of system instance to systemT designated by +sys+.
2149
+ # +sys+ may be the index or the name of the configuration, the first
2150
+ # configuration being named by the systemI name.
2151
+ def configure(sys)
2152
+ if sys.respond_to?(:to_i) then
2153
+ # The argument is an index.
2154
+ # Create the (re)configuration node.
2155
+ High.top_user.add_statement(
2156
+ Configure.new(RefObject.new(RefThis.new,self),sys.to_i))
2157
+ else
2158
+ # The argument is a name (should be).
2159
+ # Get the index corresponding to the name.
2160
+ num = @choices.find_index { |k,_| k == sys.to_sym }
2161
+ unless num then
2162
+ raise "Invalid name for configuration: #{sys.to_s}"
2163
+ end
2164
+ # Create the (re)configuration node.
2165
+ High.top_user.add_statement(
2166
+ Configure.new(RefObject.new(RefThis.new,self),num))
2167
+ end
2168
+ end
2169
+
2088
2170
  # include Hmissing
2089
2171
 
2090
2172
  # Missing methods are looked for in the public namespace of the
@@ -2121,8 +2203,11 @@ module HDLRuby::High
2121
2203
  # systemIL.properties[:low2high] = self.hdr_id
2122
2204
  # self.properties[:high2low] = systemIL
2123
2205
  # Adds the other systemTs.
2124
- self.each_systemT do |systemT|
2125
- systemIL.add_systemT(systemT.to_low) unless systemT == self.systemT
2206
+ self.each_systemT do |systemTc|
2207
+ if systemTc != self.systemT
2208
+ systemTcL = systemTc.to_low
2209
+ systemIL.add_systemT(systemTcL)
2210
+ end
2126
2211
  end
2127
2212
  return systemIL
2128
2213
  end
@@ -2399,6 +2484,18 @@ module HDLRuby::High
2399
2484
  end
2400
2485
  end
2401
2486
 
2487
+ ##
2488
+ # Describes a timed terminate statement: not synthesizable!
2489
+ class TimeTerminate < Low::TimeTerminate
2490
+ include HStatement
2491
+
2492
+ # Converts the repeat statement to HDLRuby::Low.
2493
+ def to_low
2494
+ return HDLRuby::Low::TimeTerminate.new
2495
+ end
2496
+ end
2497
+
2498
+
2402
2499
 
2403
2500
  ##
2404
2501
  # Module giving high-level expression properties
@@ -2651,6 +2748,20 @@ module HDLRuby::High
2651
2748
  #
2652
2749
  # NOTE: +rng+ can be a single expression in which case it is an index.
2653
2750
  def [](rng)
2751
+ if rng.is_a?(::Range) then
2752
+ first = rng.first
2753
+ if (first.is_a?(::Integer)) then
2754
+ first = self.type.size+first if first < 0
2755
+ end
2756
+ last = rng.last
2757
+ if (last.is_a?(::Integer)) then
2758
+ last = self.type.size+last if last < 0
2759
+ end
2760
+ rng = first..last
2761
+ end
2762
+ if rng.is_a?(::Integer) && rng < 0 then
2763
+ rng = self.type.size+rng
2764
+ end
2654
2765
  if rng.respond_to?(:to_expr) then
2655
2766
  # Number range: convert it to an expression.
2656
2767
  rng = rng.to_expr
@@ -2987,6 +3098,7 @@ module HDLRuby::High
2987
3098
 
2988
3099
  # Creates a new reference from a +base+ reference and named +object+.
2989
3100
  def initialize(base,object)
3101
+ # puts "New RefObjet with base=#{base}, object=#{object.name}"
2990
3102
  if object.respond_to?(:type) then
2991
3103
  # Typed object, so typed reference.
2992
3104
  super(object.type)
@@ -3023,7 +3135,7 @@ module HDLRuby::High
3023
3135
 
3024
3136
  # Converts the name reference to a HDLRuby::Low::RefName.
3025
3137
  def to_low
3026
- # puts "to_low with base=#{@base} @object=#{@object}"
3138
+ # puts "to_low with base=#{@base} @object=#{@object.name}"
3027
3139
  refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3028
3140
  @base.to_ref.to_low,@object.name)
3029
3141
  # # For debugging: set the source high object
@@ -3081,7 +3193,8 @@ module HDLRuby::High
3081
3193
  # Converts to a new reference.
3082
3194
  def to_ref
3083
3195
  return RefIndex.new(self.type,
3084
- self.ref.to_ref,self.index.to_expr)
3196
+ # self.ref.to_ref,self.index.to_expr)
3197
+ self.ref.to_expr,self.index.to_expr)
3085
3198
  end
3086
3199
 
3087
3200
  # Converts the index reference to HDLRuby::Low.
@@ -3319,6 +3432,27 @@ module HDLRuby::High
3319
3432
  end
3320
3433
 
3321
3434
 
3435
+ ##
3436
+ # Describes a systemI (re)configure statement: not synthesizable!
3437
+ class Configure < Low::Configure
3438
+ High = HDLRuby::High
3439
+
3440
+ include HStatement
3441
+
3442
+ # Creates a new (re)configure statement for system instance refered
3443
+ # by +ref+ with system number +num+.
3444
+ def initialize(ref,num)
3445
+ super(ref,num)
3446
+ end
3447
+
3448
+ # Converts the connection to HDLRuby::Low.
3449
+ def to_low
3450
+ return HDLRuby::Low::Configure.new(self.ref.to_low, self.index)
3451
+ end
3452
+
3453
+ end
3454
+
3455
+
3322
3456
  ##
3323
3457
  # Describes a connection.
3324
3458
  class Connection < Low::Connection
@@ -3496,7 +3630,8 @@ module HDLRuby::High
3496
3630
  # Converts the system to HDLRuby::Low and set its +name+.
3497
3631
  def to_low(name = self.name)
3498
3632
  # return HDLRuby::Low::SignalI.new(name,self.type.to_low)
3499
- signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low)
3633
+ valueL = self.value ? self.value.to_low : nil
3634
+ signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low,valueL)
3500
3635
  # # For debugging: set the source high object
3501
3636
  # signalIL.properties[:low2high] = self.hdr_id
3502
3637
  # self.properties[:high2low] = signalIL
@@ -3586,6 +3721,15 @@ module HDLRuby::High
3586
3721
  High.space_push(@namespace)
3587
3722
  @return_value = High.top_user.instance_eval(&ruby_block)
3588
3723
  High.space_pop
3724
+ # if @return_value.is_a?(HExpression) then
3725
+ # res = @return_value
3726
+ # High.space_push(@namespace)
3727
+ # @return_value = res.type.inner(HDLRuby.uniq_name)
3728
+ # puts "@return_value name=#{@return_value.name}"
3729
+ # @return_value <= res
3730
+ # High.space_pop
3731
+ # @return_value = RefObject.new(self,@return_value)
3732
+ # end
3589
3733
  @return_value
3590
3734
  end
3591
3735
 
@@ -3742,6 +3886,11 @@ module HDLRuby::High
3742
3886
  def hprint(*args)
3743
3887
  self.add_statement(Print.new(*args))
3744
3888
  end
3889
+
3890
+ # Terminate the simulation.
3891
+ def terminate
3892
+ self.add_statement(TimeTerminate.new)
3893
+ end
3745
3894
  end
3746
3895
 
3747
3896
 
@@ -3775,7 +3924,7 @@ module HDLRuby::High
3775
3924
  # Converts the block to HDLRuby::Low.
3776
3925
  def to_low
3777
3926
  # Create the resulting block
3778
- blockL = HDLRuby::Low::Block.new(self.mode)
3927
+ blockL = HDLRuby::Low::Block.new(self.mode,self.name)
3779
3928
  # # For debugging: set the source high object
3780
3929
  # blockL.properties[:low2high] = self.hdr_id
3781
3930
  # self.properties[:high2low] = blockL
@@ -165,6 +165,22 @@ module HDLRuby::Low
165
165
 
166
166
 
167
167
 
168
+ # Handling the (re)configuration.
169
+
170
+ # Gets the configuration wrapper if any.
171
+ def wrapper
172
+ return defined? @wrapper ? @wrapper : nil
173
+ end
174
+
175
+ # Sets the configuration wrapper to +systemT+.
176
+ def wrapper=(systemT)
177
+ unless systemT.is_a?(SystemT) then
178
+ raise "Invalid class for a wrapper system type: #{systemT}."
179
+ end
180
+ @wrapper = systemT
181
+ end
182
+
183
+
168
184
  # Handling the signals.
169
185
 
170
186
  # Adds input +signal+.
@@ -432,6 +448,27 @@ module HDLRuby::Low
432
448
  end
433
449
  end
434
450
  end
451
+
452
+ # Iterates over the systemT deeply if any in order of reference
453
+ # to ensure the refered elements are processed first.
454
+ #
455
+ # Returns an enumerator if no ruby block is given.
456
+ def each_systemT_deep_ref(&ruby_block)
457
+ # No ruby block? Return an enumerator.
458
+ return to_enum(:each_systemT_deep_ref) unless ruby_block
459
+ # A ruby block?
460
+ # Recurse on the systemT accessible through the instances.
461
+ self.scope.each_scope_deep do |scope|
462
+ scope.each_systemI do |systemI|
463
+ # systemI.systemT.each_systemT_deep(&ruby_block)
464
+ systemI.each_systemT do |systemT|
465
+ systemT.each_systemT_deep_ref(&ruby_block)
466
+ end
467
+ end
468
+ end
469
+ # Finally apply it to current.
470
+ ruby_block.call(self)
471
+ end
435
472
  end
436
473
 
437
474
 
@@ -2500,8 +2537,8 @@ module HDLRuby::Low
2500
2537
  # NOTE: an instance can actually represented muliple layers
2501
2538
  # of systems, the first one being the one actually instantiated
2502
2539
  # in the final RTL code.
2503
- # This layring can be used for describing software or partial
2504
- # reconfiguration.
2540
+ # This layering can be used for describing software or partial
2541
+ # (re)configuration.
2505
2542
  class SystemI
2506
2543
 
2507
2544
  include Hparent
@@ -2564,13 +2601,16 @@ module HDLRuby::Low
2564
2601
  @name = name.to_sym
2565
2602
  end
2566
2603
 
2567
- ## Adds a system layer.
2604
+ ## Adds a system configuration.
2568
2605
  def add_systemT(systemT)
2569
2606
  # puts "add_systemT #{systemT.name} to systemI #{self.name}"
2570
2607
  # Check and add the systemT.
2571
2608
  if !systemT.is_a?(SystemT) then
2572
2609
  raise AnyError, "Invalid class for a system type: #{systemT.class}"
2573
2610
  end
2611
+ # Set the base configuration of the added system.
2612
+ systemT.wrapper = self.systemT
2613
+ # Add it.
2574
2614
  @systemTs << systemT
2575
2615
  end
2576
2616
 
@@ -3781,6 +3821,93 @@ module HDLRuby::Low
3781
3821
  end
3782
3822
  end
3783
3823
  end
3824
+ end
3825
+
3826
+
3827
+ ##
3828
+ # Describes a system instance (re)configuration statement: not synthesizable!
3829
+ class Configure < Statement
3830
+
3831
+ # attr_reader :systemI, :systemT, :index
3832
+ attr_reader :ref, :index
3833
+
3834
+ # Creates a new (re)configure statement of system instance refered by
3835
+ # +ref+ with system number +index+
3836
+ def initialize(ref,index)
3837
+ super()
3838
+ # Process the arguments.
3839
+ index = index.to_i
3840
+ unless ref.is_a?(Ref) then
3841
+ raise "Invalid class for a reference: #{ref.class}."
3842
+ end
3843
+ # Sets the arguments.
3844
+ @ref = ref
3845
+ ref.parent = self
3846
+ @index = index
3847
+ # @systemT = systemI.each_systemT.to_a[index]
3848
+ # # Check the systemT is valid.
3849
+ # unless @systemT then
3850
+ # raise "Invalid configuration index: #{index}."
3851
+ # end
3852
+ end
3853
+
3854
+ # Comparison for hash: structural comparison.
3855
+ def eql?(obj)
3856
+ return false unless obj.is_a?(Configure)
3857
+ return false unless @ref.eql?(obj.ref)
3858
+ return false unless @index.eql?(obj.index)
3859
+ return true
3860
+ end
3861
+
3862
+ # Iterates over each object deeply.
3863
+ #
3864
+ # Returns an enumerator if no ruby block is given.
3865
+ def each_deep(&ruby_block)
3866
+ # No ruby block? Return an enumerator.
3867
+ return to_enum(:each_deep) unless ruby_block
3868
+ # A ruby block? First apply it to current.
3869
+ ruby_block.call(self)
3870
+ # Then apply on the reference.
3871
+ @ref.each_deep(&ruby_block)
3872
+ end
3873
+
3874
+ # Hash function.
3875
+ def hash
3876
+ return (@ref.hash + @index.hash).hash
3877
+ end
3878
+
3879
+ # Clones (deeply)
3880
+ def clone
3881
+ return Configure.new(@ref.clone,@index)
3882
+ end
3883
+
3884
+ # Iterates over the nodes deeply if any.
3885
+ def each_node_deep(&ruby_block)
3886
+ # No ruby block? Return an enumerator.
3887
+ return to_enum(:each_node_deep) unless ruby_block
3888
+ # A ruby block? First apply it to current.
3889
+ ruby_block.call(self)
3890
+ # And recurse on the reference.
3891
+ @ref.each_node_deep(&ruby_block)
3892
+ end
3893
+
3894
+ # Iterates over all the blocks contained in the current block.
3895
+ def each_block_deep(&ruby_block)
3896
+ # No ruby block? Return an enumerator.
3897
+ return to_enum(:each_block_deep) unless ruby_block
3898
+ # A ruby block?
3899
+ # Nothing more to do anyway.
3900
+ end
3901
+
3902
+ # Iterates over all the statements contained in the current block.
3903
+ def each_statement_deep(&ruby_block)
3904
+ # No ruby block? Return an enumerator.
3905
+ return to_enum(:each_statement_deep) unless ruby_block
3906
+ # A ruby block?
3907
+ # Apply it on self.
3908
+ ruby_block.call(self)
3909
+ # And that's all.
3910
+ end
3784
3911
 
3785
3912
  end
3786
3913
 
@@ -3989,6 +4116,82 @@ module HDLRuby::Low
3989
4116
  end
3990
4117
 
3991
4118
 
4119
+ ##
4120
+ # Describes a timed terminate statement: not synthesizable!
4121
+ class TimeTerminate < Statement
4122
+
4123
+ # Creates a new timed terminate statement that terminate execution.
4124
+ def initialize
4125
+ super()
4126
+ end
4127
+
4128
+ # Iterates over each object deeply.
4129
+ #
4130
+ # Returns an enumerator if no ruby block is given.
4131
+ def each_deep(&ruby_block)
4132
+ # No ruby block? Return an enumerator.
4133
+ return to_enum(:each_deep) unless ruby_block
4134
+ # A ruby block? First apply it to current.
4135
+ ruby_block.call(self)
4136
+ # And that's all.
4137
+ end
4138
+
4139
+ # Iterates over all the nodes.
4140
+ def each_node(&ruby_block)
4141
+ # No ruby block? Return an enumerator.
4142
+ return to_enum(:each_node) unless ruby_block
4143
+ # A ruby block?
4144
+ # Nothing to do anyway.
4145
+ end
4146
+
4147
+ # Iterates over all the nodes deeply.
4148
+ def each_node_deep(&ruby_block)
4149
+ # No ruby block? Return an enumerator.
4150
+ return to_enum(:each_node_deep) unless ruby_block
4151
+ # A ruby block?
4152
+ # Apply of current node.
4153
+ ruby_block.call(self)
4154
+ # And that's all.
4155
+ end
4156
+
4157
+ # Iterates over all the statements deeply.
4158
+ def each_statement_deep(&ruby_block)
4159
+ # No ruby block? Return an enumerator.
4160
+ return to_enum(:each_statement_deep) unless ruby_block
4161
+ # A ruby block?
4162
+ # Apply of current node.
4163
+ ruby_block.call(self)
4164
+ # And that's all.
4165
+ end
4166
+
4167
+ # Iterates over all the blocks contained in the current block.
4168
+ def each_block_deep(&ruby_block)
4169
+ # No ruby block? Return an enumerator.
4170
+ return to_enum(:each_block_deep) unless ruby_block
4171
+ # A ruby block?
4172
+ # Nothing to do anyway.
4173
+ end
4174
+
4175
+ # Comparison for hash: structural comparison.
4176
+ def eql?(obj)
4177
+ return false unless obj.is_a?(TimeTerminate)
4178
+ return true
4179
+ end
4180
+
4181
+ # Hash function.
4182
+ def hash
4183
+ return TimeTerminate.hash
4184
+ end
4185
+
4186
+ # Clones the TimeRepeat (deeply)
4187
+ def clone
4188
+ return TimeTerminate.new
4189
+ end
4190
+ end
4191
+
4192
+
4193
+
4194
+
3992
4195
  ##
3993
4196
  # Describes a block.
3994
4197
  class Block < Statement
@@ -4058,6 +4261,7 @@ module HDLRuby::Low
4058
4261
 
4059
4262
  # Adds inner signal +signal+.
4060
4263
  def add_inner(signal)
4264
+ # puts "add inner=#{signal.name} in block=#{self}"
4061
4265
  # Check and add the signal.
4062
4266
  unless signal.is_a?(SignalI)
4063
4267
  raise AnyError,
@@ -4087,6 +4291,7 @@ module HDLRuby::Low
4087
4291
 
4088
4292
  ## Gets an inner signal by +name+.
4089
4293
  def get_inner(name)
4294
+ # puts "name=#{name}, inners=#{@inners.each_key.to_a}"
4090
4295
  return @inners[name.to_sym]
4091
4296
  end
4092
4297
  alias_method :get_signal, :get_inner
@@ -5342,7 +5547,8 @@ module HDLRuby::Low
5342
5547
  def initialize(type,ref,index)
5343
5548
  super(type)
5344
5549
  # Check and set the accessed reference.
5345
- unless ref.is_a?(Ref) then
5550
+ # unless ref.is_a?(Ref) then
5551
+ unless ref.is_a?(Expression) then
5346
5552
  raise AnyError, "Invalid class for a reference: #{ref.class}."
5347
5553
  end
5348
5554
  @ref = ref