HDLRuby 3.6.0 → 3.6.1
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.
- checksums.yaml +4 -4
- data/README.md +7 -3
- data/lib/HDLRuby/hdr_samples/with_board.rb +11 -1
- data/lib/HDLRuby/ui/hruby_board.rb +94 -8
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.html +4 -2
- data/tuto/tutorial_sw.md +4 -2
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 86a98906417747050937e8547246ff7ac1cb06e78da82ae4c63385b26dbaa97e
         | 
| 4 | 
            +
              data.tar.gz: 1096ee8f5bf5ec44409420e6fa60969bf9798f93cec7fa3dd862abc5ac18527f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 824c3bf0f96d889913175fccef2d8b854c5da86221e2c70f633f91d104374c6456a1a4958eef0d68da1e3437da8b96b67558b7d563c0cf3c29a6681c8fa8fb1c
         | 
| 7 | 
            +
              data.tar.gz: 05adeeaa6c1e7a3872d045ad876a295a58548abd610302a94d84f4ac317d84b3bc907adca05daa093cb0d9fa79163836b0d6c5269c9fbcfd83f9cca3dcc42635
         | 
    
        data/README.md
    CHANGED
    
    | @@ -17,10 +17,12 @@ hdrcc --get-tuto | |
| 17 17 |  | 
| 18 18 | 
             
            __What's new__
         | 
| 19 19 |  | 
| 20 | 
            -
            For HDLRuby version 3.6. | 
| 20 | 
            +
            For HDLRuby version 3.6.x:
         | 
| 21 21 |  | 
| 22 22 | 
             
             * Added a new element for the GUI board that allows to assign an expression to a signal on the fly while simulating.
         | 
| 23 23 |  | 
| 24 | 
            +
             * Added a new slider element for the GUI board (from 3.6.1).
         | 
| 25 | 
            +
             | 
| 24 26 | 
             
            For HDLRuby version 3.5.0:
         | 
| 25 27 |  | 
| 26 28 | 
             
             * Added direct support for Verilog HDL files as input to 'hdrcc'.
         | 
| @@ -2224,9 +2226,11 @@ The list of possible elements is as follows: | |
| 2224 2226 |  | 
| 2225 2227 | 
             
             * `bt`: represents a set of push buttons, their number is set to match the bit-width of the attached signal.
         | 
| 2226 2228 |  | 
| 2227 | 
            -
             * ` | 
| 2229 | 
            +
             * `slider`: represents an horizontal slider.
         | 
| 2230 | 
            +
             | 
| 2231 | 
            +
             * `text`: represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named `leds`, it will be accessible as a variable.
         | 
| 2228 2232 |  | 
| 2229 | 
            -
             * `hook`:  | 
| 2233 | 
            +
             * `hook`: attaches a signal to the board without displaying. It can be used as a variable in `text` expressions, similar to display objects.
         | 
| 2230 2234 |  | 
| 2231 2235 | 
             
             * `led`: represents a set of LEDs, their number is set to match the bit-width of the attached signal.
         | 
| 2232 2236 |  | 
| @@ -15,6 +15,12 @@ system :with_board do | |
| 15 15 | 
             
                [8].inner :counter8
         | 
| 16 16 | 
             
                signed[8].inner :scounter8
         | 
| 17 17 |  | 
| 18 | 
            +
                bit[8][-256].inner :mem
         | 
| 19 | 
            +
                [8].inner :addr, :din, :dout
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                mem[addr] <= din
         | 
| 22 | 
            +
                dout <= mem[addr]
         | 
| 23 | 
            +
             | 
| 18 24 | 
             
                # Description of the board.
         | 
| 19 25 | 
             
                # It is updated at each rising edge of +clk2+.
         | 
| 20 26 | 
             
                board(:some_board) do
         | 
| @@ -24,12 +30,16 @@ system :with_board do | |
| 24 30 | 
             
                    hook sw_bi: sw_b
         | 
| 25 31 | 
             
                    row
         | 
| 26 32 | 
             
                    sw  sw_a:     sw_a
         | 
| 27 | 
            -
                     | 
| 33 | 
            +
                    slider sw_b:  sw_b
         | 
| 28 34 | 
             
                    led led_z:    led_z
         | 
| 29 35 | 
             
                    row
         | 
| 30 36 | 
             
                    text expr:    expr
         | 
| 31 37 | 
             
                    digit show:   show
         | 
| 32 38 | 
             
                    row
         | 
| 39 | 
            +
                    text addr:    addr
         | 
| 40 | 
            +
                    hexa dout:    dout
         | 
| 41 | 
            +
                    text din:     din
         | 
| 42 | 
            +
                    row
         | 
| 33 43 | 
             
                    digit cnt_d:  counter
         | 
| 34 44 | 
             
                    hexa  cnt_h:  counter
         | 
| 35 45 | 
             
                    digit cnt_s:  scounter8
         | 
| @@ -34,7 +34,7 @@ module HDLRuby::High::Std | |
| 34 34 | 
             
                         '<label class="sw"><input type="checkbox" data-bit="' + 
         | 
| 35 35 | 
             
                                 (self.size-i-1).to_s + '" ' +
         | 
| 36 36 | 
             
                                 'onchange="sw_change(this)">' +
         | 
| 37 | 
            -
                         '<span class=" | 
| 37 | 
            +
                         '<span class="sw_slider"></span></label>\n'
         | 
| 38 38 | 
             
                       end.join + "</div>\\n"
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 | 
             
                end
         | 
| @@ -52,6 +52,22 @@ module HDLRuby::High::Std | |
| 52 52 | 
             
                       end.join + "</div>\\n"
         | 
| 53 53 | 
             
                  end
         | 
| 54 54 | 
             
                end
         | 
| 55 | 
            +
                
         | 
| 56 | 
            +
                ## Class describing an "analog" slide switch.
         | 
| 57 | 
            +
                SLIDER = Struct.new(:id, :min, :max, :hwrite) do
         | 
| 58 | 
            +
                  def to_html
         | 
| 59 | 
            +
                    # Prepare the min, max and blank strings.
         | 
| 60 | 
            +
                    min = self.min.to_s
         | 
| 61 | 
            +
                    max = self.max.to_s
         | 
| 62 | 
            +
                    return "<div class=\"sliderset\" id=\"#{self.id}\" data-value=\"0\">\\n" + 
         | 
| 63 | 
            +
                      '<span class="name">' + self.hwrite.to_s.chop + '</span>' +
         | 
| 64 | 
            +
                      '<span>  </span>' +
         | 
| 65 | 
            +
                      '<input type="range" min="' + min + '" max="' + max + 
         | 
| 66 | 
            +
                        '" value="' + min + '" ' +
         | 
| 67 | 
            +
                        'class="slider" oninput="slider_change(this)">' +
         | 
| 68 | 
            +
                       "</div>\\n"
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 55 71 |  | 
| 56 72 | 
             
                ## Class describing a text-based input.
         | 
| 57 73 | 
             
                TEXT = Struct.new(:id, :size, :hwrite) do
         | 
| @@ -272,6 +288,16 @@ Content-Type: text/html | |
| 272 288 | 
             
                height: 40px;
         | 
| 273 289 | 
             
              }
         | 
| 274 290 |  | 
| 291 | 
            +
              .sliderset {
         | 
| 292 | 
            +
                display: flex;
         | 
| 293 | 
            +
                flex-direction: row;
         | 
| 294 | 
            +
                justify-content: center;
         | 
| 295 | 
            +
                align-items: center;
         | 
| 296 | 
            +
                margin-left:  8px;
         | 
| 297 | 
            +
                margin-right: 8px;
         | 
| 298 | 
            +
                height: 40px;
         | 
| 299 | 
            +
              }
         | 
| 300 | 
            +
             | 
| 275 301 | 
             
              .ledset {
         | 
| 276 302 | 
             
                display: flex;
         | 
| 277 303 | 
             
                flex-direction: row;
         | 
| @@ -454,7 +480,7 @@ Content-Type: text/html | |
| 454 480 | 
             
                height: 0;
         | 
| 455 481 | 
             
              }
         | 
| 456 482 |  | 
| 457 | 
            -
              . | 
| 483 | 
            +
              .sw_slider {
         | 
| 458 484 | 
             
                position: absolute;
         | 
| 459 485 | 
             
                cursor: pointer;
         | 
| 460 486 | 
             
                top: 0;
         | 
| @@ -467,7 +493,7 @@ Content-Type: text/html | |
| 467 493 | 
             
                border: solid 2px #505050;  
         | 
| 468 494 | 
             
              }
         | 
| 469 495 |  | 
| 470 | 
            -
              . | 
| 496 | 
            +
              .sw_slider:before {
         | 
| 471 497 | 
             
                position: absolute;
         | 
| 472 498 | 
             
                content: "";
         | 
| 473 499 | 
             
                height: 16px;
         | 
| @@ -479,16 +505,48 @@ Content-Type: text/html | |
| 479 505 | 
             
                transition: .2s;
         | 
| 480 506 | 
             
              }
         | 
| 481 507 |  | 
| 482 | 
            -
              input:checked + . | 
| 508 | 
            +
              input:checked + .sw_slider {
         | 
| 483 509 | 
             
                background-color: yellow;
         | 
| 484 510 | 
             
              }
         | 
| 485 511 |  | 
| 486 | 
            -
              input:checked + . | 
| 512 | 
            +
              input:checked + .sw_slider:before {
         | 
| 487 513 | 
             
                -webkit-transform: translateY(-16px);
         | 
| 488 514 | 
             
                -ms-transform: translateY(-16px);
         | 
| 489 515 | 
             
                transform: translateY(-16px);
         | 
| 490 516 | 
             
              }
         | 
| 491 517 |  | 
| 518 | 
            +
              .slider {
         | 
| 519 | 
            +
                -webkit-appearance: none;
         | 
| 520 | 
            +
                width: 100%;
         | 
| 521 | 
            +
                height: 25px;
         | 
| 522 | 
            +
                background-color: #ccc;
         | 
| 523 | 
            +
                -webkit-transition: .2s;
         | 
| 524 | 
            +
                transition: .2s;
         | 
| 525 | 
            +
                border: solid 2px #505050;  
         | 
| 526 | 
            +
                margin: 2px;
         | 
| 527 | 
            +
                box-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
         | 
| 528 | 
            +
                -moz-box-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
         | 
| 529 | 
            +
                -webkit-shadow: -1px -1px 1px white, 1px 1px 1px #101010;
         | 
| 530 | 
            +
              }
         | 
| 531 | 
            +
             | 
| 532 | 
            +
              .slider::-webkit-slider-thumb {
         | 
| 533 | 
            +
                -webkit-appearance: none;
         | 
| 534 | 
            +
                appearance: none;
         | 
| 535 | 
            +
                width: 25px;
         | 
| 536 | 
            +
                height: 25px;
         | 
| 537 | 
            +
                background: black;
         | 
| 538 | 
            +
                border: solid 2px #505050;  
         | 
| 539 | 
            +
                cursor: pointer;
         | 
| 540 | 
            +
              }
         | 
| 541 | 
            +
             | 
| 542 | 
            +
              .slider::-moz-range-thumb {
         | 
| 543 | 
            +
                width: 25px;
         | 
| 544 | 
            +
                height: 25px;
         | 
| 545 | 
            +
                background: black;
         | 
| 546 | 
            +
                border: solid 2px #505050;  
         | 
| 547 | 
            +
                cursor: pointer;
         | 
| 548 | 
            +
              }
         | 
| 549 | 
            +
             | 
| 492 550 | 
             
              .matrix {
         | 
| 493 551 | 
             
                font-size: 26px;
         | 
| 494 552 | 
             
                font-family: "Lucida Console", "Courier New", monospace;
         | 
| @@ -622,6 +680,7 @@ Content-Type: text/html | |
| 622 680 | 
             
                // Depending of the kind of element.
         | 
| 623 681 | 
             
                if (element.classList.contains('swset') ||
         | 
| 624 682 | 
             
                    element.classList.contains('btset') ||
         | 
| 683 | 
            +
                    element.classList.contains('sliderset') ||
         | 
| 625 684 | 
             
                    element.classList.contains('textset') ) {
         | 
| 626 685 | 
             
                  // Input element.
         | 
| 627 686 | 
             
                  input_ids.push(element.id);
         | 
| @@ -664,6 +723,14 @@ Content-Type: text/html | |
| 664 723 | 
             
                // console.log("sw value=" + swset.dataset.value);
         | 
| 665 724 | 
             
              }
         | 
| 666 725 |  | 
| 726 | 
            +
              // Handler of slider change.
         | 
| 727 | 
            +
              function slider_change(slider) {
         | 
| 728 | 
            +
                // Get the set holding slider.
         | 
| 729 | 
            +
                const sliderset = slider.parentElement;
         | 
| 730 | 
            +
                sliderset.dataset.value = slider.value;
         | 
| 731 | 
            +
                // console.log("slider value=" + sliderset.dataset.value);
         | 
| 732 | 
            +
              }
         | 
| 733 | 
            +
             | 
| 667 734 | 
             
              // Set the aspect of a button to clicked.
         | 
| 668 735 | 
             
              function bt_on(bt) {
         | 
| 669 736 | 
             
                bt.innerHTML = '<i class="bt_on"></i>';
         | 
| @@ -979,6 +1046,27 @@ HTMLRESPONSE | |
| 979 1046 | 
             
                  @elements << BT.new(@elements.size,hport[1].type.width,:"#{hport[0]}=")
         | 
| 980 1047 | 
             
                end
         | 
| 981 1048 |  | 
| 1049 | 
            +
                # Add a new slider element attached to HDLRuby port +hport+
         | 
| 1050 | 
            +
                def slider(hport)
         | 
| 1051 | 
            +
                  if !hport.is_a?(Hash) or hport.size != 1 then
         | 
| 1052 | 
            +
                    raise UIError.new("Malformed HDLRuby port declaration: #{hport}")
         | 
| 1053 | 
            +
                  end
         | 
| 1054 | 
            +
                  # Create the HDLRuby program port.
         | 
| 1055 | 
            +
                  @program.outport(hport)
         | 
| 1056 | 
            +
                  hport = hport.first
         | 
| 1057 | 
            +
                  # Compute the min and max values.
         | 
| 1058 | 
            +
                  width = hport[1].type.width
         | 
| 1059 | 
            +
                  if hport[1].type.signed? then
         | 
| 1060 | 
            +
                    min = -2**(width-1)
         | 
| 1061 | 
            +
                    max = 2**(width-1) - 1
         | 
| 1062 | 
            +
                  else
         | 
| 1063 | 
            +
                    min = 0
         | 
| 1064 | 
            +
                    max = 2**width - 1
         | 
| 1065 | 
            +
                  end
         | 
| 1066 | 
            +
                  # Create the UI component.
         | 
| 1067 | 
            +
                  @elements << SLIDER.new(@elements.size,min,max,:"#{hport[0]}=")
         | 
| 1068 | 
            +
                end
         | 
| 1069 | 
            +
             | 
| 982 1070 | 
             
                # Add a new text input element attached to HDLRuby port +hport+
         | 
| 983 1071 | 
             
                def text(hport)
         | 
| 984 1072 | 
             
                  if !hport.is_a?(Hash) or hport.size != 1 then
         | 
| @@ -1111,9 +1199,6 @@ HTMLRESPONSE | |
| 1111 1199 | 
             
                  val = "0" unless val
         | 
| 1112 1200 | 
             
                  val = val.gsub("%20"," ")
         | 
| 1113 1201 | 
             
                  # Replace the names by the corresponding ports read result.
         | 
| 1114 | 
            -
                  # val = val.gsub(/([^0-9\.A-Z][_a-z][_a-zA-Z0-9]*)/) do |str|
         | 
| 1115 | 
            -
                  #   RubyHDL.send(Regexp.last_match[1]).to_s rescue 0
         | 
| 1116 | 
            -
                  # end
         | 
| 1117 1202 | 
             
                  val = val.gsub(/([\._a-zA-Z0-9]+)/) do |str|
         | 
| 1118 1203 | 
             
                    if str[0] >= "a" && str[0] <= "z" then
         | 
| 1119 1204 | 
             
                      # Variable identifier, process it if recognized.
         | 
| @@ -1130,6 +1215,7 @@ HTMLRESPONSE | |
| 1130 1215 | 
             
                    $SAFE = 2
         | 
| 1131 1216 | 
             
                    res = eval(val).to_i
         | 
| 1132 1217 | 
             
                  rescue SyntaxError => se
         | 
| 1218 | 
            +
                  rescue StandardError => se
         | 
| 1133 1219 | 
             
                  end
         | 
| 1134 1220 | 
             
                  $SAFE = safe
         | 
| 1135 1221 | 
             
                  return res
         | 
    
        data/lib/HDLRuby/version.rb
    CHANGED
    
    
    
        data/tuto/tutorial_sw.html
    CHANGED
    
    | @@ -3047,9 +3047,11 @@ end | |
| 3047 3047 | 
             
            </li>
         | 
| 3048 3048 | 
             
            <li><p><code>led</code>: represents a set of LEDs, their number is set to match the bit-width of the attached signal.</p>
         | 
| 3049 3049 | 
             
            </li>
         | 
| 3050 | 
            -
            <li><p><code> | 
| 3050 | 
            +
            <li><p><code>slider</code>: represents an horizontal slider.</p>
         | 
| 3051 3051 | 
             
            </li>
         | 
| 3052 | 
            -
            <li><p><code> | 
| 3052 | 
            +
            <li><p><code>text</code>: represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named <code>leds</code>, it will be accessible as a variable.</p>
         | 
| 3053 | 
            +
            </li>
         | 
| 3054 | 
            +
            <li><p><code>hook</code>: attaches a signal to the board without displaying. It can be used as a variable in <code>text</code> expressions, similar to display objects.</p>
         | 
| 3053 3055 | 
             
            </li>
         | 
| 3054 3056 | 
             
            <li><p><code>hexa</code>: represents a hexadecimal number display, its character width is set to match the width of the largest possible value of the attached signal.</p>
         | 
| 3055 3057 | 
             
            </li>
         | 
    
        data/tuto/tutorial_sw.md
    CHANGED
    
    | @@ -3750,9 +3750,11 @@ And the comprise the following: | |
| 3750 3750 |  | 
| 3751 3751 | 
             
             * `led`: represents a set of LEDs, their number is set to match the bit-width of the attached signal.
         | 
| 3752 3752 |  | 
| 3753 | 
            -
             * ` | 
| 3753 | 
            +
             * `slider`: represents an horizontal slider.
         | 
| 3754 3754 |  | 
| 3755 | 
            -
             * ` | 
| 3755 | 
            +
             * `text`: represents a text input box whose content is interpreted as an expression. The syntax of the expression follows Ruby, and the available variables include the board's display objects. For example, if a set of LEDs is named `leds`, it will be accessible as a variable.
         | 
| 3756 | 
            +
             | 
| 3757 | 
            +
             * `hook`: attaches a signal to the board without displaying. It can be used as a variable in `text` expressions, similar to display objects.
         | 
| 3756 3758 |  | 
| 3757 3759 | 
             
             * `hexa`: represents a hexadecimal number display, its character width is set to match the width of the largest possible value of the attached signal.
         | 
| 3758 3760 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: HDLRuby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.6. | 
| 4 | 
            +
              version: 3.6.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Lovic Gauthier
         | 
| 8 8 | 
             
            bindir: exe
         | 
| 9 9 | 
             
            cert_chain: []
         | 
| 10 | 
            -
            date: 2025-01- | 
| 10 | 
            +
            date: 2025-01-09 00:00:00.000000000 Z
         | 
| 11 11 | 
             
            dependencies:
         | 
| 12 12 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 13 13 | 
             
              name: bundler
         |