Module: HDLRuby::High::RCSimBehavior

Included in:
Behavior, TimeBehavior
Defined in:
lib/HDLRuby/hruby_rcsim.rb

Overview

Module for extending the behavior classes for hybrid Ruby-C simulation.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#rcbehaviorObject (readonly)

Returns the value of attribute rcbehavior.



309
310
311
# File 'lib/HDLRuby/hruby_rcsim.rb', line 309

def rcbehavior
  @rcbehavior
end

Instance Method Details

#to_rcsim(rcowner) ⇒ Object

Generate the C description of the behavior comming from object whose C description is +rcowner+



313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'lib/HDLRuby/hruby_rcsim.rb', line 313

def to_rcsim(rcowner)
    # puts "to_rcsim for behavior=#{self}"
    # Process the sensitivity list.
    # Is it a clocked behavior?
    events = self.each_event.to_a
    # puts "events=#{events.map {|ev| ev.ref.object.name }}"
    if !self.is_a?(TimeBehavior) && events.empty? then
        # No events, this is not a clock behavior.
        # And it is not a time behavior neigther.
        # Generate the events list from the right values.
        # First get the references.
        refs = self.block.each_node_deep.select do |node|
            node.is_a?(RefObject) && !node.leftvalue? && 
                !node.parent.is_a?(RefObject) 
        end.to_a
        # puts "refs=#{refs}"
        # Keep only one ref per signal.
        refs.uniq! { |node| node.fullname }
        # Remove the inner signals from the list.
        self.block.each_inner do |inner|
            refs.delete_if {|r| r.name == inner.name }
        end
        # Generate the event.
        events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
        # Add them to the behavior for further processing.
        events.each {|event| self.add_event(event) }
    end

    # Create the behavior C object.
    # puts "make behavior with self.class=#{self.class}"
    @rcbehavior = RCSim.rcsim_make_behavior(self.is_a?(TimeBehavior))

    # Set the owner.
    RCSim.rcsim_set_owner(@rcbehavior,rcowner)

    # Create and add the events.
    # self.each_event do |ev|
    #     RCSim.rcsim_add_behavior_event(@rcbehavior,ev.to_rcsim)
    # end
    RCSim.rcsim_add_behavior_events(@rcbehavior,
                                    self.each_event.map do |ev|
        # puts "adding event: #{ev.ref.object.name}(#{ev.type})"
        ev.to_rcsim(@rcbehavior)
    end)

    # Create and add the block.
    RCSim.rcsim_set_behavior_block(@rcbehavior,self.block.to_rcsim)

    return @rcbehavior
end