HDLRuby 3.3.2 → 3.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9857a28c7409d23aa1aab98acc247b92b1ac294db826539bb21b2f0e6bb39c8
4
- data.tar.gz: 034ec0e1795b49b33db4c2a3461384af2e13fe1270a39109671d3d0772235904
3
+ metadata.gz: 160a8c6607e6dd20282a50fa26e0d472e055992ebce5f7cdf62d39e8c6bf7db5
4
+ data.tar.gz: 2c44f4edc3e4fdd76d64c2cb349f7083a255b68b1a18c6f41bef77c6d82138ab
5
5
  SHA512:
6
- metadata.gz: 235423b177255a0729fcd5f33338431f25dfa94b7ebe9ed0fc99c125518aedcabd0e6bd0cab927c683cf8752571d9b707e6ddf1d8056a7a20dd2ebcd67779c01
7
- data.tar.gz: e0f605b4360ffe0a05b15a65a197ba9606e43c7eff2747bf3d6fd9c07cfca1287df8e1c437f2339e86ca8efa4762676d689e81d4d79f4195b313a1684df7df23
6
+ metadata.gz: 234d4901bc7ae389c1e0893ad19a7a2aff93c2bc2851066a80ce07b778787a1fa25950af60dd30d32d7e77a8804f0ef4dbc2c43bdf2f026f7b725cd15a943c84
7
+ data.tar.gz: 774369895db9a9f30b7a85061aba5190d3e45f962f6ca28e2cee7fe77d7c02c049570dd6e2a0f730640f687bc8069f19e433ea6d4bb2f79b6cb7875a6ef423a4
@@ -0,0 +1,69 @@
1
+
2
+ # A benchmark for testing the use of a board model in conjuction
3
+ # with a sequencer implementing:
4
+ # * a simple adder whose input are set using slide switches, and
5
+ # whose output bits are showns on LEDs.
6
+ # * simple unsigned and signed counters whose values are shown using
7
+ # decimal or hexadecimal displays, and oscilloscopes.
8
+ system :with_board_sequencer do
9
+ inner :clk, :clk2
10
+ [8].inner clk_cnt: 0
11
+ inner rst: 0
12
+ [8].inner :sw_a, :sw_b
13
+ [9].inner :led_z
14
+ [16].inner counter: 0
15
+ [8].inner :counter8
16
+ signed[8].inner :scounter8
17
+
18
+ # Description of the board.
19
+ # It is updated at each rising edge of +clk2+.
20
+ board(:some_board) do
21
+ actport clk2.posedge
22
+ bt reset: rst
23
+ row
24
+ sw sw_a: sw_a
25
+ sw sw_b: sw_b
26
+ led led_z: led_z
27
+ row
28
+ digit cnt_d: counter
29
+ hexa cnt_h: counter
30
+ digit cnt_s: scounter8
31
+ row
32
+ scope scope: counter8
33
+ scope scope_s:scounter8
34
+ end
35
+
36
+ # The adder.
37
+ led_z <= sw_a.as(bit[9]) + sw_b
38
+
39
+ # The counters and the generation of +clk2+.
40
+ counter8 <= counter[7..0]
41
+ scounter8 <= counter[7..0]
42
+
43
+ seq(clk.posedge) do
44
+ clk_cnt <= clk_cnt + 1
45
+ hif(clk_cnt & 3 == 0) { clk2 <= ~clk2 }
46
+ end
47
+
48
+ sequencer(clk.posedge,rst) do
49
+ counter <= 0
50
+ sloop do
51
+ counter <= counter + 1
52
+ end
53
+ end
54
+
55
+
56
+
57
+ timed do
58
+ clk <= 0
59
+ clk2 <= 0
60
+ !10.ns
61
+ repeat(1000) do
62
+ clk <= 1
63
+ !10.ns
64
+ clk <= 0
65
+ !10.ns
66
+ end
67
+
68
+ end
69
+ end
@@ -10,7 +10,7 @@ system :nand_board do
10
10
 
11
11
  inner :clk
12
12
  # Description of the board.
13
- # It is updated at each rising edge of +clk2+.
13
+ # It is updated at each rising edge of +clk+.
14
14
  board(:nand,8080) do
15
15
  actport clk.posedge
16
16
  sw din0: din0
@@ -1529,15 +1529,19 @@ module HDLRuby::High
1529
1529
  self.each_program { |prog| scopeL.add_program(prog.to_low) }
1530
1530
  # Adds the code chunks.
1531
1531
  self.each_code { |code| scopeL.add_code(code.to_low) }
1532
+ # Adds the behaviors.
1533
+ self.each_behavior { |behavior|
1534
+ scopeL.add_behavior(behavior.to_low)
1535
+ }
1532
1536
  # Adds the connections.
1533
1537
  self.each_connection { |connection|
1534
1538
  # puts "connection=#{connection}"
1535
1539
  scopeL.add_connection(connection.to_low)
1536
1540
  }
1537
- # Adds the behaviors.
1538
- self.each_behavior { |behavior|
1539
- scopeL.add_behavior(behavior.to_low)
1540
- }
1541
+ # # Adds the behaviors.
1542
+ # self.each_behavior { |behavior|
1543
+ # scopeL.add_behavior(behavior.to_low)
1544
+ # }
1541
1545
  end
1542
1546
 
1543
1547
  # Converts the scope to HDLRuby::Low.
@@ -2247,17 +2251,21 @@ module HDLRuby::High
2247
2251
  ruby_block = proc {} unless block_given?
2248
2252
  if HDLRuby::High.in_system? then
2249
2253
  define_singleton_method(name.to_sym) do |*args,&other_block|
2254
+ res = nil
2250
2255
  sub(HDLRuby.uniq_name(name)) do
2251
- HDLRuby::High.top_user.instance_exec(*args,*other_block,
2252
- &ruby_block)
2256
+ res = HDLRuby::High.top_user.instance_exec(*args,
2257
+ *other_block, &ruby_block)
2253
2258
  end
2259
+ res
2254
2260
  end
2255
2261
  else
2256
2262
  define_method(name.to_sym) do |*args,&other_block|
2263
+ res = nil
2257
2264
  sub(HDLRuby.uniq_name(name)) do
2258
- HDLRuby::High.top_user.instance_exec(*args,*other_block,
2259
- &ruby_block)
2265
+ res = HDLRuby::High.top_user.instance_exec(*args,
2266
+ *other_block, &ruby_block)
2260
2267
  end
2268
+ res
2261
2269
  end
2262
2270
  end
2263
2271
  end
@@ -3089,10 +3097,14 @@ module HDLRuby::High
3089
3097
  end
3090
3098
 
3091
3099
 
3092
- # Creates an access to elements of range +rng+ of the signal.
3100
+ # Creates an access to elements of range +rng+ of the signal,
3101
+ # and set the type of elements as +typ+ if given.
3093
3102
  #
3094
3103
  # NOTE: +rng+ can be a single expression in which case it is an index.
3095
- def [](rng)
3104
+ def [](typ,rng=nil)
3105
+ # Treat the number of arguments
3106
+ rng, typ = typ, nil unless rng
3107
+ # Process the range.
3096
3108
  if rng.is_a?(::Range) then
3097
3109
  first = rng.first
3098
3110
  if (first.is_a?(::Integer)) then
@@ -3113,14 +3125,23 @@ module HDLRuby::High
3113
3125
  end
3114
3126
  if rng.is_a?(HDLRuby::Low::Expression) then
3115
3127
  # Index case
3116
- return RefIndex.new(self.type.base,self.to_expr,rng)
3128
+ if typ then
3129
+ return RefIndex.new(typ,self.to_expr,rng)
3130
+ else
3131
+ return RefIndex.new(self.type.base,self.to_expr,rng)
3132
+ end
3117
3133
  else
3118
3134
  # Range case, ensure it is made among expression.
3119
3135
  first = rng.first.to_expr
3120
3136
  last = rng.last.to_expr
3121
- # Abd create the reference.
3122
- return RefRange.new(self.type.slice(first..last),
3123
- self.to_expr,first..last)
3137
+ # And create the reference.
3138
+ if typ then
3139
+ return RefRange.new(typ,
3140
+ self.to_expr,first..last)
3141
+ else
3142
+ return RefRange.new(self.type.slice(first..last),
3143
+ self.to_expr,first..last)
3144
+ end
3124
3145
  end
3125
3146
  end
3126
3147
 
@@ -3524,8 +3545,8 @@ module HDLRuby::High
3524
3545
  if @base.is_a?(RefThis) &&
3525
3546
  (@object.parent != High.top_user) &&
3526
3547
  (@object.parent != High.cur_system) &&
3527
- (@object.parent != High.cur_system.scope) &&
3528
- (!@object.parent.name.empty?) then
3548
+ (@object.parent != High.cur_system.scope) then # &&
3549
+ # (!@object.parent.name.empty?) then
3529
3550
  # Need to have a hierachical access.
3530
3551
  if @object.respond_to?(:low_object) && @object.low_object then
3531
3552
  # There where already a low object, create the ref from it.
@@ -4387,9 +4408,15 @@ module HDLRuby::High
4387
4408
  end
4388
4409
 
4389
4410
  # Converts the block to HDLRuby::Low.
4390
- def to_low
4411
+ # def to_low
4412
+ def to_low(low_parent = nil)
4391
4413
  # Create the resulting block
4392
4414
  blockL = HDLRuby::Low::Block.new(self.mode,self.name)
4415
+ # Is there a low parent?
4416
+ if low_parent then
4417
+ # Set it straight away to have correct references.
4418
+ low_parent.block = blockL
4419
+ end
4393
4420
  # # For debugging: set the source high object
4394
4421
  # blockL.properties[:low2high] = self.hdr_id
4395
4422
  # self.properties[:high2low] = blockL
@@ -4555,12 +4582,16 @@ module HDLRuby::High
4555
4582
 
4556
4583
  # Converts the time behavior to HDLRuby::Low.
4557
4584
  def to_low
4585
+ # Create an empty low behavior for the result.
4586
+ behaviorL = HDLRuby::Low::Behavior.new
4587
+ # Then fill it.
4558
4588
  # Create the low level block.
4559
- blockL = self.block.to_low
4589
+ # blockL = self.block.to_low
4590
+ blockL = self.block.to_low(behaviorL)
4560
4591
  # Create the low level events.
4561
4592
  eventLs = self.each_event.map { |event| event.to_low }
4562
- # Create and return the resulting low level behavior.
4563
- behaviorL = HDLRuby::Low::Behavior.new(blockL)
4593
+ # # Create and return the resulting low level behavior.
4594
+ # behaviorL = HDLRuby::Low::Behavior.new(blockL)
4564
4595
  # # For debugging: set the source high object
4565
4596
  # behaviorL.properties[:low2high] = self.hdr_id
4566
4597
  # self.properties[:high2low] = behaviorL
@@ -4908,6 +4939,11 @@ module HDLRuby::High
4908
4939
  def width
4909
4940
  return self.bit_length
4910
4941
  end
4942
+
4943
+ # Cast.
4944
+ def as(typ)
4945
+ return self.to_expr.as(typ)
4946
+ end
4911
4947
  end
4912
4948
 
4913
4949
  # Extends the Float class for computing the bit width and conversion
@@ -74,6 +74,7 @@ module HDLRuby::Low
74
74
  res = []
75
75
  cur = self
76
76
  while(cur) do
77
+ # puts "cur=#{cur} cur.parent=#{cur.parent}"
77
78
  res << cur
78
79
  cur = cur.parent
79
80
  end
@@ -82,6 +83,7 @@ module HDLRuby::Low
82
83
 
83
84
  # Get an absolute reference to the object.
84
85
  def absolute_ref
86
+ # puts "absolute_ref for self=#{self}"
85
87
  # Get the full hierarchy up to the object.
86
88
  path = self.hierarchy
87
89
  # Create the reference.
@@ -2379,7 +2381,7 @@ module HDLRuby::Low
2379
2381
  attr_reader :block
2380
2382
 
2381
2383
  # Creates a new behavior executing +block+.
2382
- def initialize(block)
2384
+ def initialize(block = nil)
2383
2385
  # Initialize the sensitivity list.
2384
2386
  @events = []
2385
2387
  # Check and set the block.
@@ -2417,7 +2419,7 @@ module HDLRuby::Low
2417
2419
  # And set the block
2418
2420
  @block = block
2419
2421
  end
2420
- private :block=
2422
+ # private :block=
2421
2423
 
2422
2424
  # Comparison for hash: structural comparison.
2423
2425
  def eql?(obj)
@@ -6078,6 +6080,10 @@ module HDLRuby::Low
6078
6080
  raise AnyError, "Invalid class for a range last: #{last.class}."
6079
6081
  end
6080
6082
  @range = first..last
6083
+ # Clears the parent of first and last that is automatically added
6084
+ # by Ruby when creating a range.
6085
+ first.no_parent! if first.is_a?(Hparent)
6086
+ last.no_parent! if last.is_a?(Hparent)
6081
6087
  # And set their parents.
6082
6088
  first.parent = last.parent = self
6083
6089
  end
@@ -88,6 +88,7 @@ module HDLRuby::Low
88
88
 
89
89
  # Moves the declarations to the upper namespace.
90
90
  def to_upper_space!
91
+ # puts "to_upper_space for scope=#{self}"
91
92
  # First recurse.
92
93
  # On the sub scopes.
93
94
  self.each_scope(&:to_upper_space!)
@@ -472,6 +473,7 @@ module HDLRuby::Low
472
473
  # Fix the references names using scopes given in +scopes + list (they
473
474
  # are marked to be deleted).
474
475
  def fix_scope_refnames!(scopes)
476
+ # puts "fix_scope_refnames for self=#{self}"
475
477
  self.block.fix_scope_refnames!(scopes)
476
478
  return self
477
479
  end
@@ -834,10 +836,13 @@ module HDLRuby::Low
834
836
 
835
837
  # Replaces recursively +former+ name by +nname+ until it is redeclared.
836
838
  def replace_names!(former,nname)
839
+ # Already processed with fix_scope_refnames, so nothing to do
840
+ # here.
841
+ return
837
842
  # Stop here if the name is redeclared.
838
- return if self.each_inner.find {|inner| inner.name == former }
843
+ # return if self.each_inner.find {|inner| inner.name == former }
839
844
  # Recurse on the sub scopes and behaviors.
840
- replace_names_subs!(former,nname)
845
+ # replace_names_subs!(former,nname)
841
846
  end
842
847
 
843
848
  # Fix the references names using scopes given in +scopes + list (they
@@ -856,14 +861,16 @@ module HDLRuby::Low
856
861
  # are marked to be deleted).
857
862
  def fix_scope_refnames!(scopes)
858
863
  return self unless self.ref.is_a?(RefName)
859
- # puts "fix_scope_refnames! with self.name=#{name} and self.ref=#{self.ref}"
864
+ # puts "fix_scope_refnames! with self=#{self} self.name=#{name} and self.ref=#{self.ref}"
860
865
  # Recurse on the ref.
861
- self.set_ref!(self.ref.fix_scope_refnames!(scopes))
866
+ # self.set_ref!(self.ref.fix_scope_refnames!(scopes))
862
867
  # Rename and curt the subref if referening to one of the scopes.
863
868
  if scopes.find {|scope| scope.name == self.ref.name } then
864
869
  self.ref.extend_name!(self)
870
+ # But need to remove the scope reference.
865
871
  self.set_ref!(RefThis.new)
866
872
  end
873
+ # puts "Now self=#{self} self.name=#{self.name} self.ref=#{self.ref}"
867
874
  return self
868
875
  end
869
876
  end
@@ -243,6 +243,7 @@ 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=#{sig}"
246
247
  # Shall we decompose 2d vectors, and is the current signal
247
248
  # for one of them?
248
249
  if SystemT.decompose_vec2d? and sig.type.is_a?(TypeVector) and
@@ -63,7 +63,8 @@ module HDLRuby::High::Std
63
63
  end
64
64
 
65
65
  ## Class describing a digit display.
66
- DIGIT = Struct.new(:id, :size, :hread) do
66
+ # Need to know the data type since signed is supported.
67
+ DIGIT = Struct.new(:id, :size, :type, :hread) do
67
68
  def to_html
68
69
  return '<div class="digitset" id=' + self.id.to_s +
69
70
  ' data-width="' + self.size.to_s + '" data-value="0" >' +
@@ -559,6 +560,9 @@ Content-Type: text/html
559
560
  const cartouche = document.getElementById("cartouche");
560
561
  const panel = document.getElementById("panel");
561
562
 
563
+ // The current time stamp.
564
+ var time_stamp = 0;
565
+
562
566
  // The input and output elements' ids.
563
567
  const input_ids = [];
564
568
  const output_ids = [];
@@ -689,7 +693,7 @@ Content-Type: text/html
689
693
  function digitset_update(digitset,value) {
690
694
  // Update the digiset value.
691
695
  digitset.dataset.value = value;
692
- // Unsigned case.
696
+ // Update its display.
693
697
  const num = digitset.dataset.width;
694
698
  digitset.lastElementChild.innerHTML = String(value).padStart(num,"\u00A0");
695
699
  }
@@ -704,7 +708,9 @@ Content-Type: text/html
704
708
  }
705
709
 
706
710
  // Update an oscilloscope.
707
- function scope_update(scope,value) {
711
+ function scope_update(scope,value,new_time_stamp) {
712
+ // Compute the advance in time.
713
+ let diff_time_stamp = new_time_stamp - time_stamp;
708
714
  // Get the canvas.
709
715
  const canvas = scope.lastElementChild;
710
716
  // Shall we set up its size?
@@ -775,21 +781,21 @@ Content-Type: text/html
775
781
  // Draw a line to the new position.
776
782
  cxt.beginPath();
777
783
  cxt.moveTo(toPx(pos), toPy(previous));
778
- cxt.lineTo(toPx(pos+1), toPy(value));
784
+ cxt.lineTo(toPx(pos+diff_time_stamp), toPy(value));
779
785
  cxt.stroke();
780
786
  /* Update the values. */
781
787
  scope.dataset.previous = value;
782
- scope.dataset.pos = pos + 1;
788
+ scope.dataset.pos = pos + diff_time_stamp;
783
789
  }
784
790
  }
785
791
 
786
792
  // Update a general display element.
787
- function element_update(element,value) {
793
+ function element_update(element,value,new_time_stamp) {
788
794
  if(element.classList.contains('ledset')) { ledset_update(element,value); }
789
795
  if(element.classList.contains('digitset')){ digitset_update(element,value); }
790
796
  if(element.classList.contains('signedset')){signedset_update(element,value);}
791
797
  if(element.classList.contains('hexaset')) { hexaset_update(element,value); }
792
- if(element.classList.contains('scope')) { scope_update(element,value); }
798
+ if(element.classList.contains('scope')) { scope_update(element,value,new_time_stamp); }
793
799
  }
794
800
 
795
801
 
@@ -799,19 +805,25 @@ Content-Type: text/html
799
805
  xhttp.onreadystatechange = function() {
800
806
  // console.log("response=" + this.responseText);
801
807
  if (this.readyState == 4 && this.status == 200) {
802
- if (/[0-9]+:[0-9]/.test(this.responseText)) {
808
+ if (/^[0-9]+;[0-9]+:-?[0-9]/.test(this.responseText)) {
803
809
  // There is a real response.
804
810
  // Update the interface with the answer.
805
811
  const commands = this.responseText.split(';');
812
+ // Get the new time stamp.
813
+ let new_time_stamp = commands.shift();
814
+ // console.log("new_time_stamp=" + new_time_stamp);
815
+ // Process the other commands.
806
816
  for(command of commands) {
807
817
  const toks = command.split(':');
808
- element_update(document.getElementById(toks[0]),toks[1]);
818
+ element_update(document.getElementById(toks[0]),toks[1],new_time_stamp);
809
819
  }
820
+ // Update the time stamp
821
+ time_stamp = new_time_stamp
810
822
  }
811
823
  }
812
824
  };
813
825
  // Builds the action from the state of the input elements.
814
- act = '';
826
+ let act = '';
815
827
  for(id of input_ids) {
816
828
  act += id + ':' + document.getElementById(id).dataset.value + ';';
817
829
  }
@@ -824,8 +836,9 @@ Content-Type: text/html
824
836
  // First call of synchronisation.
825
837
  hruby_sync();
826
838
 
827
- // Then periodic synchronize.
828
- setInterval(function() { hruby_sync(); }, 100);
839
+ // Moved to the Ruby constructor to allow setting the time intervals.
840
+ // // Then periodic synchronize.
841
+ // setInterval(function() { hruby_sync(); }, 100);
829
842
 
830
843
  </script>
831
844
 
@@ -850,9 +863,14 @@ HTMLRESPONSE
850
863
 
851
864
  # Create a new board named +name+ accessible on HTTP port +http_port+
852
865
  # and whose content is describe in +hdlruby_block+.
853
- def initialize(name, http_port = 8000, &hdlruby_block)
866
+ def initialize(name, http_port: 8000, refresh_rate: 100,
867
+ &hdlruby_block)
854
868
  # Set the name.
855
869
  @name = name.to_s
870
+ # Set the refresh rate.
871
+ @refresh_rate = refresh_rate.to_i
872
+ # Tell the interface is to be built.
873
+ @first = true
856
874
  # Check and set the port.
857
875
  http_port = http_port.to_i
858
876
  if (@@http_ports.include?(http_port)) then
@@ -869,13 +887,17 @@ HTMLRESPONSE
869
887
  # Initialize the list of board elements to empty.
870
888
  @elements = []
871
889
  @out_elements = []
890
+ # Initialize the time stamp.
891
+ @time_stamp = 0
872
892
  # And build the board.
873
893
  # Create the namespace for the program.
874
894
  @namespace = Namespace.new(self)
875
895
  # Build the program object.
876
896
  High.space_push(@namespace)
877
897
  pr = nil
878
- High.top_user.instance_eval { pr = program(:ruby, @name.to_sym) {} }
898
+ High.top_user.instance_eval do
899
+ pr = program(:ruby, @name.to_sym) { }
900
+ end
879
901
  @program = pr
880
902
  # Fill it.
881
903
  High.top_user.instance_eval(&hdlruby_block)
@@ -936,6 +958,7 @@ HTMLRESPONSE
936
958
  # Createthe ui component.
937
959
  @elements << DIGIT.new(@elements.size,
938
960
  Math.log10(2**hport[1].type.width - 1).to_i + (sign ? 2 : 1),
961
+ hport[1].type,
939
962
  hport[0])
940
963
  @out_elements << @elements[-1]
941
964
  end
@@ -1018,9 +1041,13 @@ HTMLRESPONSE
1018
1041
  # Generate a response to a request to the server.
1019
1042
  def make_response(request)
1020
1043
  # puts "request=#{request}"
1021
- if (request.empty?) then
1044
+ if (@first) then
1045
+ @first = false
1022
1046
  # First or re-connection, generate the UI.
1023
- return UI_header + "\n<script>\n" +
1047
+ return UI_header +
1048
+ "\n<script>\n" +
1049
+ "// Then periodic synchronize.\n" +
1050
+ "setInterval(function() { hruby_sync(); }, #{@refresh_rate});\n" +
1024
1051
  "set_cartouche('#{@name}');\n" +
1025
1052
  @elements.map do |elem|
1026
1053
  "add_element('#{elem.to_html}');"
@@ -1030,11 +1057,13 @@ HTMLRESPONSE
1030
1057
  # This should be an AJAX request, process it.
1031
1058
  commands = request.split(";")
1032
1059
  commands.each do |command|
1060
+ next unless command.include?(":")
1033
1061
  id, val = command.split(":").map {|t| t.to_i}
1034
1062
  self.update_port(id,val)
1035
1063
  end
1036
1064
  # And generate the response: an update of each board output element.
1037
- return UI_response + @out_elements.each.map do |e|
1065
+ return UI_response + "#{@time_stamp};" +
1066
+ @out_elements.each.map do |e|
1038
1067
  # puts "resp=" + "#{e.id}:#{RubyHDL.send(e.hread)}"
1039
1068
  "#{e.id}:#{RubyHDL.send(e.hread)}"
1040
1069
  end.join(";")
@@ -1057,6 +1086,8 @@ HTMLRESPONSE
1057
1086
  session.print self.make_response(path[1..-1])
1058
1087
  # And tell the ui has been connected.
1059
1088
  @connected = true
1089
+ # Then advance the time stamp.
1090
+ @time_stamp += 1
1060
1091
  else
1061
1092
  session.print 'Connection Refuse'
1062
1093
  end
@@ -1072,8 +1103,11 @@ HTMLRESPONSE
1072
1103
 
1073
1104
  # Create a new board named +name+ accessible on HTTP port +http_port+
1074
1105
  # and whose content is describe in +block+.
1075
- def board(name, http_port = 8000, &block)
1076
- return Board.new(name,http_port,&block)
1106
+ def board(name, http_port: 8000, refresh_rate: 100, &block)
1107
+ # puts "name=#{name} http_port=#{http_port} refresh_rate=#{refresh_rate} block=#{block}"
1108
+ return Board.new(name,
1109
+ http_port: http_port, refresh_rate: refresh_rate,
1110
+ &block)
1077
1111
  end
1078
1112
 
1079
1113
  end
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "3.3.2"
2
+ VERSION = "3.3.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HDLRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-12 00:00:00.000000000 Z
11
+ date: 2024-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -186,6 +186,7 @@ files:
186
186
  - lib/HDLRuby/hdr_samples/tuple.rb
187
187
  - lib/HDLRuby/hdr_samples/type_minmax_bench.rb
188
188
  - lib/HDLRuby/hdr_samples/with_board.rb
189
+ - lib/HDLRuby/hdr_samples/with_board_sequencer.rb
189
190
  - lib/HDLRuby/hdr_samples/with_bram.rb
190
191
  - lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb
191
192
  - lib/HDLRuby/hdr_samples/with_bram_stack.rb
@@ -475,7 +476,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
475
476
  - !ruby/object:Gem::Version
476
477
  version: '0'
477
478
  requirements: []
478
- rubygems_version: 3.5.10
479
+ rubygems_version: 3.5.17
479
480
  signing_key:
480
481
  specification_version: 4
481
482
  summary: HDLRuby is a library for describing and simulating digital electronic systems.