class Origen::Clocks::Clock

Attributes

freq_range[W]
freq_target[W]
id[RW]
instantiate_users[RW]
owner[RW]
users[W]

Public Class Methods

new(id, owner, options = {}, &block) click to toggle source
# File lib/origen/clocks/clock.rb, line 7
def initialize(id, owner, options = {}, &block)
  @id = id
  @owner = owner
  @id = @id.symbolize unless id.is_a? Symbol
  @instantiate_users = true
  options.each { |k, v| instance_variable_set("@#{k}", v) }
  (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
  @users = [@users] unless @users.is_a? Array
  add_users_sub_blocks if @instantiate_users
  @setpoint = @freq_target
end

Public Instance Methods

curr_value()
Alias for: setpoint
freq_range() click to toggle source

Acceptable frequency range

# File lib/origen/clocks/clock.rb, line 71
def freq_range
  @freq_range
end
Also aliased as: range
freq_target() click to toggle source

Acceptable frequency range

# File lib/origen/clocks/clock.rb, line 77
def freq_target
  @freq_target
end
Also aliased as: target
max() click to toggle source

max method

# File lib/origen/clocks/clock.rb, line 92
def max
  if @freq_range == :fixed
    @freq_target
  else
    @freq_range.last
  end
end
method_missing(m, *args, &block) click to toggle source
# File lib/origen/clocks/clock.rb, line 111
def method_missing(m, *args, &block)
  ivar = "@#{m.to_s.gsub('=', '')}"
  ivar_sym = ":#{ivar}"
  if m.to_s =~ /=$/
    define_singleton_method(m) do |val|
      instance_variable_set(ivar, val)
    end
  elsif instance_variables.include? ivar_sym
    instance_variable_get(ivar)
  else
    define_singleton_method(m) do
      instance_variable_get(ivar)
    end
  end
  send(m, *args, &block)
end
min() click to toggle source

min method

# File lib/origen/clocks/clock.rb, line 83
def min
  if @freq_range == :fixed
    @freq_target
  else
    @freq_range.first
  end
end
name() click to toggle source
# File lib/origen/clocks/clock.rb, line 19
def name
  @id
end
range()
Alias for: freq_range
setpoint() click to toggle source

Current setpoint, defaults top nil on init

# File lib/origen/clocks/clock.rb, line 64
def setpoint
  @setpoint
end
Also aliased as: curr_value, value
setpoint=(val) click to toggle source
# File lib/origen/clocks/clock.rb, line 28
def setpoint=(val)
  if val == :gated || val == 'gated'
    @setpoint = :gated
  else
    setpoint_ok?(val) # This just warns if the clock is set out of range
    @setpoint = val
  end
end
setpoint_ok?(val = nil) click to toggle source
# File lib/origen/clocks/clock.rb, line 37
def setpoint_ok?(val = nil)
  val = @setpoint if val.nil?
  if @freq_range == :fixed
    if val == @freq_target
      true
    else
      Origen.log.warn("Clock '#{id}' is a fixed clock with a target frequency of #{@freq_target.as_Hz}")
      false
    end
  else
    if @freq_range.include?(val)
      true
    else
      Origen.log.warn("Setpoint (#{setpoint_string(val)}) for clock '#{id}' is not within the frequency range (#{freq_range_string})")
      false
    end
  end
end
Also aliased as: value_ok?, val_ok?
setpoint_to_target() click to toggle source

Set the clock to the target frequency

# File lib/origen/clocks/clock.rb, line 59
def setpoint_to_target
  @setpoint = @freq_target
end
target()
Alias for: freq_target
users() click to toggle source

Returns an Array of IPs that use a clock

# File lib/origen/clocks/clock.rb, line 24
def users
  @users
end
users_defined?() click to toggle source

Check if the clock users are defined anywhere in the DUT

# File lib/origen/clocks/clock.rb, line 101
def users_defined?
  undefined_ips = ips - Origen.all_sub_blocks
  if undefined_ips.empty?
    true
  else
    Origen.log.warn("Clock '#{id}' has the following IP undefined: #{undefined_ips}")
    false
  end
end
val_ok?(val = nil)
Alias for: setpoint_ok?
value()
Alias for: setpoint
value_ok?(val = nil)
Alias for: setpoint_ok?

Private Instance Methods

add_users_sub_blocks() click to toggle source

Instantiate and IP/users that use/access the clock

# File lib/origen/clocks/clock.rb, line 131
def add_users_sub_blocks
  @users.each do |ip|
    if @owner.respond_to? ip
      next
    else
      @owner.sub_block ip
    end
  end
end
attrs_ok?() click to toggle source

Ensure attributes are the correct type

# File lib/origen/clocks/clock.rb, line 142
def attrs_ok?
  return_value = true
  unless description.is_a? String
    Origen.log.error("Clock attribute 'description' must be a String!")
    return_value = false
  end
  return_value = false unless frequencies_ok?
  return_value
end
clock_freqs_ok?() click to toggle source
# File lib/origen/clocks/clock.rb, line 185
def clock_freqs_ok?
  if @freq_target.nil?
    false
  elsif @freq_range == :fixed
    true
  else
    if @freq_range.nil?
      Origen.log.error("PPEKit: Missing frequency target or range for clock '#{id}'!")
      false
    elsif @freq_range.include?(@freq_target)
      true
    else
      Origen.log.error("PPEKit: Frequency target #{@freq_target} is not inbetween the freq range #{@freq_range} for clock '#{id}'!")
      false
    end
  end
end
freq_range_string() click to toggle source
# File lib/origen/clocks/clock.rb, line 179
def freq_range_string
  start_freq = @freq_range.first
  end_freq = @freq_range.last
  "#{start_freq.as_Hz}\.\.#{end_freq.as_Hz}"
end
frequencies_ok?() click to toggle source
# File lib/origen/clocks/clock.rb, line 152
def frequencies_ok?
  if @freq_target.nil?
    false
  elsif @freq_range.nil?
    Origen.log.error("Missing frequency range for clock '#{name}'!")
    false
  elsif freq_range.is_a? Range
    if freq_range.include?(@freq_target)
      true
    else
      Origen.log.error("PPEKit: Frequency target #{@freq_target} is not inbetween the frequency range #{freq_range} for clock '#{name}'!")
      false
    end
  else
    Origen.log.error("Clock attribute 'freq_range' must be a Range!")
    return_value = false
  end
end
setpoint_string(val = nil) click to toggle source
# File lib/origen/clocks/clock.rb, line 171
def setpoint_string(val = nil)
  if val.nil?
    @setpoint.as_Hz unless @setpoint.nil?
  else
    val.as_Hz
  end
end