HDLRuby 2.6.25 → 2.7.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -2651,6 +2685,20 @@ module HDLRuby::High
2651
2685
  #
2652
2686
  # NOTE: +rng+ can be a single expression in which case it is an index.
2653
2687
  def [](rng)
2688
+ if rng.is_a?(::Range) then
2689
+ first = rng.first
2690
+ if (first.is_a?(::Integer)) then
2691
+ first = self.type.size+first if first < 0
2692
+ end
2693
+ last = rng.last
2694
+ if (last.is_a?(::Integer)) then
2695
+ last = self.type.size+last if last < 0
2696
+ end
2697
+ rng = first..last
2698
+ end
2699
+ if rng.is_a?(::Integer) && rng < 0 then
2700
+ rng = self.type.size+rng
2701
+ end
2654
2702
  if rng.respond_to?(:to_expr) then
2655
2703
  # Number range: convert it to an expression.
2656
2704
  rng = rng.to_expr
@@ -2987,6 +3035,7 @@ module HDLRuby::High
2987
3035
 
2988
3036
  # Creates a new reference from a +base+ reference and named +object+.
2989
3037
  def initialize(base,object)
3038
+ # puts "New RefObjet with base=#{base}, object=#{object.name}"
2990
3039
  if object.respond_to?(:type) then
2991
3040
  # Typed object, so typed reference.
2992
3041
  super(object.type)
@@ -3023,7 +3072,7 @@ module HDLRuby::High
3023
3072
 
3024
3073
  # Converts the name reference to a HDLRuby::Low::RefName.
3025
3074
  def to_low
3026
- # puts "to_low with base=#{@base} @object=#{@object}"
3075
+ # puts "to_low with base=#{@base} @object=#{@object.name}"
3027
3076
  refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3028
3077
  @base.to_ref.to_low,@object.name)
3029
3078
  # # For debugging: set the source high object
@@ -3081,7 +3130,8 @@ module HDLRuby::High
3081
3130
  # Converts to a new reference.
3082
3131
  def to_ref
3083
3132
  return RefIndex.new(self.type,
3084
- self.ref.to_ref,self.index.to_expr)
3133
+ # self.ref.to_ref,self.index.to_expr)
3134
+ self.ref.to_expr,self.index.to_expr)
3085
3135
  end
3086
3136
 
3087
3137
  # Converts the index reference to HDLRuby::Low.
@@ -3496,7 +3546,8 @@ module HDLRuby::High
3496
3546
  # Converts the system to HDLRuby::Low and set its +name+.
3497
3547
  def to_low(name = self.name)
3498
3548
  # return HDLRuby::Low::SignalI.new(name,self.type.to_low)
3499
- signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low)
3549
+ valueL = self.value ? self.value.to_low : nil
3550
+ signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low,valueL)
3500
3551
  # # For debugging: set the source high object
3501
3552
  # signalIL.properties[:low2high] = self.hdr_id
3502
3553
  # self.properties[:high2low] = signalIL
@@ -3586,6 +3637,15 @@ module HDLRuby::High
3586
3637
  High.space_push(@namespace)
3587
3638
  @return_value = High.top_user.instance_eval(&ruby_block)
3588
3639
  High.space_pop
3640
+ # if @return_value.is_a?(HExpression) then
3641
+ # res = @return_value
3642
+ # High.space_push(@namespace)
3643
+ # @return_value = res.type.inner(HDLRuby.uniq_name)
3644
+ # puts "@return_value name=#{@return_value.name}"
3645
+ # @return_value <= res
3646
+ # High.space_pop
3647
+ # @return_value = RefObject.new(self,@return_value)
3648
+ # end
3589
3649
  @return_value
3590
3650
  end
3591
3651
 
@@ -3775,7 +3835,7 @@ module HDLRuby::High
3775
3835
  # Converts the block to HDLRuby::Low.
3776
3836
  def to_low
3777
3837
  # Create the resulting block
3778
- blockL = HDLRuby::Low::Block.new(self.mode)
3838
+ blockL = HDLRuby::Low::Block.new(self.mode,self.name)
3779
3839
  # # For debugging: set the source high object
3780
3840
  # blockL.properties[:low2high] = self.hdr_id
3781
3841
  # self.properties[:high2low] = blockL
@@ -4058,6 +4058,7 @@ module HDLRuby::Low
4058
4058
 
4059
4059
  # Adds inner signal +signal+.
4060
4060
  def add_inner(signal)
4061
+ # puts "add inner=#{signal.name} in block=#{self}"
4061
4062
  # Check and add the signal.
4062
4063
  unless signal.is_a?(SignalI)
4063
4064
  raise AnyError,
@@ -4087,6 +4088,7 @@ module HDLRuby::Low
4087
4088
 
4088
4089
  ## Gets an inner signal by +name+.
4089
4090
  def get_inner(name)
4091
+ # puts "name=#{name}, inners=#{@inners.each_key.to_a}"
4090
4092
  return @inners[name.to_sym]
4091
4093
  end
4092
4094
  alias_method :get_signal, :get_inner
@@ -5342,7 +5344,8 @@ module HDLRuby::Low
5342
5344
  def initialize(type,ref,index)
5343
5345
  super(type)
5344
5346
  # Check and set the accessed reference.
5345
- unless ref.is_a?(Ref) then
5347
+ # unless ref.is_a?(Ref) then
5348
+ unless ref.is_a?(Expression) then
5346
5349
  raise AnyError, "Invalid class for a reference: #{ref.class}."
5347
5350
  end
5348
5351
  @ref = ref
@@ -356,8 +356,13 @@ module HDLRuby::Low
356
356
  end
357
357
  self.scope.each_block_deep do |block|
358
358
  block.each_inner do |signal|
359
- # res << signal.value.to_ch if signal.value
360
- signal.value.to_ch(res) if signal.value
359
+ # signal.value.to_ch(res) if signal.value
360
+ if signal.value then
361
+ signal.value.each_node_deep do |node|
362
+ # res << node.to_ch if node.is_a?(Value)
363
+ node.to_ch(res) if node.is_a?(Value)
364
+ end
365
+ end
361
366
  end
362
367
  block.each_node_deep do |node|
363
368
  # res << node.to_ch if node.is_a?(Value)
@@ -702,6 +707,10 @@ module HDLRuby::Low
702
707
  end.to_a
703
708
  # Keep only one ref per signal.
704
709
  refs.uniq! { |node| node.full_name }
710
+ # Remove the inner signals from the list.
711
+ self.block.each_inner do |inner|
712
+ refs.delete_if {|r| r.name == inner.name }
713
+ end
705
714
  # Generate the event.
706
715
  events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
707
716
  # Add them to the behavior for further processing.
@@ -891,11 +900,12 @@ module HDLRuby::Low
891
900
  if self.value then
892
901
  # There is an initial value.
893
902
  res << " " * (level+1)*3
894
- # res << "copy_value(#{self.value.to_c(level+2)}," +
895
- # "signalI->c_value);\n"
903
+ # res << "copy_value("
904
+ # self.value.to_c_expr(res,level+2)
905
+ # res << ",signalI->c_value);\n"
896
906
  res << "copy_value("
897
907
  self.value.to_c_expr(res,level+2)
898
- res << ",signalI->c_value);\n"
908
+ res << ",signalI->f_value);\n"
899
909
  end
900
910
 
901
911
  # Initially the signal can be overwritten by anything.
@@ -1360,7 +1370,7 @@ module HDLRuby::Low
1360
1370
  # def to_c(level = 0)
1361
1371
  def to_c(res,level = 0)
1362
1372
  # Save the value pool state.
1363
- res << (" " * (level*3)) << "SV;\n"
1373
+ res << (" " * (level*3)) << "PV;\n"
1364
1374
  # Generate the print for each argument.
1365
1375
  self.each_arg do |arg|
1366
1376
  if (arg.is_a?(StringE)) then
@@ -1610,26 +1620,18 @@ module HDLRuby::Low
1610
1620
  res << "{\n"
1611
1621
  self.value.to_c(res,level+1)
1612
1622
  res << " " * ((level+1)*3)
1613
- res << "Value v=d;\n"
1623
+ res << "dup();\n"
1614
1624
  # Ensure the selection value is testable.
1615
1625
  res << " " * ((level+1)*3)
1616
- res << "if (is_defined_value(v)) {\n"
1626
+ res << "if (is_defined()) {\n"
1617
1627
  # The condition is testable.
1618
1628
  # Generate the case as a succession of if statements.
1619
- first = true
1620
1629
  self.each_when do |w|
1621
1630
  res << " " * ((level+2)*3)
1622
- if first then
1623
- first = false
1624
- else
1625
- res << "else "
1626
- end
1627
- res << "if (value2integer(v) == "
1628
- res << "value2integer(({\n"
1631
+ res << "dup();\n"
1629
1632
  res << " " * ((level+2)*3)
1630
1633
  w.match.to_c(res,level+2)
1631
- res << "d;})"
1632
- res << ")) {\n"
1634
+ res << "if (to_integer() == to_integer()) {\n"
1633
1635
  w.statement.to_c(res,level+3)
1634
1636
  res << " " * (level+2)*3
1635
1637
  res << "}\n"
@@ -1643,6 +1645,8 @@ module HDLRuby::Low
1643
1645
  end
1644
1646
  # Close the case.
1645
1647
  res << " " * (level+1)*3
1648
+ res << "pop();\n" # Remove the testing value.
1649
+ res << " " * (level+1)*3
1646
1650
  res << "}\n"
1647
1651
  res << " " * (level)*3
1648
1652
  res << "}\n"
@@ -1899,6 +1903,16 @@ module HDLRuby::Low
1899
1903
  # Should never be here.
1900
1904
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1901
1905
  end
1906
+
1907
+ ## Generates the C text for an expression access to the expression,
1908
+ # default case.
1909
+ # +level+ is the hierachical level of the object.
1910
+ def to_c_expr(res,level = 0)
1911
+ res << "({"
1912
+ self.to_c(res,level+1)
1913
+ res << (" " * ((level+1)*3))
1914
+ res << "pop();})"
1915
+ end
1902
1916
  end
1903
1917
 
1904
1918
 
@@ -1981,7 +1995,7 @@ module HDLRuby::Low
1981
1995
  res << " " * (level+1)*3
1982
1996
  # res << "static unsigned long long data[] = { "
1983
1997
  res << "static unsigned int data[] = { "
1984
- res << str.scan(/.{1,#{Low2C.int_width}}/m).map do |sub|
1998
+ res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
1985
1999
  sub.to_i(2).to_s # + "ULL"
1986
2000
  end.join(",")
1987
2001
  res << " };\n"
@@ -2056,7 +2070,7 @@ module HDLRuby::Low
2056
2070
  # def to_c(level = 0)
2057
2071
  def to_c(res,level = 0)
2058
2072
  # Save the value pool state.
2059
- res << (" " * (level*3)) << "SV;\n"
2073
+ res << (" " * (level*3)) << "PV;\n"
2060
2074
  # Generate the child.
2061
2075
  self.child.to_c(res,level)
2062
2076
  res << (" " * (level*3))
@@ -2144,7 +2158,7 @@ module HDLRuby::Low
2144
2158
  end
2145
2159
  # Some computation required.
2146
2160
  # Save the value pool state.
2147
- res << (" " * (level*3)) << "SV;\n"
2161
+ res << (" " * (level*3)) << "PV;\n"
2148
2162
  # Generate the child.
2149
2163
  self.child.to_c(res,level)
2150
2164
  res << (" " * (level*3))
@@ -2256,7 +2270,7 @@ module HDLRuby::Low
2256
2270
  # def to_c(level = 0)
2257
2271
  def to_c(res, level = 0)
2258
2272
  # Save the value pool state.
2259
- res << (" " * (level*3)) << "SV;\n"
2273
+ res << (" " * (level*3)) << "PV;\n"
2260
2274
  # Generate the left computation.
2261
2275
  self.left.to_c(res,level)
2262
2276
  # Generate the right computation.
@@ -2375,7 +2389,7 @@ module HDLRuby::Low
2375
2389
  # +level+ is the hierachical level of the object.
2376
2390
  def to_c(res,level = 0)
2377
2391
  # Save the value pool state.
2378
- res << (" " * (level*3)) << "SV;\n"
2392
+ res << (" " * (level*3)) << "PV;\n"
2379
2393
  # Gather the possible selection choices.
2380
2394
  expressions = self.each_choice.to_a
2381
2395
  # Create the resulting string.
@@ -2444,7 +2458,7 @@ module HDLRuby::Low
2444
2458
  # +level+ is the hierachical level of the object.
2445
2459
  def to_c(res,level = 0)
2446
2460
  # Save the value pool state.
2447
- res << (" " * (level*3)) << "SV;\n"
2461
+ res << (" " * (level*3)) << "PV;\n"
2448
2462
  # Gather the content to concat.
2449
2463
  expressions = self.each_expression.to_a
2450
2464
  # Compute each sub expression.
@@ -2461,46 +2475,64 @@ module HDLRuby::Low
2461
2475
  return res
2462
2476
  end
2463
2477
 
2464
- # Generates the C text of expression for the equivalent HDLRuby code.
2465
- # +level+ is the hierachical level of the object.
2466
- def to_c_expr(res,level = 0)
2467
- # Gather the content to concat.
2468
- expressions = self.each_expression.to_a
2469
- # Create the resulting string.
2470
- res << "({\n"
2471
- # Overrides the upper src0, src1, ..., and dst...
2472
- # And allocates a new value for dst.
2473
- res << (" " * ((level+1)*3))
2474
- res << "Value "
2475
- res << expressions.size.times.map do |i|
2476
- "src#{i}"
2477
- end.join(",")
2478
- res << ";\n"
2479
- res << (" " * ((level+1)*3))
2480
- res << "Value dst = get_value();\n"
2481
- # Save the value pool state.
2482
- res << (" " * (level*3)) << "SV;\n"
2483
- # Compute each sub expression.
2484
- expressions.each_with_index do |expr,i|
2485
- res << (" " * ((level+1)*3))
2486
- res << "src#{i} = "
2487
- expr.to_c_expr(res,level+2)
2488
- res << ";\n"
2489
- end
2490
- # Compute the direction.
2491
- # Compute the resulting concatenation.
2492
- res << (" " * ((level+1)*3))
2493
- res << "concat_value(#{expressions.size},"
2494
- res << "#{self.type.direction == :little ? 1 : 0},dst,"
2495
- res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2496
- res << ");\n"
2497
- # Save the value pool state.
2498
- res << (" " * (level*3)) << "SV;\n"
2499
- # Close the computation.
2500
- res << (" " * (level*3))
2501
- res << "dst; })"
2502
- return res
2503
- end
2478
+ # # # Generates the C text of expression for the equivalent HDLRuby code.
2479
+ # # # +level+ is the hierachical level of the object.
2480
+ # # def to_c_expr(res,level = 0)
2481
+ # # # Gather the content to concat.
2482
+ # # expressions = self.each_expression.to_a
2483
+ # # # Create the resulting string.
2484
+ # # res << "({\n"
2485
+ # # # Overrides the upper src0, src1, ..., and dst...
2486
+ # # # And allocates a new value for dst.
2487
+ # # res << (" " * ((level+1)*3))
2488
+ # # res << "Value "
2489
+ # # res << expressions.size.times.map do |i|
2490
+ # # "src#{i}"
2491
+ # # end.join(",")
2492
+ # # res << ";\n"
2493
+ # # res << (" " * ((level+1)*3))
2494
+ # # res << "Value dst = get_value();\n"
2495
+ # # # Save the value pool state.
2496
+ # # res << (" " * (level*3)) << "SV;\n"
2497
+ # # # Compute each sub expression.
2498
+ # # expressions.each_with_index do |expr,i|
2499
+ # # res << (" " * ((level+1)*3))
2500
+ # # res << "src#{i} = "
2501
+ # # expr.to_c_expr(res,level+2)
2502
+ # # res << ";\n"
2503
+ # # end
2504
+ # # # Compute the direction.
2505
+ # # # Compute the resulting concatenation.
2506
+ # # res << (" " * ((level+1)*3))
2507
+ # # res << "concat_value(#{expressions.size},"
2508
+ # # res << "#{self.type.direction == :little ? 1 : 0},dst,"
2509
+ # # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2510
+ # # res << ");\n"
2511
+ # # # Save the value pool state.
2512
+ # # res << (" " * (level*3)) << "SV;\n"
2513
+ # # # Close the computation.
2514
+ # # res << (" " * (level*3))
2515
+ # # res << "dst; })"
2516
+ # # return res
2517
+ # # end
2518
+ # def to_c_expr(res,level = 0)
2519
+ # # Save the value pool state.
2520
+ # res << "({ PV;"
2521
+ # # Gather the content to concat.
2522
+ # expressions = self.each_expression.to_a
2523
+ # # Compute each sub expression.
2524
+ # expressions.each_with_index do |expr,i|
2525
+ # expr.to_c(res,level+2)
2526
+ # end
2527
+ # # Compute the resulting concatenation.
2528
+ # res << (" " * ((level+1)*3))
2529
+ # res << "sconcat(#{expressions.size},"
2530
+ # res << (self.type.direction == :little ? "1" : "0")
2531
+ # res << ");\n"
2532
+ # # Restore the value pool state.
2533
+ # res << "RV; pop();})"
2534
+ # return res
2535
+ # end
2504
2536
  end
2505
2537
 
2506
2538
 
@@ -2604,7 +2636,7 @@ module HDLRuby::Low
2604
2636
  # +left+ tells if it is a left value or not.
2605
2637
  def to_c(res,level = 0, left = false)
2606
2638
  # Save the value pool state.
2607
- res << (" " * (level*3)) << "SV;\n"
2639
+ res << (" " * (level*3)) << "PV;\n"
2608
2640
  # Compute the reference.
2609
2641
  self.ref.to_c(res,level)
2610
2642
  # Compute the index.
@@ -2718,7 +2750,7 @@ module HDLRuby::Low
2718
2750
  # end
2719
2751
  def to_c(res,level = 0, left = false)
2720
2752
  # Save the value pool state.
2721
- res << (" " * (level*3)) << "SV;\n"
2753
+ res << (" " * (level*3)) << "PV;\n"
2722
2754
  # Compute the reference.
2723
2755
  self.ref.to_c(res,level)
2724
2756
  # res << (" " * (level*3))
@@ -2784,17 +2816,11 @@ module HDLRuby::Low
2784
2816
  # +left+ tells if it is a left value or not.
2785
2817
  # def to_c(level = 0, left = false)
2786
2818
  def to_c(res,level = 0, left = false)
2787
- # # puts "RefName to_c for #{self.name}"
2788
- # self.resolve.to_c_signal(res,level+1)
2789
- # res << "->" << (left ? "f_value" : "c_value")
2790
- # return res
2791
2819
  # puts "RefName to_c for #{self.name}"
2792
2820
  res << (" " * (level*3))
2793
- # res << "d="
2794
2821
  res << "push("
2795
2822
  self.resolve.to_c_signal(res,level+1)
2796
2823
  res << "->" << (left ? "f_value" : "c_value")
2797
- # res << ";\n"
2798
2824
  res << ");\n"
2799
2825
  return res
2800
2826
  end
@@ -50,9 +50,25 @@ module HDLRuby::Low
50
50
  return found if found
51
51
  # Maybe it is a sub scope.
52
52
  return self.each_scope.find { |scope| scope.name == name }
53
+ # Maybe it in the behavior.
54
+ return self.behavior.get_by_name
53
55
  end
54
56
  end
55
57
 
58
+ ##
59
+ # Extends Behavior with the capability of finding one of its inner object
60
+ # by name.
61
+ class Behavior
62
+
63
+ ## Find an inner object by +name+.
64
+ # NOTE: return nil if not found.
65
+ def get_by_name(name)
66
+ if (self.block.name == name.to_sym) then
67
+ return self.block
68
+ end
69
+ return self.block.get_by_name(name)
70
+ end
71
+ end
56
72
 
57
73
  ##
58
74
  # Extends SystemI with the capability of finding one of its inner object
@@ -79,7 +95,16 @@ module HDLRuby::Low
79
95
  # Ensure the name is a symbol.
80
96
  name = name.to_sym
81
97
  # Look in the signals.
82
- return self.get_inner(name)
98
+ found = self.get_inner(name)
99
+ return found if found
100
+ # Check the sub blocks names.
101
+ self.each_block do |block|
102
+ # puts "block=#{block.name}"
103
+ if (block.name == name) then
104
+ return block
105
+ end
106
+ end
107
+ return nil
83
108
  end
84
109
  end
85
110
 
@@ -199,6 +224,7 @@ module HDLRuby::Low
199
224
  if self.ref.is_a?(RefName) then
200
225
  # puts "ref name=#{self.ref.name}"
201
226
  obj = self.ref.resolve
227
+ # puts "obj=#{obj}"
202
228
  # Look into the object for the name.
203
229
  return obj.get_by_name(self.name)
204
230
  else
@@ -208,12 +234,15 @@ module HDLRuby::Low
208
234
  while parent
209
235
  # puts "parent=#{parent}"
210
236
  if parent.respond_to?(:get_by_name) then
237
+ # puts "get_by_name"
211
238
  found = parent.get_by_name(self.name)
239
+ # puts "found" if found
212
240
  return found if found
213
241
  end
214
242
  parent = parent.parent
215
243
  end
216
244
  # Not found.
245
+ # puts "Not found!"
217
246
  return nil
218
247
  end
219
248
  end
@@ -1,5 +1,6 @@
1
1
  require 'set'
2
2
 
3
+
3
4
  module HDLRuby
4
5
 
5
6
  ##
@@ -410,7 +410,8 @@ extern void save_value_pos();
410
410
  extern void restore_value_pos();
411
411
 
412
412
  /** Macros for short control of the pool of values. */
413
- #define SV get_value();save_value_pos();
413
+ #define SV save_value_pos();
414
+ #define PV push(get_value());save_value_pos();
414
415
  #define RV restore_value_pos();
415
416
 
416
417
 
@@ -753,10 +754,17 @@ extern Value write_range_no_z(Value src, long long first, long long last,
753
754
  * @param val the value to push. */
754
755
  extern void push(Value val);
755
756
 
757
+ /** Duplicates a value in the stack. */
758
+ extern void dup();
759
+
756
760
  /** Pops a value.
757
761
  * @return the value. */
758
762
  extern Value pop();
759
763
 
764
+ /** Access the top value of the stack without removing it.
765
+ * @return the value. */
766
+ extern Value peek();
767
+
760
768
  /** Unary calculation.
761
769
  * @param oper the operator function
762
770
  * @return the destination