class Origen::PowerDomains::PowerDomain

Attributes

actual_name[RW]

Actual Power Domain Name

description[RW]
display_name[RW]

Display Names Hash of display names display_name = {

input:  Input voltage name, e.g. V<sub>IN</sub>
output:  Output voltage name, e.g. V<sub>OUT</sub>
default: Regular Voltage name, e.g. V<sub>DD</sub>
generic_name[RW]

Generic Power Domain Name This is the power supply that can be blocked off to multiple power supplies For example, Power Domain for DDR blocks could be GVDD, then the actual power supplies can be different for each DDR block.

DDR1 --> G1VDD
DDR2 --> G2VDD
id[RW]
max[RW]
maximum_voltage_rating[W]
min[RW]
nominal_voltage[W]
unit_voltage_range[W]
voltages[RW]

Allowed Voltage Points Some power supplies can be at different levels, e.g. 1.8V or 3.3V Could be a signal voltage or an array of voltages

Public Class Methods

new(id, options = {}, &block) click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 33
def initialize(id, options = {}, &block)
  @id = id
  @description = ''
  @display_name = {}
  @id = @id.symbolize unless @id.is_a? Symbol
  options.each { |k, v| instance_variable_set("@#{k}", v) }
  (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
  @unit_voltage_range = :fixed if @unit_voltage_range.nil?
  fail unless attrs_ok?

  create_dut_spec unless @min.nil? || @max.nil?
end

Public Instance Methods

create_dut_spec() click to toggle source

Create DUT specs for the power supply

# File lib/origen/power_domains/power_domain.rb, line 51
def create_dut_spec
  if Origen.top_level.specs.nil?
    set_specs
  elsif Origen.top_level.specs.include? name
    Origen.log.error("Cannot create power domain spec '#{name}', it already exists!")
    fail
  else
    set_specs
  end
end
curr_value()
Alias for: setpoint
display_names(default_name) click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 170
def display_names(default_name)
  @display_name[:default] = default_name
  @display_name[:input] = change_subscript('IN')
  @display_name[:output] = change_subscript('OUT')
end
ground_pins() click to toggle source

Returns an Array of ground pin IDs that match the power domain ID

# File lib/origen/power_domains/power_domain.rb, line 84
def ground_pins
  Origen.top_level.ground_pins.select { |_pin_id, p| p.supply == id }.keys
end
has_ground_pin?(pin) click to toggle source

Checks for the existence of a signal pin that references the power domain

# File lib/origen/power_domains/power_domain.rb, line 99
def has_ground_pin?(pin)
  ground_pins.include?(pin) ? true : false
end
has_pin?(pin) click to toggle source

Checks if a pin references the power domain, regardless of type

# File lib/origen/power_domains/power_domain.rb, line 109
def has_pin?(pin)
  pins.include? pin
end
has_power_pin?(pin) click to toggle source

Checks for the existence of a signal pin that references the power domain

# File lib/origen/power_domains/power_domain.rb, line 104
def has_power_pin?(pin)
  power_pins.include?(pin) ? true : false
end
has_signal_pin?(pin) click to toggle source

Checks for the existence of a signal pin that references the power domain

# File lib/origen/power_domains/power_domain.rb, line 94
def has_signal_pin?(pin)
  signal_pins.include?(pin) ? true : false
end
maximum_voltage_rating() click to toggle source

Maximum Voltage Rating

# File lib/origen/power_domains/power_domain.rb, line 63
def maximum_voltage_rating
  @maximum_voltage_rating
end
Also aliased as: mvr
method_missing(m, *args, &block) click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 176
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
mvr()
name() click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 46
def name
  @id
end
nom()
Alias for: nominal_voltage
nominal()
Alias for: nominal_voltage
nominal_voltage() click to toggle source

Nominal voltage

# File lib/origen/power_domains/power_domain.rb, line 125
def nominal_voltage
  @nominal_voltage
end
Also aliased as: nominal, nom
pin_type(pin) click to toggle source

Checks for a pin type, returns nil if it is not found

# File lib/origen/power_domains/power_domain.rb, line 114
def pin_type(pin)
  if has_pin?(pin) == false
    nil
  else
    [:signal, :ground, :power].each do |pintype|
      return pintype if send("has_#{pintype}_pin?", pin)
    end
  end
end
pins() click to toggle source

Returns an Array of all pins that reference the power domain

# File lib/origen/power_domains/power_domain.rb, line 74
def pins
  signal_pins + ground_pins + power_pins
end
power_pins() click to toggle source

Returns an Array of ground pin IDs that match the power domain ID

# File lib/origen/power_domains/power_domain.rb, line 89
def power_pins
  Origen.top_level.power_pins.select { |_pin_id, p| p.supply == id }.keys
end
setpoint() click to toggle source

Current setpoint, defaults top nil on init

# File lib/origen/power_domains/power_domain.rb, line 132
def setpoint
  @setpoint
end
Also aliased as: curr_value, value
setpoint=(val) click to toggle source

Setter for setpoint

# File lib/origen/power_domains/power_domain.rb, line 146
def setpoint=(val)
  unless setpoint_ok?(val)
    Origen.log.warn("Setpoint (#{setpoint_string(val)}) for power domain '#{name}' is not within the voltage range (#{unit_voltage_range_string})!")
  end
  @setpoint = val
end
setpoint_ok?(val = nil) click to toggle source

Checks if the setpoint is valid This will need rework once the class has spec limits added

# File lib/origen/power_domains/power_domain.rb, line 155
def setpoint_ok?(val = nil)
  return true if maximum_voltage_rating.nil?

  compare_val = val.nil? ? setpoint : val
  if compare_val.nil?
    false
  elsif compare_val <= maximum_voltage_rating
    true
  else
    false
  end
end
Also aliased as: value_ok?, val_ok?
setpoint_to_nominal() click to toggle source

Sets setpoint equal to nominal_voltage

# File lib/origen/power_domains/power_domain.rb, line 69
def setpoint_to_nominal
  @setpoint = @nominal_voltage
end
signal_pins() click to toggle source

Returns an Array of signal pin IDs that match the power domain ID

# File lib/origen/power_domains/power_domain.rb, line 79
def signal_pins
  Origen.top_level.pins.select { |_pin_id, p| p.supply == id }.keys
end
unit_range()
Alias for: unit_voltage_range
unit_voltage_range() click to toggle source

Power domain can allow either a variable or fixed unit voltage range (Range or :fixed)

# File lib/origen/power_domains/power_domain.rb, line 140
def unit_voltage_range
  @unit_voltage_range
end
Also aliased as: unit_range
val_ok?(val = nil)
Alias for: setpoint_ok?
value()
Alias for: setpoint
value_ok?(val = nil)
Alias for: setpoint_ok?

Private Instance Methods

attrs_ok?() click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 205
def attrs_ok?
  return_value = true
  unless description.is_a? String
    Origen.log.error("Power domain attribute 'description' must be a String!")
    return_value = false
  end
  return_value = false unless voltages_ok?
  return_value
end
change_subscript(new_subscript) click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 249
def change_subscript(new_subscript)
  tmp = @display_name[:default].dup
  sub_input = tmp.at_css 'sub'
  sub_input.content = new_subscript unless sub_input.nil?
  tmp
end
set_specs() click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 195
def set_specs
  Origen.top_level.spec name, :dc do |s|
    s.description = "#{name.to_s.upcase} Power Domain"
    s.min = min
    s.typ = nominal_voltage
    s.max = max
    s.unit = 'V'
  end
end
setpoint_string(val = nil) click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 215
def setpoint_string(val = nil)
  if val.nil?
    setpoint.as_units('V')
  else
    val.as_units('V')
  end
end
voltages_ok?() click to toggle source
# File lib/origen/power_domains/power_domain.rb, line 223
def voltages_ok?
  if nominal_voltage.nil?
    false
  elsif unit_voltage_range == :fixed
    true
  elsif unit_voltage_range.nil?
    Origen.log.error("PPEKit: Missing unit voltage range for power domain '#{name}'!")
    false
  elsif unit_voltage_range.is_a? Range
    unless unit_voltage_range.include?(nominal_voltage)
      Origen.log.error("PPEKit: Nominal voltage #{nominal_voltage} is not inbetween the unit voltage range #{unit_voltage_range} for power domain '#{name}'!")
      false
    end
    unless maximum_voltage_rating.nil?
      unless unit_voltage_range.last <= maximum_voltage_rating
        Origen.log.error('PPEKit: Unit voltage range exceeds the maximum voltage range!')
        fail
      end
    end
    true
  else
    Origen.log.error("Power domain attribute 'unit_voltage_range' must be a Range or set to the value of :fixed!")
    return_value = false
  end
end