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_c ⇒ Object
Convert to C code.
-
#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.
1744 1745 1746 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1744 def initialize(type) @type = type.to_type end |
Instance Attribute Details
#type ⇒ Object (readonly)
Returns the value of attribute type.
1742 1743 1744 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1742 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.
1798 1799 1800 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1798 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.
1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1813 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.
1863 1864 1865 1866 1867 1868 1869 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1863 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.
1892 1893 1894 1895 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1892 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.
1874 1875 1876 1877 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1874 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.
1880 1881 1882 1883 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1880 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.
1886 1887 1888 1889 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1886 def supto(val,&ruby_block) RubyHDL::High.top_sblock << Siter.new(RubyHDL::High.top_sblock.sequencer,self,"upto",&ruby_block) end |
#to_c ⇒ Object
Convert to C code.
1766 1767 1768 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1766 def to_c raise "to_c not defined for class: #{self.class}." end |
#to_expr ⇒ Object Also known as: to_ref
Converts to an expression.
1749 1750 1751 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1749 def to_expr self end |
#to_ruby ⇒ Object Also known as: to_ruby_left
Convert to Ruby code.
1761 1762 1763 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1761 def to_ruby raise "to_ruby not defined for class: #{self.class}." end |
#to_value ⇒ Object
Compute the expression (convert it to a value).
1756 1757 1758 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1756 def to_value raise "to_value not defined here." end |