origen 0.26.0 → 0.27.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 +4 -4
- data/config/version.rb +1 -1
- data/lib/origen.rb +34 -33
- data/lib/origen/clocks.rb +23 -0
- data/lib/origen/clocks/clock.rb +184 -0
- data/lib/origen/clocks/clocks_collection.rb +74 -0
- data/lib/origen/core_ext/string.rb +10 -1
- data/lib/origen/model.rb +9 -0
- data/lib/origen/parameters.rb +4 -0
- data/lib/origen/power_domains.rb +1 -1
- data/lib/origen/power_domains/power_domain.rb +17 -12
- data/lib/origen/power_domains/power_domains_collection.rb +1 -1
- data/lib/origen/regression_manager.rb +14 -3
- data/lib/origen/specs/checkers.rb +41 -4
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bd96773b56519ca3c588ba06ddd2db770a6a3b8
|
4
|
+
data.tar.gz: 68f3a9c05792dde205b99001d9cece88c0d1d98b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87cb67532f2c74ec3e83ba6502d527517d95a1fd96a6066a9ef11f9675cb0221c951beec990cced059914bd27a7c3e14a90c66fbc0e910b96aed77c5fb8150b5
|
7
|
+
data.tar.gz: 8a1adf271a8d4f3d2f2d0f66be8e92a957ca00278ce4a9557a8b4fec015b106221469754d8dafbc2f782cd4a4728facd533985d3f5e182016b4c38f30564334f
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -29,41 +29,42 @@ unless defined? RGen::ORIGENTRANSITION
|
|
29
29
|
require 'origen/undefined'
|
30
30
|
|
31
31
|
module Origen
|
32
|
-
autoload :Features,
|
33
|
-
autoload :Bugs,
|
34
|
-
autoload :Generator,
|
35
|
-
autoload :Pins,
|
36
|
-
autoload :Registers,
|
37
|
-
autoload :Ports,
|
38
|
-
autoload :Users,
|
39
|
-
autoload :FileHandler,
|
32
|
+
autoload :Features, 'origen/features'
|
33
|
+
autoload :Bugs, 'origen/bugs'
|
34
|
+
autoload :Generator, 'origen/generator'
|
35
|
+
autoload :Pins, 'origen/pins'
|
36
|
+
autoload :Registers, 'origen/registers'
|
37
|
+
autoload :Ports, 'origen/ports'
|
38
|
+
autoload :Users, 'origen/users'
|
39
|
+
autoload :FileHandler, 'origen/file_handler'
|
40
40
|
autoload :RegressionManager, 'origen/regression_manager'
|
41
|
-
autoload :Location,
|
42
|
-
autoload :VersionString,
|
43
|
-
autoload :Mode,
|
44
|
-
autoload :ChipMode,
|
45
|
-
autoload :ChipPackage,
|
46
|
-
autoload :Client,
|
47
|
-
autoload :SubBlocks,
|
48
|
-
autoload :SubBlock,
|
41
|
+
autoload :Location, 'origen/location'
|
42
|
+
autoload :VersionString, 'origen/version_string'
|
43
|
+
autoload :Mode, 'origen/mode'
|
44
|
+
autoload :ChipMode, 'origen/chip_mode'
|
45
|
+
autoload :ChipPackage, 'origen/chip_package'
|
46
|
+
autoload :Client, 'origen/client'
|
47
|
+
autoload :SubBlocks, 'origen/sub_blocks'
|
48
|
+
autoload :SubBlock, 'origen/sub_blocks'
|
49
49
|
autoload :ModelInitializer, 'origen/model_initializer'
|
50
|
-
autoload :Controller,
|
51
|
-
autoload :Database,
|
52
|
-
autoload :Parameters,
|
53
|
-
autoload :RevisionControl,
|
54
|
-
autoload :Specs,
|
55
|
-
autoload :CodeGenerators,
|
56
|
-
autoload :Encodings,
|
57
|
-
autoload :Log,
|
58
|
-
autoload :Chips,
|
59
|
-
autoload :Netlist,
|
60
|
-
autoload :Models,
|
61
|
-
autoload :Errata,
|
62
|
-
autoload :LSF,
|
63
|
-
autoload :LSFManager,
|
64
|
-
autoload :Fuses,
|
65
|
-
autoload :Tests,
|
66
|
-
autoload :PowerDomains,
|
50
|
+
autoload :Controller, 'origen/controller'
|
51
|
+
autoload :Database, 'origen/database'
|
52
|
+
autoload :Parameters, 'origen/parameters'
|
53
|
+
autoload :RevisionControl, 'origen/revision_control'
|
54
|
+
autoload :Specs, 'origen/specs'
|
55
|
+
autoload :CodeGenerators, 'origen/code_generators'
|
56
|
+
autoload :Encodings, 'origen/encodings'
|
57
|
+
autoload :Log, 'origen/log'
|
58
|
+
autoload :Chips, 'origen/chips'
|
59
|
+
autoload :Netlist, 'origen/netlist'
|
60
|
+
autoload :Models, 'origen/models'
|
61
|
+
autoload :Errata, 'origen/errata'
|
62
|
+
autoload :LSF, 'origen/application/lsf'
|
63
|
+
autoload :LSFManager, 'origen/application/lsf_manager'
|
64
|
+
autoload :Fuses, 'origen/fuses'
|
65
|
+
autoload :Tests, 'origen/tests'
|
66
|
+
autoload :PowerDomains, 'origen/power_domains'
|
67
|
+
autoload :Clocks, 'origen/clocks'
|
67
68
|
|
68
69
|
attr_reader :switch_user
|
69
70
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative './clocks/clock'
|
2
|
+
require_relative './clocks/clocks_collection'
|
3
|
+
module Origen
|
4
|
+
module Clocks
|
5
|
+
def clocks(expr = nil)
|
6
|
+
@_clocks ||= ClocksCollection.new
|
7
|
+
if expr.nil?
|
8
|
+
@_clocks
|
9
|
+
else
|
10
|
+
@_clocks.recursive_find_by_key(expr)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_clock(id, options = {}, &block)
|
15
|
+
if clocks.include?(id)
|
16
|
+
Origen.log.error("Cannot create clock '#{id}', it already exists!")
|
17
|
+
fail
|
18
|
+
end
|
19
|
+
clocks[id] = Clock.new(id, self, options, &block)
|
20
|
+
end
|
21
|
+
alias_method :clock, :add_clock
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module Origen
|
2
|
+
module Clocks
|
3
|
+
class Clock
|
4
|
+
attr_accessor :id, :owner, :users, :startup_freq, :nominal_freq, :frequency_range, :setpoint
|
5
|
+
|
6
|
+
def initialize(id, owner, options = {}, &block)
|
7
|
+
@id = id
|
8
|
+
@owner = owner
|
9
|
+
@id = @id.symbolize unless id.is_a? Symbol
|
10
|
+
options.each { |k, v| instance_variable_set("@#{k}", v) }
|
11
|
+
(block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
|
12
|
+
@users = [@users] unless @users.is_a? Array
|
13
|
+
instantiate_users
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
@id
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns an Array of IPs that use a clock
|
21
|
+
def users
|
22
|
+
@users
|
23
|
+
end
|
24
|
+
alias_method :ips, :users
|
25
|
+
alias_method :sub_blocks, :users
|
26
|
+
|
27
|
+
def setpoint=(val)
|
28
|
+
setpoint_ok?
|
29
|
+
@setpoint = val
|
30
|
+
end
|
31
|
+
|
32
|
+
def setpoint_ok?(val = nil)
|
33
|
+
return nil if val.nil? && setpoint.nil?
|
34
|
+
if freq_range == :fixed
|
35
|
+
if val.nil? || val == nominal_frequency
|
36
|
+
return true
|
37
|
+
else
|
38
|
+
Origen.log.warn("Clock '#{id}' is a fixed clock with a nominal frequency of #{nominal_frequency.as_Hz}, setting it to #{val.as_Hz}")
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
else
|
42
|
+
val = setpoint if val.nil?
|
43
|
+
if freq_range.include?(val)
|
44
|
+
return true
|
45
|
+
else
|
46
|
+
Origen.log.warn("Setpoint (#{setpoint_string(val)}) for clock '#{id}' is not within the frequency range (#{freq_range_string}), setting it to #{val.as_Hz}")
|
47
|
+
return false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
alias_method :value_ok?, :setpoint_ok?
|
52
|
+
alias_method :val_ok?, :setpoint_ok?
|
53
|
+
|
54
|
+
# Set the clock to the nominal frequency
|
55
|
+
def setpoint_to_nominal
|
56
|
+
@setpoint = nominal_frequency
|
57
|
+
end
|
58
|
+
|
59
|
+
# Nominal frequency
|
60
|
+
def nominal_frequency
|
61
|
+
@nominal_frequency
|
62
|
+
end
|
63
|
+
alias_method :nominal, :nominal_frequency
|
64
|
+
alias_method :nom, :nominal_frequency
|
65
|
+
|
66
|
+
# Current setpoint, defaults top nil on init
|
67
|
+
def setpoint
|
68
|
+
@setpoint
|
69
|
+
end
|
70
|
+
alias_method :curr_value, :setpoint
|
71
|
+
alias_method :value, :setpoint
|
72
|
+
|
73
|
+
# Acceptable frequency range
|
74
|
+
def frequency_range
|
75
|
+
@frequency_range
|
76
|
+
end
|
77
|
+
alias_method :freq_range, :frequency_range
|
78
|
+
alias_method :range, :frequency_range
|
79
|
+
|
80
|
+
# Check if the clock users are defined anywhere in the DUT
|
81
|
+
def users_defined?
|
82
|
+
undefined_ips = ips - Origen.all_sub_blocks
|
83
|
+
if undefined_ips.empty?
|
84
|
+
return true
|
85
|
+
else
|
86
|
+
Origen.log.warn("Clock '#{id}' has the following IP undefined: #{undefined_ips}")
|
87
|
+
return false
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def method_missing(m, *args, &block)
|
92
|
+
ivar = "@#{m.to_s.gsub('=', '')}"
|
93
|
+
ivar_sym = ":#{ivar}"
|
94
|
+
if m.to_s =~ /=$/
|
95
|
+
define_singleton_method(m) do |val|
|
96
|
+
instance_variable_set(ivar, val)
|
97
|
+
end
|
98
|
+
elsif instance_variables.include? ivar_sym
|
99
|
+
instance_variable_get(ivar)
|
100
|
+
else
|
101
|
+
define_singleton_method(m) do
|
102
|
+
instance_variable_get(ivar)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
send(m, *args, &block)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
# Instantiate and IP/users that use/access the clock
|
111
|
+
def instantiate_users
|
112
|
+
users.each do |ip|
|
113
|
+
if owner.respond_to? ip
|
114
|
+
next
|
115
|
+
else
|
116
|
+
owner.sub_block ip
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Ensure attributes are the correct type
|
122
|
+
def attrs_ok?
|
123
|
+
return_value = true
|
124
|
+
unless description.is_a? String
|
125
|
+
Origen.log.error("Clock attribute 'description' must be a String!")
|
126
|
+
return_value = false
|
127
|
+
end
|
128
|
+
return_value = false unless frequencies_ok?
|
129
|
+
return_value
|
130
|
+
end
|
131
|
+
|
132
|
+
def frequencies_ok?
|
133
|
+
if nominal_frequency.nil?
|
134
|
+
false
|
135
|
+
elsif frequency_range.nil?
|
136
|
+
Origen.log.error("Missing frequency range for clock '#{name}'!")
|
137
|
+
false
|
138
|
+
elsif frequency_range.is_a? Range
|
139
|
+
if frequency_range.include?(nominal_frequency)
|
140
|
+
true
|
141
|
+
else
|
142
|
+
Origen.log.error("PPEKit: Nominal frequency #{nominal_frequency} is not inbetween the frequency range #{frequency_range} for clock '#{name}'!")
|
143
|
+
false
|
144
|
+
end
|
145
|
+
else
|
146
|
+
Origen.log.error("Clock attribute 'frequency_range' must be a Range!")
|
147
|
+
return_value = false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def setpoint_string(val = nil)
|
152
|
+
if val.nil?
|
153
|
+
@setpoint.as_Hz unless @setpoint.nil?
|
154
|
+
else
|
155
|
+
val.as_Hz
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def freq_range_string
|
160
|
+
start_freq = freq_range.first
|
161
|
+
end_freq = freq_range.last
|
162
|
+
"#{start_freq.as_Hz}\.\.#{end_freq.as_Hz}"
|
163
|
+
end
|
164
|
+
|
165
|
+
def clock_freqs_ok?
|
166
|
+
if nominal_freq.nil?
|
167
|
+
false
|
168
|
+
elsif freq_range == :fixed
|
169
|
+
true
|
170
|
+
else
|
171
|
+
if freq_range.nil?
|
172
|
+
Origen.log.error("PPEKit: Missing frequency target or range for clock '#{id}'!")
|
173
|
+
false
|
174
|
+
elsif freq_range.include?(nominal_freq)
|
175
|
+
true
|
176
|
+
else
|
177
|
+
Origen.log.error("PPEKit: Frequency target #{nominal_freq} is not inbetween the freq range #{freq_range} for clock '#{id}'!")
|
178
|
+
false
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
module Origen
|
3
|
+
module Clocks
|
4
|
+
class ClocksCollection < Hash
|
5
|
+
ConsoleValue = Struct.new(:value, :color)
|
6
|
+
|
7
|
+
def inspect(options = {})
|
8
|
+
options = {
|
9
|
+
fancy_output: true
|
10
|
+
}.update(options)
|
11
|
+
headers = []
|
12
|
+
output_clock_list = []
|
13
|
+
column_widths = {}.tap do |colhash|
|
14
|
+
each do |clk_name, clk|
|
15
|
+
output_attr_list = {}
|
16
|
+
clk.instance_variables.each do |attr|
|
17
|
+
value_color = :default
|
18
|
+
attr_getter = attr.to_s[/\@(\S+)/, 1].to_sym
|
19
|
+
attr_val = clk.send attr_getter
|
20
|
+
next unless [String, Numeric, Float, Integer, Symbol, Range].include? attr_val.class
|
21
|
+
headers << attr_getter unless headers.include?(attr_getter)
|
22
|
+
str = case attr_val
|
23
|
+
when Numeric
|
24
|
+
value_color = :red unless clk.setpoint_ok?(attr_val)
|
25
|
+
attr_val.as_Hz
|
26
|
+
when Range
|
27
|
+
start_frequency = attr_val.first
|
28
|
+
end_frequency = attr_val.last
|
29
|
+
"#{start_frequency.as_Hz}\.\.#{end_frequency.as_Hz}"
|
30
|
+
else
|
31
|
+
attr_val.to_s
|
32
|
+
end
|
33
|
+
curr_longest = [attr_getter, str].max_by(&:length).size + 2 # Add 2 for the whitespace
|
34
|
+
if colhash[attr].nil? || (colhash[attr] < curr_longest)
|
35
|
+
colhash[attr] = curr_longest
|
36
|
+
end
|
37
|
+
output_attr_list[attr_getter] = ConsoleValue.new(str, value_color)
|
38
|
+
end
|
39
|
+
output_clock_list << output_attr_list
|
40
|
+
end
|
41
|
+
end
|
42
|
+
# Need to loop through the clock table values and find nils
|
43
|
+
# and create ConsoleValue instances for them
|
44
|
+
updated_clock_list = [].tap do |clk_ary|
|
45
|
+
output_clock_list.each do |attrs|
|
46
|
+
temp_hash = {}.tap do |tmphash|
|
47
|
+
headers.each do |h|
|
48
|
+
if attrs[h].nil?
|
49
|
+
tmphash[h] = ConsoleValue.new('', :default)
|
50
|
+
else
|
51
|
+
tmphash[h] = ConsoleValue.new(attrs[h].value, attrs[h].color)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
clk_ary << temp_hash
|
56
|
+
end
|
57
|
+
end
|
58
|
+
if options[:fancy_output]
|
59
|
+
puts '╔' + column_widths.values.each.map { |i| '═' * i }.join('╤') + '╗'
|
60
|
+
puts '║' + headers.each_with_index.map { |col_val, i| " #{col_val} ".ljust(column_widths.values[i]) }.join('│') + '║'
|
61
|
+
puts '╟' + column_widths.values.each.map { |i| '─' * i }.join('┼') + '╢'
|
62
|
+
puts updated_clock_list.each.map { |attributes| '║' + headers.each_with_index.map { |value, attr_idx| attributes[value].color == :default ? " #{attributes[value].value} ".ljust(column_widths.values[attr_idx]) : " #{attributes[value].value} ".ljust(column_widths.values[attr_idx]).colorize(:red) }.join('│') + '║' }
|
63
|
+
puts '╚' + column_widths.values.each.map { |i| '═' * i }.join('╧') + '╝'
|
64
|
+
else
|
65
|
+
puts '.' + column_widths.values.each.map { |i| '-' * i }.join('-') + '.'
|
66
|
+
puts '|' + headers.each_with_index.map { |col_val, i| " #{col_val} ".ljust(column_widths.values[i]) }.join('|') + '|'
|
67
|
+
puts '|' + column_widths.values.each.map { |i| '-' * i }.join('+') + '|'
|
68
|
+
puts updated_clock_list.each.map { |attributes| '|' + headers.each_with_index.map { |value, attr_idx| attributes[value].color == :default ? " #{attributes[value]} ".ljust(column_widths.values[attr_idx]) : " #{attributes[value]} ".ljust(column_widths.values[attr_idx]).colorize(:red) }.join('|') + '|' }
|
69
|
+
puts '`' + column_widths.values.each.map { |i| '-' * i }.join('-') + '\''
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -55,8 +55,17 @@ class String
|
|
55
55
|
# Sanitizes the string for conversion to a symbol and returns a lower
|
56
56
|
# cased symbol version of the string
|
57
57
|
def symbolize
|
58
|
+
orig_had_leading_underscore = match(/^\_/) ? true : false
|
59
|
+
orig_had_trailing_underscore = match(/\_$/) ? true : false
|
60
|
+
new_str = gsub(/(\?|\!|\-|\/|\\|\n|\s|\(|\)|\.|\[|\]|-|{|})/, '_').downcase
|
61
|
+
# Get rid of adjacent underscores
|
62
|
+
new_str.match(/\_\_/) ? new_str = new_str.squeeze('_') : new_str
|
63
|
+
new_str.chomp!('_') unless orig_had_trailing_underscore
|
64
|
+
unless orig_had_leading_underscore
|
65
|
+
new_str = new_str[1..-1] if new_str.match(/^\_/)
|
66
|
+
end
|
58
67
|
@@symbolize ||= {}
|
59
|
-
@@symbolize[self] ||=
|
68
|
+
@@symbolize[self] ||= new_str.to_sym
|
60
69
|
end
|
61
70
|
|
62
71
|
# acronyms
|
data/lib/origen/model.rb
CHANGED
@@ -28,6 +28,7 @@ module Origen
|
|
28
28
|
include Origen::Fuses
|
29
29
|
include Origen::Tests
|
30
30
|
include Origen::PowerDomains
|
31
|
+
include Origen::Clocks
|
31
32
|
end
|
32
33
|
|
33
34
|
module ClassMethods
|
@@ -174,6 +175,14 @@ module Origen
|
|
174
175
|
if @current_mode
|
175
176
|
return _modes[@current_mode] if _modes[@current_mode]
|
176
177
|
fail "The mode #{@current_mode} of #{self.class} has not been defined!"
|
178
|
+
else
|
179
|
+
unless top_level?
|
180
|
+
# Need to do this in case a class besides SubBlock includes Origen::Model
|
181
|
+
obj_above_self = parent.nil? ? Origen.top_level : parent
|
182
|
+
if obj_above_self.current_mode
|
183
|
+
_modes[obj_above_self.current_mode.id] if _modes.include? obj_above_self.current_mode.id
|
184
|
+
end
|
185
|
+
end
|
177
186
|
end
|
178
187
|
end
|
179
188
|
alias_method :mode, :current_mode
|
data/lib/origen/parameters.rb
CHANGED
data/lib/origen/power_domains.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'colorize'
|
2
1
|
require_relative './power_domains/power_domain'
|
3
2
|
require_relative './power_domains/power_domains_collection'
|
4
3
|
module Origen
|
@@ -19,5 +18,6 @@ module Origen
|
|
19
18
|
end
|
20
19
|
power_domains[id] = PowerDomain.new(id, options, &block)
|
21
20
|
end
|
21
|
+
alias_method :power_domain, :add_power_domain
|
22
22
|
end
|
23
23
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Origen
|
2
2
|
module PowerDomains
|
3
3
|
class PowerDomain
|
4
|
-
attr_accessor :id, :description, :
|
4
|
+
attr_accessor :id, :description, :unit_voltage_range, :nominal_voltage, :setpoint
|
5
5
|
|
6
6
|
# Generic Power Domain Name
|
7
7
|
# This is the power supply that can be blocked off to multiple power supplies
|
@@ -34,6 +34,7 @@ module Origen
|
|
34
34
|
@id = @id.symbolize unless @id.is_a? Symbol
|
35
35
|
options.each { |k, v| instance_variable_set("@#{k}", v) }
|
36
36
|
(block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
|
37
|
+
@unit_voltage_range = :fixed if @unit_voltage_range.nil?
|
37
38
|
fail unless attrs_ok?
|
38
39
|
end
|
39
40
|
|
@@ -112,25 +113,27 @@ module Origen
|
|
112
113
|
alias_method :value, :setpoint
|
113
114
|
|
114
115
|
# Acceptable voltage range
|
115
|
-
def
|
116
|
-
@
|
116
|
+
def unit_voltage_range
|
117
|
+
@unit_voltage_range
|
117
118
|
end
|
118
|
-
alias_method :
|
119
|
+
alias_method :unit_range, :unit_voltage_range
|
119
120
|
|
120
121
|
# Setter for setpoint
|
121
122
|
def setpoint=(val)
|
122
123
|
unless setpoint_ok?(val)
|
123
|
-
Origen.log.warn("Setpoint (#{setpoint_string(val)}) for power domain '#{name}' is not within the voltage range (#{
|
124
|
+
Origen.log.warn("Setpoint (#{setpoint_string(val)}) for power domain '#{name}' is not within the voltage range (#{unit_voltage_range_string})!")
|
124
125
|
end
|
125
126
|
@setpoint = val
|
126
127
|
end
|
127
128
|
|
128
129
|
# Checks if the setpoint is valid
|
130
|
+
# This will need rework once the class has spec limits added
|
129
131
|
def setpoint_ok?(val = nil)
|
132
|
+
return true if unit_voltage_range == :fixed
|
130
133
|
if val.nil?
|
131
|
-
|
134
|
+
unit_voltage_range.include?(setpoint) ? true : false
|
132
135
|
else
|
133
|
-
|
136
|
+
unit_voltage_range.include?(val) ? true : false
|
134
137
|
end
|
135
138
|
end
|
136
139
|
alias_method :value_ok?, :setpoint_ok?
|
@@ -182,18 +185,20 @@ module Origen
|
|
182
185
|
def voltages_ok?
|
183
186
|
if nominal_voltage.nil?
|
184
187
|
false
|
185
|
-
elsif
|
188
|
+
elsif unit_voltage_range == :fixed
|
189
|
+
true
|
190
|
+
elsif unit_voltage_range.nil?
|
186
191
|
Origen.log.error("PPEKit: Missing voltage range for power domain '#{name}'!")
|
187
192
|
false
|
188
|
-
elsif
|
189
|
-
if
|
193
|
+
elsif unit_voltage_range.is_a? Range
|
194
|
+
if unit_voltage_range.include?(nominal_voltage)
|
190
195
|
true
|
191
196
|
else
|
192
|
-
Origen.log.error("PPEKit: Nominal voltage #{nominal_voltage} is not inbetween the voltage range #{
|
197
|
+
Origen.log.error("PPEKit: Nominal voltage #{nominal_voltage} is not inbetween the voltage range #{unit_voltage_range} for power domain '#{name}'!")
|
193
198
|
false
|
194
199
|
end
|
195
200
|
else
|
196
|
-
Origen.log.error("Power domain attribute '
|
201
|
+
Origen.log.error("Power domain attribute 'unit_voltage_range' must be a Range or set to the value of :fixed!")
|
197
202
|
return_value = false
|
198
203
|
end
|
199
204
|
end
|
@@ -25,7 +25,7 @@ module Origen
|
|
25
25
|
else
|
26
26
|
attr_val.to_s
|
27
27
|
end
|
28
|
-
curr_longest = [attr_getter, str].max_by(&:length).size + 2 # Add
|
28
|
+
curr_longest = [attr_getter, str].max_by(&:length).size + 2 # Add 2 for the whitespace
|
29
29
|
if colhash[attr].nil? || (colhash[attr] < curr_longest)
|
30
30
|
colhash[attr] = curr_longest
|
31
31
|
end
|
@@ -73,14 +73,25 @@ module Origen
|
|
73
73
|
system 'bundle install --gemfile Gemfile --binstubs lbin --path ~/.origen/gems/' # this needs to be executed as 'origen -v' does not seem to handle it on its own.
|
74
74
|
system 'origen -v' # Let origen handle the gems installation and bundler setup.
|
75
75
|
else
|
76
|
-
|
77
|
-
|
76
|
+
if Origen.site_config.gem_manage_bundler
|
77
|
+
system 'origen -v'
|
78
|
+
system 'bundle install' # Make sure bundle updates the necessary config/gems required for Origen.
|
79
|
+
system 'origen m debug'
|
80
|
+
else
|
81
|
+
system 'bundle install' # Make sure bundle updates the necessary config/gems required for Origen.
|
82
|
+
system 'bundle exec origen -v'
|
83
|
+
system 'origen m debug'
|
84
|
+
end
|
78
85
|
end
|
79
86
|
Origen.log.info '######################################################'
|
80
87
|
Origen.log.info 'running regression command in reference workspace...'
|
81
88
|
Origen.log.info '######################################################'
|
82
89
|
Origen.log.info
|
83
|
-
|
90
|
+
if Origen.site_config.gem_manage_bundler
|
91
|
+
system 'origen regression'
|
92
|
+
else
|
93
|
+
system 'bundle exec origen regression'
|
94
|
+
end
|
84
95
|
end
|
85
96
|
end
|
86
97
|
end
|
@@ -72,13 +72,50 @@ module Origen
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def evaluate_limit(limit)
|
75
|
-
return limit if [Fixnum, Float, Numeric
|
75
|
+
return limit if [Fixnum, Float, Numeric].include? limit.class
|
76
76
|
return nil if limit.nil?
|
77
77
|
limit = limit.to_s if [Nokogiri::XML::NodeSet, Nokogiri::XML::Text, Nokogiri::XML::Element].include? limit.class
|
78
|
-
limit.
|
79
|
-
|
78
|
+
if limit.is_a? Symbol
|
79
|
+
limit = ':' + limit.to_s
|
80
|
+
else
|
81
|
+
limit.gsub!("\n", ' ')
|
82
|
+
limit.scrub!
|
83
|
+
end
|
80
84
|
result = false
|
81
|
-
if
|
85
|
+
if limit.match(/\:\S+/)
|
86
|
+
limit_items = limit.split(/\:|\s+/).reject(&:empty?)
|
87
|
+
references = limit.split(/\:|\s+/).select { |var| var.match(/^[a-zA-Z]\S+$/) }
|
88
|
+
new_limit_items = [].tap do |limit_ary|
|
89
|
+
limit_items.each do |item|
|
90
|
+
if references.include? item
|
91
|
+
# See if the limit is referencing a power domain, this should be extended to clocks
|
92
|
+
# TODO: Expand limit references to check Origen::Clocks
|
93
|
+
if Origen.top_level.respond_to? :power_domains
|
94
|
+
if Origen.top_level.power_domains.include? item.to_sym
|
95
|
+
limit_ary << Origen.top_level.power_domains(item.to_sym).nominal_voltage
|
96
|
+
next
|
97
|
+
end
|
98
|
+
end
|
99
|
+
if Origen.top_level.respond_to? :clocks
|
100
|
+
if Origen.top_level.clocks.include? item.to_sym
|
101
|
+
limit_ary << Origen.top_level.clocks(item.to_sym).freq_target
|
102
|
+
next
|
103
|
+
end
|
104
|
+
end
|
105
|
+
limit_ary << item
|
106
|
+
else
|
107
|
+
limit_ary << item
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
new_limit = new_limit_items.join(' ')
|
112
|
+
new_limit_references = new_limit.split(/\:|\s+/).select { |var| var.match(/^[a-zA-Z]\S+$/) }
|
113
|
+
if new_limit_references.empty?
|
114
|
+
result = eval(new_limit).round(4)
|
115
|
+
else
|
116
|
+
return limit
|
117
|
+
end
|
118
|
+
elsif !!(limit.match(/^\d+\.\d+$/)) || !!(limit.match(/^-\d+\.\d+$/))
|
82
119
|
result = Float(limit).round(4) rescue false # Use the same four digits of accuracy as the Spec model
|
83
120
|
elsif !!(limit.match(/\d+\.\d+\s+\d+\.\d+/)) # workaround for multiple specs authoring bug
|
84
121
|
Origen.log.debug "Found two numbers without an operator in the limit string '#{limit}', choosing the first..."
|
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.
|
4
|
+
version: 0.27.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-10-
|
11
|
+
date: 2017-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -421,6 +421,9 @@ files:
|
|
421
421
|
- lib/origen/chips/doc_entry.rb
|
422
422
|
- lib/origen/chips/note.rb
|
423
423
|
- lib/origen/client.rb
|
424
|
+
- lib/origen/clocks.rb
|
425
|
+
- lib/origen/clocks/clock.rb
|
426
|
+
- lib/origen/clocks/clocks_collection.rb
|
424
427
|
- lib/origen/code_generators.rb
|
425
428
|
- lib/origen/code_generators/actions.rb
|
426
429
|
- lib/origen/code_generators/base.rb
|
@@ -623,7 +626,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
623
626
|
version: 1.8.11
|
624
627
|
requirements: []
|
625
628
|
rubyforge_project:
|
626
|
-
rubygems_version: 2.
|
629
|
+
rubygems_version: 2.5.2
|
627
630
|
signing_key:
|
628
631
|
specification_version: 4
|
629
632
|
summary: The Semiconductor Developer's Kit
|