Class: HDLRuby::Low::If

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_low2hdr.rb,
lib/HDLRuby/hruby_low2seq.rb,
lib/HDLRuby/hruby_low2vhd.rb,
lib/HDLRuby/hruby_verilog.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_with_var.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_parinseq.rb,
lib/HDLRuby/hruby_low_without_namespace.rb,
lib/HDLRuby/hruby_low_casts_without_expression.rb

Overview

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

Direct Known Subclasses

High::If

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, #add_make_block, #behavior, #block, #break_types!, #parent_system, #scope, #top_block, #top_scope, #with_boolean!

Methods included from Low2Symbol

#to_sym

Methods included from Hparent

#hierarchy, #scope

Constructor Details

#initialize(condition, yes, no = nil) ⇒ If

Creates a new if statement with a +condition+ and a +yes+ and +no+ blocks.



3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
# File 'lib/HDLRuby/hruby_low.rb', line 3060

def initialize(condition, yes, no = nil)
    # Check and set the condition.
    unless condition.is_a?(Expression)
        raise AnyError,
              "Invalid class for a condition: #{condition.class}"
    end
    super()
    @condition = condition
    # And set its parent.
    condition.parent = self
    # Check and set the yes statement.
    unless yes.is_a?(Statement)
        raise AnyError, "Invalid class for a statement: #{yes.class}"
    end
    @yes = yes
    # And set its parent.
    yes.parent = self
    # Check and set the yes statement.
    if no and !no.is_a?(Statement)
        raise AnyError, "Invalid class for a statement: #{no.class}"
    end
    @no = no
    # And set its parent.
    no.parent = self if no

    # Initialize the list of alternative if statements (elsif)
    @noifs = []
end

Instance Attribute Details

#conditionObject (readonly)

The condition



3053
3054
3055
# File 'lib/HDLRuby/hruby_low.rb', line 3053

def condition
  @condition
end

#noObject

The yes and no statements



3056
3057
3058
# File 'lib/HDLRuby/hruby_low.rb', line 3056

def no
  @no
end

#yesObject (readonly)

The yes and no statements



3056
3057
3058
# File 'lib/HDLRuby/hruby_low.rb', line 3056

def yes
  @yes
end

Instance Method Details

#add_noif(next_cond, next_yes) ⇒ Object

Adds an alternative if statement (elsif) testing +next_cond+ and executing +next_yes+ when the condition is met.



3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
# File 'lib/HDLRuby/hruby_low.rb', line 3143

def add_noif(next_cond, next_yes)
    # Check the condition.
    unless next_cond.is_a?(Expression)
        raise AnyError, 
              "Invalid class for a condition: #{next_cond.class}"
    end
    # And set its parent.
    next_cond.parent = self
    # Check yes statement.
    unless next_yes.is_a?(Statement)
        raise AnyError, 
              "Invalid class for a statement: #{next_yes.class}"
    end
    # And set its parent.
    next_yes.parent = self
    # Add the statement.
    @noifs << [next_cond,next_yes]
end

#blocks2seq!Object

Converts the par sub blocks to seq.



102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/HDLRuby/hruby_low2seq.rb', line 102

def blocks2seq!
    # Convert each sub block.
    # If block.
    self.yes.blocks2seq!
    # Elsif blocks
    self.each_noif do |cond, stmnt|
        stmnt.blocks2seq!
    end
    # Else block if any.
    self.no.blocks2seq! if self.no
    return self
end

#boolean_in_assign2select!Object

Converts booleans in assignments to select operators.



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/HDLRuby/hruby_low_bool2select.rb', line 84

def boolean_in_assign2select!
    # No need to apply on condition!
    # # Apply on the condition.
    # self.set_condition!(self.condition.boolean_in_assign2select)
    # Apply on the yes.
    self.yes.boolean_in_assign2select!
    # Apply on the noifs.
    @noifs.map! do |cond,stmnt|
        # No need to apply on condition!
        # [cond.boolean_in_assign2select,stmnt.boolean_in_assign2select!]
        [cond,stmnt.boolean_in_assign2select!]
    end
    # Apply on the no if any.
    self.no.boolean_in_assign2select! if self.no
    return self
end

#casts_without_expression!Object

Extracts the expressions from the casts.



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/HDLRuby/hruby_low_casts_without_expression.rb', line 85

def casts_without_expression!
    # Apply on the condition.
    self.set_condition!(self.condition.casts_without_expression!)
    # Apply on the yes.
    self.yes.casts_without_expression!
    # Apply on the noifs.
    @noifs.map! do |cond,stmnt|
        [cond.casts_without_expression!,stmnt.casts_without_expression!]
    end
    # Apply on the no if any.
    self.no.casts_without_expression! if self.no
    return self
end

#cloneObject

Clones the If (deeply)



3270
3271
3272
3273
3274
3275
3276
3277
3278
# File 'lib/HDLRuby/hruby_low.rb', line 3270

def clone
    # Duplicate the if.
    res = If.new(@condition.clone, @yes.clone, @no ? @no.clone : nil)
    # Duplicate the alternate ifs
    @noifs.each do |next_cond,next_yes|
        res.add_noif(next_cond.clone,next_yes.clone)
    end
    return res
end

#delete_noif!(noif) ⇒ Object

Deletes an alternate if.



738
739
740
741
742
743
744
745
746
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 738

def delete_noif!(noif)
    if @noifs.include?(noif) then
        # The noif is present, delete it.
        @noifs.delete(noif)
        # And remove its parent.
        noif.parent = nil
    end
    noif
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.



807
808
809
810
811
812
813
814
815
816
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 807

def delete_related!(*names)
    # Delete the noifs if their condition uses one of names.
    @noifs.delete_if { |noif| noif[0].use_names?(names) }
    # Recurse on the yes.
    @yes.delete_related!(*names)
    # Recurse on the no.
    @no.delete_related!(*names)
    # Recruse one the no ifs statements.
    @noifs.each { |noif| noif[1].delete_related!(*names) }
end

#delete_unless!(keep) ⇒ Object

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



128
129
130
131
132
133
134
135
136
# File 'lib/HDLRuby/hruby_low_cleanup.rb', line 128

def delete_unless!(keep)
    # Recurse on the sub statements.
    # Yes.
    self.yes.delete_unless!(keep)
    # Noifs.
    self.each_noif { |cond,stmnt| stmnt.delete_unless!(keep) }
    # No if any.
    self.no.delete_unless!(keep) if self.no
end

#each_block(&ruby_block) ⇒ Object

Iterates over the sub blocks.



3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
# File 'lib/HDLRuby/hruby_low.rb', line 3222

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 yes, the alternate ifs and the no blocks.
    ruby_block.call(@yes) if @yes.is_a?(Block)
    @noifs.each do |next_cond,next_yes|
        ruby_block.call(next_yes) if next_yes.is_a?(Block)
    end
    ruby_block.call(@no) if @no.is_a?(Block)
end

#each_block_deep(&ruby_block) ⇒ Object

Iterates over all the blocks contained in the current block.



3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
# File 'lib/HDLRuby/hruby_low.rb', line 3250

def each_block_deep(&ruby_block)
    # No ruby block? Return an enumerator.
    return to_enum(:each_block_deep) unless ruby_block
    # A ruby block?
    # Apply it on the yes, the alternate ifs and the no blocks.
    @yes.each_block_deep(&ruby_block)
    @noifs.each do |next_cond,next_yes|
        next_yes.each_block_deep(&ruby_block)
    end
    # @no.each_block_deep(&ruby_block) if @no.is_a?(Block)
    @no.each_block_deep(&ruby_block) if @no
end

#each_deep(&ruby_block) ⇒ Object

Iterates over each object deeply.

Returns an enumerator if no ruby block is given.



3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
# File 'lib/HDLRuby/hruby_low.rb', line 3092

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 condition.
    self.condition.each_deep(&ruby_block)
    # Then apply on the yes.
    self.yes.each_deep(&ruby_block)
    # The apply on the no.
    self.no.each_deep(&ruby_block)
    # Then apply on the alternate ifs.
    self.each_noif do |cond,stmnt|
        cond.each_deep(&ruby_block)
        stmnt.each_deep(&ruby_block)
    end
end

#each_node(&ruby_block) ⇒ Object

Iterates over the children (including the condition).

Returns an enumerator if no ruby block is given.



3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
# File 'lib/HDLRuby/hruby_low.rb', line 3191

def each_node(&ruby_block)
    # No ruby block? Return an enumerator.
    return to_enum(:each_node) unless ruby_block
    # A ruby block?
    # Appy it on the children.
    ruby_block.call(@condition)
    ruby_block.call(@yes)
    self.each_noif do |next_cond,next_yes|
        ruby_block.call(next_cond)
        ruby_block.call(next_yes)
    end
    ruby_block.call(@no) if @no
end

#each_node_deep(&ruby_block) ⇒ Object

Iterates over the nodes deeply if any.



3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
# File 'lib/HDLRuby/hruby_low.rb', line 3206

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 children
    @condition.each_node_deep(&ruby_block)
    @yes.each_node_deep(&ruby_block)
    self.each_noif do |next_cond,next_yes|
        next_cond.each_node_deep(&ruby_block)
        next_yes.each_node_deep(&ruby_block)
    end
    @no.each_node_deep(&ruby_block) if @no
end

#each_noif(&ruby_block) ⇒ Object

Iterates over the alternate if statements (elsif).



3163
3164
3165
3166
3167
3168
3169
3170
3171
# File 'lib/HDLRuby/hruby_low.rb', line 3163

def each_noif(&ruby_block)
    # No ruby block? Return an enumerator.
    return to_enum(:each_noif) unless ruby_block
    # A ruby block?
    # Appy it on the alternate if statements.
    @noifs.each do |next_cond,next_yes|
        yield(next_cond,next_yes)
    end
end

#each_statement(&ruby_block) ⇒ Object

Iterates over each sub statement if any.

Returns an enumerator if no ruby block is given.



3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
# File 'lib/HDLRuby/hruby_low.rb', line 3176

def each_statement(&ruby_block)
    # No ruby block? Return an enumerator.
    return to_enum(:each_statement) unless ruby_block
    # A ruby block?
    # Appy it on the statement children.
    ruby_block.call(@yes)
    self.each_noif do |next_cond,next_yes|
        ruby_block.call(next_yes)
    end
    ruby_block.call(@no) if @no
end

#each_statement_deep(&ruby_block) ⇒ Object

Iterates over all the stamements of the block and its sub blocks.



3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
# File 'lib/HDLRuby/hruby_low.rb', line 3235

def each_statement_deep(&ruby_block)
    # No ruby statement? Return an enumerator.
    return to_enum(:each_statement_deep) unless ruby_block
    # A ruby block?
    # Apply it on self.
    ruby_block.call(self)
    # And recurse on the alternate ifs and the no statements.
    @yes.each_statement_deep(&ruby_block)
    @noifs.each do |next_cond,next_yes|
        next_yes.each_statement_deep(&ruby_block)
    end
    @no.each_statement_deep(&ruby_block) if @no.is_a?(Block)
end

#eql?(obj) ⇒ Boolean

Comparison for hash: structural comparison.

Returns:

  • (Boolean)


3111
3112
3113
3114
3115
3116
3117
# File 'lib/HDLRuby/hruby_low.rb', line 3111

def eql?(obj)
    return false unless obj.is_a?(If)
    return false unless @condition.eql?(obj.condition)
    return false unless @yes.eql?(obj.yes)
    return false unless @no.eql?(obj.no)
    return true
end

#explicit_types!Object

Explicit the types conversions in the if.



110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/HDLRuby/hruby_low_fix_types.rb', line 110

def explicit_types!
    # Recurse on the condition: it must be a Bit.
    self.set_condition!(self.condition.explicit_types(Bit))
    # Recurse on the yes block.
    self.yes.explicit_types!
    # Recruse on the alternative ifs, the conditions must be Bit.
    self.map_noifs! do |cond,block|
        [ cond.explicit_types(Bit), block.explicit_types! ]
    end
    # Recurse on the no block.
    self.no.explicit_types! if self.no
    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!



539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 539

def extract_declares!
    # The extracted declares.
    decls = []
    # Recurse on the sub blocks.
    # Yes.
    decls << self.yes.extract_declares!
    # Noifs.
    decls << self.each_noif.map do |cond,stmnt|
        stmnt.extract_declares!
    end
    # No if any.
    decls << self.no.extract_declares! if self.no
    # Returns the extracted declares.
    return decls
end

#extract_selects!Object

Extract the Select expressions.

NOTE: work on the condition only.



186
187
188
189
190
# File 'lib/HDLRuby/hruby_low_without_select.rb', line 186

def extract_selects!
    selects = []
    self.set_condition!(self.condition.extract_selects_to!(selects))
    return selects
end

#hashObject

Hash function.



3120
3121
3122
# File 'lib/HDLRuby/hruby_low.rb', line 3120

def hash
    return [@condition,@yes,@no].hash
end

#map_nodes!(&ruby_block) ⇒ Object

Maps on the children (including the condition).



760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 760

def map_nodes!(&ruby_block)
    @condition = ruby_block.call(@condition)
    @yes = ruby_block.call(@yes)
    self.map_noifs! do |cond,stmnt|
        [ruby_block.call(cond), ruby_block.call(stmnt)]
    end
    # @noifs.map! do |cond,stmnt|
    #     cond  = ruby_block.call(cond)
    #     stmnt = ruby_block.call(stmnt)
    #     cond.parent  = self unless cond.parent
    #     stmnt.parent = self unless stmnt.parent
    #     [cond,stmnt]
    # end
    @no = ruby_block.call(@no) if @no
end

#map_noifs!(&ruby_block) ⇒ Object

Maps on the noifs.



749
750
751
752
753
754
755
756
757
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 749

def map_noifs!(&ruby_block)
    @noifs.map! do |cond,stmnt|
        cond,stmnt  = ruby_block.call(cond,stmnt)
        # cond, stmnt  = ruby_block.call(cond), ruby_block.call(stmnt)
        cond.parent  = self unless cond.parent
        stmnt.parent = self unless stmnt.parent
        [cond,stmnt]
    end
end

#mix?(mode = nil) ⇒ Boolean

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

Returns:

  • (Boolean)


117
118
119
120
121
122
123
124
125
126
127
# File 'lib/HDLRuby/hruby_low2seq.rb', line 117

def mix?(mode = nil)
    # Check each sub block.
    # If block.
    return true if self.yes.mix?(mode)
    # Elsif blocks
    self.each_noif do |cond, stmnt|
        return true if stmnt.mix?(mode)
    end
    # Else block if any.
    true if self.no && self.no.mix?(mode)
end

#par_in_seq2seq!Object

Converts par blocks within seq blocks to seq blocks.



62
63
64
65
66
67
68
# File 'lib/HDLRuby/hruby_low_without_parinseq.rb', line 62

def par_in_seq2seq!
    self.yes.par_in_seq2seq!
    self.each_noif do |cond,blk|
        blk.par_in_seq2seq!
    end
    self.no.par_in_seq2seq! if self.no
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.



782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 782

def replace_expressions!(node2rep)
    # First recurse on the children.
    res = {}
    self.each_node do |node|
        res.merge!(node.replace_expressions!(node2rep))
    end
    # Is there a replacement to do on the condition?
    rep = node2rep[self.condition]
    if rep then
        # Yes, do it.
        rep = rep.clone
        node = self.condition
        # node.set_parent!(nil)
        self.set_condition!(rep)
        # And register the replacement.
        res[node] = rep
    end

    return res
end

#replace_names!(former, nname) ⇒ Object

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



556
557
558
559
560
561
562
563
564
565
566
567
568
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 556

def replace_names!(former,nname)
    # Recurse on the condition.
    self.condition.replace_names!(former,nname)
    # Recurse on the yes.
    self.yes.replace_names!(former,nname)
    # Recurse on the alternate ifs.
    self.each_noif do |cond,stmnt| 
        cond.replace_names!(former,nname)
        stmnt.replace_names!(former,nname)
    end
    # Recurse on the no if any.
    self.no.replace_names!(former,nname) if self.no
end

#set_condition!(condition) ⇒ Object

Sets the condition.



704
705
706
707
708
709
710
711
712
713
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 704

def set_condition!(condition)
    # Check and set the condition.
    unless condition.is_a?(Expression)
        raise AnyError,
              "Invalid class for a condition: #{condition.class}"
    end
    @condition = condition
    # And set its parent.
    condition.parent = self
end

#set_no!(no) ⇒ Object

Sets the no block.



727
728
729
730
731
732
733
734
735
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 727

def set_no!(no)
    # Check and set the yes statement.
    if no and !no.is_a?(Statement)
        raise AnyError, "Invalid class for a statement: #{no.class}"
    end
    @no = no
    # And set its parent.
    no.parent = self if no
end

#set_yes!(yes) ⇒ Object

Sets the yes block.



716
717
718
719
720
721
722
723
724
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 716

def set_yes!(yes)
    # Check and set the yes statement.
    unless yes.is_a?(Statement)
        raise AnyError, "Invalid class for a statement: #{yes.class}"
    end
    @yes = yes
    # And set its parent.
    yes.parent = self
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)

def to_c(res,level = 0) # The result string. # res = " " * level*3 res << " " * level*3 # Compute the condition. res << " res << " " * (level+1)*3 # res << "Value cond = " << self.condition.to_c(level+1) << ";\n" res << "Value cond = " self.condition.to_c(res,level+1) res << ";\n" # Ensure the condition is testable. res << " " * (level+1)*3 res << "if (is_defined_value(cond)) {\n" # The condition is testable. res << " " * (level+2)*3 res << "if (value2integer(cond)) {\n" # Generate the yes part. # res << self.yes.to_c(level+3) self.yes.to_c(res,level+3) res << " " * level*3 res << "\n" # Generate the alternate if parts. self.each_noif do |cond,stmnt| res << " " * level*3 # res << "else if (value2integer(" << cond.to_c(level+1) << ")) res << "else if (value2integer(" cond.to_c(res,level+1) res << ")) {\n" # res << stmnt.to_c(level+1) stmnt.to_c(res,level+1) res << " " * level*3 res << "\n" end # Generate the no part if any. if self.no then res << " " * level*3 # res << "else << self.no.to_c(level+1) res << "else {\n" self.no.to_c(res,level+1) res << " " * level*3 res << "\n" end # Close the if. res << " " * (level+1)*3 res << "}\n" res << " " * (level)*3 res << "}\n" # Return the result. return res end Generates the C text of the equivalent HDLRuby code. +level+ is the hierachical level of the object.



1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
# File 'lib/HDLRuby/hruby_low2c.rb', line 1445

def to_c(res,level = 0)
    res << " " * level*3
    # Compute the condition.
    self.condition.to_c(res,level)
    # Check is the value is true.
    res << " " * level*3
    res << "if (is_true()) {\n"
    # Generate the yes part.
    self.yes.to_c(res,level+1)
    res << " " * level*3
    res << "}\n"
    # Generate the alternate if parts.
    self.each_noif do |cond,stmnt|
        res << " " * (level*3)
        res << "else {\n"
        cond.to_c(res,level+1)
        # Check is the value is true.
        res << " " * (level+1)*3
        res << "if (is_true()) {\n"
        stmnt.to_c(res,level+2)
        res << " " * ((level+1)*3)
        res << "}\n"
    end
    # Generate the no part if any.
    if self.no then
        res << " " * (level*3)
        res << "else {\n"
        self.no.to_c(res,level+1)
        res << " " * level*3
        res << "}\n"
    end
    # Close the noifs.
    self.each_noif do |cond,stmnt|
        res << " " * (level*3)
        res << "}\n"
    end
    # # Close the if.
    # res << " " * ((level+1)*3)
    # res << "}\n"
    # res << " " * (level*3)
    # res << "}\n"
    # Return the result.
    return res
end

#to_ch(res) ⇒ Object

Generates the content of the h file. def to_ch



1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
# File 'lib/HDLRuby/hruby_low2c.rb', line 1492

def to_ch(res)
    # res = ""
    # Recurse on the sub statements.
    # res << self.yes.to_ch
    self.yes.to_ch(res)
    self.each_noif do |cond,stmnt|
        # res << stmnt.to_ch
        stmnt.to_ch(res)
    end
    # res << self.no.to_ch if self.no
    self.no.to_ch(res) if self.no
    return res
end

#to_hdr(level = 0) ⇒ Object

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



350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
# File 'lib/HDLRuby/hruby_low2hdr.rb', line 350

def to_hdr(level = 0)
    # The result string.
    res = " " * (level*3)
    # Generate the test.
    res << "hif " << self.condition.to_hdr(level) << " do\n"
    # Generate the yes part.
    res << self.yes.to_hdr(level+1)
    res << " " * (level*3) << "end\n"
    # Generate the alternate if parts.
    self.each_noif do |cond,stmnt|
        res << " " * (level*3)
        res << "helsif " << cond.to_hdr(level) << " do\n"
        res << stmnt.to_hdr(level+1)
        res << " " * (level*3) << "end\n"
    end
    # Generate the no part if any.
    if self.no then
        res << " " * (level*3)
        res << "helse do\n" << self.no.to_hdr(level+1)
        res << " " * (level*3) << "end\n"
    end
    # Return the result.
    return res
end

#to_highObject

Creates a new high if statement.



252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/HDLRuby/hruby_low2high.rb', line 252

def to_high
    # Is there a no?
    if self.no then
        # Yes, create a new if statement with it.
        res = HDLRuby::High::If.new(self.condition.to_high,
                                self.yes.to_high,self.no.to_high)
    else
        # No, create a new if statement without it.
        res = HDLRuby::High::If.new(self.condition.to_high,
                                self.yes.to_high)
    end
    # Add the noifs if any.
    self.each_noif do |cond,stmnt| 
        res.add_noif(cond.to_high,stmt.to_high)
    end
    return res
end

#to_seq!Object

Convert the block to seq.



71
72
73
74
75
76
77
# File 'lib/HDLRuby/hruby_low_without_parinseq.rb', line 71

def to_seq!
    self.to_seq!
    self.each_noif do |cond,blk|
        blk.to_seq!
    end
    self.no.to_seq! if self.no
end

#to_upper_space!Object

Moves the declarations to the upper namespace.



526
527
528
529
530
531
532
533
534
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 526

def to_upper_space!
    # Recurse on the sub blocks.
    # Yes.
    self.yes.to_upper_space!
    # Noifs.
    self.each_noif {|cond,stmnt| stmnt.to_upper_space! }
    # No if any.
    self.no.to_upper_space! if self.no
end

#to_verilog(spc = 3) ⇒ Object

Converts the system to Verilog code.

def to_verilog(mode = nil) Converts to Verilog code, checking adding 'spc' spaces at the begining of each line.



1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
# File 'lib/HDLRuby/hruby_verilog.rb', line 1547

def to_verilog(spc = 3)

    $blocking = false

    result = " " * spc  # Indented based on space_count.

    result << "if (#{self.condition.to_verilog}) "


    # Check if there is yes (if) and output yes or less.
    if self.respond_to? (:yes)
        result << self.yes.to_verilog(spc)
    end

    # If noif (else if) exists, it outputs it.
    # Since noif is directly under, respond_to is unnecessary.
    self.each_noif do |condition, block|
        result << "\n#{" "*spc}else if (#{condition.to_verilog}) "
        result << block.to_verilog(spc)
    end

    # Check if there is no (else) and output no or less.
    if self.no.respond_to?(:mode)
        result << "\n#{" " * spc}else "
        result << self.no.to_verilog(spc)
    end

    return result
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.



935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 935

def to_vhdl(vars,level = 0)
    # The result string.
    res = " " * (level*3)
    # Generate the test.
    res << "if (" << Low2VHDL.to_boolean(self.condition) << ") then\n"
    # Generate the yes part.
    res << self.yes.to_vhdl(vars,level+1)
    # Generate the alternate if parts.
    self.each_noif do |cond,stmnt|
        res << " " * (level*3)
        # res << "elsif (" << cond.to_vhdl(level) << ") then\n"
        res << "elsif (" << Low2VHDL.to_boolean(cond) << ") then\n"
        res << stmnt.to_vhdl(vars,level+1)
    end
    # Generate the no part if any.
    if self.no then
        res << " " * (level*3)
        res << "else\n" << self.no.to_vhdl(vars,level+1)
    end
    # Close the if.
    res << " " * (level*3)
    res << "end if;\n"
    # Return the result.
    return res
end

#use_name?(*names) ⇒ Boolean

Tell if the statement includes a signal whose name is one of +names+. NOTE: for the if check only the condition.

Returns:

  • (Boolean)


3265
3266
3267
# File 'lib/HDLRuby/hruby_low.rb', line 3265

def use_name?(*names)
    return @condition.use_name?(*name)
end

#with_var(upper = nil) ⇒ Object

Converts to a variable-compatible if where +upper+ is the upper block if any.

NOTE: the result is a new if.



271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/HDLRuby/hruby_low_with_var.rb', line 271

def with_var(upper = nil)
    # Treat the sub nodes.
    # Condition.
    ncond = self.condition.clone
    # Yes.
    nyes =self.yes.with_var(upper)
    # Noifs.
    noifs = self.each_noif.map do |cond,stmnt|
        [cond.clone,stmnt.with_var(upper)]
    end
    # No.
    nno = self.no ? self.no.with_var(upper) : nil
    # Create the resulting If.
    res= If.new(ncond,nyes, nno)
    noifs.each do |cond,stmnt|
        res.add_noif(cond,stmnt)
    end
    return res
end