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.

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, #no_parent!

Instance Method Details

#add_blocks_code(res, level) ⇒ Object

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



1274
1275
1276
1277
1278
1279
1280
1281
1282
# File 'lib/HDLRuby/hruby_low2c.rb', line 1274

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+.



1285
1286
1287
1288
1289
1290
1291
1292
1293
# File 'lib/HDLRuby/hruby_low2c.rb', line 1285

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.



2961
2962
2963
2964
2965
2966
2967
# File 'lib/HDLRuby/hruby_low.rb', line 2961

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.



2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
# File 'lib/HDLRuby/hruby_low.rb', line 2938

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.



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

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

#cloneObject

Clones (deeply)

Raises:



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

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:



2911
2912
2913
2914
# File 'lib/HDLRuby/hruby_low.rb', line 2911

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.



2931
2932
2933
2934
2935
# File 'lib/HDLRuby/hruby_low.rb', line 2931

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:



2917
2918
2919
2920
# File 'lib/HDLRuby/hruby_low.rb', line 2917

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!



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

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

#hashObject

Hash function.

Raises:



2923
2924
2925
2926
# File 'lib/HDLRuby/hruby_low.rb', line 2923

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.



2980
2981
2982
# File 'lib/HDLRuby/hruby_low.rb', line 2980

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.



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

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.



2950
2951
2952
2953
2954
2955
2956
2957
2958
# File 'lib/HDLRuby/hruby_low.rb', line 2950

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:



1260
1261
1262
1263
# File 'lib/HDLRuby/hruby_low2c.rb', line 1260

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



1267
1268
1269
1270
1271
# File 'lib/HDLRuby/hruby_low2c.rb', line 1267

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.



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

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.



2970
2971
2972
# File 'lib/HDLRuby/hruby_low.rb', line 2970

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.



2975
2976
2977
# File 'lib/HDLRuby/hruby_low.rb', line 2975

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)


2985
2986
2987
# File 'lib/HDLRuby/hruby_low.rb', line 2985

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