Class: RubyHDL::High::Sblock
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Overview
Describes a SW implementation of a block.
Instance Attribute Summary collapse
-
#sequencer ⇒ Object
readonly
Returns the value of attribute sequencer.
Instance Method Summary collapse
-
#add(statement) ⇒ Object
(also: #<<)
Add a new statement to the block.
-
#delete(statement) ⇒ Object
Delete a statement.
-
#initialize(sequencer, &ruby_block) ⇒ Sblock
constructor
Create a new block for sequencer +sequencer+ and fill it by executing +ruby_block+.
-
#last_statement ⇒ Object
Get the last statement.
-
#ruby(str = nil, &ruby_block) ⇒ Object
Some arbirary Ruby code as a string +str+ or as a proc +ruby_block+.
-
#sbreak ⇒ Object
Breaks current iteration.
-
#scontinue ⇒ Object
Continues current iteration.
-
#selse(&ruby_block) ⇒ Object
(also: #helse)
Create a sequential else statement.
-
#selsif(cond, &ruby_block) ⇒ Object
(also: #helsif)
Create a sequential elsif statement on +cond+.
-
#sfor(expr, &ruby_block) ⇒ Object
Create a sequential for statement iterating over the elements of +expr+.
-
#sif(cond, &ruby_block) ⇒ Object
(also: #hif)
Create a sequential if statement on +cond+.
-
#sloop(&ruby_block) ⇒ Object
Create a sequential infinite loop statement.
-
#step ⇒ Object
Mark a step.
-
#steps(num) ⇒ Object
Mark several steps.
-
#sterminate ⇒ Object
Terminates the sequencer.
-
#swait(cond) ⇒ Object
Wait a given condition.
-
#swhile(cond, &ruby_block) ⇒ Object
Create a sequential while statement on +cond+.
-
#sync ⇒ Object
Mark a synchronisation.
-
#text(str) ⇒ Object
Some arbitrary code whose text is to add direction.
-
#to_c ⇒ Object
Convert to C code.
-
#to_ruby ⇒ Object
Convert to Ruby code.
-
#unshift(statement) ⇒ Object
Unshift a new statement.
Methods inherited from SblockTop
#callable, #callable?, #each_signal, #make_inners, #register
Constructor Details
#initialize(sequencer, &ruby_block) ⇒ Sblock
Create a new block for sequencer +sequencer+ and fill it by executing +ruby_block+
3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3248 def initialize(sequencer,&ruby_block) super() # Sets the sequencer. @sequencer = sequencer # Initialize the statements. @statements = [] # Push the new sblock on top of the stack. RubyHDL::High.push_sblock(self) # Make signals from the arguments of the ruby block. @args = [] ruby_block.parameters.each do |typ,arg| @args << SignalI.new(Void,arg) end # Fill it. self.instance_exec(*@args,&ruby_block) # Pop the new sblock. RubyHDL::High.pop_sblock end |
Instance Attribute Details
#sequencer ⇒ Object (readonly)
Returns the value of attribute sequencer.
3244 3245 3246 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3244 def sequencer @sequencer end |
Instance Method Details
#add(statement) ⇒ Object Also known as: <<
Add a new statement to the block.
3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3268 def add(statement) # Add the statement. @statements.push(statement) # # If the statement is a transmit, schedule the corresponding # # signal for final update. # if statement.is_a?(Transmit) then # @sequencer.to_update(statement.left) # end statement end |
#delete(statement) ⇒ Object
Delete a statement.
3281 3282 3283 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3281 def delete(statement) @statements.delete(statement) end |
#last_statement ⇒ Object
Get the last statement.
3291 3292 3293 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3291 def last_statement return @statements[-1] end |
#ruby(str = nil, &ruby_block) ⇒ Object
Some arbirary Ruby code as a string +str+ or as a proc +ruby_block+.
3404 3405 3406 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3404 def ruby(str = nil, &ruby_block) self << RubyHDL::High::Ruby.new(str,&ruby_block) end |
#sbreak ⇒ Object
Breaks current iteration.
3337 3338 3339 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3337 def sbreak self << RubyHDL::High::Sbreak.new(@sequencer) end |
#scontinue ⇒ Object
Continues current iteration.
3342 3343 3344 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3342 def scontinue self << RubyHDL::High::Scontinue.new(@sequencer) end |
#selse(&ruby_block) ⇒ Object Also known as: helse
Create a sequential else statement.
3364 3365 3366 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3364 def selse(&ruby_block) self.last_statement.selse(&ruby_block) end |
#selsif(cond, &ruby_block) ⇒ Object Also known as: helsif
Create a sequential elsif statement on +cond+.
3358 3359 3360 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3358 def selsif(cond, &ruby_block) self.last_statement.selsif(&ruby_block) end |
#sfor(expr, &ruby_block) ⇒ Object
Create a sequential for statement iterating over the elements of +expr+.
3386 3387 3388 3389 3390 3391 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3386 def sfor(expr,&ruby_block) # Ensures there is a ruby block to avoid returning an enumerator # (returning an enumerator would be confusing for a for statement). ruby_block = proc {} unless ruby_block self << expr.seach.with_index(&ruby_block) end |
#sif(cond, &ruby_block) ⇒ Object Also known as: hif
Create a sequential if statement on +cond+.
3352 3353 3354 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3352 def sif(cond, &ruby_block) self << RubyHDL::High::Sif.new(@sequencer,cond,&ruby_block) end |
#sloop(&ruby_block) ⇒ Object
Create a sequential infinite loop statement.
3380 3381 3382 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3380 def sloop(&ruby_block) self << RubyHDL::High::Sloop.new(@sequencer,&ruby_block) end |
#step ⇒ Object
Mark a step.
3327 3328 3329 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3327 def step self << RubyHDL::High::Step.new(@sequencer) end |
#steps(num) ⇒ Object
Mark several steps.
3332 3333 3334 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3332 def steps(num) num.times { self.step } end |
#sterminate ⇒ Object
Terminates the sequencer.
3347 3348 3349 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3347 def sterminate self << RubyHDL::High::Sterminate.new(@sequencer) end |
#swait(cond) ⇒ Object
Wait a given condition.
3370 3371 3372 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3370 def swait(cond) self.swhile(~cond) end |
#swhile(cond, &ruby_block) ⇒ Object
Create a sequential while statement on +cond+.
3375 3376 3377 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3375 def swhile(cond,&ruby_block) self << RubyHDL::High::Swhile.new(@sequencer,cond,&ruby_block) end |
#sync ⇒ Object
Mark a synchronisation. For software only: stop the current sequencer for allowing sharing of variables with other ones.
3398 3399 3400 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3398 def sync self << RubyHDL::High::Sync.new end |
#text(str) ⇒ Object
Some arbitrary code whose text is to add direction.
3409 3410 3411 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3409 def text(str) self << str.to_s end |
#to_c ⇒ Object
Convert to C code.
3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3311 def to_c res = "" # Generate the arguments if any. if @args.any? then res = "(#{@args.map(&:to_c).join(",")})\n" end # Generate the statements. res += "{" + @statements.map do |stmnt| stmnt.to_ruby + "\n" end.join + "}" return res end |
#to_ruby ⇒ Object
Convert to Ruby code.
3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3297 def to_ruby res = "" # Generate the arguments if any. if @args.any? then res = "|#{@args.map(&:to_ruby).join(",")}|\n" end # Generate the statements. res += @statements.map do |stmnt| stmnt.to_ruby + "\n" end.join return res end |
#unshift(statement) ⇒ Object
Unshift a new statement.
3286 3287 3288 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3286 def unshift(statement) @statements.unshift(statement) end |