Module: Origen::Parameters
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/origen/parameters.rb,
lib/origen/parameters/set.rb,
lib/origen/parameters/live.rb,
lib/origen/parameters/missing.rb
Defined Under Namespace
Modules: ClassMethods Classes: Live, Missing, Set
Instance Attribute Summary collapse
-
#current ⇒ Object
Returns the value of attribute current.
Class Method Summary collapse
- .redefine(model, name) ⇒ Object private
- .start_transaction ⇒ Object private
- .stop_transaction ⇒ Object private
-
.transaction ⇒ Object
private
Any define_params blocks contained within the given block will be allowed to be re-opened later in the block to override existing parameter settings or to add new ones.
- .transaction_data ⇒ Object private
- .transaction_open ⇒ Object private
- .transaction_redefine ⇒ Object private
Instance Method Summary collapse
- #_live_parameter_requested? ⇒ Boolean private
- #_parameter_current ⇒ Object private
- #_parameter_sets ⇒ Object private
- #_request_live_parameter ⇒ Object private
- #define_params(name, options = {}, &block) ⇒ Object (also: #define_parameters)
- #define_params_transaction ⇒ Object private
- #has_params? ⇒ Boolean
-
#param?(name) ⇒ Boolean
Return value of param if it exists, nil otherwise.
- #params(context = nil) ⇒ Object (also: #parameters)
- #params=(name) ⇒ Object (also: #parameters=)
- #with_params(name, _options = {}) ⇒ Object
Instance Attribute Details
#current ⇒ Object
Returns the value of attribute current.
10 11 12 |
# File 'lib/origen/parameters.rb', line 10 def current @current end |
Class Method Details
.redefine(model, name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
73 74 75 76 77 78 79 |
# File 'lib/origen/parameters.rb', line 73 def self.redefine(model, name) @transaction_redefine = true model._parameter_sets.delete(name) @transaction_data[model][name][:definitions].each { |, block| model.define_params(name, , &block) } @transaction_data[model][name][:children].each { |model, name| redefine(model, name) } @transaction_redefine = false end |
.start_transaction ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
34 35 36 37 38 39 |
# File 'lib/origen/parameters.rb', line 34 def self.start_transaction @transaction_data = {} @transaction_open = true @transaction_counter ||= 0 @transaction_counter += 1 end |
.stop_transaction ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/origen/parameters.rb', line 42 def self.stop_transaction @transaction_counter -= 1 if @transaction_counter == 0 # Now finalize (freeze) all parameter sets we have just defined, this was deferred at define time due # to running within a transaction @transaction_data.each do |model, parameter_sets| parameter_sets.keys.each do |name| model._parameter_sets[name].finalize end end @transaction_data = nil @transaction_open = false end end |
.transaction ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Any define_params blocks contained within the given block will be allowed to be re-opened later in the block to override existing parameter settings or to add new ones.
This is not allowed normally since already-defined child parameter sets could have referenced the original parameter and they would not reflect the final value after re-opening the parent parameter set.
By defining the parameters within this block, Origen will keep track of relationships between parameter sets and any time a parent is changed the definitions of existing children will be re-executed to ensure that they reflect the new values.
This is initially intended to support the concept of a app/parameters/application.rb being used to define baseline parameter sets, and then target-specific files can then override them.
27 28 29 30 31 |
# File 'lib/origen/parameters.rb', line 27 def self.transaction start_transaction yield stop_transaction end |
.transaction_data ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
58 59 60 |
# File 'lib/origen/parameters.rb', line 58 def self.transaction_data @transaction_data end |
.transaction_open ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
63 64 65 |
# File 'lib/origen/parameters.rb', line 63 def self.transaction_open @transaction_open end |
.transaction_redefine ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
68 69 70 |
# File 'lib/origen/parameters.rb', line 68 def self.transaction_redefine @transaction_redefine end |
Instance Method Details
#_live_parameter_requested? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
209 210 211 |
# File 'lib/origen/parameters.rb', line 209 def _live_parameter_requested? @_live_parameter_requested end |
#_parameter_current ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/origen/parameters.rb', line 185 def _parameter_current if path = self.class.parameters_context case path when :top, :dut Origen.top_level._parameter_current else eval(path)._parameter_current end else @_parameter_current || :default end end |
#_parameter_sets ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
199 200 201 |
# File 'lib/origen/parameters.rb', line 199 def _parameter_sets @_parameter_sets ||= {} end |
#_request_live_parameter ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
204 205 206 |
# File 'lib/origen/parameters.rb', line 204 def _request_live_parameter @_live_parameter_requested = true end |
#define_params(name, options = {}, &block) ⇒ Object Also known as: define_parameters
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/origen/parameters.rb', line 104 def define_params(name, = {}, &block) name = name.to_sym if _parameter_sets[name] && !Origen::Parameters.transaction_open fail "Parameter set '#{name}' cannot be re-opened once originally defined!" else if Origen::Parameters.transaction_open && !Origen::Parameters.transaction_redefine define_params_transaction[self] ||= {} define_params_transaction[self][name] ||= { children: ::Set[], definitions: [] } define_params_transaction[self][name][:definitions] << [.dup, block] redefine_children = define_params_transaction[self][name][:children] if _parameter_sets[name] end if _parameter_sets[name] defaults_already_set = true else _parameter_sets[name] = Origen::Parameters::Set.new(top_level: true, owner: self) end if [:inherit] parents = {} Array([:inherit]).each do |inherit| kontext = _validate_parameter_set_name(inherit) parent = kontext[:obj]._parameter_sets[kontext[:context]] parents[inherit] = parent if Origen::Parameters.transaction_open && !Origen::Parameters.transaction_redefine define_params_transaction[kontext[:obj]][kontext[:context]][:children] << [self, name] end _parameter_sets[name].copy_defaults_from(parent) unless defaults_already_set end parents = parents.values.first if parents.size == 1 _parameter_sets[name].define(parents, &block) else _parameter_sets[name].define(&block) end if redefine_children redefine_children.each { |model, set_name| Origen::Parameters.redefine(model, set_name) } end end _parameter_sets[name] end |
#define_params_transaction ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
100 101 102 |
# File 'lib/origen/parameters.rb', line 100 def define_params_transaction Origen::Parameters.transaction_data end |
#has_params? ⇒ Boolean
168 169 170 |
# File 'lib/origen/parameters.rb', line 168 def has_params? _parameter_sets.empty? ? false : true end |
#param?(name) ⇒ Boolean
Return value of param if it exists, nil otherwise.
173 174 175 176 177 178 179 180 181 182 |
# File 'lib/origen/parameters.rb', line 173 def param?(name) _param = name.to_s =~ /^params./ ? name.to_s : 'params.' + name.to_s begin val = eval("self.#{_param}") rescue nil else val end end |
#params(context = nil) ⇒ Object Also known as: parameters
152 153 154 155 156 |
# File 'lib/origen/parameters.rb', line 152 def params(context = nil) @_live_parameter_requested = false context ||= _parameter_current _parameter_sets[context] || Missing.new(owner: self) end |
#params=(name) ⇒ Object Also known as: parameters=
159 160 161 162 163 164 165 |
# File 'lib/origen/parameters.rb', line 159 def params=(name) # Don't validate on setting this as this object could be used to set # the context on some other object, therefore validate later if someone tries # to access the params on this object # _validate_parameter_set_name(name) @_parameter_current = name end |
#with_params(name, _options = {}) ⇒ Object
145 146 147 148 149 150 |
# File 'lib/origen/parameters.rb', line 145 def with_params(name, = {}) orig = _parameter_current self.params = name yield self.params = orig end |