Class: HDLRuby::Low::Statement

Inherits:
Base::Statement
  • Object
show all
Includes:
Hparent, Low2Symbol
Defined in:
lib/HDLRuby/hruby_db.rb,
lib/HDLRuby/hruby_low.rb,
lib/HDLRuby/hruby_low2c.rb,
lib/HDLRuby/hruby_low2hdr.rb,
lib/HDLRuby/hruby_low2seq.rb,
lib/HDLRuby/hruby_low2sym.rb,
lib/HDLRuby/hruby_low2vhd.rb,
lib/HDLRuby/hruby_low2high.rb,
lib/HDLRuby/hruby_low_cleanup.rb,
lib/HDLRuby/hruby_low_mutable.rb,
lib/HDLRuby/hruby_low_skeleton.rb,
lib/HDLRuby/hruby_low_fix_types.rb,
lib/HDLRuby/hruby_low_with_bool.rb,
lib/HDLRuby/hruby_low_without_parinseq.rb,
lib/HDLRuby/hruby_low_without_namespace.rb

Overview

Extends the Statement class with functionality for moving the declarations to the upper namespace.

Direct Known Subclasses

Block, Case, If, Print, TimeRepeat, TimeWait, Transmit

Constant Summary

Constants included from Low2Symbol

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

Instance Attribute Summary

Attributes included from Hparent

#parent

Instance Method Summary collapse

Methods included from Low2Symbol

#to_sym

Methods included from Hparent

#hierarchy

Instance Method Details

#add_blocks_code(res, level) ⇒ Object

Adds the c code of the blocks to +res+ at +level+



1192
1193
1194
1195
1196
1197
1198
1199
1200
# File 'lib/HDLRuby/hruby_low2c.rb', line 1192

def add_blocks_code(res,level)
    if self.respond_to?(:each_node) then
        self.each_node do |node|
            if node.respond_to?(:add_blocks_code) then
                node.add_blocks_code(res,level)
            end
        end
    end
end

#add_make_block(res, level) ⇒ Object

Adds the creation of the blocks to +res+ at +level+.



1203
1204
1205
1206
1207
1208
1209
1210
1211
# File 'lib/HDLRuby/hruby_low2c.rb', line 1203

def add_make_block(res,level)
    if self.respond_to?(:each_node) then
        self.each_node do |node|
            if node.respond_to?(:add_blocks_code) then
                node.add_make_block(res,level)
            end
        end
    end
end

#behaviorObject

Gets the behavior the statement is in.



2885
2886
2887
2888
2889
2890
2891
# File 'lib/HDLRuby/hruby_low.rb', line 2885

def behavior
    if self.parent.is_a?(Behavior) then
        return self.parent
    else
        return self.parent.behavior
    end
end

#blockObject

Get the block of the statement.



2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
# File 'lib/HDLRuby/hruby_low.rb', line 2862

def block
    if self.is_a?(Block)
        return self
    elsif self.parent.is_a?(Scope)
        # No block
        return nil
    else
        return self.parent.block
    end
end

#blocks2seq!Object

Converts the par sub blocks to seq.



84
85
86
87
# File 'lib/HDLRuby/hruby_low2seq.rb', line 84

def blocks2seq!
    # By default, nothing to do.
    return self
end

#break_types!(types) ⇒ Object

Breaks the hierarchical types into sequences of type definitions. Assumes to_upper_space! has been called before. +types+ include the resulting types.



486
487
488
489
490
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 486

def break_types!(types)
    self.each_node do |node|
        node.break_types!(types)
    end
end

#cloneObject

Clones (deeply)

Raises:



2827
2828
2829
2830
# File 'lib/HDLRuby/hruby_low.rb', line 2827

def clone
    raise AnyError,
          "Internal error: clone is not defined for class: #{self.class}"
end

#delete_related!(*names) ⇒ Object

Deletes the elements related to one of +names+: either they have one of the names or they use an element with these names. NOTE: only delete actual instantiated elements, types or systemTs are left as is.



561
562
563
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 561

def delete_related!(*names)
    # Nothing to do by default.
end

#delete_unless!(keep) ⇒ Object

Removes the signals and corresponding assignments whose name is not in +keep+.



116
117
118
# File 'lib/HDLRuby/hruby_low_cleanup.rb', line 116

def delete_unless!(keep)
    # By default nothing to do.
end

#each_deep(&ruby_block) ⇒ Object

Iterates over each object deeply.

Returns an enumerator if no ruby block is given.

Raises:



2835
2836
2837
2838
# File 'lib/HDLRuby/hruby_low.rb', line 2835

def each_deep(&ruby_block)
    raise AnyError,
        "Internal error: each_deep is not defined for class: #{self.class}"
end

#each_statement(&ruby_block) ⇒ Object

Iterates over each sub statement if any.

Returns an enumerator if no ruby block is given.



2855
2856
2857
2858
2859
# File 'lib/HDLRuby/hruby_low.rb', line 2855

def each_statement(&ruby_block)
    # No ruby statement? Return an enumerator.
    return to_enum(:each_statement) unless ruby_block
    # By default: nothing to do.
end

#eql?(obj) ⇒ Boolean

Comparison for hash: structural comparison.

Returns:

  • (Boolean)

Raises:



2841
2842
2843
2844
# File 'lib/HDLRuby/hruby_low.rb', line 2841

def eql?(obj)
    raise AnyError,
        "Internal error: eql? is not defined for class: #{self.class}"
end

#explicit_types!Object

Explicit the types conversions in the statement.



73
74
75
# File 'lib/HDLRuby/hruby_low_fix_types.rb', line 73

def explicit_types!
    raise "Should implement explicit_types for class #{self.class}."
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!



468
469
470
471
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 468

def extract_declares!
    # By default, nothing to do.
    return []
end

#hashObject

Hash function.

Raises:



2847
2848
2849
2850
# File 'lib/HDLRuby/hruby_low.rb', line 2847

def hash
    raise AnyError,
        "Internal error: hash is not defined for class: #{self.class}"
end

#mix?(mode = nil) ⇒ Boolean

Tell if there is a mix block. +mode+ is the mode of the upper block.

Returns:

  • (Boolean)


91
92
93
94
# File 'lib/HDLRuby/hruby_low2seq.rb', line 91

def mix?(mode = nil)
    # By default, no mix block.
    return false
end

#par_in_seq2seq!Object

Converts par blocks within seq blocks to seq blocks.



45
46
47
48
# File 'lib/HDLRuby/hruby_low_without_parinseq.rb', line 45

def par_in_seq2seq!
    # By default nothing to do.
    return self
end

#parent_systemObject

Gets the parent system, i.e., the parent of the top scope.



2904
2905
2906
# File 'lib/HDLRuby/hruby_low.rb', line 2904

def parent_system
    return self.top_scope.parent
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.



552
553
554
555
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 552

def replace_expressions!(node2rep)
    # By default: nothing to do.
    return {}
end

#replace_names!(former, nname) ⇒ Object

Replaces recursively +former+ name by +nname+ until it is redeclared.



474
475
476
477
478
479
480
481
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 474

def replace_names!(former,nname)
    # By default: try to replace the name recursively.
    self.each_node_deep do |node|
        if node.respond_to?(:name) && node.name == former then
            node.set_name!(nname)
        end
    end
end

#scopeObject

Get the scope of the statement.



2874
2875
2876
2877
2878
2879
2880
2881
2882
# File 'lib/HDLRuby/hruby_low.rb', line 2874

def scope
    if self.parent.is_a?(Scope) then
        return self.parent
    elsif self.parent.is_a?(Behavior) then
        return self.parent.parent
    else
        return self.parent.scope
    end
end

#to_c(res, level = 0) ⇒ Object

Generates the C text of the equivalent HDLRuby code. +level+ is the hierachical level of the object. def to_c(level = 0)

Raises:



1178
1179
1180
1181
# File 'lib/HDLRuby/hruby_low2c.rb', line 1178

def to_c(res,level = 0)
    # Should never be here.
    raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
end

#to_ch(res) ⇒ Object

Generates the content of the h file. def to_ch



1185
1186
1187
1188
1189
# File 'lib/HDLRuby/hruby_low2c.rb', line 1185

def to_ch(res)
    # By default nothing to generate.
    # return ""
    return res
end

#to_hdr(level = 0) ⇒ Object

Generates the text of the equivalent hdr text. +level+ is the hierachical level of the object.

Raises:



327
328
329
330
# File 'lib/HDLRuby/hruby_low2hdr.rb', line 327

def to_hdr(level = 0)
    # Should never be here.
    raise AnyError, "Internal error: to_high should be implemented in class :#{self.class}"
end

#to_highObject

Creates a new high statement.

Raises:



232
233
234
235
# File 'lib/HDLRuby/hruby_low2high.rb', line 232

def to_high
    raise AnyError,
          "Internal error: to_high is not defined for class: #{self.class}"
end

#to_seq!Object

Convert the block to seq.



51
52
53
54
# File 'lib/HDLRuby/hruby_low_without_parinseq.rb', line 51

def to_seq!
    # By default nothing to do.
    return self
end

#to_upper_space!Object

Moves the declarations to the upper namespace.



461
462
463
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 461

def to_upper_space!
    # By default, nothing to do.
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.

Raises:



891
892
893
894
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 891

def to_vhdl(vars, level = 0)
    # Should never be here.
    raise AnyError, "Internal error: to_vhdl should be implemented in class :#{self.class}"
end

#top_blockObject

Gets the top block, i.e. the first block of the current behavior.



2894
2895
2896
# File 'lib/HDLRuby/hruby_low.rb', line 2894

def top_block
    return self.parent.is_a?(Behavior) ? self : self.parent.top_block
end

#top_scopeObject

Gets the top scope, i.e. the first scope of the current system.



2899
2900
2901
# File 'lib/HDLRuby/hruby_low.rb', line 2899

def top_scope
    return self.scope.top_scope
end

#use_name?(*names) ⇒ Boolean

Tell if the statement includes a signal whose name is one of +names+.

Returns:

  • (Boolean)


2909
2910
2911
# File 'lib/HDLRuby/hruby_low.rb', line 2909

def use_name?(*names)
    # By default, nothing to do.
end

#with_boolean!Object

Converts to a variable-compatible system.

NOTE: the result is the same Behaviour.



85
86
87
88
89
90
91
# File 'lib/HDLRuby/hruby_low_with_bool.rb', line 85

def with_boolean!
    self.each_node do |node| 
        if node.is_a?(Expression) && node.boolean? then
            node.set_type!(HDLRuby::Low::Boolean)
        end
    end
end