Class: HDLRuby::Low::StringE
- Inherits:
-
Expression
- Object
- Base::Expression
- Expression
- HDLRuby::Low::StringE
- Defined in:
- lib/HDLRuby/hruby_low.rb,
lib/HDLRuby/hruby_low2vhd.rb,
lib/HDLRuby/hruby_verilog.rb,
lib/HDLRuby/hruby_low2high.rb,
lib/HDLRuby/hruby_low_mutable.rb,
lib/HDLRuby/hruby_low_fix_types.rb,
lib/HDLRuby/hruby_low_bool2select.rb,
lib/HDLRuby/hruby_low_casts_without_expression.rb
Overview
Extends the StringE class with functionality for extracting expressions from cast.
Direct Known Subclasses
Constant Summary
Constants included from Low2Symbol
Low2Symbol::Low2SymbolPrefix, Low2Symbol::Low2SymbolTable, Low2Symbol::Symbol2LowTable
Instance Attribute Summary collapse
-
#content ⇒ Object
readonly
Returns the value of attribute content.
Attributes inherited from Expression
Attributes included from Hparent
Instance Method Summary collapse
-
#boolean_in_assign2select ⇒ Object
Converts booleans in assignments to select operators.
-
#casts_without_expression! ⇒ Object
Extracts the expressions from the casts.
-
#clone ⇒ Object
Clones the string.
-
#each_arg(&ruby_block) ⇒ Object
Iterates over each argument.
-
#each_block(&ruby_block) ⇒ Object
Iterates over the sub blocks.
-
#each_block_deep(&ruby_block) ⇒ Object
Iterates over all the blocks contained in the current block.
-
#each_deep(&ruby_block) ⇒ Object
Iterates over each object deeply.
-
#each_node(&ruby_block) ⇒ Object
Iterates over the expression children if any.
-
#each_node_deep(&ruby_block) ⇒ Object
Iterates over the nodes deeply if any.
-
#each_statement_deep(&ruby_block) ⇒ Object
Iterates over all the statements contained in the current block.
-
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
-
#explicit_types(type = nil) ⇒ Object
Explicit the types conversions in the concat where +type+ is the expected type of the condition if any.
-
#hash ⇒ Object
Hash function.
-
#immutable? ⇒ Boolean
Tells if the expression is immutable (cannot be written.).
-
#initialize(content, *args) ⇒ StringE
constructor
Creates a new string whose content is +str+ and is modified using the objects of +args+.
-
#map_args!(&ruby_block) ⇒ Object
Maps on the arguments.
-
#map_nodes!(&ruby_block) ⇒ Object
Maps on the children.
-
#to_high ⇒ Object
Creates a new high string expression.
-
#to_verilog(spc = 3) ⇒ Object
Converts the system to Verilog code.
-
#to_vhdl(level = 0, std_logic = false) ⇒ Object
Generates the text of the equivalent HDLRuby::High code.
Methods inherited from Expression
#boolean?, #break_types!, #each_ref_deep, #extract_selects_to!, #leftvalue?, #replace_expressions!, #replace_names!, #rightvalue?, #set_type!, #statement, #to_c, #to_c_expr, #to_hdr, #use_name?
Methods included from Low2Symbol
Methods included from Hparent
#hierarchy, #no_parent!, #scope
Constructor Details
#initialize(content, *args) ⇒ StringE
Creates a new string whose content is +str+ and is modified using the objects of +args+.
5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 |
# File 'lib/HDLRuby/hruby_low.rb', line 5994 def initialize(content,*args) super(StringT) # Checks and set the content. @content = content.to_s # Process the arguments. @args = args.map do |arg| arg.parent = self arg end end |
Instance Attribute Details
#content ⇒ Object (readonly)
Returns the value of attribute content.
5990 5991 5992 |
# File 'lib/HDLRuby/hruby_low.rb', line 5990 def content @content end |
Instance Method Details
#boolean_in_assign2select ⇒ Object
Converts booleans in assignments to select operators.
351 352 353 354 355 356 357 |
# File 'lib/HDLRuby/hruby_low_bool2select.rb', line 351 def boolean_in_assign2select # Apply on the content. # Apply on the arguments. return StringE.new(self.content.clone,*self.each_arg.map do |arg| arg.boolean_in_assign2select end) end |
#casts_without_expression! ⇒ Object
Extracts the expressions from the casts.
369 370 371 372 373 374 |
# File 'lib/HDLRuby/hruby_low_casts_without_expression.rb', line 369 def casts_without_expression! # return StringE.new(self.content, # *self.each_arg.map(&:casts_without_expression)) self.map_args! {|arg| arg.casts_without_expression! } return self end |
#clone ⇒ Object
Clones the string.
6049 6050 6051 |
# File 'lib/HDLRuby/hruby_low.rb', line 6049 def clone return StringE.new(@content.clone,*@args.map {|arg| arg.clone}) end |
#each_arg(&ruby_block) ⇒ Object
Iterates over each argument.
Returns an enumerator if no ruby block is given.
6024 6025 6026 6027 6028 6029 |
# File 'lib/HDLRuby/hruby_low.rb', line 6024 def each_arg(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_arg) unless ruby_block # A ruby block? First apply it to each argument. @args.each(&ruby_block) end |
#each_block(&ruby_block) ⇒ Object
Iterates over the sub blocks.
6073 6074 6075 6076 6077 6078 6079 6080 6081 |
# File 'lib/HDLRuby/hruby_low.rb', line 6073 def each_block(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_block) unless ruby_block # A ruby block? # Recurse on each argument. @args.each do |arg| arg.each_block(&ruby_block) if arg.respond_to?(:each_block) end end |
#each_block_deep(&ruby_block) ⇒ Object
Iterates over all the blocks contained in the current block.
6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 |
# File 'lib/HDLRuby/hruby_low.rb', line 6084 def each_block_deep(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_block_deep) unless ruby_block # A ruby block? # Recurse on each argument. @args.each do |arg| if arg.respond_to?(:each_block_deep) then arg.each_block_deep(&ruby_block) end end end |
#each_deep(&ruby_block) ⇒ Object
Iterates over each object deeply.
Returns an enumerator if no ruby block is given.
6034 6035 6036 6037 6038 6039 6040 6041 |
# File 'lib/HDLRuby/hruby_low.rb', line 6034 def each_deep(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_deep) unless ruby_block # A ruby block? First apply it to current. ruby_block.call(self) # Then apply on the arguments. self.each_arg(&ruby_block) end |
#each_node(&ruby_block) ⇒ Object
Iterates over the expression children if any.
6054 6055 6056 6057 6058 6059 6060 |
# File 'lib/HDLRuby/hruby_low.rb', line 6054 def each_node(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_node) unless ruby_block # A ruby block? # Apply it on each argument. @args.each(&ruby_block) end |
#each_node_deep(&ruby_block) ⇒ Object
Iterates over the nodes deeply if any.
6063 6064 6065 6066 6067 6068 6069 6070 |
# File 'lib/HDLRuby/hruby_low.rb', line 6063 def each_node_deep(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_node_deep) unless ruby_block # A ruby block? First apply it to current. ruby_block.call(self) # And apply it on each argument. @args.each(&ruby_block) end |
#each_statement_deep(&ruby_block) ⇒ Object
Iterates over all the statements contained in the current block.
6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 |
# File 'lib/HDLRuby/hruby_low.rb', line 6097 def each_statement_deep(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_statement_deep) unless ruby_block # A ruby block? # Apply it on self. ruby_block.call(self) # Recurse on each argument. @args.each do |arg| if arg.respond_to?(:each_statement_deep) then arg.each_statement_deep(&ruby_block) end end end |
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
6012 6013 6014 6015 6016 6017 6018 6019 |
# File 'lib/HDLRuby/hruby_low.rb', line 6012 def eql?(obj) return false unless obj.is_a?(StringE) return false unless @content.eql?(obj.content) return false if @args.each.zip(obj.each_arg).any? do |a0,a1| !a0.eql?(a1) end return true end |
#explicit_types(type = nil) ⇒ Object
Explicit the types conversions in the concat where +type+ is the expected type of the condition if any.
478 479 480 481 |
# File 'lib/HDLRuby/hruby_low_fix_types.rb', line 478 def explicit_types(type = nil) return StringE.new(self.content, *self.each_arg.map(&:explicit_types)) end |
#hash ⇒ Object
Hash function.
6044 6045 6046 |
# File 'lib/HDLRuby/hruby_low.rb', line 6044 def hash return @args.hash end |
#immutable? ⇒ Boolean
Tells if the expression is immutable (cannot be written.)
6006 6007 6008 6009 |
# File 'lib/HDLRuby/hruby_low.rb', line 6006 def immutable? # String objects are always immutable. true end |
#map_args!(&ruby_block) ⇒ Object
Maps on the arguments.
1982 1983 1984 1985 1986 1987 1988 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 1982 def map_args!(&ruby_block) @args.map! do |arg| arg = ruby_block.call(arg) arg.parent = self unless arg.parent arg end end |
#map_nodes!(&ruby_block) ⇒ Object
Maps on the children.
1991 1992 1993 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 1991 def map_nodes!(&ruby_block) self.map_args!(&ruby_block) end |
#to_high ⇒ Object
Creates a new high string expression.
515 516 517 518 |
# File 'lib/HDLRuby/hruby_low2high.rb', line 515 def to_high return HDLRuby::High::StringE.new(self.content, *self.each_arg.map {|arg| arg.to_high }) end |
#to_verilog(spc = 3) ⇒ Object
Converts the system to Verilog code.
2260 2261 2262 2263 2264 2265 2266 |
# File 'lib/HDLRuby/hruby_verilog.rb', line 2260 def to_verilog(spc = 3) code = "\"#{Low.v_string(self.content)}" + "#{self.each_arg.map do |arg| to.to_verilog end.join(",")}\"" return code end |
#to_vhdl(level = 0, std_logic = false) ⇒ Object
Generates the text of the equivalent HDLRuby::High code. +level+ is the hierachical level of the object.
1532 1533 1534 1535 1536 |
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 1532 def to_vhdl(level = 0, std_logic = false) # Generate a report statement. return "\"#{Low2VHDL.vhdl_string(self.content)}\"" + self.each_arg.map { |arg| arg.to_vhdl }.join(" & ") end |