Class: HDLRuby::Low::TimeRepeat
- Defined in:
- lib/HDLRuby/hruby_db.rb,
lib/HDLRuby/hruby_low.rb,
lib/HDLRuby/hruby_low2c.rb,
lib/HDLRuby/hruby_low2seq.rb,
lib/HDLRuby/hruby_low2vhd.rb,
lib/HDLRuby/hruby_low2high.rb,
lib/HDLRuby/hruby_low_mutable.rb,
lib/HDLRuby/hruby_low_skeleton.rb,
lib/HDLRuby/hruby_low_fix_types.rb,
lib/HDLRuby/hruby_low_bool2select.rb,
lib/HDLRuby/hruby_low_without_select.rb,
lib/HDLRuby/hruby_low_without_namespace.rb
Overview
Extends the When class with functionality for moving the declarations to the upper namespace.
Direct Known Subclasses
Constant Summary
Constants included from Low2Symbol
Low2Symbol::Low2SymbolPrefix, Low2Symbol::Low2SymbolTable, Low2Symbol::Symbol2LowTable
Instance Attribute Summary collapse
-
#delay ⇒ Object
readonly
The delay until the loop is repeated.
-
#statement ⇒ Object
readonly
The statement to execute.
Attributes included from Hparent
Instance Method Summary collapse
-
#blocks2seq! ⇒ Object
Converts the par sub blocks to seq.
-
#boolean_in_assign2select! ⇒ Object
Converts booleans in assignments to select operators.
-
#clone ⇒ Object
Clones the TimeRepeat (deeply).
-
#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_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! ⇒ Object
Explicit the types conversions in the time repeat.
-
#extract_declares! ⇒ Object
Extract the declares from the scope and returns them into an array.
-
#extract_selects! ⇒ Object
Extract the Select expressions.
-
#hash ⇒ Object
Hash function.
-
#initialize(statement, delay) ⇒ TimeRepeat
constructor
Creates a new timed loop statement execute in a loop +statement+ until +delay+ has passed.
-
#map_nodes!(&ruby_block) ⇒ Object
Maps on the child.
-
#mix?(mode = nil) ⇒ Boolean
Tell if there is a mix block.
-
#process_to_vhdl(vars, level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code as a new process.
-
#replace_expressions!(node2rep) ⇒ Object
Replaces sub expressions using +node2rep+ table indicating the node to replace and the corresponding replacement.
-
#replace_names!(former, nname) ⇒ Object
Replaces recursively +former+ name by +nname+ until it is redeclared.
-
#set_delay!(delay) ⇒ Object
Sets the delay.
-
#set_statement!(statement) ⇒ Object
Sets the statement.
-
#to_c(level = 0) ⇒ Object
Generates the C text of the equivalent HDLRuby::High code.
-
#to_high(level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code.
-
#to_upper_space! ⇒ Object
Moves the declarations to the upper namespace.
-
#to_vhdl(vars, level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code.
Methods inherited from Statement
#add_blocks_code, #behavior, #block, #break_types!, #delete_related!, #delete_unless!, #parent_system, #scope, #top_block, #top_scope, #use_name?, #with_boolean!
Methods included from Low2Symbol
Methods included from Hparent
Constructor Details
#initialize(statement, delay) ⇒ TimeRepeat
Creates a new timed loop statement execute in a loop +statement+ until +delay+ has passed.
3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 |
# File 'lib/HDLRuby/hruby_low.rb', line 3368 def initialize(statement,delay) # Check and set the statement. unless statement.is_a?(Statement) raise AnyError, "Invalid class for a statement: #{statement.class}." end @statement = statement # And set its parent. statement.parent = self # Check and set the delay. unless delay.is_a?(Delay) raise AnyError, "Invalid class for a delay: #{delay.class}." end @delay = delay # And set its parent. delay.parent = self end |
Instance Attribute Details
#delay ⇒ Object (readonly)
The delay until the loop is repeated
3361 3362 3363 |
# File 'lib/HDLRuby/hruby_low.rb', line 3361 def delay @delay end |
#statement ⇒ Object (readonly)
The statement to execute.
3364 3365 3366 |
# File 'lib/HDLRuby/hruby_low.rb', line 3364 def statement @statement end |
Instance Method Details
#blocks2seq! ⇒ Object
Converts the par sub blocks to seq.
178 179 180 181 182 |
# File 'lib/HDLRuby/hruby_low2seq.rb', line 178 def blocks2seq! # Converts the statement. self.statement.blocks2seq! return self end |
#boolean_in_assign2select! ⇒ Object
Converts booleans in assignments to select operators.
136 137 138 139 140 |
# File 'lib/HDLRuby/hruby_low_bool2select.rb', line 136 def boolean_in_assign2select! # Simply recurse on the stamtement. self.statement.boolean_in_assign2select! return self end |
#clone ⇒ Object
Clones the TimeRepeat (deeply)
3401 3402 3403 |
# File 'lib/HDLRuby/hruby_low.rb', line 3401 def clone return TimeRepeat.new(@statement.clone,@delay.clone) end |
#each_block(&ruby_block) ⇒ Object
Iterates over the sub blocks.
3424 3425 3426 3427 3428 3429 3430 |
# File 'lib/HDLRuby/hruby_low.rb', line 3424 def each_block(&ruby_block) # No ruby block? Return an enumerator. return to_enum(:each_block) unless ruby_block # A ruby block? # Apply it on the statement if it is a block. ruby_block.call(@statement) if statement.is_a?(Block) end |
#each_block_deep(&ruby_block) ⇒ Object
Iterates over all the blocks contained in the current block.
3433 3434 3435 3436 3437 3438 3439 |
# File 'lib/HDLRuby/hruby_low.rb', line 3433 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 the statement. @statement.each_block_deep(&ruby_block) end |
#each_node(&ruby_block) ⇒ Object
Iterates over the expression children if any.
3406 3407 3408 3409 3410 3411 |
# File 'lib/HDLRuby/hruby_low.rb', line 3406 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 the child. ruby_block.call(@statement) end |
#each_node_deep(&ruby_block) ⇒ Object
Iterates over the nodes deeply if any.
3414 3415 3416 3417 3418 3419 3420 3421 |
# File 'lib/HDLRuby/hruby_low.rb', line 3414 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 recurse on the child @statement.each_node_deep(&ruby_block) end |
#each_statement_deep(&ruby_block) ⇒ Object
Iterates over all the statements contained in the current block.
3442 3443 3444 3445 3446 3447 3448 3449 3450 |
# File 'lib/HDLRuby/hruby_low.rb', line 3442 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 the statement. @statement.each_statement_deep(&ruby_block) end |
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
3388 3389 3390 3391 3392 3393 |
# File 'lib/HDLRuby/hruby_low.rb', line 3388 def eql?(obj) return false unless obj.is_a?(TimeRepeat) return false unless @delay.eql?(obj.delay) return false unless @statement.eql?(obj.statement) return true end |
#explicit_types! ⇒ Object
Explicit the types conversions in the time repeat.
152 153 154 155 156 |
# File 'lib/HDLRuby/hruby_low_fix_types.rb', line 152 def explicit_types! # Recurse on the statement. self.statement.explicit_types! return self end |
#extract_declares! ⇒ Object
Extract the declares from the scope and returns them into an array.
NOTE: do not recurse into the sub scopes or behaviors!
650 651 652 653 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 650 def extract_declares! # Recurse on the statement. return self.statement.extract_declares! end |
#extract_selects! ⇒ Object
Extract the Select expressions.
116 117 118 119 120 121 122 123 |
# File 'lib/HDLRuby/hruby_low_without_select.rb', line 116 def extract_selects! # Simply recruse on the statement. if self.statement.is_a?(Block) then return [] else return self.statement.extract_selects! end end |
#hash ⇒ Object
Hash function.
3396 3397 3398 |
# File 'lib/HDLRuby/hruby_low.rb', line 3396 def hash return [@delay,@statement].hash end |
#map_nodes!(&ruby_block) ⇒ Object
Maps on the child.
1006 1007 1008 1009 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 1006 def map_nodes!(&ruby_block) @statement = ruby_block.call(@statement) @statement.parent = self unless @statement.parent end |
#mix?(mode = nil) ⇒ Boolean
Tell if there is a mix block. +mode+ is the mode of the upper block.
186 187 188 189 |
# File 'lib/HDLRuby/hruby_low2seq.rb', line 186 def mix?(mode = nil) # Check the statement. return self.statement.mix?(mode) end |
#process_to_vhdl(vars, level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code as a new process. +vars+ is the list of the variables and +level+ is the hierachical level of the object.
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 |
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 1034 def process_to_vhdl(vars,level = 0) # Generate a separate process for the repeated statement with # a wait. # The resulting string. res = " " * (level*3) # Generate the header. unless self.block.name.empty? then res << Low2VHDL.vhdl_name(self.block.name) << ": " end res << "process \n" # Generate the content. res << " " * (level*3) res << "begin\n" # Adds the wait. res << " " * ((level+1)*3) res << "wait for " << self.delay.to_vhdl(level) << ";\n" # Generate the remaining of the body. res << self.statement.to_vhdl(vars,level+1) # Close the process. res << " " * (level*3) res << "end process;\n\n" # Return the result. return res end |
#replace_expressions!(node2rep) ⇒ Object
Replaces sub expressions using +node2rep+ table indicating the node to replace and the corresponding replacement. Returns the actually replaced nodes and their corresponding replacement.
NOTE: the replacement is duplicated.
1017 1018 1019 1020 1021 1022 1023 1024 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 1017 def replace_expressions!(node2rep) res = {} # Recurse on the children. self.each_node do |node| res.merge!(node.replace_expressions!(node2rep)) end return res end |
#replace_names!(former, nname) ⇒ Object
Replaces recursively +former+ name by +nname+ until it is redeclared.
656 657 658 659 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 656 def replace_names!(former,nname) # Recurse on the statement. self.statement.replace_names!(former,nname) end |
#set_delay!(delay) ⇒ Object
Sets the delay.
995 996 997 998 999 1000 1001 1002 1003 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 995 def set_delay!(delay) # Check and set the delay. unless delay.is_a?(Delay) raise AnyError, "Invalid class for a delay: #{delay.class}." end @delay = delay # And set its parent. delay.parent = self end |
#set_statement!(statement) ⇒ Object
Sets the statement.
983 984 985 986 987 988 989 990 991 992 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 983 def set_statement!(statement) # Check and set the statement. unless statement.is_a?(Statement) raise AnyError, "Invalid class for a statement: #{statement.class}." end @statement = statement # And set its parent. statement.parent = self end |
#to_c(level = 0) ⇒ Object
Generates the C text of the equivalent HDLRuby::High code. +level+ is the hierachical level of the object.
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 |
# File 'lib/HDLRuby/hruby_low2c.rb', line 1254 def to_c(level = 0) # The resulting string. res = " " * level*3 # Generate an infinite loop executing the block and waiting. res << "for(;;) {\n" res << "#{self.to_c(level+1)}\n" res = " " * (level+1)*3 res << Low2C.wait_code(self,level) # Return the resulting string. return res end |
#to_high(level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code. +level+ is the hierachical level of the object.
454 455 456 457 458 459 460 461 462 463 464 465 |
# File 'lib/HDLRuby/hruby_low2high.rb', line 454 def to_high(level = 0) # The resulting string. res = " " * (level*3) # Generate the header. res << "repeat " << self.delay.to_high(level) << " do\n" # Generate the statement to repeat. res << self.statement.to_high(level+1) # Close the repeat. res << " " * (level*3) << "end\n" # Return the resulting string. return res end |
#to_upper_space! ⇒ Object
Moves the declarations to the upper namespace.
642 643 644 645 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 642 def to_upper_space! # Recurse on the statement. self.statement.to_upper_space! end |
#to_vhdl(vars, level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code. +vars+ is the list of the variables and +level+ is the hierachical level of the object.
1025 1026 1027 1028 |
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 1025 def to_vhdl(vars,level = 0) # Nothing to do, see process_to_vhdl return "" end |