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

Constructor Details

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

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



3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
# File 'lib/HDLRuby/hruby_low.rb', line 3136

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



3129
3130
3131
# File 'lib/HDLRuby/hruby_low.rb', line 3129

def condition
  @condition
end

#noObject

The yes and no statements



3132
3133
3134
# File 'lib/HDLRuby/hruby_low.rb', line 3132

def no
  @no
end

#yesObject (readonly)

The yes and no statements



3132
3133
3134
# File 'lib/HDLRuby/hruby_low.rb', line 3132

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.



3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
# File 'lib/HDLRuby/hruby_low.rb', line 3219

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.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/HDLRuby/hruby_low_bool2select.rb', line 96

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)



3346
3347
3348
3349
3350
3351
3352
3353
3354
# File 'lib/HDLRuby/hruby_low.rb', line 3346

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.



3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
# File 'lib/HDLRuby/hruby_low.rb', line 3298

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.



3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
# File 'lib/HDLRuby/hruby_low.rb', line 3326

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.



3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
# File 'lib/HDLRuby/hruby_low.rb', line 3168

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.



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

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.



3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
# File 'lib/HDLRuby/hruby_low.rb', line 3282

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



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

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.



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

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.



3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
# File 'lib/HDLRuby/hruby_low.rb', line 3311

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)


3187
3188
3189
3190
3191
3192
3193
# File 'lib/HDLRuby/hruby_low.rb', line 3187

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.



129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/HDLRuby/hruby_low_fix_types.rb', line 129

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!



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

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.



196
197
198
199
200
# File 'lib/HDLRuby/hruby_low_without_select.rb', line 196

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

#hashObject

Hash function.



3196
3197
3198
# File 'lib/HDLRuby/hruby_low.rb', line 3196

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.



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

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.



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
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
# File 'lib/HDLRuby/hruby_low2c.rb', line 1549

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



1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
# File 'lib/HDLRuby/hruby_low2c.rb', line 1596

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.



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

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.



1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
# File 'lib/HDLRuby/hruby_verilog.rb', line 1562

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.



947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
# File 'lib/HDLRuby/hruby_low2vhd.rb', line 947

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)


3341
3342
3343
# File 'lib/HDLRuby/hruby_low.rb', line 3341

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