HDLRuby 2.5.1 → 2.6.8

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 (46) 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/comparison_bench.rb +40 -0
  6. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
  7. data/lib/HDLRuby/hdr_samples/dff_unit.rb +3 -3
  8. data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
  9. data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
  10. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
  11. data/lib/HDLRuby/hdr_samples/multi_timed_bench.rb +54 -0
  12. data/lib/HDLRuby/hdr_samples/music.rb +79 -0
  13. data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
  14. data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
  15. data/lib/HDLRuby/hdr_samples/type_minmax_bench.rb +37 -0
  16. data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
  17. data/lib/HDLRuby/hdr_samples/with_to_array.rb +29 -0
  18. data/lib/HDLRuby/hdrcc.rb +69 -9
  19. data/lib/HDLRuby/hruby_decorator.rb +3 -1
  20. data/lib/HDLRuby/hruby_high.rb +220 -29
  21. data/lib/HDLRuby/hruby_low.rb +433 -45
  22. data/lib/HDLRuby/hruby_low2c.rb +122 -168
  23. data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
  24. data/lib/HDLRuby/hruby_low2high.rb +331 -549
  25. data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
  26. data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
  27. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
  28. data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
  29. data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
  30. data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
  31. data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
  32. data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
  33. data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
  34. data/lib/HDLRuby/hruby_tools.rb +11 -1
  35. data/lib/HDLRuby/hruby_verilog.rb +1572 -1723
  36. data/lib/HDLRuby/sim/hruby_sim.h +45 -5
  37. data/lib/HDLRuby/sim/hruby_sim_calc.c +192 -20
  38. data/lib/HDLRuby/sim/hruby_sim_core.c +24 -9
  39. data/lib/HDLRuby/sim/hruby_sim_vcd.c +7 -3
  40. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
  41. data/lib/HDLRuby/std/fixpoint.rb +9 -0
  42. data/lib/HDLRuby/std/function_generator.rb +139 -0
  43. data/lib/HDLRuby/std/hruby_unit.rb +75 -0
  44. data/lib/HDLRuby/version.rb +1 -1
  45. metadata +18 -6
  46. data/lib/HDLRuby/hruby_unit.rb +0 -43
@@ -0,0 +1,29 @@
1
+
2
+ def connect8(i0,i1,i2,i3,i4,i5,i6,i7,
3
+ o0,o1,o2,o3,o4,o5,o6,o7)
4
+ o0 <= i0
5
+ o1 <= i1
6
+ o2 <= i2
7
+ o3 <= i3
8
+ o4 <= i4
9
+ o5 <= i5
10
+ o6 <= i6
11
+ o7 <= i7
12
+ end
13
+
14
+ # A benchmark for testing the conversion to ruby array of expressions.
15
+ system :with_to_bench do
16
+ [8].inner :val
17
+ inner :b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7
18
+
19
+ connect8(*val,b0,b1,b2,b3,b4,b5,b6,b7)
20
+
21
+ timed do
22
+ val <= _01101010
23
+ !10.ns
24
+ val <= _01011010
25
+ !10.ns
26
+ val <= _00001111
27
+ !10.ns
28
+ end
29
+ end
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -5,7 +5,7 @@ require 'tempfile'
5
5
  require 'HDLRuby'
6
6
  require 'HDLRuby/hruby_check.rb'
7
7
  # require 'ripper'
8
- require 'HDLRuby/hruby_low2high'
8
+ require 'HDLRuby/hruby_low2hdr'
9
9
  require 'HDLRuby/hruby_low2c'
10
10
  require 'HDLRuby/hruby_low2vhd'
11
11
  require 'HDLRuby/hruby_low_fix_types'
@@ -252,6 +252,20 @@ module HDLRuby
252
252
 
253
253
  end
254
254
 
255
+ # Locate an executable from cmd.
256
+ def which(cmd)
257
+ # Get the possible exetensions (for windows case).
258
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
259
+ # Look for the command within the executable paths.
260
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
261
+ exts.each do |ext|
262
+ exe = File.join(path, "#{cmd}#{ext}")
263
+ return exe if File.executable?(exe) && !File.directory?(exe)
264
+ end
265
+ end
266
+ nil
267
+ end
268
+
255
269
 
256
270
 
257
271
  if __FILE__ == $0 then
@@ -337,9 +351,12 @@ $optparse = OptionParser.new do |opts|
337
351
  opts.on("-D", "--debug","Set the HDLRuby debug mode") do |d|
338
352
  $options[:debug] = d
339
353
  end
340
- opts.on("-T","--test","Compile the unit tests.") do |t|
354
+ opts.on("-T","--test t0,t1,t2","Compile the unit tests named t0,t1,...") do |t|
341
355
  $options[:test] = t
342
356
  end
357
+ opts.on("--testall","Compile all the available unit tests.") do |t|
358
+ $options[:testall] = t
359
+ end
343
360
  opts.on("-t", "--top system", "Specify the top system to process") do|t|
344
361
  $options[:top] = t
345
362
  end
@@ -350,6 +367,10 @@ $optparse = OptionParser.new do |opts|
350
367
  $options[:dump] = v
351
368
  $options[:multiple] = v
352
369
  end
370
+ opts.on("--version", "Shows the version of HDLRuby.") do |v|
371
+ puts VERSION
372
+ exit
373
+ end
353
374
  # opts.on_tail("-h", "--help", "Show this message") do
354
375
  opts.on("-h", "--help", "Show this message") do
355
376
  puts opts
@@ -400,14 +421,23 @@ if $input == nil then
400
421
  exit
401
422
  end
402
423
 
403
- if ($options[:test]) then
424
+ if ($options[:test] || $options[:testall]) then
404
425
  $top = "__test__"
426
+ tests = $options[:test]
427
+ if tests then
428
+ tests = tests.to_s.split(",")
429
+ tests.map! {|test| ":\"#{test}\"" }
430
+ tests = ", #{tests.join(",")}"
431
+ else
432
+ tests = ""
433
+ end
405
434
  # Generate the unit test file.
406
435
  $test_file = Tempfile.new('tester.rb',Dir.getwd)
407
- $test_file.write("require 'hruby_unit.rb'\nrequire_relative '#{$input}'\n\n" +
408
- "HDLRuby::Unit.test(\"#{$top}\")\n")
436
+ $test_file.write("require 'std/hruby_unit.rb'\nrequire_relative '#{$input}'\n\n" +
437
+ "HDLRuby::Unit.test(:\"#{$top}\"#{tests})\n")
409
438
  # $test_file.rewind
410
439
  # puts $test_file.read
440
+ # exit
411
441
  $test_file.rewind
412
442
  # It is the new input file.
413
443
  $input = $test_file
@@ -425,7 +455,7 @@ if $output then
425
455
  $output = File.open($output,"w")
426
456
  end
427
457
  else
428
- if $option[:multiple] then
458
+ if $options[:multiple] then
429
459
  raise "Need a target directory in multiple files generation mode."
430
460
  end
431
461
  $output = $stdout
@@ -463,6 +493,24 @@ end
463
493
  # Get the top systemT.
464
494
  $top_system = $top_instance.to_low.systemT
465
495
 
496
+
497
+ # Apply the pre drivers if any.
498
+ Hdecorator.each_with_property(:pre_driver) do |obj, value|
499
+ unless value.is_a?(Array) && value.size == 2 then
500
+ raise "pre_driver requires a driver file name command name."
501
+ end
502
+ # Load the driver.
503
+ require_relative(value[0].to_s)
504
+ # Ensure obj is the low version.
505
+ if obj.properties.key?(:high2low) then
506
+ # obj is high, get the corresponding low.
507
+ obj = obj.properties[:high2low][0]
508
+ end
509
+ # Execute it.
510
+ send(value[1].to_sym,obj,*value[2..-1])
511
+ end
512
+
513
+
466
514
  # Gather the non-HDLRuby code.
467
515
  $non_hdlruby = []
468
516
  $top_system.each_systemT_deep do |systemT|
@@ -504,7 +552,7 @@ elsif $options[:hdr] then
504
552
  # $output << systemT.to_high
505
553
  # end
506
554
  # $output << $top_instance.to_low.systemT.to_high
507
- $output << $top_system.to_high
555
+ $output << $top_system.to_hdr
508
556
  elsif $options[:clang] then
509
557
  # top_system = $top_instance.to_low.systemT
510
558
  # top_system = $top_system
@@ -589,6 +637,7 @@ elsif $options[:clang] then
589
637
  name = $output + "/" +
590
638
  HDLRuby::Low::Low2C.c_name(systemT.name) +
591
639
  ".c"
640
+ # puts "for systemT=#{systemT.name} generating: #{name}"
592
641
  # Open the file for current systemT
593
642
  outfile = File.open(name,"w")
594
643
  # Generate the C code in to.
@@ -621,8 +670,19 @@ elsif $options[:clang] then
621
670
  end
622
671
  end
623
672
  Dir.chdir($output)
624
- # Kernel.system("make -s")
625
- Kernel.system("cc -o3 -o hruby_simulator *.c -lpthread")
673
+ # Find the compiler.
674
+ cc_cmd = which('cc')
675
+ unless cc_cmd then
676
+ cc_cmd = which('gcc')
677
+ end
678
+ unless cc_cmd then
679
+ raise "Could not find any compiler, please compile by hand as follows:\n" +
680
+ " In folder #{$output} execute:\n" +
681
+ " <my compiler> -o hruby_simulator *.c -lpthread\n" +
682
+ " Then execute:\n hruby_simulator"
683
+ end
684
+ # Use it.
685
+ Kernel.system("#{cc_cmd} -o3 -o hruby_simulator *.c -lpthread")
626
686
  Kernel.system("./hruby_simulator")
627
687
  end
628
688
  elsif $options[:verilog] then
@@ -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.
@@ -609,7 +609,8 @@ module HDLRuby::High
609
609
  # possible arguments +args+.
610
610
  def instantiate(i_name,*args)
611
611
  # Create the eigen type.
612
- eigen = self.expand(High.names_create(i_name.to_s + ":T"), *args)
612
+ # eigen = self.expand(High.names_create(i_name.to_s + ":T"), *args)
613
+ eigen = self.expand(HDLRuby.uniq_name(i_name.to_s + ":T"), *args)
613
614
 
614
615
  # Create the instance and sets its eigen system to +eigen+.
615
616
  instance = @instance_class.new(i_name,eigen)
@@ -620,8 +621,8 @@ module HDLRuby::High
620
621
  # Extend the instance.
621
622
  instance.eigen_extend(@singleton_instanceO)
622
623
  # puts "instance scope= #{instance.systemT.scope}"
623
- # Add the instance.
624
- High.top_user.send(:add_systemI,instance)
624
+ # Add the instance if instantiating within another system.
625
+ High.top_user.send(:add_systemI,instance) if High.top_user
625
626
 
626
627
  # Execute the post instantiation tasks.
627
628
  eigen.each_on_instance { |task| task.(instance) }
@@ -758,10 +759,13 @@ module HDLRuby::High
758
759
  "Cannot convert a system without a name to HDLRuby::Low."
759
760
  end
760
761
  # Create the resulting low system type.
761
- systemTL = HDLRuby::Low::SystemT.new(High.names_create(name),
762
+ # systemTL = HDLRuby::Low::SystemT.new(High.names_create(name),
763
+ systemTL = HDLRuby::Low::SystemT.new(HDLRuby.uniq_name(name),
762
764
  self.scope.to_low)
765
+ # puts "New low from system #{self.name}: #{systemTL.name}"
763
766
  # For debugging: set the source high object
764
767
  systemTL.properties[:low2high] = self.hdr_id
768
+ self.properties[:high2low] = systemTL
765
769
 
766
770
  # Fills the interface of the new system
767
771
  # from the included systems.
@@ -936,8 +940,19 @@ module HDLRuby::High
936
940
  # Set the namespace for buidling the scope.
937
941
  High.space_push(@namespace)
938
942
  # Build the scope.
939
- @return_value = High.top_user.instance_eval(&ruby_block)
943
+ # @return_value = High.top_user.instance_eval(&ruby_block)
944
+ res = High.top_user.instance_eval(&ruby_block)
940
945
  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
955
+ # This will be the return value.
941
956
  @return_value
942
957
  end
943
958
 
@@ -1298,6 +1313,7 @@ module HDLRuby::High
1298
1313
  scopeL = HDLRuby::Low::Scope.new(self.name)
1299
1314
  # For debugging: set the source high object
1300
1315
  scopeL.properties[:low2high] = self.hdr_id
1316
+ self.properties[:high2low] = scopeL
1301
1317
 
1302
1318
  # Push the private namespace for the low generation.
1303
1319
  High.space_push(@namespace)
@@ -1531,6 +1547,7 @@ module HDLRuby::High
1531
1547
  typeL = HDLRuby::Low::Type.new(name)
1532
1548
  # For debugging: set the source high object
1533
1549
  typeL.properties[:low2high] = self.hdr_id
1550
+ self.properties[:high2low] = typeL
1534
1551
  return typeL
1535
1552
  end
1536
1553
  end
@@ -1616,6 +1633,18 @@ module HDLRuby::High
1616
1633
  include HbasicType
1617
1634
  end
1618
1635
 
1636
+ # The string type
1637
+ StringT = define_type(:string)
1638
+ class << StringT
1639
+ # Converts the type to HDLRuby::Low.
1640
+ def to_low
1641
+ return Low::StringT
1642
+ end
1643
+
1644
+ include HbasicType
1645
+ end
1646
+
1647
+
1619
1648
  # # The infer type.
1620
1649
  # # Unspecified, but automatically infered when connected.
1621
1650
  # Infer = define_type(:infer)
@@ -1672,6 +1701,7 @@ module HDLRuby::High
1672
1701
  typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1673
1702
  # For debugging: set the source high object
1674
1703
  typeDefL.properties[:low2high] = self.hdr_id
1704
+ self.properties[:high2low] = typeDefL
1675
1705
  return typeDefL
1676
1706
  end
1677
1707
  end
@@ -1724,6 +1754,7 @@ module HDLRuby::High
1724
1754
  typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1725
1755
  # For debugging: set the source high object
1726
1756
  typeDefL.properties[:low2high] = self.hdr_id
1757
+ self.properties[:high2low] = typeDefL
1727
1758
  return typeDefL
1728
1759
  end
1729
1760
  end
@@ -1741,6 +1772,7 @@ module HDLRuby::High
1741
1772
  self.range.to_low)
1742
1773
  # For debugging: set the source high object
1743
1774
  typeVectorL.properties[:low2high] = self.hdr_id
1775
+ self.properties[:high2low] = typeVectorL
1744
1776
  return typeVectorL
1745
1777
  end
1746
1778
  end
@@ -1820,6 +1852,7 @@ module HDLRuby::High
1820
1852
  *@types.map { |type| type.to_low } )
1821
1853
  # For debugging: set the source high object
1822
1854
  typeTupleL.properties[:low2high] = self.hdr_id
1855
+ self.properties[:high2low] = typeTupleL
1823
1856
  return typeTupleL
1824
1857
  end
1825
1858
  end
@@ -1840,6 +1873,7 @@ module HDLRuby::High
1840
1873
  @types.map { |name,type| [name,type.to_low] } )
1841
1874
  # For debugging: set the source high object
1842
1875
  typeStructL.properties[:low2high] = self.hdr_id
1876
+ self.properties[:high2low] = typeStructL
1843
1877
  return typeStructL
1844
1878
  end
1845
1879
  end
@@ -2007,7 +2041,8 @@ module HDLRuby::High
2007
2041
  else
2008
2042
  # No, perform a connection is order of declaration
2009
2043
  connects.each.with_index do |csig,i|
2010
- # puts "csig=#{csig.name} i=#{i}"
2044
+ csig = csig.to_expr
2045
+ # puts "csig=#{csig} i=#{i}"
2011
2046
  # puts "systemT inputs=#{systemT.each_input.to_a.size}"
2012
2047
  # Gets i-est signal to connect
2013
2048
  ssig = self.systemT.get_interface_with_included(i)
@@ -2078,6 +2113,7 @@ module HDLRuby::High
2078
2113
  systemTL)
2079
2114
  # For debugging: set the source high object
2080
2115
  systemIL.properties[:low2high] = self.hdr_id
2116
+ self.properties[:high2low] = systemIL
2081
2117
  # Adds the other systemTs.
2082
2118
  self.each_systemT do |systemT|
2083
2119
  systemIL.add_systemT(systemT.to_low) unless systemT == self.systemT
@@ -2105,6 +2141,7 @@ module HDLRuby::High
2105
2141
  end)
2106
2142
  # For debugging: set the source high object
2107
2143
  chunkL.properties[:low2high] = self.hdr_id
2144
+ self.properties[:high2low] = chunkL
2108
2145
  return chunkL
2109
2146
  end
2110
2147
  end
@@ -2118,6 +2155,7 @@ module HDLRuby::High
2118
2155
  codeL = HDLRuby::Low::Code.new
2119
2156
  # For debugging: set the source high object
2120
2157
  codeL.properties[:low2high] = self.hdr_id
2158
+ self.properties[:high2low] = codeL
2121
2159
  # Add the low-level events.
2122
2160
  self.each_event { |event| codeL.add_event(event.to_low) }
2123
2161
  # Add the low-level code chunks.
@@ -2211,6 +2249,7 @@ module HDLRuby::High
2211
2249
  self.each_noif {|cond,block| ifL.add_noif(cond.to_low,block.to_low)}
2212
2250
  # For debugging: set the source high object
2213
2251
  ifL.properties[:low2high] = self.hdr_id
2252
+ self.properties[:high2low] = ifL
2214
2253
  return ifL
2215
2254
  end
2216
2255
  end
@@ -2235,6 +2274,7 @@ module HDLRuby::High
2235
2274
  self.statement.to_low)
2236
2275
  # For debugging: set the source high object
2237
2276
  whenL.properties[:low2high] = self.hdr_id
2277
+ self.properties[:high2low] = whenL
2238
2278
  return whenL
2239
2279
  end
2240
2280
  end
@@ -2282,6 +2322,7 @@ module HDLRuby::High
2282
2322
  caseL = HDLRuby::Low::Case.new(@value.to_low)
2283
2323
  # For debugging: set the source high object
2284
2324
  caseL.properties[:low2high] = self.hdr_id
2325
+ self.properties[:high2low] = caseL
2285
2326
  # Add each when case.
2286
2327
  self.each_when do |w|
2287
2328
  caseL.add_when(w.to_low)
@@ -2312,6 +2353,7 @@ module HDLRuby::High
2312
2353
  delayL = HDLRuby::Low::Delay.new(self.value, self.unit)
2313
2354
  # For debugging: set the source high object
2314
2355
  delayL.properties[:low2high] = self.hdr_id
2356
+ self.properties[:high2low] = delayL
2315
2357
  return delayL
2316
2358
  end
2317
2359
  end
@@ -2327,6 +2369,7 @@ module HDLRuby::High
2327
2369
  timeWaitL = HDLRuby::Low::TimeWait.new(self.delay.to_low)
2328
2370
  # For debugging: set the source high object
2329
2371
  timeWaitL.properties[:low2high] = self.hdr_id
2372
+ self.properties[:high2low] = timeWaitL
2330
2373
  return timeWaitL
2331
2374
  end
2332
2375
  end
@@ -2345,6 +2388,7 @@ module HDLRuby::High
2345
2388
  self.delay.to_low)
2346
2389
  # For debugging: set the source high object
2347
2390
  timeRepeatL.properties[:low2high] = self.hdr_id
2391
+ self.properties[:high2low] = timeRepeatL
2348
2392
  return timeRepeatL
2349
2393
  end
2350
2394
  end
@@ -2493,6 +2537,35 @@ module HDLRuby::High
2493
2537
  return self.ljust(self[-1])
2494
2538
  end
2495
2539
 
2540
+ # Match the type with +typ+:
2541
+ # - Recurse on the sub expr if hierachical type, raising an arror
2542
+ # if the expression is not hierarchical.
2543
+ # - Directly cast otherwise.
2544
+ def match_type(typ)
2545
+ # Has the type sub types?
2546
+ if typ.types? then
2547
+ unless self.is_a?(Concat) then
2548
+ raise AnyError,
2549
+ "Invalid class for assignment to hierarchical: #{self.class}."
2550
+ end
2551
+ return Concat.new(typ,
2552
+ self.each_expression.zip(typ.each_type).map do |e,t|
2553
+ e.match_type(t)
2554
+ end)
2555
+ elsif typ.vector? && typ.base.hierarchical? then
2556
+ unless self.is_a?(Concat) then
2557
+ raise AnyError,
2558
+ "Invalid class for assignment to hierarchical: #{self.class}."
2559
+ end
2560
+ return Concat.new(typ,
2561
+ self.each_expression.map do |e|
2562
+ e.match_type(typ.base)
2563
+ end)
2564
+ else
2565
+ return self.as(typ)
2566
+ end
2567
+ end
2568
+
2496
2569
  # Gets the origin method for operation +op+.
2497
2570
  def self.orig_operator(op)
2498
2571
  return (op.to_s + "_orig").to_sym
@@ -2585,7 +2658,6 @@ module HDLRuby::High
2585
2658
  end
2586
2659
  end
2587
2660
 
2588
-
2589
2661
  # Converts to a select operator using current expression as
2590
2662
  # condition for one of the +choices+.
2591
2663
  #
@@ -2601,6 +2673,7 @@ module HDLRuby::High
2601
2673
  end
2602
2674
 
2603
2675
 
2676
+
2604
2677
  # Methods for conversion for HDLRuby::Low: type processing, flattening
2605
2678
  # and so on
2606
2679
 
@@ -2641,14 +2714,19 @@ module HDLRuby::High
2641
2714
  #
2642
2715
  # NOTE: it is converted afterward to an expression if required.
2643
2716
  def <=(expr)
2717
+ # Cast expr to self if required.
2718
+ expr = expr.to_expr.match_type(self.type)
2719
+ # Generate the transmit.
2644
2720
  if High.top_user.is_a?(HDLRuby::Low::Block) then
2645
2721
  # We are in a block, so generate and add a Transmit.
2646
2722
  High.top_user.
2647
- add_statement(Transmit.new(self.to_ref,expr.to_expr))
2723
+ # add_statement(Transmit.new(self.to_ref,expr.to_expr))
2724
+ add_statement(Transmit.new(self.to_ref,expr))
2648
2725
  else
2649
2726
  # We are in a system type, so generate and add a Connection.
2650
2727
  High.top_user.
2651
- add_connection(Connection.new(self.to_ref,expr.to_expr))
2728
+ # add_connection(Connection.new(self.to_ref,expr.to_expr))
2729
+ add_connection(Connection.new(self.to_ref,expr))
2652
2730
  end
2653
2731
  end
2654
2732
  end
@@ -2670,6 +2748,7 @@ module HDLRuby::High
2670
2748
  castL =HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
2671
2749
  # For debugging: set the source high object
2672
2750
  castL.properties[:low2high] = self.hdr_id
2751
+ self.properties[:high2low] = castL
2673
2752
  return castL
2674
2753
  end
2675
2754
  end
@@ -2693,6 +2772,7 @@ module HDLRuby::High
2693
2772
  self.child.to_low)
2694
2773
  # For debugging: set the source high object
2695
2774
  unaryL.properties[:low2high] = self.hdr_id
2775
+ self.properties[:high2low] = unaryL
2696
2776
  return unaryL
2697
2777
  end
2698
2778
  end
@@ -2717,6 +2797,7 @@ module HDLRuby::High
2717
2797
  self.left.to_low, self.right.to_low)
2718
2798
  # For debugging: set the source high object
2719
2799
  binaryL.properties[:low2high] = self.hdr_id
2800
+ self.properties[:high2low] = binaryL
2720
2801
  return binaryL
2721
2802
  end
2722
2803
  end
@@ -2751,6 +2832,7 @@ module HDLRuby::High
2751
2832
  end)
2752
2833
  # For debugging: set the source high object
2753
2834
  selectL.properties[:low2high] = self.hdr_id
2835
+ self.properties[:high2low] = selectL
2754
2836
  return selectL
2755
2837
  end
2756
2838
  end
@@ -2784,6 +2866,7 @@ module HDLRuby::High
2784
2866
  )
2785
2867
  # For debugging: set the source high object
2786
2868
  concatL.properties[:low2high] = self.hdr_id
2869
+ self.properties[:high2low] = concatL
2787
2870
  return concatL
2788
2871
  end
2789
2872
  end
@@ -2827,6 +2910,7 @@ module HDLRuby::High
2827
2910
  valueL = HDLRuby::Low::Value.new(self.type.to_low,self.content)
2828
2911
  # For debugging: set the source high object
2829
2912
  valueL.properties[:low2high] = self.hdr_id
2913
+ self.properties[:high2low] = valueL
2830
2914
  return valueL
2831
2915
  end
2832
2916
 
@@ -2929,12 +3013,12 @@ module HDLRuby::High
2929
3013
 
2930
3014
  # Converts the name reference to a HDLRuby::Low::RefName.
2931
3015
  def to_low
2932
- # return HDLRuby::Low::RefName.new(self.type.to_low,
2933
- # @base.to_ref.to_low,@object.name)
3016
+ # puts "to_low with base=#{@base} @object=#{@object}"
2934
3017
  refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
2935
3018
  @base.to_ref.to_low,@object.name)
2936
3019
  # For debugging: set the source high object
2937
3020
  refNameL.properties[:low2high] = self.hdr_id
3021
+ self.properties[:high2low] = refNameL
2938
3022
  return refNameL
2939
3023
  end
2940
3024
 
@@ -2974,6 +3058,7 @@ module HDLRuby::High
2974
3058
  )
2975
3059
  # For debugging: set the source high object
2976
3060
  refConcatL.properties[:low2high] = self.hdr_id
3061
+ self.properties[:high2low] = refConcatL
2977
3062
  return refConcatL
2978
3063
  end
2979
3064
  end
@@ -2997,6 +3082,7 @@ module HDLRuby::High
2997
3082
  self.ref.to_low,self.index.to_low)
2998
3083
  # For debugging: set the source high object
2999
3084
  refIndexL.properties[:low2high] = self.hdr_id
3085
+ self.properties[:high2low] = refIndexL
3000
3086
  return refIndexL
3001
3087
  end
3002
3088
  end
@@ -3020,6 +3106,7 @@ module HDLRuby::High
3020
3106
  self.ref.to_low,self.range.to_low)
3021
3107
  # For debugging: set the source high object
3022
3108
  refRangeL.properties[:low2high] = self.hdr_id
3109
+ self.properties[:high2low] = refRangeL
3023
3110
  return refRangeL
3024
3111
  end
3025
3112
  end
@@ -3031,7 +3118,7 @@ module HDLRuby::High
3031
3118
 
3032
3119
  # Converts to a new reference.
3033
3120
  def to_ref
3034
- return RefName.new(self.ref.to_ref,self.name)
3121
+ return RefName.new(self.type,self.ref.to_ref,self.name)
3035
3122
  end
3036
3123
 
3037
3124
  # Converts the name reference to HDLRuby::Low.
@@ -3042,6 +3129,7 @@ module HDLRuby::High
3042
3129
  self.ref.to_low,self.name)
3043
3130
  # For debugging: set the source high object
3044
3131
  refNameL.properties[:low2high] = self.hdr_id
3132
+ self.properties[:high2low] = refNameL
3045
3133
  return refNameL
3046
3134
  end
3047
3135
  end
@@ -3078,14 +3166,49 @@ module HDLRuby::High
3078
3166
  refThisL = HDLRuby::Low::RefThis.new
3079
3167
  # For debugging: set the source high object
3080
3168
  refThisL.properties[:low2high] = self.hdr_id
3169
+ self.properties[:high2low] = refThisL
3081
3170
  return refThisL
3082
3171
  end
3083
3172
  end
3084
3173
 
3174
+ ##
3175
+ # Describes a string.
3176
+ #
3177
+ # NOTE: This is not synthesizable!
3178
+ class StringE < Low::StringE
3179
+ include HExpression
3180
+
3181
+ # Converts to an expression.
3182
+ def to_expr
3183
+ return StringE.new(self.content,*self.each_arg.map(&:to_expr))
3184
+ end
3185
+
3186
+ # Converts the connection to HDLRuby::Low.
3187
+ def to_low
3188
+ return HDLRuby::Low::StringE.new(self.content,
3189
+ *self.each_arg.map(&:to_low))
3190
+ end
3191
+ end
3192
+
3193
+
3194
+
3195
+
3196
+ # Sets the current this to +obj+.
3197
+ #
3198
+ # NOTE: do not use a this= style to avoid confusion.
3199
+ def set_this(obj = proc { RefThis.new })
3200
+ if (obj.is_a?(Proc)) then
3201
+ @@this = obj
3202
+ else
3203
+ @@this = proc { RefObject.new(RefThis.new,obj) }
3204
+ end
3205
+ end
3206
+
3085
3207
 
3086
3208
  # Gives access to the *this* reference.
3087
3209
  def this
3088
- RefThis.new
3210
+ # RefThis.new
3211
+ @@this.call
3089
3212
  end
3090
3213
 
3091
3214
 
@@ -3116,6 +3239,7 @@ module HDLRuby::High
3116
3239
  eventL = HDLRuby::Low::Event.new(self.type,self.ref.to_low)
3117
3240
  # For debugging: set the source high object
3118
3241
  eventL.properties[:low2high] = self.hdr_id
3242
+ self.properties[:high2low] = eventL
3119
3243
  return eventL
3120
3244
  end
3121
3245
  end
@@ -3158,10 +3282,33 @@ module HDLRuby::High
3158
3282
  self.right.to_low)
3159
3283
  # For debugging: set the source high object
3160
3284
  transmitL.properties[:low2high] = self.hdr_id
3285
+ self.properties[:high2low] = transmitL
3161
3286
  return transmitL
3162
3287
  end
3163
3288
  end
3164
3289
 
3290
+
3291
+ ##
3292
+ # Describes a print statement: not synthesizable!
3293
+ class Print < Low::Print
3294
+ High = HDLRuby::High
3295
+
3296
+ include HStatement
3297
+
3298
+ # Creates a new statement for printing +args+.
3299
+ def initialize(*args)
3300
+ # Process the arguments.
3301
+ super(*args.map(&:to_expr))
3302
+ end
3303
+
3304
+ # Converts the connection to HDLRuby::Low.
3305
+ def to_low
3306
+ return HDLRuby::Low::Print.new(*self.each_arg.map(&:to_low))
3307
+ end
3308
+
3309
+ end
3310
+
3311
+
3165
3312
  ##
3166
3313
  # Describes a connection.
3167
3314
  class Connection < Low::Connection
@@ -3228,6 +3375,7 @@ module HDLRuby::High
3228
3375
  self.right.to_low)
3229
3376
  # For debugging: set the source high object
3230
3377
  connectionL.properties[:low2high] = self.hdr_id
3378
+ self.properties[:high2low] = connectionL
3231
3379
  return connectionL
3232
3380
  end
3233
3381
  end
@@ -3258,7 +3406,7 @@ module HDLRuby::High
3258
3406
  # NOTE: +dir+ can be :input, :output, :inout or :inner
3259
3407
  def initialize(name,type,dir,value = nil)
3260
3408
  # Check the value.
3261
- value = value.to_expr if value
3409
+ value = value.to_expr.match_type(type) if value
3262
3410
  # Initialize the type structure.
3263
3411
  super(name,type,value)
3264
3412
 
@@ -3341,6 +3489,7 @@ module HDLRuby::High
3341
3489
  signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low)
3342
3490
  # For debugging: set the source high object
3343
3491
  signalIL.properties[:low2high] = self.hdr_id
3492
+ self.properties[:high2low] = signalIL
3344
3493
  return signalIL
3345
3494
  end
3346
3495
  end
@@ -3357,7 +3506,7 @@ module HDLRuby::High
3357
3506
  # and +value+.
3358
3507
  def initialize(name,type,value)
3359
3508
  # Check the value is a constant.
3360
- value = value.to_expr
3509
+ value = value.to_expr.match_type(type)
3361
3510
  unless value.constant? then
3362
3511
  raise AnyError,"Non-constant value assignment to constant."
3363
3512
  end
@@ -3406,6 +3555,7 @@ module HDLRuby::High
3406
3555
  self.value.to_low)
3407
3556
  # For debugging: set the source high object
3408
3557
  signalCL.properties[:low2high] = self.hdr_id
3558
+ self.properties[:high2low] = signalCL
3409
3559
  return signalCL
3410
3560
  end
3411
3561
  end
@@ -3479,13 +3629,6 @@ module HDLRuby::High
3479
3629
  # Use its return value.
3480
3630
  return block.return_value
3481
3631
  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
3632
 
3490
3633
  # Gets the current block.
3491
3634
  def cur_block
@@ -3583,6 +3726,12 @@ module HDLRuby::High
3583
3726
  end
3584
3727
  statement.hwhen(match, mode, &ruby_block)
3585
3728
  end
3729
+
3730
+
3731
+ # Prints.
3732
+ def hprint(*args)
3733
+ self.add_statement(Print.new(*args))
3734
+ end
3586
3735
  end
3587
3736
 
3588
3737
 
@@ -3619,6 +3768,7 @@ module HDLRuby::High
3619
3768
  blockL = HDLRuby::Low::Block.new(self.mode)
3620
3769
  # For debugging: set the source high object
3621
3770
  blockL.properties[:low2high] = self.hdr_id
3771
+ self.properties[:high2low] = blockL
3622
3772
  # Push the namespace for the low generation.
3623
3773
  High.space_push(@namespace)
3624
3774
  # Pushes on the name stack for converting the internals of
@@ -3688,6 +3838,7 @@ module HDLRuby::High
3688
3838
  blockL = HDLRuby::Low::TimeBlock.new(self.mode)
3689
3839
  # For debugging: set the source high object
3690
3840
  blockL.properties[:low2high] = self.hdr_id
3841
+ self.properties[:high2low] = blockL
3691
3842
  # Add the inner signals
3692
3843
  self.each_inner { |inner| blockL.add_inner(inner.to_low) }
3693
3844
  # Add the statements
@@ -3781,6 +3932,7 @@ module HDLRuby::High
3781
3932
  behaviorL = HDLRuby::Low::Behavior.new(blockL)
3782
3933
  # For debugging: set the source high object
3783
3934
  behaviorL.properties[:low2high] = self.hdr_id
3935
+ self.properties[:high2low] = behaviorL
3784
3936
  eventLs.each(&behaviorL.method(:add_event))
3785
3937
  return behaviorL
3786
3938
  end
@@ -3810,6 +3962,7 @@ module HDLRuby::High
3810
3962
  timeBehaviorL = HDLRuby::Low::TimeBehavior.new(blockL)
3811
3963
  # For debugging: set the source high object
3812
3964
  timeBehaviorL.properties[:low2high] = self.hdr_id
3965
+ self.properties[:high2low] = timeBehaviorL
3813
3966
  eventLs.each(&timeBehaviorL.method(:add_event))
3814
3967
  return timeBehaviorL
3815
3968
  end
@@ -4116,13 +4269,40 @@ module HDLRuby::High
4116
4269
 
4117
4270
  # Extends the String class for computing conversion to expression.
4118
4271
  class ::String
4119
- # Converts to a new high-level expression.
4120
- def to_expr
4272
+ # # Converts to a new high-level expression.
4273
+ # def to_expr
4274
+ # # Convert the string to a bit string.
4275
+ # bstr = BitString.new(self)
4276
+ # # Use it to create the new value.
4277
+ # return Value.new(Bit[bstr.width],self)
4278
+ # end
4279
+
4280
+ # Converts to a new high-level value.
4281
+ def to_value
4121
4282
  # Convert the string to a bit string.
4122
4283
  bstr = BitString.new(self)
4123
4284
  # Use it to create the new value.
4124
4285
  return Value.new(Bit[bstr.width],self)
4125
4286
  end
4287
+
4288
+ # Convert to a new high-level string expression
4289
+ def to_expr
4290
+ return StringE.new(self)
4291
+ end
4292
+
4293
+ # For now deactivated, needs rethinking.
4294
+ # # Rework format to generate HDLRuby string.
4295
+ # alias_method :__format_old__, :%
4296
+ # def %(args)
4297
+ # # Is there any HW argument?
4298
+ # if args.any? { |arg| arg.is_a?(HDLRuby::Low::Hparent) } then
4299
+ # # Yes generate a HDLRuby string.
4300
+ # return StringE.new(self,*args)
4301
+ # else
4302
+ # # No process the format normally.
4303
+ # self.__format_old__(args)
4304
+ # end
4305
+ # end
4126
4306
  end
4127
4307
 
4128
4308
 
@@ -4216,11 +4396,14 @@ module HDLRuby::High
4216
4396
 
4217
4397
  # Converts to a new high-level expression.
4218
4398
  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) }
4399
+ # expr = Concat.new(TypeTuple.new(:"",:little,*self.map do |elem|
4400
+ # elem.to_expr.type
4401
+ # end))
4402
+ elems = self.map {|elem| elem.to_expr }
4403
+ typ= TypeTuple.new(:"",:little)
4404
+ elems.each {|elem| typ.add_type(elem.type) }
4405
+ expr = Concat.new(typ)
4406
+ elems.each {|elem| expr.add_expression(elem) }
4224
4407
  expr
4225
4408
  end
4226
4409
 
@@ -4291,6 +4474,11 @@ module HDLRuby::High
4291
4474
  end
4292
4475
  end
4293
4476
 
4477
+ # Add support of the left arrow operator.
4478
+ def <=(expr)
4479
+ self.to_expr <= expr
4480
+ end
4481
+
4294
4482
  # Array construction shortcuts
4295
4483
 
4296
4484
  # Create an array whose number of elements is given by the content
@@ -4583,6 +4771,9 @@ def self.configure_high
4583
4771
  end
4584
4772
  end
4585
4773
 
4774
+ # Initialize the this.
4775
+ set_this
4776
+
4586
4777
  # Generate the standard signals
4587
4778
  $clk = Universe.scope.inner :__universe__clk__
4588
4779
  $rst = Universe.scope.inner :__universe__rst__