Class: HDLRuby::High::Connection
- Inherits:
-
Low::Connection
- Object
- Base::Statement
- Low::Statement
- Low::Transmit
- Low::Connection
- HDLRuby::High::Connection
- 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
Constants included from Low::Low2Symbol
Low::Low2Symbol::Low2SymbolPrefix, Low::Low2Symbol::Low2SymbolTable, Low::Low2Symbol::Symbol2LowTable
Instance Attribute Summary collapse
-
#rcbehavior ⇒ Object
readonly
Returns the value of attribute rcbehavior.
Attributes inherited from Low::Transmit
Attributes included from Low::Hparent
Instance Method Summary collapse
-
#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.
-
#execute(mode) ⇒ Object
Executes the statement.
-
#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.
-
#init_sim(systemT) ⇒ Object
Initialize the simulation for system +systemT+.
-
#to_expr ⇒ Object
Converts the connection to a comparison expression.
-
#to_low ⇒ Object
Converts the connection to HDLRuby::Low.
-
#to_rcsim(rcowner) ⇒ Object
Generate the C description of the connection.
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
Methods included from Low::Hparent
#hierarchy, #no_parent!, #scope
Constructor Details
This class inherits a constructor from HDLRuby::Low::Transmit
Instance Attribute Details
#rcbehavior ⇒ Object (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_expr ⇒ Object
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_low ⇒ Object
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 |