origen 0.7.45 → 0.7.46

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: 816ceb3d0f393ee76db97ce78c88ac9bb920a880
4
- data.tar.gz: 98bd761e01d12b56e13df84bd523bd5a97f9af39
3
+ metadata.gz: 8aa96dc40d731d65be9719183658fed3eaa4b059
4
+ data.tar.gz: 6acae3a224086bd332b90cd2d9ebbe4fc056ab61
5
5
  SHA512:
6
- metadata.gz: 29b35509aa06de548d11dea0ba6cb3187c266aa1dfaad2929a6d0981902499f4a2680b879e8606e51283b8cd3a96917d779e0d46e86d65a2880c5bedec1dea79
7
- data.tar.gz: 0f901ffc7dc4ccffc832b28d6885ba9c32a6415ef20c41af44e2fa016a21d1637b3c8ddc87c37471d9a2042b0452191cb5b055d7feea9437613b3bb5450959f7
6
+ metadata.gz: 26689bc47d753ad5e51eba5e1bdfddfaca1553baaefa5906dd4404db569a5b2c7a5bc1bc3aacabe77d4020303eb32965f0624a990c7b63db1630250823552ded
7
+ data.tar.gz: 0a94636dd35a31dd73aad8c474ffeab045aa84dc37dc9fe13115dd6ddf1cfb9ebc32ca4544a0c48642d647da91b4539db1a660b194f7ecc7dbb9caf74dc77c1f
@@ -1,7 +1,7 @@
1
1
  module Origen
2
2
  MAJOR = 0
3
3
  MINOR = 7
4
- BUGFIX = 45
4
+ BUGFIX = 46
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -181,6 +181,18 @@ module Origen
181
181
  end
182
182
  alias_method :imports_dir, :imports_directory
183
183
 
184
+ # Returns a path to the remotes directory for the application. e.g. if the app live
185
+ # at /home/thao/my_app, then the remotes directory will typically
186
+ # be /home/thao/.my_app_remotes_DO_NOT_HAND_MODIFY
187
+ #
188
+ # Origen will ensure that this directory is outside of the scope of the current application's revision
189
+ # control system. This prevents conflicts with the revision control system for the application and those
190
+ # used to import 3rd party dependencies
191
+ def remotes_directory
192
+ workspace_manager.remotes_directory
193
+ end
194
+ alias_method :remotes_dir, :remotes_directory
195
+
184
196
  # Returns the namespace used by the application as a string
185
197
  def namespace
186
198
  @namespace ||= self.class.to_s.split('::').first.gsub('_', '').sub('Application', '')
@@ -37,11 +37,13 @@ module Origen
37
37
  # Example
38
38
  # # soc/nevis.rb
39
39
  #
40
- # ORIGEN::Runner::LSF.configuration do |config|
41
- # # Use "msg.nevis" for the project string when running in Noida
42
- # if %x["domainname"] =~ /nidc/
43
- # Origen.config.lsf.project = "msg.nevis"
40
+ # Origen::Runner::LSF.configuration do |config|
41
+ # # Use "msg.nevis" for the project string when running in Noida
42
+ # if %x["domainname"] =~ /nidc/
43
+ # config.lsf.project = "msg.nevis"
44
+ # end
44
45
  # end
46
+ #
45
47
  # # Change the default group
46
48
  # Origen.config.lsf.group = "lam"
47
49
  def self.configuration
@@ -73,6 +73,7 @@ module Origen
73
73
  @size = 1
74
74
  @value = 0
75
75
  @clock = nil
76
+ @meta = options[:meta] || {}
76
77
  on_init(owner, options)
77
78
  # Assign the initial state from the method so that any inversion is picked up...
78
79
  send(@reset)
@@ -159,7 +160,13 @@ module Origen
159
160
  default = instance_variable_get("@#{attribute}")
160
161
  if options[:function]
161
162
  v = functions[:ids][options[:function]][attribute]
162
- return v if v
163
+ if v
164
+ if v.is_a?(Hash) && default.is_a?(Hash)
165
+ return default.merge(v) # v will overwrite any default values
166
+ else
167
+ return v
168
+ end
169
+ end
163
170
  # else fall back to context-based lookup
164
171
  end
165
172
  mode_id = options[:mode] || current_mode_id
@@ -170,7 +177,16 @@ module Origen
170
177
  config_id = config_id.to_sym if config_id
171
178
  configuration = mode[config_id] || mode[:all]
172
179
  if configuration
173
- configuration[attribute] || default
180
+ v = configuration[attribute]
181
+ if v
182
+ if v.is_a?(Hash) && default.is_a?(Hash)
183
+ return default.merge(v) # v will overwrite any default values
184
+ else
185
+ return v
186
+ end
187
+ else
188
+ default
189
+ end
174
190
  else
175
191
  default
176
192
  end
@@ -863,6 +879,10 @@ module Origen
863
879
  @clock.next_edge
864
880
  end
865
881
 
882
+ def duty_cycles
883
+ @clock.cycles_per_duty
884
+ end
885
+
866
886
  def half_period
867
887
  @clock.cycles_per_half_period
868
888
  end
@@ -1,123 +1,137 @@
1
1
  module Origen
2
2
  module Pins
3
3
  class PinClock
4
- attr_accessor :running
5
- attr_accessor :cycles_per_half_period
6
- attr_accessor :last_edge
7
- attr_accessor :next_edge
4
+ attr_reader :cycles_per_duty, :last_edge, :next_edge
8
5
 
9
6
  def initialize(owner, options = {})
10
7
  @owner = owner
11
8
  @running = false
12
- @cycles_per_half_period = 0
13
- @ns_per_half_period = 0
14
- update_half_period(options)
15
- end
16
9
 
17
- def running?
18
- @running
10
+ @clock_period_in_ns = 0
11
+ @tester_period_in_ns = 0
12
+
13
+ update_clock_period(options)
14
+ update_tester_period_local
15
+ update_clock_parameters
19
16
  end
20
17
 
21
18
  def start_clock(options = {})
22
- fail "ERROR: Clock on #{@owner.name} already running." if running?
19
+ # Throw error if this pin is already a running clock
20
+ if running?
21
+ fail "PIN CLOCK ERROR: Clock on #{@owner.name} already running."
22
+ end
23
23
 
24
- if update_required?(options)
25
- update_half_period(options)
24
+ clock_updated = update_clock_period(options)
25
+ tester_updated = update_tester_period_local
26
+ if clock_updated || tester_updated
27
+ update_clock_parameters
26
28
  end
27
29
 
28
- @last_edge = Origen.tester.cycle_count
29
- @next_edge = Origen.tester.cycle_count + @cycles_per_half_period
30
- cc "Start clock on #{@owner.name}: cycles_per_half_period=#{@cycles_per_half_period}, start cycle=#{@last_edge}"
30
+ cc "[PinClock] Start #{@owner.name}.clock at #{Origen.tester.cycle_count}: period=#{@clock_period_in_ns}ns, cycles=#{cycles_per_period}, duty=#{duty_str}"
31
+ update_edges
31
32
  Origen.tester.push_running_clock(@owner) unless running?
32
33
  @running = true
33
34
  end
34
35
 
35
- def restart_clock(_options = {})
36
+ def stop_clock(options = {})
37
+ cc "[PinClock] Stop #{@owner.name}.clock: stop_cycle=#{Origen.tester.cycle_count}" if running?
38
+ Origen.tester.pop_running_clock(@owner) if running?
39
+ @running = false
40
+ end
41
+
42
+ def restart_clock
36
43
  stop_clock
37
44
  update_clock
38
45
  start_clock
39
46
  end
40
47
 
41
- def stop_clock(_options = {})
42
- cc "Stop clock on #{@owner.name}: stop cycle=#{Origen.tester.cycle_count}" if running?
43
- Origen.tester.pop_running_clock(@owner) if running?
44
- @running = false
45
- end
46
-
47
48
  def update_clock
48
- unless update_half_period(period_in_ns: @ns_per_half_period)
49
- @last_edge = Origen.tester.cycle_count
50
- @next_edge = Origen.tester.cycle_count + @cycles_per_half_period
49
+ if update_tester_period_local
50
+ update_clock_parameters
51
+ cc "[PinClock] Update #{@owner.name}.clock at #{Origen.tester.cycle_count}: period=#{@clock_period_in_ns}ns, cycles=#{cycles_per_period}, duty=#{duty_str}"
52
+ update_edges
51
53
  end
52
54
  end
53
55
 
56
+ def running?
57
+ @running
58
+ end
59
+
54
60
  def toggle
55
61
  @owner.toggle
56
- @last_edge = Origen.tester.cycle_count
57
- @next_edge = Origen.tester.cycle_count + @cycles_per_half_period
62
+ update_edges
63
+ end
64
+
65
+ # The only caller to this should be legacy support so just force 50% duty cycle
66
+ def cycles_per_half_period
67
+ @cycles_per_duty.min
58
68
  end
59
69
 
60
70
  private
61
71
 
62
- def update_half_period(options = {})
63
- old_cycles_per_half_period = @cycles_per_half_period
64
- options = { cycles: 0,
65
- period_in_s: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0,
66
- frequency_in_hz: 0, frequency_in_khz: 0, frequency_in_mhz: 0,
67
- freq_in_hz: 0, freq_in_khz: 0, freq_in_mhz: 0
68
- }.merge(options)
69
-
70
- cycles = 0
71
- cycles += options[:cycles]
72
- cycles += s_to_cycles(options[:period_in_s])
73
- cycles += ms_to_cycles(options[:period_in_ms])
74
- cycles += us_to_cycles(options[:period_in_us])
75
- cycles += ns_to_cycles(options[:period_in_ns])
76
- cycles += hz_to_cycles(options[:frequency_in_hz])
77
- cycles += khz_to_cycles(options[:frequency_in_khz])
78
- cycles += mhz_to_cycles(options[:frequency_in_mhz])
79
- cycles += hz_to_cycles(options[:freq_in_hz])
80
- cycles += khz_to_cycles(options[:freq_in_khz])
81
- cycles += mhz_to_cycles(options[:freq_in_mhz])
82
-
83
- @cycles_per_half_period = cycles / 2
84
- @ns_per_half_period = cycles * Origen.tester.current_period_in_ns
85
- @cycles_per_half_period == old_cycles_per_half_period
72
+ def update_clock_parameters
73
+ @cycles_per_duty = [(cycles_per_period / 2.0).floor, (cycles_per_period / 2.0).ceil]
86
74
  end
87
75
 
88
- def s_to_cycles(time) # :nodoc:
89
- ((time.to_f) * 1000 * 1000 * 1000 / Origen.tester.current_period_in_ns).to_int
76
+ def cycles_per_period
77
+ (@clock_period_in_ns / @tester_period_in_ns).to_int
90
78
  end
91
79
 
92
- def ms_to_cycles(time) # :nodoc:
93
- ((time.to_f) * 1000 * 1000 / Origen.tester.current_period_in_ns).to_int
80
+ def update_edges
81
+ @last_edge = Origen.tester.cycle_count
82
+ @next_edge = Origen.tester.cycle_count + @cycles_per_duty[0]
83
+ @cycles_per_duty.reverse!
94
84
  end
95
85
 
96
- def us_to_cycles(time) # :nodoc:
97
- ((time.to_f * 1000) / Origen.tester.current_period_in_ns).to_int
86
+ def update_tester_period_local
87
+ if Origen.tester.current_period_in_ns == @tester_period_in_ns
88
+ return false
89
+ else
90
+ @tester_period_in_ns = Origen.tester.current_period_in_ns
91
+ return true
92
+ end
98
93
  end
99
94
 
100
- def ns_to_cycles(time) # :nodoc:
101
- (time.to_f / Origen.tester.current_period_in_ns).to_int
102
- end
95
+ def update_clock_period(options = {})
96
+ new = get_clock_period(options)
103
97
 
104
- def hz_to_cycles(freq) # :nodoc:
105
- (freq == 0) ? freq : s_to_cycles(1 / freq.to_f)
98
+ if new == @clock_period_in_ns
99
+ false
100
+ else
101
+ @clock_period_in_ns = new
102
+ true
103
+ end
106
104
  end
107
105
 
108
- def khz_to_cycles(freq) # :nodoc:
109
- (freq == 0) ? freq : ms_to_cycles(1 / freq.to_f)
110
- end
106
+ def get_clock_period(options = {})
107
+ return @clock_period_in_ns if options.empty?
108
+
109
+ p = []
110
+
111
+ # Passed in as time
112
+ p << (options[:period_in_s] * 1_000_000_000) if options[:period_in_s]
113
+ p << (options[:period_in_ms] * 1_000_000) if options[:period_in_ms]
114
+ p << (options[:period_in_us] * 1_000) if options[:period_in_us]
115
+ p << (options[:period_in_ns] * 1) if options[:period_in_ns]
116
+
117
+ # Passed in as frequency (or freq.)
118
+ p << ((1.0 / options[:frequency_in_hz]) * 1_000_000_000) if options[:frequency_in_hz]
119
+ p << ((1.0 / options[:freq_in_hz]) * 1_000_000_000) if options[:freq_in_hz]
120
+ p << ((1.0 / options[:frequency_in_khz]) * 1_000_000) if options[:frequency_in_khz]
121
+ p << ((1.0 / options[:freq_in_khz]) * 1_000_000) if options[:freq_in_khz]
122
+ p << ((1.0 / options[:frequency_in_mhz]) * 1_000) if options[:frequency_in_mhz]
123
+ p << ((1.0 / options[:freq_in_mhz]) * 1_000) if options[:freq_in_mhz]
124
+
125
+ # Passed in as cycles (not advised)
126
+ p << (options[:cycles] * Origen.tester.period_in_ns) if options[:cycles]
111
127
 
112
- def mhz_to_cycles(freq) # :nodoc:
113
- (freq == 0) ? freq : us_to_cycles(1 / freq.to_f)
128
+ return @clock_period_in_ns if p.empty?
129
+ fail "[Pin Clock] ERROR: Multiple unit declarations for #{@owner.name}.clock" if p.size > 1
130
+ p[0].to_int
114
131
  end
115
132
 
116
- def update_required?(options)
117
- options[:cycles] ||
118
- options[:period_in_s] || options[:period_in_ms] || options[:period_in_us] || options[:period_in_ns]
119
- options[:frequency_in_hz] || options[:frequency_in_khz] || options[:frequency_in_mhz] ||
120
- options[:freq_in_hz] || options[:freq_in_khz] || options[:freq_in_mhz]
133
+ def duty_str
134
+ "#{@cycles_per_duty[0]}/#{@cycles_per_duty[1]}"
121
135
  end
122
136
  end
123
137
  end
@@ -1,6 +1,15 @@
1
1
  module Origen
2
2
  module Pins
3
3
  class PowerPin < Pin
4
+ attr_accessor :current_limit
5
+
6
+ def initialize(id, owner, options = {}) # :nodoc:
7
+ v = options[:voltage] || options[:voltages]
8
+ self.voltage = v if v
9
+ self.current_limit = options[:current_limit] if options[:current_limit]
10
+ super
11
+ end
12
+
4
13
  # Set the operating voltage for the pin, can be a single value or an array
5
14
  def voltage=(val)
6
15
  @voltages = [val].flatten.uniq
@@ -18,15 +18,22 @@ module Origen
18
18
  def require!
19
19
  unless required?
20
20
  while updates_required?
21
+ Origen.log.info '*******************************************************************************'
21
22
  Origen.log.info 'The following remotes need to be updated, this will now happen automatically:'
22
23
  dirty_remotes.each do |name, remote|
23
24
  if remote[:path]
24
- Origen.log.info " #{name} - #{remote[:path]}"
25
+ Origen.log.info " #{name} - #{remote[:path]}".green
25
26
  else
26
- Origen.log.info " #{name} - #{remote[:version]}"
27
+ Origen.log.info " #{name} - #{remote[:version]}".green
27
28
  end
28
29
  end
30
+ Origen.log.info ''
31
+
29
32
  update!
33
+
34
+ Origen.log.info ''
35
+ Origen.log.info 'Finished updating remotes.'
36
+ Origen.log.info '*******************************************************************************'
30
37
  end
31
38
  @required = true
32
39
  end
@@ -289,7 +296,7 @@ module Origen
289
296
  end
290
297
  end
291
298
 
292
- # Makes all dirty imports clean
299
+ # Makes all dirty remotes clean
293
300
  def update!
294
301
  ensure_remotes_directory
295
302
  dirty_remotes.each do |_name, remote|
@@ -305,12 +312,20 @@ module Origen
305
312
  create_symlink(remote[:path], dir)
306
313
 
307
314
  else
308
- unless File.exist?("#{dir}/.initial_populate_successful")
309
- ws.build(dir, rc_url: remote[:vault], allow_rebuild: true)
310
- ws.switch_version(dir, remote[:version])
315
+ rc_url = remote[:rc_url] || remote[:vault]
316
+ tag = Origen::VersionString.new(remote[:version])
317
+ version_file = dir.to_s + '/.current_version'
318
+ if File.exist?("#{dir}/.initial_populate_successful")
319
+ FileUtils.rm_f(version_file) if File.exist?(version_file)
320
+ rc = RevisionControl.new remote: rc_url, local: dir
321
+ rc.checkout version: prefix_tag(tag), force: true
322
+ `echo "#{tag}" >> "#{version_file}"`
323
+ else
324
+ rc = RevisionControl.new remote: rc_url, local: dir
325
+ rc.checkout version: prefix_tag(tag), force: true
311
326
  `touch "#{dir}/.initial_populate_successful"`
327
+ `echo "#{tag}" >> "#{version_file}"`
312
328
  end
313
- ws.switch_version(dir, remote[:version])
314
329
  end
315
330
  end
316
331
  end
@@ -321,8 +336,8 @@ module Origen
321
336
 
322
337
  def ensure_remotes_directory
323
338
  unless remotes.empty?
324
- unless File.exist?(ws.remotes_directory)
325
- FileUtils.mkdir_p(ws.remotes_directory)
339
+ unless File.exist?(Origen.app.remotes_dir)
340
+ FileUtils.mkdir_p Origen.app.remotes_dir
326
341
  end
327
342
  end
328
343
  end
@@ -330,5 +345,16 @@ module Origen
330
345
  def ws
331
346
  Origen.app.workspace_manager
332
347
  end
348
+
349
+ # If the supplied tag looks like a semantic version number, then make sure it has the
350
+ # 'v' prefix
351
+ def prefix_tag(tag)
352
+ tag = Origen::VersionString.new(tag)
353
+ if tag.semantic?
354
+ tag.prefixed
355
+ else
356
+ tag
357
+ end
358
+ end
333
359
  end
334
360
  end
@@ -136,7 +136,7 @@ The regression results are:
136
136
  end
137
137
 
138
138
  def external?(type)
139
- [:production, :major, :minor, :bugfix].include?(type)
139
+ [:production, :major, :minor, :tiny, :bugfix].include?(type)
140
140
  end
141
141
  end
142
142
  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.7.45
4
+ version: 0.7.46
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-02-09 00:00:00.000000000 Z
11
+ date: 2017-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport