HDLRuby 2.5.0 → 2.6.5

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/HDLRuby/hdr_samples/adder.rb +1 -1
  3. data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
  4. data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
  5. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
  6. data/lib/HDLRuby/hdr_samples/dff_unit.rb +54 -0
  7. data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
  8. data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
  9. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
  10. data/lib/HDLRuby/hdr_samples/multi_timed_bench.rb +54 -0
  11. data/lib/HDLRuby/hdr_samples/music.rb +79 -0
  12. data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
  13. data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
  14. data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
  15. data/lib/HDLRuby/hdrcc.rb +132 -24
  16. data/lib/HDLRuby/hruby_decorator.rb +3 -1
  17. data/lib/HDLRuby/hruby_high.rb +215 -27
  18. data/lib/HDLRuby/hruby_low.rb +402 -45
  19. data/lib/HDLRuby/hruby_low2c.rb +122 -168
  20. data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
  21. data/lib/HDLRuby/hruby_low2high.rb +331 -549
  22. data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
  23. data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
  24. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
  25. data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
  26. data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
  27. data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
  28. data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
  29. data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
  30. data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
  31. data/lib/HDLRuby/hruby_tools.rb +11 -1
  32. data/lib/HDLRuby/hruby_verilog.rb +1572 -1723
  33. data/lib/HDLRuby/sim/hruby_sim.h +29 -3
  34. data/lib/HDLRuby/sim/hruby_sim_calc.c +63 -6
  35. data/lib/HDLRuby/sim/hruby_sim_core.c +24 -9
  36. data/lib/HDLRuby/sim/hruby_sim_vcd.c +7 -3
  37. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
  38. data/lib/HDLRuby/std/fixpoint.rb +9 -0
  39. data/lib/HDLRuby/std/function_generator.rb +139 -0
  40. data/lib/HDLRuby/std/hruby_unit.rb +75 -0
  41. data/lib/HDLRuby/version.rb +1 -1
  42. metadata +16 -5
@@ -46,11 +46,13 @@ module HDLRuby
46
46
  # Iterate over all the id with their object.
47
47
  #
48
48
  # Returns an enumerator if no ruby block is given.
49
+ #
50
+ # NOTE: converts the hash to an array to allow on-the-fly modification.
49
51
  def self.each(&ruby_block)
50
52
  # No ruby block? Return an enumerator.
51
53
  return to_enum(:each) unless ruby_block
52
54
  # A ruby block? Apply it on each object.
53
- @@id_map.each(&ruby_block)
55
+ @@id_map.to_a.each(&ruby_block)
54
56
  end
55
57
 
56
58
  # The decorator also need to add properties to the HDLRuby objects.
@@ -620,8 +620,8 @@ module HDLRuby::High
620
620
  # Extend the instance.
621
621
  instance.eigen_extend(@singleton_instanceO)
622
622
  # puts "instance scope= #{instance.systemT.scope}"
623
- # Add the instance.
624
- High.top_user.send(:add_systemI,instance)
623
+ # Add the instance if instantiating within another system.
624
+ High.top_user.send(:add_systemI,instance) if High.top_user
625
625
 
626
626
  # Execute the post instantiation tasks.
627
627
  eigen.each_on_instance { |task| task.(instance) }
@@ -762,6 +762,7 @@ module HDLRuby::High
762
762
  self.scope.to_low)
763
763
  # For debugging: set the source high object
764
764
  systemTL.properties[:low2high] = self.hdr_id
765
+ self.properties[:high2low] = systemTL
765
766
 
766
767
  # Fills the interface of the new system
767
768
  # from the included systems.
@@ -936,8 +937,19 @@ module HDLRuby::High
936
937
  # Set the namespace for buidling the scope.
937
938
  High.space_push(@namespace)
938
939
  # Build the scope.
939
- @return_value = High.top_user.instance_eval(&ruby_block)
940
+ # @return_value = High.top_user.instance_eval(&ruby_block)
941
+ res = High.top_user.instance_eval(&ruby_block)
940
942
  High.space_pop
943
+ # Now gain access to the result within the sub scope.
944
+ if (res.is_a?(HRef)) then
945
+ @return_value = res.type.inner(HDLRuby.uniq_name)
946
+ High.space_push(@namespace)
947
+ @return_value <= res
948
+ High.space_pop
949
+ else
950
+ @return_value = res
951
+ end
952
+ # This will be the return value.
941
953
  @return_value
942
954
  end
943
955
 
@@ -1298,6 +1310,7 @@ module HDLRuby::High
1298
1310
  scopeL = HDLRuby::Low::Scope.new(self.name)
1299
1311
  # For debugging: set the source high object
1300
1312
  scopeL.properties[:low2high] = self.hdr_id
1313
+ self.properties[:high2low] = scopeL
1301
1314
 
1302
1315
  # Push the private namespace for the low generation.
1303
1316
  High.space_push(@namespace)
@@ -1531,6 +1544,7 @@ module HDLRuby::High
1531
1544
  typeL = HDLRuby::Low::Type.new(name)
1532
1545
  # For debugging: set the source high object
1533
1546
  typeL.properties[:low2high] = self.hdr_id
1547
+ self.properties[:high2low] = typeL
1534
1548
  return typeL
1535
1549
  end
1536
1550
  end
@@ -1616,6 +1630,18 @@ module HDLRuby::High
1616
1630
  include HbasicType
1617
1631
  end
1618
1632
 
1633
+ # The string type
1634
+ StringT = define_type(:string)
1635
+ class << StringT
1636
+ # Converts the type to HDLRuby::Low.
1637
+ def to_low
1638
+ return Low::StringT
1639
+ end
1640
+
1641
+ include HbasicType
1642
+ end
1643
+
1644
+
1619
1645
  # # The infer type.
1620
1646
  # # Unspecified, but automatically infered when connected.
1621
1647
  # Infer = define_type(:infer)
@@ -1672,6 +1698,7 @@ module HDLRuby::High
1672
1698
  typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1673
1699
  # For debugging: set the source high object
1674
1700
  typeDefL.properties[:low2high] = self.hdr_id
1701
+ self.properties[:high2low] = typeDefL
1675
1702
  return typeDefL
1676
1703
  end
1677
1704
  end
@@ -1724,6 +1751,7 @@ module HDLRuby::High
1724
1751
  typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1725
1752
  # For debugging: set the source high object
1726
1753
  typeDefL.properties[:low2high] = self.hdr_id
1754
+ self.properties[:high2low] = typeDefL
1727
1755
  return typeDefL
1728
1756
  end
1729
1757
  end
@@ -1741,6 +1769,7 @@ module HDLRuby::High
1741
1769
  self.range.to_low)
1742
1770
  # For debugging: set the source high object
1743
1771
  typeVectorL.properties[:low2high] = self.hdr_id
1772
+ self.properties[:high2low] = typeVectorL
1744
1773
  return typeVectorL
1745
1774
  end
1746
1775
  end
@@ -1820,6 +1849,7 @@ module HDLRuby::High
1820
1849
  *@types.map { |type| type.to_low } )
1821
1850
  # For debugging: set the source high object
1822
1851
  typeTupleL.properties[:low2high] = self.hdr_id
1852
+ self.properties[:high2low] = typeTupleL
1823
1853
  return typeTupleL
1824
1854
  end
1825
1855
  end
@@ -1840,6 +1870,7 @@ module HDLRuby::High
1840
1870
  @types.map { |name,type| [name,type.to_low] } )
1841
1871
  # For debugging: set the source high object
1842
1872
  typeStructL.properties[:low2high] = self.hdr_id
1873
+ self.properties[:high2low] = typeStructL
1843
1874
  return typeStructL
1844
1875
  end
1845
1876
  end
@@ -2007,7 +2038,8 @@ module HDLRuby::High
2007
2038
  else
2008
2039
  # No, perform a connection is order of declaration
2009
2040
  connects.each.with_index do |csig,i|
2010
- # puts "csig=#{csig.name} i=#{i}"
2041
+ csig = csig.to_expr
2042
+ # puts "csig=#{csig} i=#{i}"
2011
2043
  # puts "systemT inputs=#{systemT.each_input.to_a.size}"
2012
2044
  # Gets i-est signal to connect
2013
2045
  ssig = self.systemT.get_interface_with_included(i)
@@ -2078,6 +2110,7 @@ module HDLRuby::High
2078
2110
  systemTL)
2079
2111
  # For debugging: set the source high object
2080
2112
  systemIL.properties[:low2high] = self.hdr_id
2113
+ self.properties[:high2low] = systemIL
2081
2114
  # Adds the other systemTs.
2082
2115
  self.each_systemT do |systemT|
2083
2116
  systemIL.add_systemT(systemT.to_low) unless systemT == self.systemT
@@ -2105,6 +2138,7 @@ module HDLRuby::High
2105
2138
  end)
2106
2139
  # For debugging: set the source high object
2107
2140
  chunkL.properties[:low2high] = self.hdr_id
2141
+ self.properties[:high2low] = chunkL
2108
2142
  return chunkL
2109
2143
  end
2110
2144
  end
@@ -2118,6 +2152,7 @@ module HDLRuby::High
2118
2152
  codeL = HDLRuby::Low::Code.new
2119
2153
  # For debugging: set the source high object
2120
2154
  codeL.properties[:low2high] = self.hdr_id
2155
+ self.properties[:high2low] = codeL
2121
2156
  # Add the low-level events.
2122
2157
  self.each_event { |event| codeL.add_event(event.to_low) }
2123
2158
  # Add the low-level code chunks.
@@ -2211,6 +2246,7 @@ module HDLRuby::High
2211
2246
  self.each_noif {|cond,block| ifL.add_noif(cond.to_low,block.to_low)}
2212
2247
  # For debugging: set the source high object
2213
2248
  ifL.properties[:low2high] = self.hdr_id
2249
+ self.properties[:high2low] = ifL
2214
2250
  return ifL
2215
2251
  end
2216
2252
  end
@@ -2235,6 +2271,7 @@ module HDLRuby::High
2235
2271
  self.statement.to_low)
2236
2272
  # For debugging: set the source high object
2237
2273
  whenL.properties[:low2high] = self.hdr_id
2274
+ self.properties[:high2low] = whenL
2238
2275
  return whenL
2239
2276
  end
2240
2277
  end
@@ -2282,6 +2319,7 @@ module HDLRuby::High
2282
2319
  caseL = HDLRuby::Low::Case.new(@value.to_low)
2283
2320
  # For debugging: set the source high object
2284
2321
  caseL.properties[:low2high] = self.hdr_id
2322
+ self.properties[:high2low] = caseL
2285
2323
  # Add each when case.
2286
2324
  self.each_when do |w|
2287
2325
  caseL.add_when(w.to_low)
@@ -2312,6 +2350,7 @@ module HDLRuby::High
2312
2350
  delayL = HDLRuby::Low::Delay.new(self.value, self.unit)
2313
2351
  # For debugging: set the source high object
2314
2352
  delayL.properties[:low2high] = self.hdr_id
2353
+ self.properties[:high2low] = delayL
2315
2354
  return delayL
2316
2355
  end
2317
2356
  end
@@ -2327,6 +2366,7 @@ module HDLRuby::High
2327
2366
  timeWaitL = HDLRuby::Low::TimeWait.new(self.delay.to_low)
2328
2367
  # For debugging: set the source high object
2329
2368
  timeWaitL.properties[:low2high] = self.hdr_id
2369
+ self.properties[:high2low] = timeWaitL
2330
2370
  return timeWaitL
2331
2371
  end
2332
2372
  end
@@ -2345,6 +2385,7 @@ module HDLRuby::High
2345
2385
  self.delay.to_low)
2346
2386
  # For debugging: set the source high object
2347
2387
  timeRepeatL.properties[:low2high] = self.hdr_id
2388
+ self.properties[:high2low] = timeRepeatL
2348
2389
  return timeRepeatL
2349
2390
  end
2350
2391
  end
@@ -2493,6 +2534,35 @@ module HDLRuby::High
2493
2534
  return self.ljust(self[-1])
2494
2535
  end
2495
2536
 
2537
+ # Match the type with +typ+:
2538
+ # - Recurse on the sub expr if hierachical type, raising an arror
2539
+ # if the expression is not hierarchical.
2540
+ # - Directly cast otherwise.
2541
+ def match_type(typ)
2542
+ # Has the type sub types?
2543
+ if typ.types? then
2544
+ unless self.is_a?(Concat) then
2545
+ raise AnyError,
2546
+ "Invalid class for assignment to hierarchical: #{self.class}."
2547
+ end
2548
+ return Concat.new(typ,
2549
+ self.each_expression.zip(typ.each_type).map do |e,t|
2550
+ e.match_type(t)
2551
+ end)
2552
+ elsif typ.vector? && typ.base.hierarchical? then
2553
+ unless self.is_a?(Concat) then
2554
+ raise AnyError,
2555
+ "Invalid class for assignment to hierarchical: #{self.class}."
2556
+ end
2557
+ return Concat.new(typ,
2558
+ self.each_expression.map do |e|
2559
+ e.match_type(typ.base)
2560
+ end)
2561
+ else
2562
+ return self.as(typ)
2563
+ end
2564
+ end
2565
+
2496
2566
  # Gets the origin method for operation +op+.
2497
2567
  def self.orig_operator(op)
2498
2568
  return (op.to_s + "_orig").to_sym
@@ -2641,14 +2711,19 @@ module HDLRuby::High
2641
2711
  #
2642
2712
  # NOTE: it is converted afterward to an expression if required.
2643
2713
  def <=(expr)
2714
+ # Cast expr to self if required.
2715
+ expr = expr.to_expr.match_type(self.type)
2716
+ # Generate the transmit.
2644
2717
  if High.top_user.is_a?(HDLRuby::Low::Block) then
2645
2718
  # We are in a block, so generate and add a Transmit.
2646
2719
  High.top_user.
2647
- add_statement(Transmit.new(self.to_ref,expr.to_expr))
2720
+ # add_statement(Transmit.new(self.to_ref,expr.to_expr))
2721
+ add_statement(Transmit.new(self.to_ref,expr))
2648
2722
  else
2649
2723
  # We are in a system type, so generate and add a Connection.
2650
2724
  High.top_user.
2651
- add_connection(Connection.new(self.to_ref,expr.to_expr))
2725
+ # add_connection(Connection.new(self.to_ref,expr.to_expr))
2726
+ add_connection(Connection.new(self.to_ref,expr))
2652
2727
  end
2653
2728
  end
2654
2729
  end
@@ -2670,6 +2745,7 @@ module HDLRuby::High
2670
2745
  castL =HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
2671
2746
  # For debugging: set the source high object
2672
2747
  castL.properties[:low2high] = self.hdr_id
2748
+ self.properties[:high2low] = castL
2673
2749
  return castL
2674
2750
  end
2675
2751
  end
@@ -2693,6 +2769,7 @@ module HDLRuby::High
2693
2769
  self.child.to_low)
2694
2770
  # For debugging: set the source high object
2695
2771
  unaryL.properties[:low2high] = self.hdr_id
2772
+ self.properties[:high2low] = unaryL
2696
2773
  return unaryL
2697
2774
  end
2698
2775
  end
@@ -2717,6 +2794,7 @@ module HDLRuby::High
2717
2794
  self.left.to_low, self.right.to_low)
2718
2795
  # For debugging: set the source high object
2719
2796
  binaryL.properties[:low2high] = self.hdr_id
2797
+ self.properties[:high2low] = binaryL
2720
2798
  return binaryL
2721
2799
  end
2722
2800
  end
@@ -2751,6 +2829,7 @@ module HDLRuby::High
2751
2829
  end)
2752
2830
  # For debugging: set the source high object
2753
2831
  selectL.properties[:low2high] = self.hdr_id
2832
+ self.properties[:high2low] = selectL
2754
2833
  return selectL
2755
2834
  end
2756
2835
  end
@@ -2784,6 +2863,7 @@ module HDLRuby::High
2784
2863
  )
2785
2864
  # For debugging: set the source high object
2786
2865
  concatL.properties[:low2high] = self.hdr_id
2866
+ self.properties[:high2low] = concatL
2787
2867
  return concatL
2788
2868
  end
2789
2869
  end
@@ -2827,6 +2907,7 @@ module HDLRuby::High
2827
2907
  valueL = HDLRuby::Low::Value.new(self.type.to_low,self.content)
2828
2908
  # For debugging: set the source high object
2829
2909
  valueL.properties[:low2high] = self.hdr_id
2910
+ self.properties[:high2low] = valueL
2830
2911
  return valueL
2831
2912
  end
2832
2913
 
@@ -2929,12 +3010,12 @@ module HDLRuby::High
2929
3010
 
2930
3011
  # Converts the name reference to a HDLRuby::Low::RefName.
2931
3012
  def to_low
2932
- # return HDLRuby::Low::RefName.new(self.type.to_low,
2933
- # @base.to_ref.to_low,@object.name)
3013
+ # puts "to_low with base=#{@base} @object=#{@object}"
2934
3014
  refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
2935
3015
  @base.to_ref.to_low,@object.name)
2936
3016
  # For debugging: set the source high object
2937
3017
  refNameL.properties[:low2high] = self.hdr_id
3018
+ self.properties[:high2low] = refNameL
2938
3019
  return refNameL
2939
3020
  end
2940
3021
 
@@ -2974,6 +3055,7 @@ module HDLRuby::High
2974
3055
  )
2975
3056
  # For debugging: set the source high object
2976
3057
  refConcatL.properties[:low2high] = self.hdr_id
3058
+ self.properties[:high2low] = refConcatL
2977
3059
  return refConcatL
2978
3060
  end
2979
3061
  end
@@ -2997,6 +3079,7 @@ module HDLRuby::High
2997
3079
  self.ref.to_low,self.index.to_low)
2998
3080
  # For debugging: set the source high object
2999
3081
  refIndexL.properties[:low2high] = self.hdr_id
3082
+ self.properties[:high2low] = refIndexL
3000
3083
  return refIndexL
3001
3084
  end
3002
3085
  end
@@ -3020,6 +3103,7 @@ module HDLRuby::High
3020
3103
  self.ref.to_low,self.range.to_low)
3021
3104
  # For debugging: set the source high object
3022
3105
  refRangeL.properties[:low2high] = self.hdr_id
3106
+ self.properties[:high2low] = refRangeL
3023
3107
  return refRangeL
3024
3108
  end
3025
3109
  end
@@ -3031,7 +3115,7 @@ module HDLRuby::High
3031
3115
 
3032
3116
  # Converts to a new reference.
3033
3117
  def to_ref
3034
- return RefName.new(self.ref.to_ref,self.name)
3118
+ return RefName.new(self.type,self.ref.to_ref,self.name)
3035
3119
  end
3036
3120
 
3037
3121
  # Converts the name reference to HDLRuby::Low.
@@ -3042,6 +3126,7 @@ module HDLRuby::High
3042
3126
  self.ref.to_low,self.name)
3043
3127
  # For debugging: set the source high object
3044
3128
  refNameL.properties[:low2high] = self.hdr_id
3129
+ self.properties[:high2low] = refNameL
3045
3130
  return refNameL
3046
3131
  end
3047
3132
  end
@@ -3078,14 +3163,49 @@ module HDLRuby::High
3078
3163
  refThisL = HDLRuby::Low::RefThis.new
3079
3164
  # For debugging: set the source high object
3080
3165
  refThisL.properties[:low2high] = self.hdr_id
3166
+ self.properties[:high2low] = refThisL
3081
3167
  return refThisL
3082
3168
  end
3083
3169
  end
3084
3170
 
3171
+ ##
3172
+ # Describes a string.
3173
+ #
3174
+ # NOTE: This is not synthesizable!
3175
+ class StringE < Low::StringE
3176
+ include HExpression
3177
+
3178
+ # Converts to an expression.
3179
+ def to_expr
3180
+ return StringE.new(self.content,*self.each_arg.map(&:to_expr))
3181
+ end
3182
+
3183
+ # Converts the connection to HDLRuby::Low.
3184
+ def to_low
3185
+ return HDLRuby::Low::StringE.new(self.content,
3186
+ *self.each_arg.map(&:to_low))
3187
+ end
3188
+ end
3189
+
3190
+
3191
+
3192
+
3193
+ # Sets the current this to +obj+.
3194
+ #
3195
+ # NOTE: do not use a this= style to avoid confusion.
3196
+ def set_this(obj = proc { RefThis.new })
3197
+ if (obj.is_a?(Proc)) then
3198
+ @@this = obj
3199
+ else
3200
+ @@this = proc { RefObject.new(RefThis.new,obj) }
3201
+ end
3202
+ end
3203
+
3085
3204
 
3086
3205
  # Gives access to the *this* reference.
3087
3206
  def this
3088
- RefThis.new
3207
+ # RefThis.new
3208
+ @@this.call
3089
3209
  end
3090
3210
 
3091
3211
 
@@ -3116,6 +3236,7 @@ module HDLRuby::High
3116
3236
  eventL = HDLRuby::Low::Event.new(self.type,self.ref.to_low)
3117
3237
  # For debugging: set the source high object
3118
3238
  eventL.properties[:low2high] = self.hdr_id
3239
+ self.properties[:high2low] = eventL
3119
3240
  return eventL
3120
3241
  end
3121
3242
  end
@@ -3158,10 +3279,33 @@ module HDLRuby::High
3158
3279
  self.right.to_low)
3159
3280
  # For debugging: set the source high object
3160
3281
  transmitL.properties[:low2high] = self.hdr_id
3282
+ self.properties[:high2low] = transmitL
3161
3283
  return transmitL
3162
3284
  end
3163
3285
  end
3164
3286
 
3287
+
3288
+ ##
3289
+ # Describes a print statement: not synthesizable!
3290
+ class Print < Low::Print
3291
+ High = HDLRuby::High
3292
+
3293
+ include HStatement
3294
+
3295
+ # Creates a new statement for printing +args+.
3296
+ def initialize(*args)
3297
+ # Process the arguments.
3298
+ super(*args.map(&:to_expr))
3299
+ end
3300
+
3301
+ # Converts the connection to HDLRuby::Low.
3302
+ def to_low
3303
+ return HDLRuby::Low::Print.new(*self.each_arg.map(&:to_low))
3304
+ end
3305
+
3306
+ end
3307
+
3308
+
3165
3309
  ##
3166
3310
  # Describes a connection.
3167
3311
  class Connection < Low::Connection
@@ -3228,6 +3372,7 @@ module HDLRuby::High
3228
3372
  self.right.to_low)
3229
3373
  # For debugging: set the source high object
3230
3374
  connectionL.properties[:low2high] = self.hdr_id
3375
+ self.properties[:high2low] = connectionL
3231
3376
  return connectionL
3232
3377
  end
3233
3378
  end
@@ -3258,7 +3403,7 @@ module HDLRuby::High
3258
3403
  # NOTE: +dir+ can be :input, :output, :inout or :inner
3259
3404
  def initialize(name,type,dir,value = nil)
3260
3405
  # Check the value.
3261
- value = value.to_expr if value
3406
+ value = value.to_expr.match_type(type) if value
3262
3407
  # Initialize the type structure.
3263
3408
  super(name,type,value)
3264
3409
 
@@ -3341,6 +3486,7 @@ module HDLRuby::High
3341
3486
  signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low)
3342
3487
  # For debugging: set the source high object
3343
3488
  signalIL.properties[:low2high] = self.hdr_id
3489
+ self.properties[:high2low] = signalIL
3344
3490
  return signalIL
3345
3491
  end
3346
3492
  end
@@ -3357,7 +3503,7 @@ module HDLRuby::High
3357
3503
  # and +value+.
3358
3504
  def initialize(name,type,value)
3359
3505
  # Check the value is a constant.
3360
- value = value.to_expr
3506
+ value = value.to_expr.match_type(type)
3361
3507
  unless value.constant? then
3362
3508
  raise AnyError,"Non-constant value assignment to constant."
3363
3509
  end
@@ -3406,6 +3552,7 @@ module HDLRuby::High
3406
3552
  self.value.to_low)
3407
3553
  # For debugging: set the source high object
3408
3554
  signalCL.properties[:low2high] = self.hdr_id
3555
+ self.properties[:high2low] = signalCL
3409
3556
  return signalCL
3410
3557
  end
3411
3558
  end
@@ -3479,13 +3626,6 @@ module HDLRuby::High
3479
3626
  # Use its return value.
3480
3627
  return block.return_value
3481
3628
  end
3482
-
3483
- # # Get the current mode of the block.
3484
- # #
3485
- # # NOTE: for name coherency purpose only.
3486
- # def block
3487
- # return self.mode
3488
- # end
3489
3629
 
3490
3630
  # Gets the current block.
3491
3631
  def cur_block
@@ -3583,6 +3723,12 @@ module HDLRuby::High
3583
3723
  end
3584
3724
  statement.hwhen(match, mode, &ruby_block)
3585
3725
  end
3726
+
3727
+
3728
+ # Prints.
3729
+ def hprint(*args)
3730
+ self.add_statement(Print.new(*args))
3731
+ end
3586
3732
  end
3587
3733
 
3588
3734
 
@@ -3619,6 +3765,7 @@ module HDLRuby::High
3619
3765
  blockL = HDLRuby::Low::Block.new(self.mode)
3620
3766
  # For debugging: set the source high object
3621
3767
  blockL.properties[:low2high] = self.hdr_id
3768
+ self.properties[:high2low] = blockL
3622
3769
  # Push the namespace for the low generation.
3623
3770
  High.space_push(@namespace)
3624
3771
  # Pushes on the name stack for converting the internals of
@@ -3688,6 +3835,7 @@ module HDLRuby::High
3688
3835
  blockL = HDLRuby::Low::TimeBlock.new(self.mode)
3689
3836
  # For debugging: set the source high object
3690
3837
  blockL.properties[:low2high] = self.hdr_id
3838
+ self.properties[:high2low] = blockL
3691
3839
  # Add the inner signals
3692
3840
  self.each_inner { |inner| blockL.add_inner(inner.to_low) }
3693
3841
  # Add the statements
@@ -3781,6 +3929,7 @@ module HDLRuby::High
3781
3929
  behaviorL = HDLRuby::Low::Behavior.new(blockL)
3782
3930
  # For debugging: set the source high object
3783
3931
  behaviorL.properties[:low2high] = self.hdr_id
3932
+ self.properties[:high2low] = behaviorL
3784
3933
  eventLs.each(&behaviorL.method(:add_event))
3785
3934
  return behaviorL
3786
3935
  end
@@ -3810,7 +3959,8 @@ module HDLRuby::High
3810
3959
  timeBehaviorL = HDLRuby::Low::TimeBehavior.new(blockL)
3811
3960
  # For debugging: set the source high object
3812
3961
  timeBehaviorL.properties[:low2high] = self.hdr_id
3813
- eventLs.each(&behaviorL.method(:add_event))
3962
+ self.properties[:high2low] = timeBehaviorL
3963
+ eventLs.each(&timeBehaviorL.method(:add_event))
3814
3964
  return timeBehaviorL
3815
3965
  end
3816
3966
  end
@@ -4116,13 +4266,40 @@ module HDLRuby::High
4116
4266
 
4117
4267
  # Extends the String class for computing conversion to expression.
4118
4268
  class ::String
4119
- # Converts to a new high-level expression.
4120
- def to_expr
4269
+ # # Converts to a new high-level expression.
4270
+ # def to_expr
4271
+ # # Convert the string to a bit string.
4272
+ # bstr = BitString.new(self)
4273
+ # # Use it to create the new value.
4274
+ # return Value.new(Bit[bstr.width],self)
4275
+ # end
4276
+
4277
+ # Converts to a new high-level value.
4278
+ def to_value
4121
4279
  # Convert the string to a bit string.
4122
4280
  bstr = BitString.new(self)
4123
4281
  # Use it to create the new value.
4124
4282
  return Value.new(Bit[bstr.width],self)
4125
4283
  end
4284
+
4285
+ # Convert to a new high-level string expression
4286
+ def to_expr
4287
+ return StringE.new(self)
4288
+ end
4289
+
4290
+ # For now deactivated, needs rethinking.
4291
+ # # Rework format to generate HDLRuby string.
4292
+ # alias_method :__format_old__, :%
4293
+ # def %(args)
4294
+ # # Is there any HW argument?
4295
+ # if args.any? { |arg| arg.is_a?(HDLRuby::Low::Hparent) } then
4296
+ # # Yes generate a HDLRuby string.
4297
+ # return StringE.new(self,*args)
4298
+ # else
4299
+ # # No process the format normally.
4300
+ # self.__format_old__(args)
4301
+ # end
4302
+ # end
4126
4303
  end
4127
4304
 
4128
4305
 
@@ -4216,11 +4393,14 @@ module HDLRuby::High
4216
4393
 
4217
4394
  # Converts to a new high-level expression.
4218
4395
  def to_expr
4219
- # expr = Concat.new
4220
- expr = Concat.new(TypeTuple.new(:"",:little,*self.map do |elem|
4221
- elem.to_expr.type
4222
- end))
4223
- self.each {|elem| expr.add_expression(elem.to_expr) }
4396
+ # expr = Concat.new(TypeTuple.new(:"",:little,*self.map do |elem|
4397
+ # elem.to_expr.type
4398
+ # end))
4399
+ elems = self.map {|elem| elem.to_expr }
4400
+ typ= TypeTuple.new(:"",:little)
4401
+ elems.each {|elem| typ.add_type(elem.type) }
4402
+ expr = Concat.new(typ)
4403
+ elems.each {|elem| expr.add_expression(elem) }
4224
4404
  expr
4225
4405
  end
4226
4406
 
@@ -4291,6 +4471,11 @@ module HDLRuby::High
4291
4471
  end
4292
4472
  end
4293
4473
 
4474
+ # Add support of the left arrow operator.
4475
+ def <=(expr)
4476
+ self.to_expr <= expr
4477
+ end
4478
+
4294
4479
  # Array construction shortcuts
4295
4480
 
4296
4481
  # Create an array whose number of elements is given by the content
@@ -4583,6 +4768,9 @@ def self.configure_high
4583
4768
  end
4584
4769
  end
4585
4770
 
4771
+ # Initialize the this.
4772
+ set_this
4773
+
4586
4774
  # Generate the standard signals
4587
4775
  $clk = Universe.scope.inner :__universe__clk__
4588
4776
  $rst = Universe.scope.inner :__universe__rst__