origen 0.25.1 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
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