Class: Symbol

Inherits:
Object
  • Object
show all
Defined in:
lib/HDLRuby/hruby_high.rb,
lib/HDLRuby/hruby_low2sym.rb

Overview

Extends the symbol class for auto declaration of input or output.

Constant Summary collapse

High =
HDLRuby::High

Instance Method Summary collapse

Instance Method Details

#to_hdrObject

Convert to the equivalent HDLRuby object if any, returns nil if not.



50
51
52
# File 'lib/HDLRuby/hruby_low2sym.rb', line 50

def to_hdr
    return Low2Symbol::Symbol2LowTable[self]
end

#to_valueObject Also known as: to_expr

Converts to a new value.

Returns nil if no value can be obtained from it.



5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
# File 'lib/HDLRuby/hruby_high.rb', line 5487

def to_value
    str = self.to_s
    return nil if str[0] != "_" # Bit string are prefixed by "_"
    # Get and check the type
    # type = str[0]
    type = str[1]
    if ["0", "1", "z", "Z", "o", "d", "h"].include?(type) then
        # Default binary
        type = "b"
    else
        # Not a default type
        # str = str[1..-1]
        str = str[2..-1]
    end
    return nil unless ["b","u","s"].include?(type)
    # Remove the "_"
    str = str.delete("_")
    return nil if str.empty?
    # Get the width if any.
    if str[0].match(/[0-9]/) then
        width = str.scan(/[0-9]*/)[0]
    else
        width = nil
    end
    # puts "width=#{width}"
    old_str = str # Save the string it this state since its first chars
                  # can be erroneously considered as giving the width
    str = str[width.size..-1] if width
    # Get the base and the value
    base = str[0]
    # puts "base=#{base}\n"
    unless ["b", "o", "d", "h"].include?(base) then
        # No base found, default is bit
        base = "b"
        # And the width was actually a part of the value.
        value = old_str
        width = nil
    else
        # Get the value.
        value = str[1..-1]
    end
    # puts "value=#{value}"
    # Compute the bit width and the value
    case base
    when "b" then
        # base 2, compute the width
        width = width ? width.to_i : value.size
        # Check the value
        return nil unless value.match(/^[0-1zxZX]+$/)
    when "o" then
        # base 8, compute the width
        width = width ? width.to_i : value.size * 3
        # Check the value
        if value.match(/^[0-7xXzZ]+$/) then
            # 4-state value, conpute the correspondig bit string.
            value = value.each_char.map do |c|
                c = c.upcase
                if c == "X" or c.upcase == "Z" then
                    c * 3
                else
                    c.to_i(8).to_s(2).rjust(3,"0")
                end
            end.join
        else
            # Invalid value
            return nil
        end
    when "d" then
        # base 10, compute the width 
        width = width ? width.to_i : value.to_i.to_s(2).size + 1
        # Check the value
        return nil unless value.match(/^[0-9]+$/)
        # Compute it (base 10 values cannot be 4-state!)
        value = value.to_i.to_s(2)
    when "h" then
        # base 16, compute the width
        width = width ? width.to_i : value.size * 4
        # Check the value
        if value.match(/^[0-9a-fA-FxXzZ]+$/) then
            # 4-state value, conpute the correspondig bit string.
            value = value.each_char.map do |c|
                c = c.upcase
                if c == "X" or c.upcase == "Z" then
                    c * 4
                else
                    c.to_i(16).to_s(2).rjust(4,"0")
                end
            end.join
        else
            # Invalid value
            return nil
        end
    else
        # Unknown base
        return nil
    end
    # Compute the type.
    case type
    when "b" then
        type = bit[width]
    when "u" then
        type = unsigned[width]
    when "s" then
        type = signed[width]
    else
        # Unknown type
        return nil
    end
    # puts "type.width=#{type.width}, value=#{value}"
    # Create and return the value.
    return Value.new(type,value)
end

#to_value?Boolean

Tell if the expression can be converted to a value.

Returns:

  • (Boolean)


5480
5481
5482
# File 'lib/HDLRuby/hruby_high.rb', line 5480

def to_value?
    return true
end