Class: RubyHDL::High::Sblock

Inherits:
SblockTop show all
Defined in:
lib/HDLRuby/std/sequencer_sw.rb

Overview

Describes a SW implementation of a block.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from SblockTop

#callable, #callable?, #each_signal, #make_inners, #make_inputs, #make_outputs, #register

Constructor Details

#initialize(sequencer, &ruby_block) ⇒ Sblock

Create a new block for sequencer +sequencer+ and fill it by executing +ruby_block+



3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3468

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.
  # unsigned 32-bit integers by default.
  @args = []
  ruby_block.parameters.each do |typ,arg|
    # @args << SignalI.new(arg,Void,:inner)
    @args << SignalI.new(arg,bit[32],:inner)
  end
  # Fill it.
  self.instance_exec(*@args,&ruby_block)
  # Pop the new sblock.
  RubyHDL::High.pop_sblock
end

Instance Attribute Details

#sequencerObject (readonly)

Returns the value of attribute sequencer.



3464
3465
3466
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3464

def sequencer
  @sequencer
end

Instance Method Details

#add(statement) ⇒ Object Also known as: <<

Add a new statement to the block.



3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3490

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.



3518
3519
3520
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3518

def delete(statement)
  @statements.delete(statement)
end

#each_arg(&ruby_block) ⇒ Object

Iterate on the arguments if any.



3533
3534
3535
3536
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3533

def each_arg(&ruby_block)
  return to_enum(:each_arg) unless ruby_block
  @args.each(&ruby_block)
end

#each_statement(&ruby_block) ⇒ Object

Iterate on the statements.



3503
3504
3505
3506
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3503

def each_statement(&ruby_block)
  return to_enum(:each_statement) unless ruby_block
  @statements.each { |statement| ruby_block(statement) }
end

#each_statement_deep(&ruby_block) ⇒ Object

Iterate deeply on the statements.



3509
3510
3511
3512
3513
3514
3515
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3509

def each_statement_deep(&ruby_block)
  return to_enum(:each_statement_deep) unless ruby_block
  @statements.each do |statement|
    statement.each_statement_deep(&ruby_block)
    ruby_block(statement)
  end
end

#last_statementObject

Get the last statement.



3528
3529
3530
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3528

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



3652
3653
3654
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3652

def ruby(str = nil, &ruby_block)
  self << RubyHDL::High::Ruby.new(str,&ruby_block)
end

#sbreakObject

Breaks current iteration.



3580
3581
3582
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3580

def sbreak
  self << RubyHDL::High::Sbreak.new(@sequencer)
end

#scontinueObject

Continues current iteration.



3585
3586
3587
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3585

def scontinue
  self << RubyHDL::High::Scontinue.new(@sequencer)
end

#selse(&ruby_block) ⇒ Object Also known as: helse

Create a sequential else statement.



3612
3613
3614
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3612

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



3606
3607
3608
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3606

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



3634
3635
3636
3637
3638
3639
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3634

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



3600
3601
3602
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3600

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.



3628
3629
3630
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3628

def sloop(&ruby_block)
  self << RubyHDL::High::Sloop.new(@sequencer,&ruby_block)
end

#sreturn(val) ⇒ Object

Create a return statement.



3590
3591
3592
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3590

def sreturn(val)
  self << RubyHDL::High::Sreturn.new(@sequencer,val)
end

#stepObject

Mark a step.



3570
3571
3572
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3570

def step
  self << RubyHDL::High::Step.new(@sequencer)
end

#steps(num) ⇒ Object

Mark several steps.



3575
3576
3577
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3575

def steps(num)
  num.times { self.step }
end

#sterminateObject

Terminates the sequencer.



3595
3596
3597
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3595

def sterminate
  self << RubyHDL::High::Sterminate.new(@sequencer)
end

#swait(cond) ⇒ Object

Wait a given condition.



3618
3619
3620
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3618

def swait(cond)
  self.swhile(~cond)
end

#swhile(cond, &ruby_block) ⇒ Object

Create a sequential while statement on +cond+.



3623
3624
3625
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3623

def swhile(cond,&ruby_block)
  self << RubyHDL::High::Swhile.new(@sequencer,cond,&ruby_block)
end

#syncObject

Mark a synchronisation. For software only: stop the current sequencer for allowing sharing of variables with other ones.



3646
3647
3648
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3646

def sync
  self << RubyHDL::High::Sync.new(@sequencer)
end

#text(str) ⇒ Object

Some arbitrary code whose text is to add direction.



3657
3658
3659
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3657

def text(str)
  self << str.to_s
end

#to_cObject

Convert to C code.



3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3554

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_rubyObject

Convert to Ruby code.



3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3539

def to_ruby
  res = ""
  # The arguments are ignored, as they are handled in SfunctionT.
  # # 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.



3523
3524
3525
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3523

def unshift(statement)
  @statements.unshift(statement)
end