Class: HDLRuby::High::Value

Inherits:
Low::Value show all
Includes:
HExpression, Vprocess
Defined in:
lib/HDLRuby/hruby_high.rb,
lib/HDLRuby/hruby_rsim.rb,
lib/HDLRuby/hruby_rcsim.rb

Overview

Extends the Value class for hybrid Ruby-C simulation.

Constant Summary

Constants included from Low::Low2Symbol

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

Instance Attribute Summary

Attributes included from HExpression

#systemT, #type

Attributes inherited from Low::Value

#content

Attributes inherited from Low::Expression

#type

Attributes included from Low::Hparent

#parent

Instance Method Summary collapse

Methods included from Vprocess

#cast, #coerce, concat, #eql?, #to_f, #to_i, #to_vstr, #trunc, #zero?

Methods included from HExpression

#[], #as, #coerce, #inout, #input, #ljust, #lr, #ls, #match_type, #mux, orig_operator, #orig_operator, #output, #rjust, #rr, #rs, #sext, #to_bit, #to_unsigned, #zext

Methods inherited from Low::Value

#<=>, #boolean_in_assign2select, #casts_without_expression!, #clone, #each_deep, #eql?, #even?, #explicit_types, #hash, #immutable?, #initialize, #odd?, #set_content!, #to_arith, #to_c, #to_c_expr, #to_c_make, #to_ch, #to_getrange, #to_hdr, #to_high, #to_i, #to_verilog, #to_vhdl, #width

Methods inherited from Low::Expression

#boolean?, #break_types!, #clone, #each_node, #each_node_deep, #each_ref_deep, #eql?, #explicit_types, #extract_selects_to!, #hash, #immutable?, #initialize, #leftvalue?, #map_nodes!, #replace_expressions!, #replace_names!, #rightvalue?, #set_type!, #signal2subs!, #statement, #to_c, #to_c_expr, #to_hdr, #to_high, #to_vhdl, #use_name?

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::Value

Instance Method Details

#constant?Boolean

Tell if the expression is constant.

Returns:

  • (Boolean)


3279
3280
3281
3282
# File 'lib/HDLRuby/hruby_high.rb', line 3279

def constant?
    # A value is a constant.
    return true
end

#execute(mode) ⇒ Object

Executes the expression.



998
999
1000
# File 'lib/HDLRuby/hruby_rsim.rb', line 998

def execute(mode)
    return self
end

#init_sim(systemT) ⇒ Object

Initialize the simulation for system +systemT+.



991
992
993
# File 'lib/HDLRuby/hruby_rsim.rb', line 991

def init_sim(systemT)
    # Nothing to do.
end

#to_exprObject

Converts to a new expression.



3285
3286
3287
# File 'lib/HDLRuby/hruby_high.rb', line 3285

def to_expr
    return self.to_value
end

#to_lowObject

Converts the value to HDLRuby::Low.



3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
# File 'lib/HDLRuby/hruby_high.rb', line 3290

def to_low
    # Clone the content if possible
    content = self.content.frozen? ? self.content : self.content.clone
    # Create and return the resulting low-level value
    # return HDLRuby::Low::Value.new(self.type.to_low,self.content)
    valueL = HDLRuby::Low::Value.new(self.type.to_low,self.content)
    # # For debugging: set the source high object 
    # valueL.properties[:low2high] = self.hdr_id
    # self.properties[:high2low] = valueL
    return valueL
end

#to_rcsimObject

Generate the C description of the value.



787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
# File 'lib/HDLRuby/hruby_rcsim.rb', line 787

def to_rcsim
    # Create the value C object.
    if self.content.is_a?(::Integer) then
        # puts "self.type.width=#{self.type.width} and content=#{self.content}" ; $stdout.flush
        if self.type.width <= 64 then
            if self.content.bit_length <= 63 then
                return RCSim.rcsim_make_value_numeric(self.type.to_rcsim,
                                                      self.content)
            else
                return RCSim.rcsim_make_value_numeric(self.type.to_rcsim,
                                                      self.content & 0xFFFFFFFFFFFF)
            end
        else
            if self.content < 0 then
                str = (2**self.type.width + self.content).to_s(2)
                str = "1" * (self.type.width-str.length) + str
            else
                str = self.content.to_s(2)
                str = "0" * (self.type.width-str.length) + str
            end
            # puts "now str=#{str} (#{str.length})" ; $stdout.flush
            return RCSim.rcsim_make_value_bitstring(self.type.to_rcsim,
                                                    str.reverse)
        end
    else
        return RCSim.rcsim_make_value_bitstring(self.type.to_rcsim,
                                                self.content.to_s.reverse)
    end
end

#to_valueObject

Converts to a new value.



3272
3273
3274
3275
3276
# File 'lib/HDLRuby/hruby_high.rb', line 3272

def to_value
    # # Already a value.
    # self
    return Value.new(self.type,self.content)
end

#to_value?Boolean

Tell if the expression can be converted to a value.

Returns:

  • (Boolean)


3267
3268
3269
# File 'lib/HDLRuby/hruby_high.rb', line 3267

def to_value?
    return true
end