Class: HDLRuby::Low::TimeRepeat

Inherits:
Statement
  • Object
show all
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

High::TimeRepeat

Constant Summary

Constants included from Low2Symbol

Low2Symbol::Low2SymbolPrefix, Low2Symbol::Low2SymbolTable, Low2Symbol::Symbol2LowTable

Instance Attribute Summary collapse

Attributes included from Hparent

#parent

Instance Method Summary collapse

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

#to_sym

Methods included from Hparent

#scope

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

#delayObject (readonly)

The delay until the loop is repeated



3361
3362
3363
# File 'lib/HDLRuby/hruby_low.rb', line 3361

def delay
  @delay
end

#statementObject (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

#cloneObject

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.

Returns:

  • (Boolean)


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

#hashObject

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.

Returns:

  • (Boolean)


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