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_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.
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1567 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.
1563 1564 1565 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1563 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.
1635 1636 1637 1638 1639 1640 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1635 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.
1655 1656 1657 1658 1659 1660 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1655 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.
1665 1666 1667 1668 1669 1670 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1665 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.
1645 1646 1647 1648 1649 1650 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1645 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.
1673 1674 1675 1676 1677 1678 1679 1680 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1673 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.
1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1588 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.
1699 1700 1701 1702 1703 1704 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1699 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.
1618 1619 1620 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1618 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.
1624 1625 1626 1627 1628 1629 1630 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1624 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.
1603 1604 1605 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1603 def hash return [super,@types].hash end |
#struct? ⇒ Boolean
Tells if the type has named sub types.
1608 1609 1610 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1608 def struct? return true end |
#types? ⇒ Boolean
Tells if the type has sub types.
1613 1614 1615 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1613 def types? return true end |
#width ⇒ Object
Gets the bitwidth of the type, nil for undefined.
NOTE: must be redefined for specific types.
1687 1688 1689 1690 1691 1692 1693 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1687 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 |