HDLRuby 2.11.11 → 3.0.0

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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.html +3274 -0
  3. data/README.md +608 -99
  4. data/ext/hruby_sim/hruby_rcsim_build.c +27 -0
  5. data/ext/hruby_sim/hruby_sim.h +3 -0
  6. data/ext/hruby_sim/hruby_sim_calc.c +2 -0
  7. data/ext/hruby_sim/hruby_sim_core.c +17 -5
  8. data/ext/hruby_sim/hruby_sim_stack_calc.c +1 -1
  9. data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
  10. data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
  11. data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
  12. data/lib/HDLRuby/backend/hruby_allocator.rb +2 -2
  13. data/lib/HDLRuby/backend/hruby_c_allocator.rb +7 -7
  14. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
  15. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
  16. data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
  17. data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
  18. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +12 -12
  19. data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
  20. data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
  21. data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
  22. data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
  23. data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
  24. data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +105 -0
  25. data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +69 -0
  26. data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
  27. data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
  28. data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
  29. data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
  30. data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
  31. data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
  32. data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
  33. data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
  34. data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
  35. data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
  36. data/lib/HDLRuby/hdr_samples/with_register_stack.rb +150 -0
  37. data/lib/HDLRuby/hdr_samples/with_sequencer.rb +190 -0
  38. data/lib/HDLRuby/hdr_samples/with_sequencer_deep.rb +91 -0
  39. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +405 -0
  40. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +89 -0
  41. data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +120 -0
  42. data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
  43. data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
  44. data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
  45. data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
  46. data/lib/HDLRuby/hdrcc.rb +29 -3
  47. data/lib/HDLRuby/hdrlib.rb +1 -1
  48. data/lib/HDLRuby/hruby_bstr.rb +10 -5
  49. data/lib/HDLRuby/hruby_db.rb +2 -2
  50. data/lib/HDLRuby/hruby_high.rb +152 -47
  51. data/lib/HDLRuby/hruby_high_fullname.rb +3 -1
  52. data/lib/HDLRuby/hruby_low.rb +189 -18
  53. data/lib/HDLRuby/hruby_low2c.rb +129 -54
  54. data/lib/HDLRuby/hruby_low2hdr.rb +66 -40
  55. data/lib/HDLRuby/hruby_low2high.rb +86 -44
  56. data/lib/HDLRuby/hruby_low2seq.rb +26 -18
  57. data/lib/HDLRuby/hruby_low2sym.rb +14 -13
  58. data/lib/HDLRuby/hruby_low2vhd.rb +80 -44
  59. data/lib/HDLRuby/hruby_low_bool2select.rb +61 -46
  60. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +56 -44
  61. data/lib/HDLRuby/hruby_low_cleanup.rb +18 -16
  62. data/lib/HDLRuby/hruby_low_fix_types.rb +65 -32
  63. data/lib/HDLRuby/hruby_low_mutable.rb +83 -119
  64. data/lib/HDLRuby/hruby_low_resolve.rb +38 -30
  65. data/lib/HDLRuby/hruby_low_with_bool.rb +33 -16
  66. data/lib/HDLRuby/hruby_low_with_port.rb +3 -3
  67. data/lib/HDLRuby/hruby_low_with_var.rb +23 -9
  68. data/lib/HDLRuby/hruby_low_without_concat.rb +45 -19
  69. data/lib/HDLRuby/hruby_low_without_namespace.rb +47 -32
  70. data/lib/HDLRuby/hruby_low_without_parinseq.rb +32 -16
  71. data/lib/HDLRuby/hruby_low_without_select.rb +37 -24
  72. data/lib/HDLRuby/hruby_low_without_subsignals.rb +280 -0
  73. data/lib/HDLRuby/hruby_rcsim.rb +158 -134
  74. data/lib/HDLRuby/hruby_rsim.rb +194 -20
  75. data/lib/HDLRuby/hruby_rsim_mute.rb +2 -3
  76. data/lib/HDLRuby/hruby_rsim_vcd.rb +125 -50
  77. data/lib/HDLRuby/hruby_values.rb +48 -33
  78. data/lib/HDLRuby/hruby_verilog.rb +90 -48
  79. data/lib/HDLRuby/soft/stacks.rb +219 -0
  80. data/lib/HDLRuby/std/bram.rb +26 -0
  81. data/lib/HDLRuby/std/clocks.rb +1 -1
  82. data/lib/HDLRuby/std/fixpoint.rb +2 -2
  83. data/lib/HDLRuby/std/fsm.rb +48 -11
  84. data/lib/HDLRuby/std/function_generator.rb +2 -2
  85. data/lib/HDLRuby/std/sequencer.rb +1857 -0
  86. data/lib/HDLRuby/std/sequencer_sync.rb +400 -0
  87. data/lib/HDLRuby/std/std.rb +12 -0
  88. data/lib/HDLRuby/version.rb +1 -1
  89. data/tuto/adder_sat_flags_vcd.png +0 -0
  90. data/tuto/addsub_vcd.png +0 -0
  91. data/tuto/alu_vcd.png +0 -0
  92. data/tuto/bit_pong_vcd.png +0 -0
  93. data/tuto/checksum_vcd.png +0 -0
  94. data/tuto/circuit_hdr.odg +0 -0
  95. data/tuto/circuit_hdr.png +0 -0
  96. data/tuto/circuit_hie.odg +0 -0
  97. data/tuto/circuit_hie.png +0 -0
  98. data/tuto/circuit_view.odg +0 -0
  99. data/tuto/circuit_view.png +0 -0
  100. data/tuto/clock_counter_vcd.png +0 -0
  101. data/tuto/counter_ext_vcd.png +0 -0
  102. data/tuto/fact_vcd.png +0 -0
  103. data/tuto/hw_flow.odg +0 -0
  104. data/tuto/hw_flow.png +0 -0
  105. data/tuto/maxxer_vcd.png +0 -0
  106. data/tuto/pingpong0_vcd.png +0 -0
  107. data/tuto/pingpong1_vcd.png +0 -0
  108. data/tuto/pingpong2_vcd.png +0 -0
  109. data/tuto/ram_vcd.png +0 -0
  110. data/tuto/serializer_vcd.png +0 -0
  111. data/tuto/sw_flow.odg +0 -0
  112. data/tuto/sw_flow.png +0 -0
  113. data/tuto/the_counter_vcd.png +0 -0
  114. data/tuto/tutorial_sw.html +2359 -0
  115. data/tuto/tutorial_sw.md +2684 -0
  116. data/tuto/tutorial_sw.pdf +0 -0
  117. data/tuto/tutorial_sw_jp.md +417 -0
  118. metadata +49 -3
  119. data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -26,6 +26,14 @@ module HDLRuby::High
26
26
  return HDLRuby::Infinity
27
27
  end
28
28
 
29
+ # Reimplementation of the Proc's curry that transmit the context for
30
+ # execution.
31
+ def curry_with_context(*args,&ruby_block)
32
+ return proc do |cxt,*new_args|
33
+ cxt.instance_exec(*(args+new_args),&ruby_block)
34
+ end
35
+ end
36
+
29
37
 
30
38
 
31
39
  ##
@@ -38,7 +46,7 @@ module HDLRuby::High
38
46
  # puts "eigen_extend for #{self} class=#{self.class}"
39
47
  obj.singleton_methods.each do |name|
40
48
  next if name == :yaml_tag # Do not know why we need to skip
41
- puts "name=#{name}"
49
+ # puts "name=#{name}"
42
50
  self.define_singleton_method(name, &obj.singleton_method(name))
43
51
  end
44
52
  end
@@ -403,6 +411,11 @@ module HDLRuby::High
403
411
  return @scope
404
412
  end
405
413
 
414
+ # Converts to a new reference.
415
+ def to_ref
416
+ return RefObject.new(this,self)
417
+ end
418
+
406
419
  # Creates and adds a set of inputs typed +type+ from a list of +names+.
407
420
  #
408
421
  # NOTE: a name can also be a signal, is which case it is duplicated.
@@ -1397,6 +1410,7 @@ module HDLRuby::High
1397
1410
  # Merge the included systems interface in +systemT+
1398
1411
  # NOTE: incompatible with further to_low transformation.
1399
1412
  def merge_included(systemT)
1413
+ # puts "merge_included for scope=#{self.name} with behaviors=#{self.each_behavior.count}"
1400
1414
  # Recurse on the sub.
1401
1415
  self.each_scope {|scope| scope.merge_included(systemT) }
1402
1416
  # Include for current scope.
@@ -1437,6 +1451,8 @@ module HDLRuby::High
1437
1451
  end
1438
1452
  # Adds its subscopes.
1439
1453
  included.scope.each_scope do |scope|
1454
+ # Do not override scopes with same name since it is prioritary!
1455
+ next if !scope.name.empty? && systemT.scope.each_scope.find {|sc| sc.name == scope.name}
1440
1456
  scope.no_parent!
1441
1457
  systemT.scope.add_scope(scope)
1442
1458
  end
@@ -1709,10 +1725,27 @@ module HDLRuby::High
1709
1725
  # Set the new method for the operator.
1710
1726
  self.define_singleton_method(comp_operator(operator)) do |*args|
1711
1727
  # puts "Top user=#{HDLRuby::High.top_user}"
1712
- HDLRuby::High.top_user.instance_exec do
1713
- sub do
1714
- HDLRuby::High.top_user.instance_exec(*args,&ruby_block)
1715
- end
1728
+ HDLRuby::High.top_user.sub(HDLRuby.uniq_name) do
1729
+ ruby_block.call(*args)
1730
+ end
1731
+ end
1732
+ end
1733
+
1734
+ # Redefinition of +operator+ when requiring the context to be passed
1735
+ # as argument (normally only used internally).
1736
+ def define_operator_with_context(operator,&ruby_block)
1737
+ # Ensure there is a block.
1738
+ ruby_block = proc {} unless block_given?
1739
+ # Register the operator as overloaded.
1740
+ @overloads ||= {}
1741
+ @overloads[operator] = ruby_block
1742
+ # Set the new method for the operator.
1743
+ self.define_singleton_method(comp_operator(operator)) do |*args|
1744
+ # puts "Top user=#{HDLRuby::High.top_user}"
1745
+ HDLRuby::High.top_user.sub(HDLRuby.uniq_name) do
1746
+ # It is assumed that the first argument of the ruby_block
1747
+ # is the context in which it must be executed.
1748
+ ruby_block.call(self,*args)
1716
1749
  end
1717
1750
  end
1718
1751
  end
@@ -1945,7 +1978,8 @@ module HDLRuby::High
1945
1978
  gtype)
1946
1979
  # Adds the possible overloaded operators.
1947
1980
  self.each_overload do |op,ruby_block|
1948
- gtype.define_operator(op,&(ruby_block.curry[*args]))
1981
+ # gtype.define_operator(op,&(ruby_block.curry[*args]))
1982
+ gtype.define_operator_with_context(op,&(High.curry_with_context(*args,&ruby_block)))
1949
1983
  end
1950
1984
  # Returns the resulting type
1951
1985
  return gtype
@@ -2010,7 +2044,7 @@ module HDLRuby::High
2010
2044
  end
2011
2045
 
2012
2046
  ##
2013
- # Describes a unsigned integer data type.
2047
+ # Describes an unsigned integer data type.
2014
2048
  class TypeUnsigned < TypeVector
2015
2049
 
2016
2050
  # Creates a new vector type named +name+ from +base+ type and with
@@ -2051,10 +2085,10 @@ module HDLRuby::High
2051
2085
 
2052
2086
  # Converts the type to HDLRuby::Low and set its +name+.
2053
2087
  def to_low(name = self.name)
2054
- # return HDLRuby::Low::TypeTuple.new(name,self.direction,
2055
- # *@types.map { |type| type.to_low } )
2056
- typeTupleL = HDLRuby::Low::TypeTuple.new(name,self.direction,
2057
- *@types.map { |type| type.to_low } )
2088
+ # typeTupleL = HDLRuby::Low::TypeTuple.new(name,self.direction,
2089
+ # *@types.map do |typ| typ.to_low )
2090
+ typeTupleL = HDLRuby::Low::TypeTuple.new(name,self.direction)
2091
+ @types.each { |typ| typeTupleL.add_type(typ.to_low) }
2058
2092
  # # For debugging: set the source high object
2059
2093
  # typeTupleL.properties[:low2high] = self.hdr_id
2060
2094
  # self.properties[:high2low] = typeTupleL
@@ -2116,6 +2150,7 @@ module HDLRuby::High
2116
2150
  gtype = type.generate(*args)
2117
2151
  # And add it as a local type of the system.
2118
2152
  HDLRuby::High.top_user.add_type(gtype)
2153
+ gtype
2119
2154
  end
2120
2155
  end
2121
2156
  else
@@ -2820,17 +2855,17 @@ module HDLRuby::High
2820
2855
 
2821
2856
  # Casts to a bit vector type.
2822
2857
  def to_bit
2823
- return self.as(bit[self.width])
2858
+ return self.as(HDLRuby::High.top_user.bit[self.type.width])
2824
2859
  end
2825
2860
 
2826
2861
  # Casts to an unsigned bit vector type.
2827
2862
  def to_unsigned
2828
- return self.as(unsigned[self.width])
2863
+ return self.as(HDLRuby::High.top_user.unsigned[self.type.width])
2829
2864
  end
2830
2865
 
2831
2866
  # Casts to a signed bit vector type.
2832
- def to_unsigned
2833
- return self.as(signed[self.width])
2867
+ def to_signed
2868
+ return self.as(HDLRuby::High.top_user.signed[self.type.width])
2834
2869
  end
2835
2870
 
2836
2871
  # Extends on the left to +n+ bits filling with +v+ bit values.
@@ -2962,6 +2997,12 @@ module HDLRuby::High
2962
2997
  define_method(orig_operator(operator),&meth)
2963
2998
  end
2964
2999
 
3000
+ # The <=> operator is also supported by is transformed into a sub
3001
+ # with a signed result.
3002
+ def <=>(expr)
3003
+ return (self.as(self.type.base[self.type.width+1])-expr).to_signed
3004
+ end
3005
+
2965
3006
 
2966
3007
  # Creates an access to elements of range +rng+ of the signal.
2967
3008
  #
@@ -3153,7 +3194,7 @@ module HDLRuby::High
3153
3194
 
3154
3195
 
3155
3196
  ##
3156
- # Describes a section operation (generalization of the ternary operator).
3197
+ # Describes a selection operation (generalization of the ternary operator).
3157
3198
  #
3158
3199
  # NOTE: choice is using the value of +select+ as an index.
3159
3200
  class Select < Low::Select
@@ -3208,6 +3249,7 @@ module HDLRuby::High
3208
3249
  # expr.to_low
3209
3250
  # end
3210
3251
  # )
3252
+ i = 0
3211
3253
  concatL = HDLRuby::Low::Concat.new(self.type.to_low,
3212
3254
  self.each_expression.map do |expr|
3213
3255
  expr.to_low
@@ -3292,7 +3334,8 @@ module HDLRuby::High
3292
3334
 
3293
3335
  # Converts to a new event.
3294
3336
  def to_event
3295
- return Event.new(:change,self.to_ref)
3337
+ # return Event.new(:change,self.to_ref)
3338
+ return Event.new(:anyedge,self.to_ref)
3296
3339
  end
3297
3340
 
3298
3341
  # Iterate over the elements.
@@ -3307,6 +3350,12 @@ module HDLRuby::High
3307
3350
  end
3308
3351
  end
3309
3352
 
3353
+ # Get the refered objects.
3354
+ def objects
3355
+ return [ self.object] if self.is_a?(RefObject)
3356
+ return self.each.map { |ref| ref.objects }.flatten
3357
+ end
3358
+
3310
3359
  # Reference can be used like enumerator
3311
3360
  include Enumerable
3312
3361
  end
@@ -3370,8 +3419,19 @@ module HDLRuby::High
3370
3419
  def to_low
3371
3420
  # puts "to_low with base=#{@base} @object=#{@object}"
3372
3421
  # puts "@object.name=#{@object.name}"
3373
- refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3422
+ if @base.is_a?(RefThis) &&
3423
+ (@object.parent != High.top_user) &&
3424
+ (@object.parent != High.cur_system) &&
3425
+ (!@object.parent.name.empty?) then
3426
+ # Need to have a hierachical access.
3427
+ # puts "Indirect access for #{self.object.name}: #{self.object.parent.name}(#{self.object.parent.class}) != #{High.cur_system.name}(#{High.top_user.class})"
3428
+ refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3429
+ @object.parent.to_ref.to_low,@object.name)
3430
+ else
3431
+ # Direct access is enough.
3432
+ refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
3374
3433
  @base.to_ref.to_low,@object.name)
3434
+ end
3375
3435
  # # For debugging: set the source high object
3376
3436
  # refNameL.properties[:low2high] = self.hdr_id
3377
3437
  # self.properties[:high2low] = refNameL
@@ -3801,11 +3861,15 @@ module HDLRuby::High
3801
3861
 
3802
3862
  # Hierarchical type allows access to sub references, so generate
3803
3863
  # the corresponding methods.
3864
+ # For that first get the real type.
3865
+ type = type.def while type.is_a?(TypeDef)
3866
+ # Now process it if it is a structured type.
3804
3867
  if type.struct? then
3805
3868
  type.each_name do |name|
3869
+ sig = SignalI.new(name,type.get_type(name),dir)
3870
+ self.add_signal(sig)
3806
3871
  self.define_singleton_method(name) do
3807
- RefObject.new(self.to_ref,
3808
- SignalI.new(name,type.get_type(name),dir))
3872
+ RefObject.new(self.to_ref,sig)
3809
3873
  end
3810
3874
  end
3811
3875
  end
@@ -3838,17 +3902,41 @@ module HDLRuby::High
3838
3902
 
3839
3903
  # Creates a positive edge event from the signal.
3840
3904
  def posedge
3841
- return Event.new(:posedge,self.to_ref)
3905
+ # return Event.new(:posedge,self.to_ref)
3906
+ # Is there any sub signals?
3907
+ if self.each_signal.any? then
3908
+ # Yes, make events with them instead.
3909
+ return self.each_signal.map { |sig| sig.posedge }
3910
+ else
3911
+ # No, create a single event.
3912
+ return Event.new(:posedge,self.to_ref)
3913
+ end
3842
3914
  end
3843
3915
 
3844
3916
  # Creates a negative edge event from the signal.
3845
3917
  def negedge
3846
- return Event.new(:negedge,self.to_ref)
3918
+ # return Event.new(:negedge,self.to_ref)
3919
+ # Is there any sub signals?
3920
+ if self.each_signal.any? then
3921
+ # Yes, make events with them instead.
3922
+ return self.each_signal.map { |sig| sig.negedge }
3923
+ else
3924
+ # No, create a single event.
3925
+ return Event.new(:negedge,self.to_ref)
3926
+ end
3847
3927
  end
3848
3928
 
3849
3929
  # Creates an edge event from the signal.
3850
- def edge
3851
- return Event.new(:edge,self.to_ref)
3930
+ def anyedge
3931
+ # return Event.new(:edge,self.to_ref)
3932
+ # Is there any sub signals?
3933
+ if self.each_signal.any? then
3934
+ # Yes, make events with them instead.
3935
+ return self.each_signal.map { |sig| sig.anyedge }
3936
+ else
3937
+ # No, create a single event.
3938
+ return Event.new(:anyedge,self.to_ref)
3939
+ end
3852
3940
  end
3853
3941
 
3854
3942
  # Converts to a new reference.
@@ -3871,6 +3959,10 @@ module HDLRuby::High
3871
3959
  # return HDLRuby::Low::SignalI.new(name,self.type.to_low)
3872
3960
  valueL = self.value ? self.value.to_low : nil
3873
3961
  signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low,valueL)
3962
+ # Recurse on the sub signals if any.
3963
+ self.each_signal do |sig|
3964
+ signalIL.add_signal(sig.to_low)
3965
+ end
3874
3966
  # # For debugging: set the source high object
3875
3967
  # signalIL.properties[:low2high] = self.hdr_id
3876
3968
  # self.properties[:high2low] = signalIL
@@ -3937,6 +4029,10 @@ module HDLRuby::High
3937
4029
  # self.value.to_low)
3938
4030
  signalCL = HDLRuby::Low::SignalC.new(name,self.type.to_low,
3939
4031
  self.value.to_low)
4032
+ # Recurse on the sub signals if any.
4033
+ self.each_signal do |sig|
4034
+ signalCL.add_signal(sig.to_low)
4035
+ end
3940
4036
  # # For debugging: set the source high object
3941
4037
  # signalCL.properties[:low2high] = self.hdr_id
3942
4038
  # self.properties[:high2low] = signalCL
@@ -4062,7 +4158,8 @@ module HDLRuby::High
4062
4158
  # +ruby_block+.
4063
4159
  #
4064
4160
  # NOTE: the else part is defined through the helse method.
4065
- def hif(condition, mode = nil, &ruby_block)
4161
+ # def hif(condition, mode = nil, &ruby_block)
4162
+ def hif(condition, mode = self.mode, &ruby_block)
4066
4163
  # Ensure there is a block.
4067
4164
  ruby_block = proc {} unless block_given?
4068
4165
  # Creates the if statement.
@@ -4325,14 +4422,14 @@ module HDLRuby::High
4325
4422
  super(nil)
4326
4423
  # # Save the Location for debugging information
4327
4424
  # @location = caller_locations
4328
- # Sets the current behavior
4329
- @@cur_behavior = self
4330
- # Add the events.
4331
- events.each { |event| self.add_event(event) }
4425
+ # # Sets the current behavior
4426
+ # @@cur_behavior = self
4427
+ # Add the events (they may be hierarchical to flatten)
4428
+ events.flatten.each { |event| self.add_event(event) }
4332
4429
  # Create and add the block.
4333
4430
  self.block = High.make_block(mode,&ruby_block)
4334
- # Unset the current behavior
4335
- @@cur_behavior = nil
4431
+ # # Unset the current behavior
4432
+ # @@cur_behavior = nil
4336
4433
  end
4337
4434
 
4338
4435
  # Sets an event to the behavior.
@@ -4499,12 +4596,21 @@ module HDLRuby::High
4499
4596
  end
4500
4597
  end
4501
4598
 
4502
- # The current behavior: by default none.
4503
- @@cur_behavior = nil
4599
+ # # The current behavior: by default none.
4600
+ # @@cur_behavior = nil
4504
4601
 
4505
4602
  # Gets the enclosing behavior if any.
4506
4603
  def self.cur_behavior
4507
- return @@cur_behavior
4604
+ # return @@cur_behavior
4605
+ if in_behavior? then
4606
+ user = top_user
4607
+ while(user && !user.is_a?(Behavior)) do
4608
+ user = user.parent
4609
+ end
4610
+ return user
4611
+ else
4612
+ return nil
4613
+ end
4508
4614
  end
4509
4615
 
4510
4616
  # Tell if we are in a behavior.
@@ -4680,13 +4786,10 @@ module HDLRuby::High
4680
4786
  return Value.new(TypeSigned.new(:"",self.bit_length..0),self)
4681
4787
  end
4682
4788
  end
4683
- end
4684
-
4685
- # Extends the Float class for computing for conversion to expression.
4686
- class ::Float
4687
- # Converts to a new high-level expression.
4688
- def to_expr
4689
- return Value.new(Float,self)
4789
+
4790
+ # Gets the bit width
4791
+ def width
4792
+ return self.bit_length
4690
4793
  end
4691
4794
  end
4692
4795
 
@@ -4982,19 +5085,21 @@ module HDLRuby::High
4982
5085
  def to_value
4983
5086
  str = self.to_s
4984
5087
  return nil if str[0] != "_" # Bit string are prefixed by "_"
4985
- # Remove the "_" not needed any longer.
4986
- str = str[1..-1]
4987
5088
  # Get and check the type
4988
- type = str[0]
4989
- if type == "0" or type == "1" or type == "z" or type == "Z" then
5089
+ # type = str[0]
5090
+ type = str[1]
5091
+ if ["0", "1", "z", "Z", "o", "d", "h"].include?(type) then
4990
5092
  # Default binary
4991
5093
  type = "b"
4992
5094
  else
4993
5095
  # Not a default type
4994
- str = str[1..-1]
5096
+ # str = str[1..-1]
5097
+ str = str[2..-1]
4995
5098
  end
4996
- return nil if str.empty?
4997
5099
  return nil unless ["b","u","s"].include?(type)
5100
+ # Remove the "_"
5101
+ str = str.delete("_")
5102
+ return nil if str.empty?
4998
5103
  # Get the width if any.
4999
5104
  if str[0].match(/[0-9]/) then
5000
5105
  width = str.scan(/[0-9]*/)[0]
@@ -5,10 +5,11 @@ require "HDLRuby/hruby_high"
5
5
  module HDLRuby::High
6
6
 
7
7
  ##
8
- # Library for describing adding the fullname method to HDLRuby::High objects.
8
+ # Library for adding the fullname method to HDLRuby::High objects.
9
9
  #
10
10
  ########################################################################
11
11
 
12
+
12
13
  class SystemT
13
14
 
14
15
  ## Returns the name of the signal with its hierarchy.
@@ -32,6 +33,7 @@ module HDLRuby::High
32
33
 
33
34
  end
34
35
 
36
+
35
37
  class Scope
36
38
  include WithFullname
37
39
  end