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.
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, #leaf?, #left, #max, #min, #name=, #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.
1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1499 def initialize(name,dir,content) # Initialize the type. super(name) # Set the direction. @direction = dir.to_sym unless [:little, :big].include?(@direction) raise AnyError, "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 AnyError, "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.
1495 1496 1497 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1495 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.
1567 1568 1569 1570 1571 1572 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1567 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.
1587 1588 1589 1590 1591 1592 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1587 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.
1597 1598 1599 1600 1601 1602 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1597 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.
1577 1578 1579 1580 1581 1582 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1577 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.
1605 1606 1607 1608 1609 1610 1611 1612 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1605 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.
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1520 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.
1631 1632 1633 1634 1635 1636 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1631 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.
1550 1551 1552 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1550 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.
1556 1557 1558 1559 1560 1561 1562 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1556 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.
1535 1536 1537 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1535 def hash return [super,@types].hash end |
#struct? ⇒ Boolean
Tells if the type has named sub types.
1540 1541 1542 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1540 def struct? return true end |
#types? ⇒ Boolean
Tells if the type has sub types.
1545 1546 1547 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1545 def types? return true end |
#width ⇒ Object
Gets the bitwidth of the type, nil for undefined.
NOTE: must be redefined for specific types.
1619 1620 1621 1622 1623 1624 1625 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1619 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 |