HDLRuby 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/HDLRuby.gemspec +1 -0
  3. data/README.md +10 -0
  4. data/ext/hruby_sim/hruby_rcsim_build.c +2 -0
  5. data/ext/hruby_sim/hruby_sim_calc.c +33 -6
  6. data/ext/hruby_sim/hruby_sim_tree_calc.c +111 -22
  7. data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
  8. data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
  9. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
  10. data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
  11. data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
  12. data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
  13. data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
  14. data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
  15. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
  16. data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
  17. data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
  18. data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
  19. data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
  20. data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
  21. data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
  22. data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
  23. data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
  24. data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
  25. data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
  26. data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
  27. data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
  28. data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
  29. data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
  30. data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
  31. data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
  32. data/lib/HDLRuby/hdr_samples/with_sequencer.rb +17 -0
  33. data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
  34. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +10 -0
  35. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +18 -4
  36. data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
  37. data/lib/HDLRuby/hdrcc.rb +12 -0
  38. data/lib/HDLRuby/hruby_high.rb +82 -26
  39. data/lib/HDLRuby/hruby_low.rb +127 -3
  40. data/lib/HDLRuby/hruby_low2programs.rb +47 -0
  41. data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
  42. data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
  43. data/lib/HDLRuby/hruby_low_without_subsignals.rb +1 -1
  44. data/lib/HDLRuby/hruby_rcsim.rb +24 -1
  45. data/lib/HDLRuby/hruby_serializer.rb +2 -1
  46. data/lib/HDLRuby/hruby_verilog.rb +94 -20
  47. data/lib/HDLRuby/hruby_verilog_name.rb +3 -17
  48. data/lib/HDLRuby/std/fixpoint.rb +2 -2
  49. data/lib/HDLRuby/std/function_generator.rb +1 -1
  50. data/lib/HDLRuby/std/linear.rb +7 -7
  51. data/lib/HDLRuby/std/sequencer.rb +263 -13
  52. data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
  53. data/lib/HDLRuby/std/sequencer_func.rb +28 -15
  54. data/lib/HDLRuby/std/std.rb +1 -0
  55. data/lib/HDLRuby/version.rb +1 -1
  56. metadata +22 -3
@@ -79,6 +79,24 @@ module HDLRuby::Low
79
79
  end
80
80
  return res
81
81
  end
82
+
83
+ # Get an absolute reference to the object.
84
+ def absolute_ref
85
+ # Get the full hierarchy up to the object.
86
+ path = self.hierarchy
87
+ # Create the reference.
88
+ # return path.reduce(RefThis.new) do |ref,node|
89
+ return path.reverse_each.reduce(RefThis.new) do |ref,node|
90
+ # puts "node=#{node}"
91
+ # puts "name=#{node.name}" if node.respond_to?(:name)
92
+ if node.respond_to?(:name) then
93
+ typ = node.respond_to?(:type) ? node.type : void
94
+ RefName.new(typ,ref,node.name)
95
+ else
96
+ ref
97
+ end
98
+ end
99
+ end
82
100
  end
83
101
 
84
102
 
@@ -98,7 +116,8 @@ module HDLRuby::Low
98
116
  attr_reader :scope
99
117
 
100
118
  # Creates a new system type named +name+ with +scope+.
101
- def initialize(name,scope)
119
+ # def initialize(name,scope)
120
+ def initialize(name,scope = nil)
102
121
  # Set the name as a symbol.
103
122
  @name = name.to_sym
104
123
 
@@ -109,6 +128,13 @@ module HDLRuby::Low
109
128
  @interface = [] # The interface signals in order of
110
129
  # declaration
111
130
 
131
+ # self.set_scope(scope) if scope
132
+ # end
133
+
134
+ # # Set the scope of the systemT to +scope+.
135
+ # # Note: cannot override an existing scope.
136
+ # def set_scope(scope)
137
+ # raise(AnyError,"Scope already present") if @scope
112
138
  # Check the scope
113
139
  unless scope.is_a?(Scope)
114
140
  raise AnyError,
@@ -313,7 +339,7 @@ module HDLRuby::Low
313
339
  # Returns an enumerator if no ruby block is given.
314
340
  def each_signal_all(&ruby_block)
315
341
  # No ruby block? Return an enumerator.
316
- return to_enum(:each_signal) unless ruby_block
342
+ return to_enum(:each_signal_all) unless ruby_block
317
343
  # A ruby block? Apply it on each signal instance.
318
344
  @inputs.each(&ruby_block)
319
345
  @outputs.each(&ruby_block)
@@ -526,6 +552,8 @@ module HDLRuby::Low
526
552
  @inners = HashName.new
527
553
  # Initialize the system instances list.
528
554
  @systemIs = HashName.new
555
+ # Initialize the programs list.
556
+ @programs = []
529
557
  # Initialize the non-HDLRuby code chunks list.
530
558
  @codes = []
531
559
  # Initialize the connections list.
@@ -804,7 +832,40 @@ module HDLRuby::Low
804
832
  # end
805
833
  # systemI
806
834
  # end
835
+
836
+
837
+ # Handling the programs.
838
+
839
+ # Adds program +prog+.
840
+ def add_program(prog)
841
+ # Check and add the program.
842
+ unless prog.is_a?(Program)
843
+ raise AnyError,
844
+ "Invalid class for a program: #{prog.class}"
845
+ end
846
+ # Set the parent of the program.
847
+ program.parent = self
848
+ # Add the program.
849
+ @programs << program
850
+ program
851
+ end
852
+
853
+ # Iterates over the programs.
807
854
  #
855
+ # Returns an enumerator if no ruby block is given.
856
+ def each_program(&ruby_block)
857
+ # puts "each_program from scope=#{self}"
858
+ # No ruby block? Return an enumerator.
859
+ return to_enum(:each_program) unless ruby_block
860
+ # A ruby block? Apply it on each program.
861
+ @programs.each(&ruby_block)
862
+ end
863
+
864
+ # Tells if there is any program.
865
+ def has_program?
866
+ return !@programs.empty?
867
+ end
868
+
808
869
  # Handling the non-HDLRuby code chunks.
809
870
 
810
871
  # Adds code chunk +code+.
@@ -832,7 +893,7 @@ module HDLRuby::Low
832
893
  # puts "each_code from scope=#{self}"
833
894
  # No ruby block? Return an enumerator.
834
895
  return to_enum(:each_code) unless ruby_block
835
- # A ruby block? Apply it on each system instance.
896
+ # A ruby block? Apply it on each code.
836
897
  @codes.each(&ruby_block)
837
898
  end
838
899
 
@@ -2936,6 +2997,69 @@ module HDLRuby::Low
2936
2997
  end
2937
2998
 
2938
2999
 
3000
+ ##
3001
+ # Describes a program.
3002
+ class Program
3003
+
3004
+ include Hparent
3005
+
3006
+ attr_reader :language, :function
3007
+
3008
+ # Creates a new program in language +lang+ with start function
3009
+ # named +func+ accessed expressions, events and code files given in
3010
+ # +args+.
3011
+ def initialize(lang,func,*args)
3012
+ # Sets the language.
3013
+ @language = lang.to_sym
3014
+ # Sets the start function.
3015
+ @function = func.to_s
3016
+ # Process the expressions and code files arguments.
3017
+ @exprs = []
3018
+ @events = []
3019
+ @codes = []
3020
+ args.each do |arg|
3021
+ if arg.is_a?(String) then
3022
+ @codes << arg
3023
+ elsif arg.is_a?(Event) then
3024
+ @events << arg
3025
+ else
3026
+ @exprs << arg.to_expr
3027
+ end
3028
+ end
3029
+ end
3030
+
3031
+ # Iterates over each accessed expression.
3032
+ #
3033
+ # Returns an enumerator if no ruby block is given.
3034
+ def each_expression(&ruby_block)
3035
+ # No block? Return an enumerator.
3036
+ return to_enum(:each_expression) unless ruby_block
3037
+ # A block is given, apply it.
3038
+ @exprs.each(&ruby_block)
3039
+ end
3040
+
3041
+ # Iterates over each accessed event.
3042
+ #
3043
+ # Returns an enumerator if no ruby block is given.
3044
+ def each_event(&ruby_block)
3045
+ # No block? Return an enumerator.
3046
+ return to_enum(:each_event) unless ruby_block
3047
+ # A block is given, apply it.
3048
+ @events.each(&ruby_block)
3049
+ end
3050
+
3051
+ # Iterates over each code files.
3052
+ #
3053
+ # Returns an enumerator if no ruby block is given.
3054
+ def each_code(&ruby_block)
3055
+ # No block? Return an enumerator.
3056
+ return to_enum(:each_code) unless ruby_block
3057
+ # A block is given, apply it.
3058
+ @codes.each(&ruby_block)
3059
+ end
3060
+ end
3061
+
3062
+
2939
3063
  ##
2940
3064
  # Decribes a set of non-HDLRuby code chunks.
2941
3065
  class Code
@@ -0,0 +1,47 @@
1
+ require 'HDLRuby'
2
+ require 'HDLRuby/hruby_low_with_bool'
3
+ require 'HDLRuby/hruby_low_without_namespace'
4
+ require 'HDLRuby/hruby_low_with_var'
5
+
6
+
7
+ module HDLRuby::Low
8
+
9
+
10
+ ##
11
+ # Converts a HDLRuby::Low description to descriptions of software programs.
12
+ #
13
+ ########################################################################
14
+
15
+ ## Provides tools for extracting software from HDLRuby description.
16
+ module Low2Programs
17
+
18
+ class SystemT
19
+ ## Extends the SystemT class with extraction of software.
20
+
21
+ # Extract the information about the software in the system and put it
22
+ # into +target+ directory.
23
+ def extract_programs(target)
24
+ # Gather the programs descriptions.
25
+ programs = self.scope.each_scope_deep.map do |scope|
26
+ scope.each_program.to_a
27
+ end
28
+ programs.flatten!
29
+ # Sort the programs by language.
30
+ lang2prog = Hash.new([])
31
+ programs.each { |prog| lang2prog[prog.language] << prog }
32
+ # Copy the programs in the corresponding subdirectories.
33
+ lang2prog.each do |lang,progs|
34
+ dir = target + "/" + lang
35
+ Dir.mkdir(dir)
36
+ progs.each do |prog|
37
+ prog.each_code { |code| FileUtils.cp(code,dir) }
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+
44
+ class Scope
45
+ end
46
+
47
+ end
@@ -233,6 +233,7 @@ module HDLRuby::Low
233
233
  if self.ref.is_a?(RefName) then
234
234
  obj = self.ref.resolve
235
235
  # puts "obj=#{obj}"
236
+ return obj if obj.name == self.name
236
237
  # Look into the object for the name.
237
238
  return obj.get_by_name(self.name)
238
239
  else
@@ -242,9 +243,9 @@ module HDLRuby::Low
242
243
  while parent
243
244
  # puts "parent=#{parent}"
244
245
  if parent.respond_to?(:get_by_name) then
245
- # puts "get_by_name"
246
+ # puts "Going get_by_name with name=#{self.name}"
246
247
  found = parent.get_by_name(self.name)
247
- # puts "found" if found
248
+ # puts "found=#{found}" if found
248
249
  return found if found
249
250
  end
250
251
  parent = parent.parent
@@ -122,10 +122,17 @@ module HDLRuby::Low
122
122
  # Extract the connections of the sub scopes.
123
123
  cnxs = self.each_scope.map(&:extract_connections!).flatten
124
124
  # Reinsert them to self.
125
- cnxs.each { |beh| self.add_connection(beh) }
125
+ cnxs.each { |cnx| self.add_connection(cnx) }
126
+
127
+ # The fix the RefName using sub scopes since their target have
128
+ # been deplaced to current scope and renamed.
129
+ self_scopes = self.each_scope.to_a
130
+ self.each_behavior { |beh| beh.fix_scope_refnames!(self_scopes) }
131
+ self.each_connection { |cnx| cnx.fix_scope_refnames!(self_scopes) }
126
132
 
127
133
  # Now can delete the sub scopes since they are empty.
128
- self.each_scope.to_a.each { |scope| self.delete_scope!(scope) }
134
+ # self.each_scope.to_a.each { |scope| self.delete_scope!(scope) }
135
+ self_scopes.each { |scope| self.delete_scope!(scope) }
129
136
  end
130
137
 
131
138
  # Extract the behaviors from the scope and returns them into an array.
@@ -219,9 +226,10 @@ module HDLRuby::Low
219
226
  # in the internals.
220
227
  def replace_names_subs!(former,nname)
221
228
  # puts "replace_names_subs! for #{self} with former=#{former} and nname=#{nname}"
222
- self.each_type do |type|
223
- type.replace_names!(former,nname)
224
- end
229
+ # No need?
230
+ # self.each_type do |type|
231
+ # type.replace_names!(former,nname)
232
+ # end
225
233
  self.each_systemT do |systemT|
226
234
  systemT.replace_names!(former,nname)
227
235
  end
@@ -460,6 +468,13 @@ module HDLRuby::Low
460
468
  # Recurse on the block.
461
469
  self.block.replace_names!(former,nname)
462
470
  end
471
+
472
+ # Fix the references names using scopes given in +scopes + list (they
473
+ # are marked to be deleted).
474
+ def fix_scope_refnames!(scopes)
475
+ self.block.fix_scope_refnames!(scopes)
476
+ return self
477
+ end
463
478
  end
464
479
 
465
480
 
@@ -498,6 +513,34 @@ module HDLRuby::Low
498
513
  node.break_types!(types)
499
514
  end
500
515
  end
516
+
517
+ # Fix the references names using scopes given in +scopes + list (they
518
+ # are marked to be deleted).
519
+ def fix_scope_refnames!(scopes)
520
+ # By default, does nothing.
521
+ return self
522
+ end
523
+ end
524
+
525
+
526
+ class Transmit
527
+ # Fix the references names using scopes given in +scopes + list (they
528
+ # are marked to be deleted).
529
+ def fix_scope_refnames!(scopes)
530
+ self.set_left!(self.left.fix_scope_refnames!(scopes))
531
+ self.set_right!(self.right.fix_scope_refnames!(scopes))
532
+ return self
533
+ end
534
+ end
535
+
536
+ class Connection
537
+ # Fix the references names using scopes given in +scopes + list (they
538
+ # are marked to be deleted).
539
+ def fix_scope_refnames!(scopes)
540
+ self.set_left!(self.left.fix_scope_refnames!(scopes))
541
+ self.set_right!(self.right.fix_scope_refnames!(scopes))
542
+ return self
543
+ end
501
544
  end
502
545
 
503
546
 
@@ -527,6 +570,16 @@ module HDLRuby::Low
527
570
  end
528
571
  end
529
572
  end
573
+
574
+ # Fix the references names using scopes given in +scopes + list (they
575
+ # are marked to be deleted).
576
+ def fix_scope_refnames!(scopes)
577
+ # By default: recurse.
578
+ self.map_nodes! do |node|
579
+ node.fix_scope_refnames!(scopes)
580
+ end
581
+ return self
582
+ end
530
583
  end
531
584
 
532
585
 
@@ -578,6 +631,24 @@ module HDLRuby::Low
578
631
  # Recurse on the no if any.
579
632
  self.no.replace_names!(former,nname) if self.no
580
633
  end
634
+
635
+ # Fix the references names using scopes given in +scopes + list (they
636
+ # are marked to be deleted).
637
+ def fix_scope_refnames!(scopes)
638
+ # Fix the condition.
639
+ self.set_condition!(self.condition.fix_scope_refnames!(scopes))
640
+ # Recurse on the yes.
641
+ self.yes.fix_scope_refnames!(scopes)
642
+ # Recurse on the alternate ifs.
643
+ self.map_noifs! do |cond,stmnt|
644
+ cond = cond.fix_scope_refnames!(scopes)
645
+ stmnt = stmnt.fix_scope_refnames!(scopes)
646
+ [cond,stmnt]
647
+ end
648
+ # Recruse on the no if any.
649
+ self.no.fix_scope_refnames!(scopes) if self.no
650
+ return self
651
+ end
581
652
  end
582
653
 
583
654
 
@@ -618,6 +689,16 @@ module HDLRuby::Low
618
689
  end
619
690
  end
620
691
  end
692
+
693
+ # Fix the references names using scopes given in +scopes + list (they
694
+ # are marked to be deleted).
695
+ def fix_scope_refnames!(scopes)
696
+ # Fix the match.
697
+ self.set_match!(self.match.fix_scope_refnames!(scopes))
698
+ # Recurse on the statement.
699
+ self.statement.fix_scope_refnames!(scopes)
700
+ return self
701
+ end
621
702
  end
622
703
 
623
704
 
@@ -655,6 +736,18 @@ module HDLRuby::Low
655
736
  # Recurse on the default.
656
737
  self.default.replace_names!(former,nname) if self.default
657
738
  end
739
+
740
+ # Fix the references names using scopes given in +scopes + list (they
741
+ # are marked to be deleted).
742
+ def fix_scope_refnames!(scopes)
743
+ # Fix the value.
744
+ self.set_value!(self.value.fix_scope_refnames!(scopes))
745
+ # Recurse on the whens.
746
+ self.each_when {|w| w.fix_scope_refnames!(scopes) }
747
+ # Recurse on the default.
748
+ self.default.fix_scope_refnames!(scopes) if self.default
749
+ return self
750
+ end
658
751
  end
659
752
 
660
753
 
@@ -681,6 +774,14 @@ module HDLRuby::Low
681
774
  # Recurse on the statement.
682
775
  self.statement.replace_names!(former,nname)
683
776
  end
777
+
778
+ # Fix the references names using scopes given in +scopes + list (they
779
+ # are marked to be deleted).
780
+ def fix_scope_refnames!(scopes)
781
+ # Recurse on the statement.
782
+ self.statement.fix_scope_refnames!(scopes)
783
+ return self
784
+ end
684
785
  end
685
786
 
686
787
 
@@ -738,6 +839,33 @@ module HDLRuby::Low
738
839
  # Recurse on the sub scopes and behaviors.
739
840
  replace_names_subs!(former,nname)
740
841
  end
842
+
843
+ # Fix the references names using scopes given in +scopes + list (they
844
+ # are marked to be deleted).
845
+ def fix_scope_refnames!(scopes)
846
+ self.each_statement {|stmnt| stmnt.fix_scope_refnames!(scopes) }
847
+ return self
848
+ end
849
+ end
850
+
851
+
852
+ class RefName
853
+ include ForceName
854
+
855
+ # Fix the references names using scopes given in +scopes + list (they
856
+ # are marked to be deleted).
857
+ def fix_scope_refnames!(scopes)
858
+ return self unless self.ref.is_a?(RefName)
859
+ # puts "fix_scope_refnames! with self.name=#{name} and self.ref=#{self.ref}"
860
+ # Recurse on the ref.
861
+ self.set_ref!(self.ref.fix_scope_refnames!(scopes))
862
+ # Rename and curt the subref if referening to one of the scopes.
863
+ if scopes.find {|scope| scope.name == self.ref.name } then
864
+ self.ref.extend_name!(self)
865
+ self.set_ref!(RefThis.new)
866
+ end
867
+ return self
868
+ end
741
869
  end
742
870
 
743
871
  end
@@ -243,7 +243,6 @@ module HDLRuby::Low
243
243
  # Flatten a reference to a list of reference to leaf signals
244
244
  # from signal +sig+ and add to result to +subrefs+
245
245
  def flatten_to(sig,subrefs)
246
- # puts "flatten_to with sig name=#{sig.name}"
247
246
  # Shall we decompose 2d vectors, and is the current signal
248
247
  # for one of them?
249
248
  if SystemT.decompose_vec2d? and sig.type.is_a?(TypeVector) and
@@ -294,6 +293,7 @@ module HDLRuby::Low
294
293
  # Decompose the hierarchical signals in the statements.
295
294
  def signal2subs!
296
295
  # puts "signal2subs! for RefName: #{self.name}"
296
+ return self if self.type == void # Not a singal anyway.
297
297
  # Decompose it to a list of reference to each leaf sub signal.
298
298
  subrefs = []
299
299
  self.flatten_to(self.resolve,subrefs)
@@ -1000,7 +1000,30 @@ module HDLRuby::High
1000
1000
 
1001
1001
  class RefName
1002
1002
  ## Extends the RefName class for hybrid Ruby-C simulation.
1003
- # Should not be used with rcsim.
1003
+ # Converted to RefRange.
1004
+
1005
+ # Generate the C description of the reference range (not ref name!).
1006
+ def to_rcsim
1007
+ # Convert the base to a bit vector.
1008
+ type_base = Bit[self.ref.type.width]
1009
+ # self.ref.parent = nil
1010
+ # bit_base = Cast.new(type_base,self.ref)
1011
+ bit_base = RCSim.rcsim_make_cast(type_base.to_rcsim,self.ref.to_rcsim)
1012
+ # Compute range in bits of the field.
1013
+ last = 0
1014
+ self.ref.type.each.detect do |name,typ|
1015
+ last += typ.width
1016
+ name == self.name
1017
+ end
1018
+ first = last-self.type.width
1019
+ last -= 1
1020
+ # puts "name=#{self.name} first=#{first} last=#{last}"
1021
+ type_int = Bit[type_base.width.width]
1022
+ return RCSim.rcsim_make_refRange(self.type.to_rcsim,
1023
+ Value.new(type_int,last).to_rcsim,
1024
+ Value.new(type_int,first).to_rcsim,
1025
+ bit_base)
1026
+ end
1004
1027
  end
1005
1028
 
1006
1029
 
@@ -23,7 +23,8 @@ module HDLRuby
23
23
  Low::TypeSigned, Low::TypeUnsigned, Low::TypeFloat,
24
24
  Low::TypeTuple, Low::TypeStruct,
25
25
  Low::Behavior, Low::TimeBehavior,
26
- Low::Event, Low::Block, Low::TimeBlock, Low::Code,
26
+ Low::Event, Low::Block, Low::TimeBlock,
27
+ Low::Program, Low::Code,
27
28
  Low::SignalI, Low::SignalC,
28
29
  Low::SystemI, Low::Connection,
29
30
  Low::Transmit, Low::If, Low::Case, Low::When, Low::Cast,