Class: HDLRuby::Low::If
- 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
Constant Summary
Constants included from Low2Symbol
Low2Symbol::Low2SymbolPrefix, Low2Symbol::Low2SymbolTable, Low2Symbol::Symbol2LowTable
Instance Attribute Summary collapse
-
#condition ⇒ Object
readonly
The condition.
-
#no ⇒ Object
The yes and no statements.
-
#yes ⇒ Object
readonly
The yes and no statements.
Attributes included from Hparent
Instance Method Summary collapse
-
#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.
-
#blocks2seq! ⇒ Object
Converts the par sub blocks to seq.
-
#boolean_in_assign2select! ⇒ Object
Converts booleans in assignments to select operators.
-
#casts_without_expression! ⇒ Object
Extracts the expressions from the casts.
-
#clone ⇒ Object
Clones the If (deeply).
-
#delete_noif!(noif) ⇒ Object
Deletes an alternate if.
-
#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.
-
#delete_unless!(keep) ⇒ Object
Removes the signals and corresponding assignments whose name is not in +keep+.
-
#each_block(&ruby_block) ⇒ Object
Iterates over the sub blocks.
-
#each_block_deep(&ruby_block) ⇒ Object
Iterates over all the blocks contained in the current block.
-
#each_deep(&ruby_block) ⇒ Object
Iterates over each object deeply.
-
#each_node(&ruby_block) ⇒ Object
Iterates over the children (including the condition).
-
#each_node_deep(&ruby_block) ⇒ Object
Iterates over the nodes deeply if any.
-
#each_noif(&ruby_block) ⇒ Object
Iterates over the alternate if statements (elsif).
-
#each_statement(&ruby_block) ⇒ Object
Iterates over each sub statement if any.
-
#each_statement_deep(&ruby_block) ⇒ Object
Iterates over all the stamements of the block and its sub blocks.
-
#eql?(obj) ⇒ Boolean
Comparison for hash: structural comparison.
-
#explicit_types! ⇒ Object
Explicit the types conversions in the if.
-
#extract_declares! ⇒ Object
Extract the declares from the scope and returns them into an array.
-
#extract_selects! ⇒ Object
Extract the Select expressions.
-
#hash ⇒ Object
Hash function.
-
#initialize(condition, yes, no = nil) ⇒ If
constructor
Creates a new if statement with a +condition+ and a +yes+ and +no+ blocks.
-
#map_nodes!(&ruby_block) ⇒ Object
Maps on the children (including the condition).
-
#map_noifs!(&ruby_block) ⇒ Object
Maps on the noifs.
-
#mix?(mode = nil) ⇒ Boolean
Tell if there is a mix block.
-
#par_in_seq2seq! ⇒ Object
Converts par blocks within seq blocks to seq blocks.
-
#replace_expressions!(node2rep) ⇒ Object
Replaces sub expressions using +node2rep+ table indicating the node to replace and the corresponding replacement.
-
#replace_names!(former, nname) ⇒ Object
Replaces recursively +former+ name by +nname+ until it is redeclared.
-
#set_condition!(condition) ⇒ Object
Sets the condition.
-
#set_no!(no) ⇒ Object
Sets the no block.
-
#set_yes!(yes) ⇒ Object
Sets the yes block.
-
#to_c(res, level = 0) ⇒ Object
Generates the C text of the equivalent HDLRuby code.
-
#to_ch(res) ⇒ Object
Generates the content of the h file.
-
#to_hdr(level = 0) ⇒ Object
Generates the text of the equivalent hdr text.
-
#to_high ⇒ Object
Creates a new high if statement.
-
#to_seq! ⇒ Object
Convert the block to seq.
-
#to_upper_space! ⇒ Object
Moves the declarations to the upper namespace.
-
#to_verilog(spc = 3) ⇒ Object
Converts the system to Verilog code.
-
#to_vhdl(vars, level = 0) ⇒ Object
Generates the text of the equivalent HDLRuby::High code.
-
#use_name?(*names) ⇒ Boolean
Tell if the statement includes a signal whose name is one of +names+.
-
#with_var(upper = nil) ⇒ Object
Converts to a variable-compatible if where +upper+ is the upper block if any.
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
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
#condition ⇒ Object (readonly)
The condition
3129 3130 3131 |
# File 'lib/HDLRuby/hruby_low.rb', line 3129 def condition @condition end |
#no ⇒ Object
The yes and no statements
3132 3133 3134 |
# File 'lib/HDLRuby/hruby_low.rb', line 3132 def no @no end |
#yes ⇒ Object (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 |
#clone ⇒ Object
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 (*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.(*names) # Recurse on the no. @no.(*names) # Recruse one the no ifs statements. @noifs.each { |noif| noif[1].(*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.
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 |
#hash ⇒ Object
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.
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.
1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 |
# File 'lib/HDLRuby/hruby_low2c.rb', line 1586 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
1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 |
# File 'lib/HDLRuby/hruby_low2c.rb', line 1633 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_high ⇒ Object
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.
1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 |
# File 'lib/HDLRuby/hruby_verilog.rb', line 1589 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.
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 |