Class: RubyHDL::High::TypeStruct
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Overview
Describes a struct type.
Instance Attribute Summary collapse
-
#direction ⇒ Object
readonly
Returns the value of attribute direction.
Attributes inherited from Type
Instance Method Summary collapse
-
#each(&ruby_block) ⇒ Object
Iterates over the sub name/type pair.
-
#each_key(&ruby_block) ⇒ Object
Iterates over the keys.
-
#each_name(&ruby_block) ⇒ Object
Iterates over the sub type names.
-
#each_type(&ruby_block) ⇒ Object
Iterates over the sub types.
-
#each_type_deep(&ruby_block) ⇒ Object
(also: #each_deep)
Iterates over the types deeply if any.
-
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
-
#equivalent?(type) ⇒ Boolean
Tell if
typeis equivalent to current type. -
#get_all_types ⇒ Object
Gets an array containing all the syb types.
-
#get_type(name) ⇒ Object
Gets a sub type by
name. -
#hash ⇒ Object
Hash function.
-
#initialize(name, dir, content) ⇒ TypeStruct
constructor
Creates a new structure type named
namewith directiondirand whose hierachy is given bycontent. -
#struct? ⇒ Boolean
Tells if the type has named sub types.
-
#types? ⇒ Boolean
Tells if the type has sub types.
-
#width ⇒ Object
Gets the bitwidth of the type, nil for undefined.
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
#direction ⇒ Object (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.
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.
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_types ⇒ Object
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 |
#hash ⇒ Object
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.
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.
1665 1666 1667 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1665 def types? return true end |
#width ⇒ Object
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 |