Class: HDLRuby::High::TimeBehavior

Inherits:
Low::TimeBehavior show all
Includes:
RCSimBehavior
Defined in:
lib/HDLRuby/hruby_high.rb,
lib/HDLRuby/hruby_rsim.rb,
lib/HDLRuby/hruby_rcsim.rb,
lib/HDLRuby/hruby_high_fullname.rb

Overview

Extends the TimeBehavior class for hybrid Ruby-C simulation.

Constant Summary collapse

High =
HDLRuby::High

Constants included from Low::Low2Symbol

Low::Low2Symbol::Low2SymbolPrefix, Low::Low2Symbol::Low2SymbolTable, Low::Low2Symbol::Symbol2LowTable

Instance Attribute Summary collapse

Attributes included from RCSimBehavior

#rcbehavior

Attributes inherited from Low::Behavior

#block

Attributes included from Low::Hparent

#parent

Instance Method Summary collapse

Methods included from RCSimBehavior

#to_rcsim

Methods inherited from Low::TimeBehavior

#add_event, #eql?, #hash, #set_block!, #to_c, #to_hdr, #to_high

Methods inherited from Low::Behavior

#add_event, #blocks2seq!, #delete_event!, #each_block, #each_block_deep, #each_deep, #each_event, #each_node_deep, #each_statement, #eql?, #explicit_types!, #extract_declares!, #get_by_name, #has_event?, #hash, #last_statement, #map_events!, #mixblocks2seq!, #on_edge?, #on_event?, #parent_system, #replace_names!, #reverse_each_statement, #set_block!, #to_c, #to_ch, #to_hdr, #to_high, #to_upper_space!, #to_vhdl, #top_scope, #with_boolean!, #with_var!

Methods included from Low::Low2Symbol

#to_sym

Methods included from Low::Hparent

#hierarchy, #no_parent!, #scope

Constructor Details

#initialize(mode, &ruby_block) ⇒ TimeBehavior

Creates a new timed behavior built by executing +ruby_block+. +mode+ can be either :seq or :par for respectively sequential or



4360
4361
4362
4363
4364
4365
# File 'lib/HDLRuby/hruby_high.rb', line 4360

def initialize(mode, &ruby_block)
    # Create a default par block for the behavior.
    block = High.make_time_block(mode,&ruby_block)
    # Initialize the behavior with it.
    super(block)
end

Instance Attribute Details

#idObject (readonly)

Get the id of the timed behavior.



338
339
340
# File 'lib/HDLRuby/hruby_rsim.rb', line 338

def id
  @id
end

#timeObject

Get the current time of the behavior.



336
337
338
# File 'lib/HDLRuby/hruby_rsim.rb', line 336

def time
  @time
end

Instance Method Details

#fullnameObject

Returns the name of the signal with its hierarchy.



52
53
54
# File 'lib/HDLRuby/hruby_high_fullname.rb', line 52

def fullname
    return self.parent.fullname
end

#init_sim(systemT) ⇒ Object

Initialize the simulation for system +systemT+.



341
342
343
344
345
346
347
348
349
# File 'lib/HDLRuby/hruby_rsim.rb', line 341

def init_sim(systemT)
    @sim = systemT
    # Add the behavior to the list of timed behavior.
    @id = systemT.add_timed_behavior(self)
    # Initialize the time to 0.
    @time = 0
    # Initialize the statements.
    self.block.init_sim(systemT)
end

#make_threadObject

Create the execution thread



352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
# File 'lib/HDLRuby/hruby_rsim.rb', line 352

def make_thread
    systemT = @sim
    @thread = Thread.new do
        # puts "In thread."
        # sleep
        systemT.run_init do
            begin
                # puts "Starting thread"
                systemT.run_req(@id)
                self.block.execute(:par)
                # puts "Ending thread"
            rescue => e
                puts "Got exception: #{e.full_message}"
            end
            systemT.remove_timed_behavior(self)
            systemT.run_done(@id)
        end
    end
end

#runObject

(Re)start execution of the thread.



373
374
375
376
# File 'lib/HDLRuby/hruby_rsim.rb', line 373

def run
    # Run.
    @thread.run
end

#to_lowObject

Converts the time behavior to HDLRuby::Low.



4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
# File 'lib/HDLRuby/hruby_high.rb', line 4368

def to_low
    # Create the low level block.
    blockL = self.block.to_low
    # Create the low level events.
    eventLs = self.each_event.map { |event| event.to_low }
    # Create and return the resulting low level behavior.
    timeBehaviorL = HDLRuby::Low::TimeBehavior.new(blockL)
    # # For debugging: set the source high object 
    # timeBehaviorL.properties[:low2high] = self.hdr_id
    # self.properties[:high2low] = timeBehaviorL
    eventLs.each(&timeBehaviorL.method(:add_event))
    return timeBehaviorL
end