Class: HDLRuby::High::SignalI
- Inherits:
-
Low::SignalI
- Object
- Base::SignalI
- Low::SignalI
- HDLRuby::High::SignalI
- Includes:
- HRef, SimSignal, WithFullname
- 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 SignalI 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
-
#can_read ⇒ Object
Tells if the signal can be read.
-
#can_write ⇒ Object
Tells if the signal can be written.
-
#dir ⇒ Object
The bounding direction.
-
#rcsignalI ⇒ Object
readonly
Returns the value of attribute rcsignalI.
Attributes included from SimSignal
Attributes inherited from Low::SignalI
Attributes included from Low::Hparent
Instance Method Summary collapse
-
#anyedge ⇒ Object
Creates an edge event from the signal.
-
#coerce(obj) ⇒ Object
Coerce by converting signal to an expression.
-
#initialize(name, type, dir, value = nil) ⇒ SignalI
constructor
Creates a new signal named +name+ typed as +type+ with +dir+ as bounding direction and possible +value+.
-
#negedge ⇒ Object
Creates a negative edge event from the signal.
-
#posedge ⇒ Object
Creates a positive edge event from the signal.
-
#to_expr ⇒ Object
Converts to a new expression.
-
#to_low(name = self.name) ⇒ Object
Converts the system to HDLRuby::Low and set its +name+.
-
#to_rcsim(rcowner) ⇒ Object
Generate the C description of the signal comming from object whose C description is +rcowner+.
-
#to_ref ⇒ Object
Converts to a new reference.
Methods included from WithFullname
Methods included from SimSignal
#add_anyedge, #add_negedge, #add_posedge, #assign, #assign_at, #each_anyedge, #each_negedge, #each_posedge, #execute, #fullname, #get_vars_with_fullname, #get_vars_with_idstr, #init_sim, #show_hierarchy
Methods included from HRef
Methods inherited from Low::SignalI
#add_signal, #clone, #each_deep, #each_signal, #explicit_types!, #get_by_name, #get_signal, #immutable?, #replace_names!, #set_name!, #set_type!, #set_value!, #to_c, #to_c_alias, #to_c_signal, #to_ch, #to_hdr, #to_high, #to_verilog, #to_vhdl, #width
Methods included from Low::Low2Symbol
Methods included from Low::Hparent
#hierarchy, #no_parent!, #scope
Constructor Details
#initialize(name, type, dir, value = nil) ⇒ SignalI
Creates a new signal named +name+ typed as +type+ with +dir+ as bounding direction and possible +value+.
NOTE: +dir+ can be :input, :output, :inout or :inner
3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 |
# File 'lib/HDLRuby/hruby_high.rb', line 3838 def initialize(name,type,dir,value = nil) # Check the value. value = value.to_expr.match_type(type) if value # Initialize the type structure. super(name,type,value) unless name.empty? then # Named signal, set the hdl-like access to the signal. obj = self # For using the right self within the proc High.space_reg(name) { obj } end # Hierarchical type allows access to sub references, so generate # the corresponding methods. # For that first get the real type. type = type.def while type.is_a?(TypeDef) # Now process it if it is a structured type. if type.struct? then type.each_name do |name| sig = SignalI.new(name,type.get_type(name),dir) self.add_signal(sig) self.define_singleton_method(name) do RefObject.new(self.to_ref,sig) end end end # Check and set the bound. self.dir = dir # Set the read and write authorisations. @can_read = 1.to_expr @can_write = 1.to_expr end |
Instance Attribute Details
#can_read ⇒ Object
Tells if the signal can be read.
3829 3830 3831 |
# File 'lib/HDLRuby/hruby_high.rb', line 3829 def can_read @can_read end |
#can_write ⇒ Object
Tells if the signal can be written.
3832 3833 3834 |
# File 'lib/HDLRuby/hruby_high.rb', line 3832 def can_write @can_write end |
#dir ⇒ Object
The bounding direction.
3826 3827 3828 |
# File 'lib/HDLRuby/hruby_high.rb', line 3826 def dir @dir end |
#rcsignalI ⇒ Object (readonly)
Returns the value of attribute rcsignalI.
410 411 412 |
# File 'lib/HDLRuby/hruby_rcsim.rb', line 410 def rcsignalI @rcsignalI end |
Instance Method Details
#anyedge ⇒ Object
Creates an edge event from the signal.
3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 |
# File 'lib/HDLRuby/hruby_high.rb', line 3918 def anyedge # return Event.new(:edge,self.to_ref) # Is there any sub signals? if self.each_signal.any? then # Yes, make events with them instead. return self.each_signal.map { |sig| sig.anyedge } else # No, create a single event. return Event.new(:anyedge,self.to_ref) end end |
#coerce(obj) ⇒ Object
Coerce by converting signal to an expression.
3941 3942 3943 |
# File 'lib/HDLRuby/hruby_high.rb', line 3941 def coerce(obj) return [obj,self.to_expr] end |
#negedge ⇒ Object
Creates a negative edge event from the signal.
3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 |
# File 'lib/HDLRuby/hruby_high.rb', line 3905 def negedge # return Event.new(:negedge,self.to_ref) # Is there any sub signals? if self.each_signal.any? then # Yes, make events with them instead. return self.each_signal.map { |sig| sig.negedge } else # No, create a single event. return Event.new(:negedge,self.to_ref) end end |
#posedge ⇒ Object
Creates a positive edge event from the signal.
3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 |
# File 'lib/HDLRuby/hruby_high.rb', line 3892 def posedge # return Event.new(:posedge,self.to_ref) # Is there any sub signals? if self.each_signal.any? then # Yes, make events with them instead. return self.each_signal.map { |sig| sig.posedge } else # No, create a single event. return Event.new(:posedge,self.to_ref) end end |
#to_expr ⇒ Object
Converts to a new expression.
3936 3937 3938 |
# File 'lib/HDLRuby/hruby_high.rb', line 3936 def to_expr return self.to_ref end |
#to_low(name = self.name) ⇒ Object
Converts the system to HDLRuby::Low and set its +name+.
3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 |
# File 'lib/HDLRuby/hruby_high.rb', line 3946 def to_low(name = self.name) # return HDLRuby::Low::SignalI.new(name,self.type.to_low) valueL = self.value ? self.value.to_low : nil signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low,valueL) # Recurse on the sub signals if any. self.each_signal do |sig| signalIL.add_signal(sig.to_low) end # # For debugging: set the source high object # signalIL.properties[:low2high] = self.hdr_id # self.properties[:high2low] = signalIL return signalIL end |
#to_rcsim(rcowner) ⇒ Object
Generate the C description of the signal comming from object whose C description is +rcowner+
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 |
# File 'lib/HDLRuby/hruby_rcsim.rb', line 414 def to_rcsim(rcowner) # Create the signal C object. @rcsignalI = RCSim.rcsim_make_signal(self.name.to_s, self.type.to_rcsim) # puts "to_rcsim for signal=(#{self.name})#{self}, @rcsignalI=#{@rcsignalI}" # Set the owner. RCSim.rcsim_set_owner(@rcsignalI,rcowner) # Create and add the sub signals if any. RCSim.rcsim_add_signal_signals(@rcsignalI, self.each_signal.each.map do |sig| sig.to_rcsim(@rcsignalI) end) # Set the initial value if any. if self.value then RCSim.rcsim_set_signal_value(@rcsignalI,self.value.to_rcsim) end return @rcsignalI end |