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(level = 0) ⇒ Object
Generates the C text of the equivalent HDLRuby code.
-
#to_ch ⇒ 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
Constructor Details
#initialize(condition, yes, no = nil) ⇒ If
Creates a new if statement with a +condition+ and a +yes+ and +no+ blocks.
3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 |
# File 'lib/HDLRuby/hruby_low.rb', line 3049 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
3042 3043 3044 |
# File 'lib/HDLRuby/hruby_low.rb', line 3042 def condition @condition end |
#no ⇒ Object
The yes and no statements
3045 3046 3047 |
# File 'lib/HDLRuby/hruby_low.rb', line 3045 def no @no end |
#yes ⇒ Object (readonly)
The yes and no statements
3045 3046 3047 |
# File 'lib/HDLRuby/hruby_low.rb', line 3045 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.
3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 |
# File 'lib/HDLRuby/hruby_low.rb', line 3132 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 |
#clone ⇒ Object
Clones the If (deeply)
3259 3260 3261 3262 3263 3264 3265 3266 3267 |
# File 'lib/HDLRuby/hruby_low.rb', line 3259 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.
726 727 728 729 730 731 732 733 734 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 726 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.
795 796 797 798 799 800 801 802 803 804 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 795 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.
3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 |
# File 'lib/HDLRuby/hruby_low.rb', line 3211 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.
3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 |
# File 'lib/HDLRuby/hruby_low.rb', line 3239 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.
3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 |
# File 'lib/HDLRuby/hruby_low.rb', line 3081 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.
3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 |
# File 'lib/HDLRuby/hruby_low.rb', line 3180 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.
3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 |
# File 'lib/HDLRuby/hruby_low.rb', line 3195 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).
3152 3153 3154 3155 3156 3157 3158 3159 3160 |
# File 'lib/HDLRuby/hruby_low.rb', line 3152 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.
3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 |
# File 'lib/HDLRuby/hruby_low.rb', line 3165 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.
3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 |
# File 'lib/HDLRuby/hruby_low.rb', line 3224 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.
3100 3101 3102 3103 3104 3105 3106 |
# File 'lib/HDLRuby/hruby_low.rb', line 3100 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!
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 537 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 |
#hash ⇒ Object
Hash function.
3109 3110 3111 |
# File 'lib/HDLRuby/hruby_low.rb', line 3109 def hash return [@condition,@yes,@no].hash end |
#map_nodes!(&ruby_block) ⇒ Object
Maps on the children (including the condition).
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 748 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.
737 738 739 740 741 742 743 744 745 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 737 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.
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 770 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.
554 555 556 557 558 559 560 561 562 563 564 565 566 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 554 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.
692 693 694 695 696 697 698 699 700 701 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 692 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.
715 716 717 718 719 720 721 722 723 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 715 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.
704 705 706 707 708 709 710 711 712 |
# File 'lib/HDLRuby/hruby_low_mutable.rb', line 704 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(level = 0) ⇒ Object
Generates the C text of the equivalent HDLRuby code. +level+ is the hierachical level of the object.
1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 |
# File 'lib/HDLRuby/hruby_low2c.rb', line 1169 def to_c(level = 0) # The result string. res = " " * level*3 # Compute the condition. res << "{\n" res << " " * (level+1)*3 res << "Value cond = " << self.condition.to_c(level+1) << ";\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) 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) << ")) {\n" res << stmnt.to_c(level+1) res << " " * level*3 res << "}\n" end # Generate the no part if any. if self.no then res << " " * level*3 res << "else {\n" << self.no.to_c(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 |
#to_ch ⇒ Object
Generates the content of the h file.
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 |
# File 'lib/HDLRuby/hruby_low2c.rb', line 1211 def to_ch res = "" # Recurse on the sub statements. res << self.yes.to_ch self.each_noif do |cond,stmnt| res << stmnt.to_ch end res << self.no.to_ch 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.
524 525 526 527 528 529 530 531 532 |
# File 'lib/HDLRuby/hruby_low_without_namespace.rb', line 524 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.
1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 |
# File 'lib/HDLRuby/hruby_verilog.rb', line 1490 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.
3254 3255 3256 |
# File 'lib/HDLRuby/hruby_low.rb', line 3254 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 |