Class: HDLRuby::High::Connection

Inherits:
Low::Connection show all
Defined in:
lib/HDLRuby/hruby_high.rb,
lib/HDLRuby/hruby_rsim.rb,
lib/HDLRuby/hruby_rcsim.rb

Overview

Extends the Connection 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 inherited from Low::Transmit

#left, #right

Attributes included from Low::Hparent

#parent

Instance Method Summary collapse

Methods inherited from Low::Connection

#array_connection, #break_concat_assigns, #eql?, #hash, #parent_system, #reassign_expressions!, #to_high, #to_verilog, #top_block, #top_scope

Methods inherited from Low::Transmit

#boolean_in_assign2select!, #break_concat_assigns, #casts_without_expression!, #clone, #each_block, #each_block_deep, #each_deep, #each_node, #each_node_deep, #each_statement_deep, #eql?, #explicit_types!, #extract_selects!, #hash, #initialize, #map_nodes!, #replace_expressions!, #set_left!, #set_right!, #to_c, #to_hdr, #to_high, #to_verilog, #to_vhdl, #use_name?

Methods inherited from Low::Statement

#add_blocks_code, #add_make_block, #behavior, #block, #blocks2seq!, #break_types!, #clone, #delete_related!, #delete_unless!, #each_deep, #each_statement, #eql?, #explicit_types!, #extract_declares!, #hash, #mix?, #par_in_seq2seq!, #parent_system, #replace_expressions!, #replace_names!, #scope, #to_c, #to_ch, #to_hdr, #to_high, #to_seq!, #to_upper_space!, #to_vhdl, #top_block, #top_scope, #use_name?, #with_boolean!

Methods included from Low::Low2Symbol

#to_sym

Methods included from Low::Hparent

#hierarchy, #no_parent!, #scope

Constructor Details

This class inherits a constructor from HDLRuby::Low::Transmit

Instance Attribute Details

#rcbehaviorObject (readonly)

Returns the value of attribute rcbehavior.



692
693
694
# File 'lib/HDLRuby/hruby_rcsim.rb', line 692

def rcbehavior
  @rcbehavior
end

Instance Method Details

#at(event) ⇒ Object

Creates a new behavior sensitive to +event+ including the connection converted to a transmission, and replace the former by the new behavior.



3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
# File 'lib/HDLRuby/hruby_high.rb', line 3714

def at(event)
    # Creates the behavior.
    left, right = self.left, self.right
    # Detached left and right from their connection since they will
    # be put in a new behavior instead.
    left.parent = right.parent = nil
    # Create the new behavior replacing the connection.
    behavior = Behavior.new(:par,event) do
        left <= right
    end
    # Adds the behavior.
    High.top_user.add_behavior(behavior)
    # Remove the connection
    High.top_user.delete_connection!(self)
end

#execute(mode) ⇒ Object

Executes the statement.



799
800
801
802
# File 'lib/HDLRuby/hruby_rsim.rb', line 799

def execute(mode)
    # puts "connection = #{self}"
    self.left.assign(mode,self.right.execute(mode))
end

#hif(condition) ⇒ Object

Creates a new behavior with an if statement from +condition+ enclosing the connection converted to a transmission, and replace the former by the new behavior.

NOTE: the else part is defined through the helse method.



3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
# File 'lib/HDLRuby/hruby_high.rb', line 3735

def hif(condition)
    # Creates the behavior.
    left, right = self.left, self.right
    # Detached left and right from their connection since they will
    # be put in a new behavior instead.
    left.parent = right.parent = nil
    # Create the new behavior replacing the connection.
    behavior = Behavior.new(:par) do
        hif(condition) do
            left <= right
        end
    end
    # Adds the behavior.
    High.top_user.add_behavior(behavior)
    # Remove the connection
    High.top_user.delete_connection!(self)
end

#init_sim(systemT) ⇒ Object

Initialize the simulation for system +systemT+.



776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
# File 'lib/HDLRuby/hruby_rsim.rb', line 776

def init_sim(systemT)
    # Recurse on the left.
    self.left.init_sim(systemT)
    # Process the sensitivity list.
    # Is it a clocked behavior?
    events = []
    # Generate the events list from the right values.
    # First get the references.
    refs = self.right.each_node_deep.select do |node|
        node.is_a?(RefObject) && !node.parent.is_a?(RefObject) 
    end.to_a
    # Keep only one ref per signal.
    refs.uniq! { |node| node.fullname }
    # # Generate the event.
    # events = refs.map {|ref| Event.new(:anyedge,ref) }
    # # Add them to the behavior for further processing.
    # events.each {|event| self.add_event(event) }
    # Now process the events: add the connection to the corresponding
    # activation list of the signals of the events.
    refs.each {|ref| ref.object.add_anyedge(self) }
end

#to_exprObject

Converts the connection to a comparison expression.

NOTE: required because the <= operator is ambigous and by default produces a Transmit or a Connection.



3704
3705
3706
3707
3708
3709
# File 'lib/HDLRuby/hruby_high.rb', line 3704

def to_expr
    # Remove the connection from the system type.
    High.top_user.delete_connection(self)
    # Generate an expression.
    return Binary.new(:<=,self.left,self.right)
end

#to_lowObject

Converts the connection to HDLRuby::Low.



3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
# File 'lib/HDLRuby/hruby_high.rb', line 3754

def to_low
    # return HDLRuby::Low::Connection.new(self.left.to_low,
    #                                     self.right.to_low)
    connectionL = HDLRuby::Low::Connection.new(self.left.to_low,
                                        self.right.to_low)
    # # For debugging: set the source high object 
    # connectionL.properties[:low2high] = self.hdr_id
    # self.properties[:high2low] = connectionL
    return connectionL
end

#to_rcsim(rcowner) ⇒ Object

Generate the C description of the connection. +rcowner+ is a link to the C description of the owner scope.



696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
# File 'lib/HDLRuby/hruby_rcsim.rb', line 696

def to_rcsim(rcowner)
    # puts "make behavior with self.class=#{self.class}"
    # Create the connection C object, actually it is a behavior.
    @rcbehavior = RCSim.rcsim_make_behavior(false)

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

    # Create and add the events.
    rcevs = []
    self.right.each_node_deep do |node|
        if node.is_a?(RefObject) then
            ev = RCSim.rcsim_make_event(:anyedge,node.to_rcsim)
            RCSim.rcsim_set_owner(ev,@rcbehavior)
            rcevs << ev
        end
    end
    RCSim.rcsim_add_behavior_events(@rcbehavior,rcevs)

    # Create and set the block.
    rcblock = RCSim.rcsim_make_block(:par)
    # RCSim.rcsim_add_block_statement(
    #     RCSim.rcsim_make_transmit(self.left.to_rcsim,
    #                         self.right.to_rcsim))
    # puts "self.left=#{self.left} self.right=#{self.right}"
    RCSim.rcsim_add_block_statements(rcblock,
        [RCSim.rcsim_make_transmit(self.left.to_rcsim, self.right.to_rcsim)])
    RCSim.rcsim_set_behavior_block(@rcbehavior,rcblock)

    return @rcbehavior
end