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
@@ -850,6 +850,7 @@ module HDLRuby::Low
850
850
 
851
851
  # Adds inner signal +signal+.
852
852
  def add_inner(signal)
853
+ # puts "adding inner signal: #{signal.name}(#{signal})"
853
854
  # Check and add the signal.
854
855
  unless signal.is_a?(SignalI)
855
856
  raise AnyError,
@@ -1632,6 +1633,112 @@ module HDLRuby::Low
1632
1633
 
1633
1634
  alias_method :each_deep, :each_type_deep
1634
1635
 
1636
+ # Tells if the type signed.
1637
+ def signed?
1638
+ return @def.signed?
1639
+ end
1640
+
1641
+ # Tells if the type is unsigned.
1642
+ def unsigned?
1643
+ return @def.unsigned?
1644
+ end
1645
+
1646
+ # Tells if the type is fixed point.
1647
+ def fixed?
1648
+ return @def.fixed?
1649
+ end
1650
+
1651
+ # Tells if the type is floating point.
1652
+ def float?
1653
+ return @def.float?
1654
+ end
1655
+
1656
+ # Tells if the type is a leaf.
1657
+ def leaf?
1658
+ return @def.leaf?
1659
+ end
1660
+
1661
+ # Tells if the type of of vector kind.
1662
+ def vector?
1663
+ return @def.vector?
1664
+ end
1665
+
1666
+ # Gets the bitwidth of the type, by default 0.
1667
+ # Bit, signed, unsigned and Float base have a width of 1.
1668
+ def width
1669
+ return @def.width
1670
+ end
1671
+
1672
+ # Gets the type max value if any.
1673
+ # Default: not defined.
1674
+ def max
1675
+ return @def.max
1676
+ end
1677
+
1678
+ # Gets the type min value if any.
1679
+ # Default: not defined.
1680
+ def min
1681
+ return @def.min
1682
+ end
1683
+
1684
+ # Get the direction of the type, little or big endian.
1685
+ def direction
1686
+ return @def.direction
1687
+ end
1688
+
1689
+ # Tells if the type has a range.
1690
+ def range?
1691
+ return @def.range?
1692
+ end
1693
+
1694
+ # Gets the range of the type, by default range is not defined.
1695
+ def range
1696
+ return @def.range
1697
+ end
1698
+
1699
+ # Tells if the type has a base.
1700
+ def base?
1701
+ return @def.base?
1702
+ end
1703
+
1704
+ # Gets the base type, by default base type is not defined.
1705
+ def base
1706
+ return @def.base
1707
+ end
1708
+
1709
+ # Tells if the type has sub types.
1710
+ def types?
1711
+ return @def.types?
1712
+ end
1713
+
1714
+ # Tells if the type is regular (applies for tuples).
1715
+ def regular?
1716
+ return @def.regular?
1717
+ end
1718
+
1719
+ # Tells if the type has named sub types.
1720
+ def struct?
1721
+ return @def.struct?
1722
+ end
1723
+
1724
+ # Tells if the type is hierarchical.
1725
+ def hierarchical?
1726
+ return @def.hierarchical?
1727
+ end
1728
+
1729
+ # Tell if +type+ is equivalent to current type.
1730
+ #
1731
+ # NOTE: type can be compatible while not being equivalent, please
1732
+ # refer to `hruby_types.rb` for type compatibility.
1733
+ def equivalent?(type)
1734
+ return @def.equivalent?(type)
1735
+ end
1736
+
1737
+ # Converts to a bit vector.
1738
+ def to_vector
1739
+ return @def.to_vector
1740
+ end
1741
+
1635
1742
  end
1636
1743
 
1637
1744
 
@@ -1812,7 +1919,7 @@ module HDLRuby::Low
1812
1919
  end
1813
1920
 
1814
1921
  ##
1815
- # Describes a unsigned integer data type.
1922
+ # Describes an unsigned integer data type.
1816
1923
  class TypeUnsigned < TypeVector
1817
1924
 
1818
1925
  # Creates a new vector type named +name+ from +base+ type and with
@@ -1925,7 +2032,7 @@ module HDLRuby::Low
1925
2032
  def each(&ruby_block)
1926
2033
  # No ruby block? Return an enumerator.
1927
2034
  return to_enum(:each) unless ruby_block
1928
- # A ruby block? Apply it on each input signal instance.
2035
+ # A ruby block? Apply it on each sub name/type pair.
1929
2036
  @types.each(&ruby_block)
1930
2037
  end
1931
2038
 
@@ -1935,7 +2042,7 @@ module HDLRuby::Low
1935
2042
  def each_type(&ruby_block)
1936
2043
  # No ruby block? Return an enumerator.
1937
2044
  return to_enum(:each_type) unless ruby_block
1938
- # A ruby block? Apply it on each input signal instance.
2045
+ # A ruby block? Apply it on each sub type.
1939
2046
  @types.each(&ruby_block)
1940
2047
  end
1941
2048
 
@@ -2021,16 +2128,18 @@ module HDLRuby::Low
2021
2128
  ##
2022
2129
  # Describes a structure type.
2023
2130
  class TypeStruct < Type
2024
- # Creates a new structure type named +name+ with +direction+ and
2131
+ attr_reader :direction
2132
+
2133
+ # Creates a new structure type named +name+ with direction +dir+ and
2025
2134
  # whose hierachy is given by +content+.
2026
- def initialize(name,direction,content)
2135
+ def initialize(name,dir,content)
2027
2136
  # Initialize the type.
2028
2137
  super(name)
2029
2138
 
2030
2139
  # Set the direction.
2031
- @direction = direction.to_sym
2140
+ @direction = dir.to_sym
2032
2141
  unless [:little, :big].include?(@direction)
2033
- raise AnyError, "Invalid direction for a type: #{direction}"
2142
+ raise AnyError, "Invalid direction for a type: #{dir}"
2034
2143
  end
2035
2144
 
2036
2145
  # Check and set the content.
@@ -2046,7 +2155,8 @@ module HDLRuby::Low
2046
2155
  # Comparison for hash: structural comparison.
2047
2156
  def eql?(obj)
2048
2157
  # General type comparison.
2049
- return false unless super(obj)
2158
+ # return false unless super(obj)
2159
+ return false unless obj.is_a?(TypeStruct)
2050
2160
  # Specific comparison.
2051
2161
  idx = 0
2052
2162
  obj.each_key do |name|
@@ -2078,8 +2188,13 @@ module HDLRuby::Low
2078
2188
  end
2079
2189
 
2080
2190
  # Gets a sub type by +name+.
2191
+ # NOTE: +name+ can also be an index.
2081
2192
  def get_type(name)
2082
- return @types[name.to_sym]
2193
+ if name.respond_to?(:to_sym) then
2194
+ return @types[name.to_sym]
2195
+ else
2196
+ return @types.values[name.to_i]
2197
+ end
2083
2198
  end
2084
2199
 
2085
2200
  # Iterates over the sub name/type pair.
@@ -2088,7 +2203,7 @@ module HDLRuby::Low
2088
2203
  def each(&ruby_block)
2089
2204
  # No ruby block? Return an enumerator.
2090
2205
  return to_enum(:each) unless ruby_block
2091
- # A ruby block? Apply it on each input signal instance.
2206
+ # A ruby block? Apply it on each sub name/type pair.
2092
2207
  @types.each(&ruby_block)
2093
2208
  end
2094
2209
 
@@ -2098,17 +2213,27 @@ module HDLRuby::Low
2098
2213
  def each_type(&ruby_block)
2099
2214
  # No ruby block? Return an enumerator.
2100
2215
  return to_enum(:each_type) unless ruby_block
2101
- # A ruby block? Apply it on each input signal instance.
2216
+ # A ruby block? Apply it on each sub type.
2102
2217
  @types.each_value(&ruby_block)
2103
2218
  end
2104
2219
 
2220
+ # Iterates over the keys.
2221
+ #
2222
+ # Returns an enumerator if no ruby block is given.
2223
+ def each_key(&ruby_block)
2224
+ # No ruby block? Return an enumerator.
2225
+ return to_enum(:each_key) unless ruby_block
2226
+ # A ruby block? Apply it on each key.
2227
+ @types.each_key(&ruby_block)
2228
+ end
2229
+
2105
2230
  # Iterates over the sub type names.
2106
2231
  #
2107
2232
  # Returns an enumerator if no ruby block is given.
2108
2233
  def each_name(&ruby_block)
2109
2234
  # No ruby block? Return an enumerator.
2110
2235
  return to_enum(:each_name) unless ruby_block
2111
- # A ruby block? Apply it on each input signal instance.
2236
+ # A ruby block? Apply it on each name.
2112
2237
  @types.each_key(&ruby_block)
2113
2238
  end
2114
2239
 
@@ -2128,7 +2253,11 @@ module HDLRuby::Low
2128
2253
  #
2129
2254
  # NOTE: must be redefined for specific types.
2130
2255
  def width
2131
- return @types.reduce(0) {|sum,type| sum + type.width }
2256
+ if @types.is_a?(Array) then
2257
+ return @types.reduce(0) {|sum,type| sum + type.width }
2258
+ else
2259
+ return @types.each_value.reduce(0) {|sum,type| sum + type.width }
2260
+ end
2132
2261
  end
2133
2262
 
2134
2263
  # # Checks the compatibility with +type+
@@ -2506,8 +2635,9 @@ module HDLRuby::Low
2506
2635
  end
2507
2636
  @value = val
2508
2637
  val.parent = self
2509
- else
2510
- @value = nil
2638
+ # For memory optimization: no initialization if not used.
2639
+ # else
2640
+ # @value = nil
2511
2641
  end
2512
2642
  end
2513
2643
 
@@ -2517,6 +2647,40 @@ module HDLRuby::Low
2517
2647
  false
2518
2648
  end
2519
2649
 
2650
+ # Adds sub signal +sig+
2651
+ def add_signal(sig)
2652
+ # puts "add sub=#{sig.name} in signal=#{self}"
2653
+ # Sets the hash of sub signals if none.
2654
+ @signals = HashName.new unless @signals
2655
+ # Check and add the signal.
2656
+ unless sig.is_a?(SignalI)
2657
+ raise AnyError,
2658
+ "Invalid class for a signal instance: #{sig.class}"
2659
+ end
2660
+ # if @signals.include?(sig) then
2661
+ # raise AnyError, "SignalI #{sig.name} already present."
2662
+ # end
2663
+ # Set its parent.
2664
+ sig.parent = self
2665
+ # And add it
2666
+ @signals.add(sig)
2667
+ end
2668
+
2669
+ # Gets a sub signal by name.
2670
+ def get_signal(name)
2671
+ return @signals ? @signals[name] : nil
2672
+ end
2673
+
2674
+ # Iterates over the sub signals.
2675
+ #
2676
+ # Returns an enumerator if no ruby block is given.
2677
+ def each_signal(&ruby_block)
2678
+ # No ruby block? Return an enumerator.
2679
+ return to_enum(:each_signal) unless ruby_block
2680
+ # A ruby block? Apply it on each sub signal instance if any.
2681
+ @signals.each(&ruby_block) if @signals
2682
+ end
2683
+
2520
2684
  # # Add decorator capability (modifies intialize to put after).
2521
2685
  # include Hdecorator
2522
2686
 
@@ -4717,8 +4881,15 @@ module HDLRuby::Low
4717
4881
  content.is_a?(HDLRuby::BitString)
4718
4882
  # content = HDLRuby::BitString.new(content.to_s)
4719
4883
  content = content.to_s
4720
- if self.type.unsigned? && content[0] != 0 then
4721
- content = "0" + content.rjust(self.type.width,content[0])
4884
+ if self.type.unsigned? && content[0] != "0" then
4885
+ # content = "0" + content.rjust(self.type.width,content[0])
4886
+ if content[0] == "1" then
4887
+ # Do not extend the 1, but 0 instead.
4888
+ content = "0" + content.rjust(self.type.width,"0")
4889
+ else
4890
+ # But extend the other.
4891
+ content = "0" + content.rjust(self.type.width,content[0])
4892
+ end
4722
4893
  end
4723
4894
  content = HDLRuby::BitString.new(content)
4724
4895
  end
@@ -5946,7 +6117,7 @@ module HDLRuby::Low
5946
6117
 
5947
6118
 
5948
6119
  ##
5949
- # Describe a this reference.
6120
+ # Describes a this reference.
5950
6121
  #
5951
6122
  # This is the current system.
5952
6123
  class RefThis < Ref