Class: RubyHDL::High::Expression
- Inherits:
-
Object
- Object
- RubyHDL::High::Expression
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Overview
Describes the software implementation of an expression.
Instance Attribute Summary collapse
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Instance Method Summary collapse
-
#<=(right) ⇒ Object
The <= operator which can be either a transmit or a comparison.
-
#[](typ, rng = nil) ⇒ Object
Creates an access to elements of range +rng+ of the signal, and set the type of elements as +typ+ if given.
-
#initialize(type) ⇒ Expression
constructor
Create a new expression with +type+ data type.
-
#mux(*choices) ⇒ Object
Converts to a select operator using current expression as condition for one of the +choices+.
-
#sdownto(val, &ruby_block) ⇒ Object
HW downto iteration.
-
#seach(&ruby_block) ⇒ Object
HW iteration on each element.
-
#stimes(&ruby_block) ⇒ Object
HW times iteration.
-
#supto(val, &ruby_block) ⇒ Object
HW upto iteration.
-
#to_expr ⇒ Object
(also: #to_ref)
Converts to an expression.
-
#to_ruby ⇒ Object
(also: #to_ruby_left)
Convert to ruby code.
-
#to_value ⇒ Object
Compute the expression (convert it to a value).
Constructor Details
#initialize(type) ⇒ Expression
Create a new expression with +type+ data type.
1545 1546 1547 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1545 def initialize(type) @type = type.to_type end |
Instance Attribute Details
#type ⇒ Object (readonly)
Returns the value of attribute type.
1543 1544 1545 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1543 def type @type end |
Instance Method Details
#<=(right) ⇒ Object
The <= operator which can be either a transmit or a comparison. By default set to transmit, and converted to comparison if child of operator or condition of sif/swhile statements.
1594 1595 1596 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1594 def <=(right) return Transmit.new(self.to_expr,right.to_expr) end |
#[](typ, rng = nil) ⇒ Object
Creates an access to elements of range +rng+ of the signal, and set the type of elements as +typ+ if given.
NOTE: +rng+ can be a single expression in which case it is an index.
1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1609 def [](typ,rng=nil) # Treat the number of arguments rng, typ = typ, nil unless rng # Process the range. if rng.is_a?(::Range) then first = rng.first if (first.is_a?(::Integer)) then first = self.type.size+first if first < 0 end last = rng.last if (last.is_a?(::Integer)) then last = self.type.size+last if last < 0 end rng = first..last end if rng.is_a?(::Integer) && rng < 0 then rng = self.type.size+rng end if rng.respond_to?(:to_expr) then # Number range: convert it to an expression. rng = rng.to_expr end if rng.is_a?(Expression) then # Index case if typ then return RefIndex.new(typ,self.to_expr,rng) else return RefIndex.new(self.type.base,self.to_expr,rng) end else # Range case, ensure it is made among expression. first = rng.first.to_expr last = rng.last.to_expr # And create the reference. if typ then return RefRange.new(typ, self.to_expr,first..last) else return RefRange.new(self.type.slice(first..last), self.to_expr,first..last) end end end |
#mux(*choices) ⇒ Object
Converts to a select operator using current expression as condition for one of the +choices+.
NOTE: +choices+ can either be a list of arguments or an array. If +choices+ has only two entries (and it is not a hash), +value+ will be converted to a boolean.
1659 1660 1661 1662 1663 1664 1665 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1659 def mux(*choices) # Process the choices. choices = choices.flatten(1) if choices.size == 1 choices.map! { |choice| choice.to_expr } # Generate the select expression. return Select.new(choices[0].type,self.to_expr,*choices) end |
#sdownto(val, &ruby_block) ⇒ Object
HW downto iteration.
1688 1689 1690 1691 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1688 def sdownto(val,&ruby_block) RubyHDL::High.top_sblock << Siter.new(RubyHDL::High.top_sblock.sequencer,self,"downto",&ruby_block) end |
#seach(&ruby_block) ⇒ Object
HW iteration on each element.
1670 1671 1672 1673 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1670 def seach(&ruby_block) RubyHDL::High.top_sblock << Siter.new(RubyHDL::High.top_sblock.sequencer,self,"each",&ruby_block) end |
#stimes(&ruby_block) ⇒ Object
HW times iteration.
1676 1677 1678 1679 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1676 def stimes(&ruby_block) RubyHDL::High.top_sblock << Siter.new(RubyHDL::High.top_sblock.sequencer,self,"times",&ruby_block) end |
#supto(val, &ruby_block) ⇒ Object
HW upto iteration.
1682 1683 1684 1685 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1682 def supto(val,&ruby_block) RubyHDL::High.top_sblock << Siter.new(RubyHDL::High.top_sblock.sequencer,self,"upto",&ruby_block) end |
#to_expr ⇒ Object Also known as: to_ref
Converts to an expression.
1550 1551 1552 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1550 def to_expr self end |
#to_ruby ⇒ Object Also known as: to_ruby_left
Convert to ruby code.
1562 1563 1564 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1562 def to_ruby raise "to_ruby not defined for class: #{self.class}." end |
#to_value ⇒ Object
Compute the expression (convert it to a value).
1557 1558 1559 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1557 def to_value raise "to_value not defined here." end |