Module: HDLRuby::High::HBlock

Includes:
HScope_missing, Hmux
Included in:
Block, TimeBlock
Defined in:
lib/HDLRuby/hruby_high.rb

Overview

Module giving the properties of a high-level block.

Constant Summary collapse

High =
HDLRuby::High

Constants included from Hmissing

HDLRuby::High::Hmissing::NAMES

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Hmux

#mux

Methods included from HScope_missing

#h_missing, #method_missing

Methods included from Hmissing

#method_missing

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class HDLRuby::High::HScope_missing

Instance Attribute Details

#namespaceObject (readonly)

The namespace



4166
4167
4168
# File 'lib/HDLRuby/hruby_high.rb', line 4166

def namespace
  @namespace
end

#return_valueObject (readonly)

The return value when building the scope.



4169
4170
4171
# File 'lib/HDLRuby/hruby_high.rb', line 4169

def return_value
  @return_value
end

Instance Method Details

#add_block(mode = nil, name = :"", &ruby_block) ⇒ Object

Creates and adds a new block executed in +mode+, with possible +name+ and built by executing +ruby_block+.



4200
4201
4202
4203
4204
4205
4206
4207
# File 'lib/HDLRuby/hruby_high.rb', line 4200

def add_block(mode = nil, name = :"", &ruby_block)
    # Creates the block.
    block = High.make_block(mode,name,&ruby_block)
    # Adds it as a statement.
    self.add_statement(block)
    # Use its return value.
    return block.return_value
end

#build(&ruby_block) ⇒ Object Also known as: open

Build the block by executing +ruby_block+.



4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
# File 'lib/HDLRuby/hruby_high.rb', line 4172

def build(&ruby_block)
    High.space_push(@namespace)
    @return_value = High.top_user.instance_eval(&ruby_block)
    High.space_pop
    # if @return_value.is_a?(HExpression) then
    #     res = @return_value
    #     High.space_push(@namespace)
    #     @return_value = res.type.inner(HDLRuby.uniq_name)
    #     puts "@return_value name=#{@return_value.name}"
    #     @return_value <= res
    #     High.space_pop
    #     @return_value = RefObject.new(self,@return_value)
    # end
    @return_value
end

#cur_behaviorObject

Gets the current behavior.



4254
4255
4256
# File 'lib/HDLRuby/hruby_high.rb', line 4254

def cur_behavior
    return HDLRuby::High.cur_behavior
end

#cur_blockObject

Gets the current block.



4244
4245
4246
# File 'lib/HDLRuby/hruby_high.rb', line 4244

def cur_block
    return HDLRuby::High.cur_block
end

#cur_scopeObject

Gets the current scope.



4259
4260
4261
# File 'lib/HDLRuby/hruby_high.rb', line 4259

def cur_scope
    return HDLRuby::High.cur_scope
end

#cur_systemObject

Gets the current system.



4264
4265
4266
# File 'lib/HDLRuby/hruby_high.rb', line 4264

def cur_system
    return HDLRuby::High.cur_system
end

#hcase(value) ⇒ Object

Creates a new case statement with a +value+ used for deciding which block to execute.

NOTE: the when part is defined through the hwhen method.



4326
4327
4328
4329
# File 'lib/HDLRuby/hruby_high.rb', line 4326

def hcase(value)
    # Creates the case statement.
    self.add_statement(Case.new(value))
end

#helse(mode = nil, &ruby_block) ⇒ Object

Sets the block executed when the condition is not met to the block in +mode+ generated by the execution of +ruby_block+.

Can only be used once.



4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
# File 'lib/HDLRuby/hruby_high.rb', line 4290

def helse(mode = nil, &ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    # There is a ruby_block: the helse is assumed to be with
    # the hif in the same block.
    # Completes the hif or the hcase statement.
    statement = @statements.last
    unless statement.is_a?(If) or statement.is_a?(Case) then
        raise AnyError, "Error: helse statement without hif nor hcase (#{statement.class})."
    end
    statement.helse(mode, &ruby_block)
end

#helsif(condition, mode = nil, &ruby_block) ⇒ Object

Sets the condition check when the condition is not met to the block, with a +condition+ that when met lead to the execution of the block in +mode+ generated by the +ruby_block+.



4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
# File 'lib/HDLRuby/hruby_high.rb', line 4306

def helsif(condition, mode = nil, &ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    # There is a ruby_block: the helse is assumed to be with
    # the hif in the same block.
    # Completes the hif statement.
    statement = @statements.last
    unless statement.is_a?(If) then
        raise AnyError,
             "Error: helsif statement without hif (#{statement.class})."
    end
    statement.helsif(condition, mode, &ruby_block)
end

#hif(condition, mode = self.mode, &ruby_block) ⇒ Object

Creates a new if statement with a +condition+ that when met lead to the execution of the block in +mode+ generated by the +ruby_block+.

NOTE: the else part is defined through the helse method. def hif(condition, mode = nil, &ruby_block)



4279
4280
4281
4282
4283
4284
# File 'lib/HDLRuby/hruby_high.rb', line 4279

def hif(condition, mode = self.mode, &ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    # Creates the if statement.
    self.add_statement(If.new(condition,mode,&ruby_block))
end

#hprint(*args) ⇒ Object

Prints.



4351
4352
4353
# File 'lib/HDLRuby/hruby_high.rb', line 4351

def hprint(*args)
    self.add_statement(Print.new(*args))
end

#hwhen(match, mode = nil, &ruby_block) ⇒ Object

Sets the block of a case structure executed when the +match+ is met to the block in +mode+ generated by the execution of +ruby_block+.

Can only be used once.



4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
# File 'lib/HDLRuby/hruby_high.rb', line 4335

def hwhen(match, mode = nil, &ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    # There is a ruby_block: the helse is assumed to be with
    # the hif in the same block.
    # Completes the hcase statement.
    statement = @statements.last
    unless statement.is_a?(Case) then
        raise AnyError,
            "Error: hwhen statement without hcase (#{statement.class})."
    end
    statement.hwhen(match, mode, &ruby_block)
end

#par(name = :"", &ruby_block) ⇒ Object

Creates a new parallel block with possible +name+ and built from +ruby_block+.



4211
4212
4213
4214
# File 'lib/HDLRuby/hruby_high.rb', line 4211

def par(name = :"", &ruby_block)
    return :par unless ruby_block
    self.add_block(:par,name,&ruby_block)
end

#seq(name = :"", &ruby_block) ⇒ Object

Creates a new sequential block with possible +name+ and built from +ruby_block+.



4218
4219
4220
4221
# File 'lib/HDLRuby/hruby_high.rb', line 4218

def seq(name = :"", &ruby_block)
    return :seq unless ruby_block
    self.add_block(:seq,name,&ruby_block)
end

#sub(name = :"", &ruby_block) ⇒ Object

Creates a new block with the current mode with possible +name+ and built from +ruby_block+.



4225
4226
4227
4228
4229
# File 'lib/HDLRuby/hruby_high.rb', line 4225

def sub(name = :"", &ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    self.add_block(self.mode,name,&ruby_block)
end

#terminateObject

Terminate the simulation.



4356
4357
4358
# File 'lib/HDLRuby/hruby_high.rb', line 4356

def terminate
    self.add_statement(TimeTerminate.new)
end

#to_refObject

Converts to a new reference.



4192
4193
4194
# File 'lib/HDLRuby/hruby_high.rb', line 4192

def to_ref
    return RefObject.new(this,self)
end

#top_blockObject

Gets the top block of the current behavior.



4249
4250
4251
# File 'lib/HDLRuby/hruby_high.rb', line 4249

def top_block
    return HDLRuby::High.top_block
end

#unshift(&ruby_block) ⇒ Object

Adds statements at the top of the block.



4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
# File 'lib/HDLRuby/hruby_high.rb', line 4232

def unshift(&ruby_block)
    # Ensure there is a block.
    ruby_block = proc {} unless block_given?
    # Create a sub block for the statements.
    block = High.make_block(self.mode,:"",&ruby_block)
    # Unshifts it.
    self.unshift_statement(block)
    # Use its return value.
    return block.return_value
end