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,
lib/HDLRuby/hruby_low_casts_without_expression.rb

Overview

Extends the TimeRepeat class with functionality for extracting expressions from cast.

Direct Known Subclasses

High::TimeRepeat

Constant Summary

Constants included from Low2Symbol

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

Instance Attribute Summary collapse

Attributes included from Hdecorator

#hdr_id

Attributes included from Hparent

#parent

Instance Method Summary collapse

Methods inherited from Statement

#add_blocks_code, #add_make_block, #behavior, #block, #break_types!, #delete_related!, #delete_unless!, #par_in_seq2seq!, #parent_system, #scope, #to_ch, #to_seq!, #top_block, #top_scope, #use_name?, #with_boolean!

Methods included from Low2Symbol

#to_sym

Methods included from Hdecorator

decorate_parent_id, dump, each, each_with_property, get, included, load, #properties

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.



3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
# File 'lib/HDLRuby/hruby_low.rb', line 3676

def initialize(statement,delay)
    # Check and set the statement.
    unless statement.is_a?(Statement)
        raise AnyError,
              "Invalid class for a statement: #{statement.class}."
    end
    super()
    @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



3669
3670
3671
# File 'lib/HDLRuby/hruby_low.rb', line 3669

def delay
  @delay
end

#statementObject (readonly)

The statement to execute.



3672
3673
3674
# File 'lib/HDLRuby/hruby_low.rb', line 3672

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

#casts_without_expression!Object

Extracts the expressions from the casts.



133
134
135
136
137
# File 'lib/HDLRuby/hruby_low_casts_without_expression.rb', line 133

def casts_without_expression!
    # Simply recurse on the stamtement.
    self.statement.casts_without_expression!
    return self
end

#cloneObject

Clones the TimeRepeat (deeply)



3724
3725
3726
# File 'lib/HDLRuby/hruby_low.rb', line 3724

def clone
    return TimeRepeat.new(@statement.clone,@delay.clone)
end

#each_block(&ruby_block) ⇒ Object

Iterates over the sub blocks.



3747
3748
3749
3750
3751
3752
3753
# File 'lib/HDLRuby/hruby_low.rb', line 3747

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.



3756
3757
3758
3759
3760
3761
3762
# File 'lib/HDLRuby/hruby_low.rb', line 3756

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_deep(&ruby_block) ⇒ Object

Iterates over each object deeply.

Returns an enumerator if no ruby block is given.



3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
# File 'lib/HDLRuby/hruby_low.rb', line 3699

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 statement.
    self.statement.each_deep(&ruby_block)
    # Then apply on the delay.
    self.delay.each_deep(&ruby_block)
end

#each_node(&ruby_block) ⇒ Object

Iterates over the expression children if any.



3729
3730
3731
3732
3733
3734
# File 'lib/HDLRuby/hruby_low.rb', line 3729

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.



3737
3738
3739
3740
3741
3742
3743
3744
# File 'lib/HDLRuby/hruby_low.rb', line 3737

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.



3765
3766
3767
3768
3769
3770
3771
3772
3773
# File 'lib/HDLRuby/hruby_low.rb', line 3765

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)


3711
3712
3713
3714
3715
3716
# File 'lib/HDLRuby/hruby_low.rb', line 3711

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.



3719
3720
3721
# File 'lib/HDLRuby/hruby_low.rb', line 3719

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.



1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
# File 'lib/HDLRuby/hruby_low2c.rb', line 1305

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