class Origen::PowerDomains::PowerDomain
Attributes
Actual Power Domain Name
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 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
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
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
Source
# 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
Create DUT specs for the power supply
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
Source
# 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
Returns an Array
of ground pin IDs that match the power domain ID
Source
# File lib/origen/power_domains/power_domain.rb, line 99 def has_ground_pin?(pin) ground_pins.include?(pin) ? true : false end
Checks for the existence of a signal pin that references the power domain
Source
# File lib/origen/power_domains/power_domain.rb, line 109 def has_pin?(pin) pins.include? pin end
Checks if a pin references the power domain, regardless of type
Source
# File lib/origen/power_domains/power_domain.rb, line 104 def has_power_pin?(pin) power_pins.include?(pin) ? true : false end
Checks for the existence of a signal pin that references the power domain
Source
# File lib/origen/power_domains/power_domain.rb, line 94 def has_signal_pin?(pin) signal_pins.include?(pin) ? true : false end
Checks for the existence of a signal pin that references the power domain
Source
# File lib/origen/power_domains/power_domain.rb, line 63 def maximum_voltage_rating @maximum_voltage_rating end
Maximum Voltage Rating
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
Source
# File lib/origen/power_domains/power_domain.rb, line 125 def nominal_voltage @nominal_voltage end
Nominal voltage
Source
# 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
Checks for a pin type, returns nil if it is not found
Source
# File lib/origen/power_domains/power_domain.rb, line 74 def pins signal_pins + ground_pins + power_pins end
Returns an Array
of all pins that reference the power domain
Source
# 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
Returns an Array
of ground pin IDs that match the power domain ID
Source
# File lib/origen/power_domains/power_domain.rb, line 132 def setpoint @setpoint end
Current setpoint, defaults top nil on init
Source
# 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
Setter for setpoint
Source
# 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
Checks if the setpoint is valid This will need rework once the class has spec limits added
Source
# File lib/origen/power_domains/power_domain.rb, line 69 def setpoint_to_nominal @setpoint = @nominal_voltage end
Sets setpoint equal to nominal_voltage
Source
# 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
Returns an Array
of signal pin IDs that match the power domain ID
Source
# File lib/origen/power_domains/power_domain.rb, line 140 def unit_voltage_range @unit_voltage_range end
Power domain can allow either a variable or fixed unit voltage range (Range
or :fixed)
Private Instance Methods
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
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
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
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
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