origen 0.25.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 164ff1785465c05f948cea646a845c30d9501318
4
- data.tar.gz: 572cfdfd8d006b70e8b447789530284d99a1d391
3
+ metadata.gz: acdfacb78dd1389f6c42d6e77b8b311f44a424c0
4
+ data.tar.gz: 91c007f2243274a27202049375088256448d9b53
5
5
  SHA512:
6
- metadata.gz: c5bb8de8859693e4ba457f555709dca46200ddccccbde5ea382b6099ba2ee22e8e90d72c9ddc7aaa1fb5dd2e54bb535925df9455017c7ad5dc889eacbfd40afe
7
- data.tar.gz: 6a96a68b9d08642282b489d0f6d08596fcee33fed04c41264b66bdaa836ad21130b370213b564fac1fe3db842feb8985b3f82c421417d28114a351602f0beb9d
6
+ metadata.gz: 29c5b7ca4267fe59b675b2250805dfeaa361601ca64f34b36ac3c68244cff7600b9e37477dd645c02f53930672ad2daf78ef648021bcb8759a1ec2a6f0e68835
7
+ data.tar.gz: 77a5dc8760bcad34b0b356796ad722269dbe4396c3e888d8f3330ef768dcf168d7fde8ccfac28fb644f896f20e977527f05dc786adbfd80d791fd727f3c2a386
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Origen
2
2
  MAJOR = 0
3
- MINOR = 25
4
- BUGFIX = 1
3
+ MINOR = 26
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
data/lib/origen.rb CHANGED
@@ -62,6 +62,8 @@ unless defined? RGen::ORIGENTRANSITION
62
62
  autoload :LSF, 'origen/application/lsf'
63
63
  autoload :LSFManager, 'origen/application/lsf_manager'
64
64
  autoload :Fuses, 'origen/fuses'
65
+ autoload :Tests, 'origen/tests'
66
+ autoload :PowerDomains, 'origen/power_domains'
65
67
 
66
68
  attr_reader :switch_user
67
69
 
@@ -17,8 +17,9 @@ module Origen
17
17
  alias_method :typ_voltage, :typical_voltage
18
18
 
19
19
  def initialize(name, options = {})
20
- @name = name
21
20
  options.each { |k, v| instance_variable_set("@#{k}", v) }
21
+ (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
22
+ @name = name
22
23
  validate_args
23
24
  end
24
25
 
@@ -65,12 +66,23 @@ module Origen
65
66
  # Implements methods like:
66
67
  #
67
68
  # if $dut.mode.rambist?
68
- def method_missing(method_name, *arguments)
69
+ def method_missing(method_name, *arguments, &block)
70
+ ivar = "@#{method_name.to_s.gsub('=', '')}"
71
+ ivar_sym = ":#{ivar}"
69
72
  if method_name[-1] == '?'
70
73
  id == method_name[0..-2].to_sym
74
+ elsif method_name[-1] == '='
75
+ define_singleton_method(method_name) do |val|
76
+ instance_variable_set(ivar, val)
77
+ end
78
+ elsif instance_variables.include? ivar_sym
79
+ instance_variable_get(ivar)
71
80
  else
72
- super
81
+ define_singleton_method(method_name) do
82
+ instance_variable_get(ivar)
83
+ end
73
84
  end
85
+ send(method_name, *arguments, &block)
74
86
  end
75
87
 
76
88
  def to_s
@@ -56,7 +56,7 @@ class String
56
56
  # cased symbol version of the string
57
57
  def symbolize
58
58
  @@symbolize ||= {}
59
- @@symbolize[self] ||= gsub(/(\n|\s|\(|\)|\.|\[|\]|-|{|})/, '_').downcase.to_sym
59
+ @@symbolize[self] ||= gsub(/(\?|\!|\-|\/|\\|\n|\s|\(|\)|\.|\[|\]|-|{|})/, '_').downcase.to_sym
60
60
  end
61
61
 
62
62
  # acronyms
@@ -134,6 +134,9 @@ module Origen
134
134
  def run_erb(file, opts = {}, &block)
135
135
  # Refresh the target to start all settings from scratch each time
136
136
  # This is an easy way to reset all registered values
137
+ if opts[:preserve_target]
138
+ options[:preserve_target] = opts.delete(:preserve_target)
139
+ end
137
140
  Origen.app.reload_target! unless options[:preserve_target]
138
141
  # Record the current file, this can be used to resolve any relative path
139
142
  # references in the file about to be compiled
data/lib/origen/model.rb CHANGED
@@ -26,6 +26,8 @@ module Origen
26
26
  include Origen::Memory
27
27
  include Origen::Errata
28
28
  include Origen::Fuses
29
+ include Origen::Tests
30
+ include Origen::PowerDomains
29
31
  end
30
32
 
31
33
  module ClassMethods
@@ -30,6 +30,11 @@ module Origen
30
30
  end
31
31
  alias_method :current_context, :context
32
32
 
33
+ def available_contexts
34
+ owner._parameter_sets.keys
35
+ end
36
+ alias_method :contexts, :available_contexts
37
+
33
38
  def copy_defaults_from(set)
34
39
  set.each do |name, val|
35
40
  if val.is_a?(Set)
@@ -0,0 +1,23 @@
1
+ require 'colorize'
2
+ require_relative './power_domains/power_domain'
3
+ require_relative './power_domains/power_domains_collection'
4
+ module Origen
5
+ module PowerDomains
6
+ def power_domains(expr = nil)
7
+ @_power_domains ||= PowerDomainsCollection.new
8
+ if expr.nil?
9
+ @_power_domains
10
+ else
11
+ @_power_domains.recursive_find_by_key(expr)
12
+ end
13
+ end
14
+
15
+ def add_power_domain(id, options = {}, &block)
16
+ if power_domains.include?(id)
17
+ Origen.log.error("Cannot create power domain '#{id}', it already exists!")
18
+ fail
19
+ end
20
+ power_domains[id] = PowerDomain.new(id, options, &block)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,209 @@
1
+ module Origen
2
+ module PowerDomains
3
+ class PowerDomain
4
+ attr_accessor :id, :description, :voltage_range, :nominal_voltage, :setpoint
5
+
6
+ # Generic Power Domain Name
7
+ # This is the power supply that can be blocked off to multiple power supplies
8
+ # For example, Power Domain for DDR blocks could be GVDD, then the actual
9
+ # power supplies can be different for each DDR block.
10
+ # DDR1 --> G1VDD
11
+ # DDR2 --> G2VDD
12
+ attr_accessor :generic_name
13
+
14
+ # Actual Power Domain Name
15
+ attr_accessor :actual_name
16
+
17
+ # Allowed Voltage Points
18
+ # Some power supplies can be at different levels, e.g. 1.8V or 3.3V
19
+ # Could be a signal voltage or an array of voltages
20
+ attr_accessor :voltages
21
+
22
+ # Display Names
23
+ # Hash of display names
24
+ # display_name = {
25
+ # input: Input voltage name, e.g. V<sub>IN</sub>
26
+ # output: Output voltage name, e.g. V<sub>OUT</sub>
27
+ # default: Regular Voltage name, e.g. V<sub>DD</sub>
28
+ attr_accessor :display_name
29
+
30
+ def initialize(id, options = {}, &block)
31
+ @id = id
32
+ @description = ''
33
+ @display_name = {}
34
+ @id = @id.symbolize unless @id.is_a? Symbol
35
+ options.each { |k, v| instance_variable_set("@#{k}", v) }
36
+ (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
37
+ fail unless attrs_ok?
38
+ end
39
+
40
+ def name
41
+ @id
42
+ end
43
+
44
+ # Sets setpoint equal to nominal_voltage
45
+ def setpoint_to_nominal
46
+ @setpoint = @nominal_voltage
47
+ end
48
+
49
+ # Returns an Array of all pins that reference the power domain
50
+ def pins
51
+ signal_pins + ground_pins + power_pins
52
+ end
53
+
54
+ # Returns an Array of signal pin IDs that match the power domain ID
55
+ def signal_pins
56
+ Origen.top_level.pins.select { |_pin_id, p| p.supply == id }.keys
57
+ end
58
+
59
+ # Returns an Array of ground pin IDs that match the power domain ID
60
+ def ground_pins
61
+ Origen.top_level.ground_pins.select { |_pin_id, p| p.supply == id }.keys
62
+ end
63
+
64
+ # Returns an Array of ground pin IDs that match the power domain ID
65
+ def power_pins
66
+ Origen.top_level.power_pins.select { |_pin_id, p| p.supply == id }.keys
67
+ end
68
+
69
+ # Checks for the existence of a signal pin that references the power domain
70
+ def has_signal_pin?(pin)
71
+ signal_pins.include?(pin) ? true : false
72
+ end
73
+
74
+ # Checks for the existence of a signal pin that references the power domain
75
+ def has_ground_pin?(pin)
76
+ ground_pins.include?(pin) ? true : false
77
+ end
78
+
79
+ # Checks for the existence of a signal pin that references the power domain
80
+ def has_power_pin?(pin)
81
+ power_pins.include?(pin) ? true : false
82
+ end
83
+
84
+ # Checks if a pin references the power domain, regardless of type
85
+ def has_pin?(pin)
86
+ pins.include? pin
87
+ end
88
+
89
+ # Checks for a pin type, returns nil if it is not found
90
+ def pin_type(pin)
91
+ if self.has_pin?(pin) == false
92
+ nil
93
+ else
94
+ [:signal, :ground, :power].each do |pintype|
95
+ return pintype if send("has_#{pintype}_pin?", pin)
96
+ end
97
+ end
98
+ end
99
+
100
+ # Nominal voltage
101
+ def nominal_voltage
102
+ @nominal_voltage
103
+ end
104
+ alias_method :nominal, :nominal_voltage
105
+ alias_method :nom, :nominal_voltage
106
+
107
+ # Current setpoint, defaults top nil on init
108
+ def setpoint
109
+ @setpoint
110
+ end
111
+ alias_method :curr_value, :setpoint
112
+ alias_method :value, :setpoint
113
+
114
+ # Acceptable voltage range
115
+ def voltage_range
116
+ @voltage_range
117
+ end
118
+ alias_method :range, :voltage_range
119
+
120
+ # Setter for setpoint
121
+ def setpoint=(val)
122
+ unless setpoint_ok?(val)
123
+ Origen.log.warn("Setpoint (#{setpoint_string(val)}) for power domain '#{name}' is not within the voltage range (#{voltage_range_string})!")
124
+ end
125
+ @setpoint = val
126
+ end
127
+
128
+ # Checks if the setpoint is valid
129
+ def setpoint_ok?(val = nil)
130
+ if val.nil?
131
+ voltage_range.include?(setpoint) ? true : false
132
+ else
133
+ voltage_range.include?(val) ? true : false
134
+ end
135
+ end
136
+ alias_method :value_ok?, :setpoint_ok?
137
+ alias_method :val_ok?, :setpoint_ok?
138
+
139
+ def display_names(default_name)
140
+ @display_name[:default] = default_name
141
+ @display_name[:input] = change_subscript('IN')
142
+ @display_name[:output] = change_subscript('OUT')
143
+ end
144
+
145
+ def method_missing(m, *args, &block)
146
+ ivar = "@#{m.to_s.gsub('=', '')}"
147
+ ivar_sym = ":#{ivar}"
148
+ if m.to_s =~ /=$/
149
+ define_singleton_method(m) do |val|
150
+ instance_variable_set(ivar, val)
151
+ end
152
+ elsif instance_variables.include? ivar_sym
153
+ instance_variable_get(ivar)
154
+ else
155
+ define_singleton_method(m) do
156
+ instance_variable_get(ivar)
157
+ end
158
+ end
159
+ send(m, *args, &block)
160
+ end
161
+
162
+ private
163
+
164
+ def attrs_ok?
165
+ return_value = true
166
+ unless description.is_a? String
167
+ Origen.log.error("Power domain attribute 'description' must be a String!")
168
+ return_value = false
169
+ end
170
+ return_value = false unless voltages_ok?
171
+ return_value
172
+ end
173
+
174
+ def setpoint_string(val = nil)
175
+ if val.nil?
176
+ setpoint.as_units('V')
177
+ else
178
+ val.as_units('V')
179
+ end
180
+ end
181
+
182
+ def voltages_ok?
183
+ if nominal_voltage.nil?
184
+ false
185
+ elsif voltage_range.nil?
186
+ Origen.log.error("PPEKit: Missing voltage range for power domain '#{name}'!")
187
+ false
188
+ elsif voltage_range.is_a? Range
189
+ if voltage_range.include?(nominal_voltage)
190
+ true
191
+ else
192
+ Origen.log.error("PPEKit: Nominal voltage #{nominal_voltage} is not inbetween the voltage range #{voltage_range} for power domain '#{name}'!")
193
+ false
194
+ end
195
+ else
196
+ Origen.log.error("Power domain attribute 'voltage_range' must be a Range!")
197
+ return_value = false
198
+ end
199
+ end
200
+
201
+ def change_subscript(new_subscript)
202
+ tmp = @display_name[:default].dup
203
+ sub_input = tmp.at_css 'sub'
204
+ sub_input.content = new_subscript unless sub_input.nil?
205
+ tmp
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,53 @@
1
+ module Origen
2
+ module PowerDomains
3
+ class PowerDomainsCollection < Hash
4
+ def inspect(options = {})
5
+ options = {
6
+ fancy_output: true
7
+ }.update(options)
8
+ headers = []
9
+ output_power_domain_list = []
10
+ column_widths = {}.tap do |colhash|
11
+ each do |domain_name, domain|
12
+ output_attr_list = {}
13
+ domain.instance_variables.each do |attr|
14
+ attr_getter = attr.to_s[/\@(\S+)/, 1].to_sym
15
+ attr_val = domain.send attr_getter
16
+ next unless [String, Numeric, Float, Integer, Symbol, Range].include? attr_val.class
17
+ headers << attr_getter unless headers.include?(attr_getter)
18
+ str = case attr_val
19
+ when Numeric
20
+ attr_val.as_V
21
+ when Range
22
+ start_voltage = attr_val.first
23
+ end_voltage = attr_val.last
24
+ "#{start_voltage.as_V}\.\.#{end_voltage.as_V}"
25
+ else
26
+ attr_val.to_s
27
+ end
28
+ curr_longest = [attr_getter, str].max_by(&:length).size + 2 # Add 3 for the whitespace
29
+ if colhash[attr].nil? || (colhash[attr] < curr_longest)
30
+ colhash[attr] = curr_longest
31
+ end
32
+ output_attr_list[attr_getter] = str
33
+ end
34
+ output_power_domain_list << output_attr_list
35
+ end
36
+ end
37
+ if options[:fancy_output]
38
+ puts '╔' + column_widths.values.each.map { |i| '═' * i }.join('╤') + '╗'
39
+ puts '║' + headers.each_with_index.map { |col_val, i| " #{col_val} ".ljust(column_widths.values[i]) }.join('│') + '║'
40
+ puts '╟' + column_widths.values.each.map { |i| '─' * i }.join('┼') + '╢'
41
+ puts output_power_domain_list.each.map { |attributes| '║' + headers.each_with_index.map { |value, attr_idx| " #{attributes[value]} ".ljust(column_widths.values[attr_idx]) }.join('│') + '║' }
42
+ puts '╚' + column_widths.values.each.map { |i| '═' * i }.join('╧') + '╝'
43
+ else
44
+ puts '.' + column_widths.values.each.map { |i| '-' * i }.join('-') + '.'
45
+ puts '|' + headers.each_with_index.map { |col_val, i| " #{col_val} ".ljust(column_widths.values[i]) }.join('|') + '|'
46
+ puts '|' + column_widths.values.each.map { |i| '-' * i }.join('+') + '|'
47
+ puts output_power_domain_list.each.map { |attributes| '|' + headers.each_with_index.map { |value, attr_idx| " #{attributes[value]} ".ljust(column_widths.values[attr_idx]) }.join('|') + '|' }
48
+ puts '`' + column_widths.values.each.map { |i| '-' * i }.join('-') + '\''
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -35,6 +35,7 @@ module Origen
35
35
 
36
36
  # Initialize the variables
37
37
  def initialize(gen, act)
38
+ Origen.deprecate 'Origen::Specs::Power_Supply is deprecated, use Origen::PowerDomains::PowerDomain instead'
38
39
  @generic = gen
39
40
  @actual = act
40
41
  @voltages = []
@@ -243,6 +243,14 @@ module Origen
243
243
  end
244
244
  alias_method :has_regs?, :owns_registers?
245
245
 
246
+ def has_fuses?
247
+ fuses.empty? ? false : true
248
+ end
249
+
250
+ def has_tests?
251
+ tests.empty? ? false : true
252
+ end
253
+
246
254
  def sub_block(name, options = {})
247
255
  if i = options.delete(:instances)
248
256
  a = []
@@ -0,0 +1,31 @@
1
+ require_relative './tests/test'
2
+ module Origen
3
+ module Tests
4
+ def tests(expr = nil)
5
+ if expr.nil?
6
+ if @_tests.nil?
7
+ @_tests = {}
8
+ elsif @_tests.is_a? Hash
9
+ if @_tests.empty?
10
+ @_tests
11
+ else
12
+ @_tests.ids
13
+ end
14
+ else
15
+ @_tests = {}
16
+ end
17
+ else
18
+ @_tests.recursive_find_by_key(expr)
19
+ end
20
+ end
21
+
22
+ def add_test(id, options = {}, &block)
23
+ @_tests ||= {}
24
+ if @_tests.include?(id)
25
+ Origen.log.error("Cannot create test '#{id}', it already exists!")
26
+ fail
27
+ end
28
+ @_tests[id] = Test.new(id, options, &block)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ module Origen
2
+ module Tests
3
+ class Test
4
+ attr_accessor :id, :owner, :description, :conditions, :platforms
5
+
6
+ def initialize(id, options = {}, &block)
7
+ @id = id
8
+ @description = ''
9
+ @conditions, @platforms = [], []
10
+ @id = @id.symbolize unless @id.is_a? Symbol
11
+ options.each { |k, v| instance_variable_set("@#{k}", v) }
12
+ (block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
13
+ fail unless attrs_ok?
14
+ end
15
+
16
+ def name
17
+ @id
18
+ end
19
+
20
+ def method_missing(m, *args, &block)
21
+ ivar = "@#{m.to_s.gsub('=', '')}"
22
+ ivar_sym = ":#{ivar}"
23
+ if m.to_s =~ /=$/
24
+ define_singleton_method(m) do |val|
25
+ instance_variable_set(ivar, val)
26
+ end
27
+ elsif instance_variables.include? ivar_sym
28
+ instance_variable_get(ivar)
29
+ else
30
+ define_singleton_method(m) do
31
+ instance_variable_get(ivar)
32
+ end
33
+ end
34
+ send(m, *args, &block)
35
+ end
36
+
37
+ private
38
+
39
+ def attrs_ok?
40
+ return_value = true
41
+ [:conditions, :platforms].each do |attr|
42
+ unless instance_variable_get("@#{attr}").is_a? Array
43
+ Origen.log.error("Test attribute '#{attr}' should be an Array!")
44
+ return_value = false
45
+ end
46
+ end
47
+ unless @description.is_a? String
48
+ Origen.log.error("Test attribute 'description' must be a String!")
49
+ return_value = false
50
+ end
51
+ return_value
52
+ end
53
+ end
54
+ end
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.1
4
+ version: 0.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen McGinty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-15 00:00:00.000000000 Z
11
+ date: 2017-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -352,6 +352,20 @@ dependencies:
352
352
  - - "~>"
353
353
  - !ruby/object:Gem::Version
354
354
  version: '2'
355
+ - !ruby/object:Gem::Dependency
356
+ name: colorize
357
+ requirement: !ruby/object:Gem::Requirement
358
+ requirements:
359
+ - - "~>"
360
+ - !ruby/object:Gem::Version
361
+ version: 0.8.1
362
+ type: :runtime
363
+ prerelease: false
364
+ version_requirements: !ruby/object:Gem::Requirement
365
+ requirements:
366
+ - - "~>"
367
+ - !ruby/object:Gem::Version
368
+ version: 0.8.1
355
369
  description:
356
370
  email:
357
371
  - stephen.f.mcginty@gmail.com
@@ -513,6 +527,9 @@ files:
513
527
  - lib/origen/ports/port.rb
514
528
  - lib/origen/ports/port_collection.rb
515
529
  - lib/origen/ports/section.rb
530
+ - lib/origen/power_domains.rb
531
+ - lib/origen/power_domains/power_domain.rb
532
+ - lib/origen/power_domains/power_domains_collection.rb
516
533
  - lib/origen/registers.rb
517
534
  - lib/origen/registers/bit.rb
518
535
  - lib/origen/registers/bit_collection.rb
@@ -543,6 +560,8 @@ files:
543
560
  - lib/origen/specs/spec_features.rb
544
561
  - lib/origen/specs/version_history.rb
545
562
  - lib/origen/sub_blocks.rb
563
+ - lib/origen/tests.rb
564
+ - lib/origen/tests/test.rb
546
565
  - lib/origen/top_level.rb
547
566
  - lib/origen/undefined.rb
548
567
  - lib/origen/users.rb
@@ -604,7 +623,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
604
623
  version: 1.8.11
605
624
  requirements: []
606
625
  rubyforge_project:
607
- rubygems_version: 2.5.2
626
+ rubygems_version: 2.6.7
608
627
  signing_key:
609
628
  specification_version: 4
610
629
  summary: The Semiconductor Developer's Kit