Class: RubyHDL::High::TypeStruct

Inherits:
Type
  • Object
show all
Defined in:
lib/HDLRuby/std/sequencer_sw.rb

Overview

Describes a struct type.

Instance Attribute Summary collapse

Attributes inherited from Type

#name

Instance Method Summary collapse

Methods inherited from Type

#[], #base, #base?, #binary, #comp_operator, #constant, #define_operator, #define_operator_with_context, #each_overload, #fixed?, #float?, #hierarchical?, #htype?, #inner, #input, #leaf?, #left, #max, #min, #output, #range, #range?, #register, #regular?, #right, #signed?, #to_c, #to_c_init, #to_python_init, #to_type, #to_vector, #typedef, #unary, #unsigned?, #vector?

Methods included from HDLRuby::Tprocess

#&, #*, #+, #+@, #-@, #/, #<<, #==, #abs, #lr, #make, #resolve, #slice, #~

Constructor Details

#initialize(name, dir, content) ⇒ TypeStruct

Creates a new structure type named name with direction dir and whose hierachy is given by content.



1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1619

def initialize(name,dir,content)
  # Initialize the type.
  super(name)

  # Set the direction.
  @direction = dir.to_sym
  unless [:little, :big].include?(@direction)
    raise "Invalid direction for a type: #{dir}"
  end

  # Check and set the content.
  content = Hash[content]
  @types = content.map do |k,v|
    unless v.is_a?(Type) then
      raise "Invalid class for a type: #{v.class}"
    end
    [ k.to_sym, v ]
  end.to_h
end

Instance Attribute Details

#directionObject (readonly)

Returns the value of attribute direction.



1615
1616
1617
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1615

def direction
  @direction
end

Instance Method Details

#each(&ruby_block) ⇒ Object

Iterates over the sub name/type pair.

Returns an enumerator if no ruby block is given.



1687
1688
1689
1690
1691
1692
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1687

def each(&ruby_block)
  # No ruby block? Return an enumerator.
  return to_enum(:each) unless ruby_block
  # A ruby block? Apply it on each sub name/type pair.
  @types.each(&ruby_block)
end

#each_key(&ruby_block) ⇒ Object

Iterates over the keys.

Returns an enumerator if no ruby block is given.



1707
1708
1709
1710
1711
1712
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1707

def each_key(&ruby_block)
  # No ruby block? Return an enumerator.
  return to_enum(:each_key) unless ruby_block
  # A ruby block? Apply it on each key.
  @types.each_key(&ruby_block)
end

#each_name(&ruby_block) ⇒ Object

Iterates over the sub type names.

Returns an enumerator if no ruby block is given.



1717
1718
1719
1720
1721
1722
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1717

def each_name(&ruby_block)
  # No ruby block? Return an enumerator.
  return to_enum(:each_name) unless ruby_block
  # A ruby block? Apply it on each name.
  @types.each_key(&ruby_block)
end

#each_type(&ruby_block) ⇒ Object

Iterates over the sub types.

Returns an enumerator if no ruby block is given.



1697
1698
1699
1700
1701
1702
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1697

def each_type(&ruby_block)
  # No ruby block? Return an enumerator.
  return to_enum(:each_type) unless ruby_block
  # A ruby block? Apply it on each sub type.
  @types.each_value(&ruby_block)
end

#each_type_deep(&ruby_block) ⇒ Object Also known as: each_deep

Iterates over the types deeply if any.



1725
1726
1727
1728
1729
1730
1731
1732
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1725

def each_type_deep(&ruby_block)
  # No ruby block? Return an enumerator.
  return to_enum(:each_type_deep) unless ruby_block
  # A ruby block? First apply it to current.
  ruby_block.call(self)
  # And recurse on the sub types.
  @types.each_value { |type| type.each_type_deep(&ruby_block) }
end

#eql?(obj) ⇒ Boolean

Comparison for hash: structural comparison.

Returns:

  • (Boolean)


1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1640

def eql?(obj)
  # General type comparison.
  # return false unless super(obj)
  return false unless obj.is_a?(TypeStruct)
  # Specific comparison.
  idx = 0
  obj.each_key do |name|
    return false unless @types[name].eql?(obj.get_type(name))
    idx += 1
  end
  return false unless idx == @types.size
  return true
end

#equivalent?(type) ⇒ Boolean

Tell if type is equivalent to current type.

NOTE: type can be compatible while not being equivalent, please refer to hruby_types.rb for type compatibility.

Returns:

  • (Boolean)


1751
1752
1753
1754
1755
1756
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1751

def equivalent?(type)
  return (type.is_a?(TypeStruct) and
          !@types.to_a.zip(type.types.to_a).index do |t0,t1|
            t0[0] != t1[0] or !t0[1].equivalent?(t1[1])
          end)
end

#get_all_typesObject

Gets an array containing all the syb types.



1670
1671
1672
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1670

def get_all_types
  return @types.values
end

#get_type(name) ⇒ Object

Gets a sub type by name. NOTE: name can also be an index.



1676
1677
1678
1679
1680
1681
1682
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1676

def get_type(name)
  if name.respond_to?(:to_sym) then
    return @types[name.to_sym]
  else
    return @types.values[name.to_i]
  end
end

#hashObject

Hash function.



1655
1656
1657
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1655

def hash
  return [super,@types].hash
end

#struct?Boolean

Tells if the type has named sub types.

Returns:

  • (Boolean)


1660
1661
1662
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1660

def struct?
  return true
end

#types?Boolean

Tells if the type has sub types.

Returns:

  • (Boolean)


1665
1666
1667
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1665

def types?
  return true
end

#widthObject

Gets the bitwidth of the type, nil for undefined.

NOTE: must be redefined for specific types.



1739
1740
1741
1742
1743
1744
1745
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1739

def width
  if @types.is_a?(Array) then
    return @types.reduce(0) {|sum,type| sum + type.width }
  else
    return @types.each_value.reduce(0) {|sum,type| sum + type.width }
  end
end