origen 0.55.2 → 0.57.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 +5 -5
- data/config/version.rb +2 -2
- data/lib/origen.rb +3 -0
- data/lib/origen/application/lsf_manager.rb +12 -13
- data/lib/origen/application/workspace_manager.rb +1 -1
- data/lib/origen/commands.rb +16 -6
- data/lib/origen/generator/job.rb +9 -3
- data/lib/origen/generator/pattern.rb +18 -3
- data/lib/origen/generator/pattern_sequence.rb +49 -5
- data/lib/origen/generator/pattern_sequencer.rb +19 -0
- data/lib/origen/generator/pattern_thread.rb +3 -1
- data/lib/origen/log.rb +5 -2
- data/lib/origen/regression_manager.rb +15 -8
- data/lib/origen/revision_control/git.rb +1 -0
- data/lib/origen/sub_blocks.rb +31 -16
- data/lib/origen/utility/mailer.rb +5 -1
- data/origen_app_generators/origen_app_generators.gemspec +3 -3
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 21b7b219ea6b020ff55496a1c3103e1abb49080162ae22c7e923cf09573b2909
|
4
|
+
data.tar.gz: 2e0fdba7223ee3fa33f272f88ff9ccdea39ba54d630eb8e28c99d5bfc73c6563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb7fcc388d925a782a33120045527f627e5c7c31fcbfe351f0ef32c8368824c2d94c473f818e68a5e1948cd321dd8cd130d288d348ce141875678b03d11ee693
|
7
|
+
data.tar.gz: 187445f738cc7873c920f29e4c55eb480d67d8ab1be5fbc143e592d6cc855ecb8a27f2c835efbb53ce304faa123e432fedd8ba51b3205df1fe414f3f1482ad8c
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -252,8 +252,9 @@ module Origen
|
|
252
252
|
end
|
253
253
|
|
254
254
|
# Build the log file from the completed jobs
|
255
|
-
def build_log(
|
256
|
-
|
255
|
+
def build_log(options = {})
|
256
|
+
log_method = options[:log_file] ? options[:log_file] : :info
|
257
|
+
Origen.log.send(log_method, '*' * 70)
|
257
258
|
completed_jobs.each do |job|
|
258
259
|
File.open(log_file(job[:id])) do |f|
|
259
260
|
last_line_blank = false
|
@@ -291,12 +292,12 @@ module Origen
|
|
291
292
|
stats.failed_files += Regexp.last_match[1].to_i
|
292
293
|
elsif line =~ /ERROR!/
|
293
294
|
stats.errors += 1
|
294
|
-
Origen.log.send :relog, line
|
295
|
+
Origen.log.send :relog, line, options
|
295
296
|
else
|
296
297
|
# Compress multiple blank lines
|
297
298
|
if line =~ /^\s*$/ || line =~ /.*\|\|\s*$/
|
298
299
|
unless last_line_blank
|
299
|
-
Origen.log.
|
300
|
+
Origen.log.send(log_method, nil)
|
300
301
|
last_line_blank = true
|
301
302
|
end
|
302
303
|
else
|
@@ -305,8 +306,7 @@ module Origen
|
|
305
306
|
line =~ /Insecure world writable dir/ ||
|
306
307
|
line =~ /To save all of/
|
307
308
|
line.strip!
|
308
|
-
|
309
|
-
Origen.log.send :relog, line
|
309
|
+
Origen.log.send :relog, line, options
|
310
310
|
last_line_blank = false
|
311
311
|
end
|
312
312
|
end
|
@@ -319,7 +319,7 @@ module Origen
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
end
|
322
|
-
Origen.log.
|
322
|
+
Origen.log.send(log_method, '*' * 70)
|
323
323
|
stats.print_summary
|
324
324
|
end
|
325
325
|
|
@@ -409,7 +409,7 @@ module Origen
|
|
409
409
|
end
|
410
410
|
|
411
411
|
str = "#{action} #{cmd}".strip
|
412
|
-
str.sub('origen ', '') if str =~ /^origen /
|
412
|
+
str.sub!('origen ', '') if str =~ /^origen /
|
413
413
|
|
414
414
|
# Append the --exec_remote switch to all Origen commands, this allows command
|
415
415
|
# processing to be altered based on whether it is running locally or
|
@@ -420,12 +420,11 @@ module Origen
|
|
420
420
|
end
|
421
421
|
|
422
422
|
def command_prefix(id, dependents)
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
prefix = "source #{Regexp.last_match[1]}/origen_setup; "
|
423
|
+
# define prefix as a blank string if Origen.site_config.lsf_command_prefix is not defined
|
424
|
+
if Origen.site_config.lsf_command_prefix
|
425
|
+
prefix = Origen.site_config.lsf_command_prefix
|
427
426
|
else
|
428
|
-
prefix =
|
427
|
+
prefix = ''
|
429
428
|
end
|
430
429
|
prefix += "cd #{Origen.root}; origen l --execute --id #{id} "
|
431
430
|
unless dependents.empty?
|
@@ -114,7 +114,7 @@ module Origen
|
|
114
114
|
fail "Sorry but #{path} already exists!"
|
115
115
|
end
|
116
116
|
FileUtils.rm_rf(path.to_s) if File.exist?(path.to_s)
|
117
|
-
rc = RevisionControl.new remote: options[:rc_url], local: path.to_s
|
117
|
+
rc = RevisionControl.new options.merge(remote: options[:rc_url], local: path.to_s)
|
118
118
|
rc.build
|
119
119
|
end
|
120
120
|
|
data/lib/origen/commands.rb
CHANGED
@@ -62,24 +62,34 @@ if ARGV.delete('--coverage') ||
|
|
62
62
|
Origen.log.info 'Started code coverage'
|
63
63
|
SimpleCov.configure do
|
64
64
|
filters.clear # This will remove the :root_filter that comes via simplecov's defaults
|
65
|
+
|
65
66
|
add_filter do |src|
|
66
|
-
|
67
|
+
if File.directory?("#{Origen.root}/app/lib")
|
68
|
+
!(src.filename =~ /^#{Origen.root}\/app\/lib/)
|
69
|
+
else
|
70
|
+
!(src.filename =~ /^#{Origen.root}\/lib/)
|
71
|
+
end
|
67
72
|
end
|
68
73
|
|
69
74
|
# Results from commands run in succession will be merged by default
|
70
75
|
use_merging(!ARGV.delete('--no_merge'))
|
71
|
-
|
72
76
|
# Try and make a guess about which directory contains the bulk of the application's code
|
73
77
|
# and create groups to match the main folders
|
74
|
-
|
75
|
-
|
76
|
-
|
78
|
+
# Highest priority is given to the new application structure
|
79
|
+
# Applications on the old directory structure need to make sure that there isn't another "app" directory in Origen.root
|
80
|
+
# Applications on the new directory structure need to make sure that there isn't another "lib" directory in Origen.root
|
81
|
+
d1 = "#{Origen.root}/app/"
|
82
|
+
d2 = "#{Origen.root}/lib/#{Origen.app.name.to_s.underscore}"
|
83
|
+
d3 = "#{Origen.root}/lib/#{Origen.app.namespace.to_s.underscore}"
|
84
|
+
d4 = "#{Origen.root}/lib"
|
77
85
|
if File.exist?(d1) && File.directory?(d1)
|
78
86
|
dir = d1
|
79
87
|
elsif File.exist?(d2) && File.directory?(d2)
|
80
88
|
dir = d2
|
81
|
-
|
89
|
+
elsif File.exist?(d3) && File.directory?(d3)
|
82
90
|
dir = d3
|
91
|
+
else
|
92
|
+
dir = d4
|
83
93
|
end
|
84
94
|
|
85
95
|
Dir.glob("#{dir}/*").each do |d|
|
data/lib/origen/generator/job.rb
CHANGED
@@ -3,7 +3,7 @@ module Origen
|
|
3
3
|
# A job is responsible for executing a single pattern source
|
4
4
|
class Job # :nodoc: all
|
5
5
|
attr_accessor :output_file_body, :pattern
|
6
|
-
attr_reader :split_counter
|
6
|
+
attr_reader :split_counter, :split_names
|
7
7
|
attr_reader :options
|
8
8
|
|
9
9
|
def initialize(pattern, options)
|
@@ -23,9 +23,11 @@ module Origen
|
|
23
23
|
@no_comments
|
24
24
|
end
|
25
25
|
|
26
|
-
def inc_split_counter
|
26
|
+
def inc_split_counter(name = '')
|
27
27
|
@split_counter ||= 0
|
28
|
+
@split_names ||= ['']
|
28
29
|
@split_counter += 1
|
30
|
+
@split_names << name
|
29
31
|
end
|
30
32
|
|
31
33
|
def requested_pattern
|
@@ -115,7 +117,11 @@ module Origen
|
|
115
117
|
|
116
118
|
def split_number
|
117
119
|
if split_counter
|
118
|
-
|
120
|
+
if split_names[split_counter] != ''
|
121
|
+
"_#{split_names[split_counter]}"
|
122
|
+
else
|
123
|
+
"_part#{split_counter}"
|
124
|
+
end
|
119
125
|
else
|
120
126
|
''
|
121
127
|
end
|
@@ -91,9 +91,23 @@ module Origen
|
|
91
91
|
# end
|
92
92
|
|
93
93
|
@pattern_sequence = true
|
94
|
-
|
94
|
+
|
95
|
+
# The startup callbacks need to be skipped for now until the main thread is open for business
|
96
|
+
pattern_wrapper([], [], options.merge(call_startup_callbacks: false)) do
|
97
|
+
# The startup callbacks, if required, need to be wrapped up in a closure for calling
|
98
|
+
# later by the main thread
|
99
|
+
if (options.key?(:call_startup_callbacks) && !options[:call_startup_callbacks]) || options[:skip_startup]
|
100
|
+
pre_block = nil
|
101
|
+
else
|
102
|
+
pre_block = proc do
|
103
|
+
# Call startup callbacks
|
104
|
+
Origen.app.listeners_for(:startup).each do |listener|
|
105
|
+
listener.startup(options)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
95
109
|
PatternSequencer.send(:active=, true)
|
96
|
-
@pattern_sequence = PatternSequence.new(job.output_pattern_filename, block)
|
110
|
+
@pattern_sequence = PatternSequence.new(job.output_pattern_filename, block, pre_block)
|
97
111
|
@pattern_sequence.send(:execute)
|
98
112
|
PatternSequencer.send(:active=, false)
|
99
113
|
end
|
@@ -221,8 +235,9 @@ module Origen
|
|
221
235
|
# Each additional pattern section created by calling this method
|
222
236
|
# will have '_partN' appended to the original pattern name.
|
223
237
|
def split(options = {})
|
238
|
+
split_name = options.delete(:name) || ''
|
224
239
|
pattern_close(options.merge(call_shutdown_callbacks: false))
|
225
|
-
job.inc_split_counter
|
240
|
+
job.inc_split_counter(split_name)
|
226
241
|
pattern_open(options.merge(call_startup_callbacks: false))
|
227
242
|
end
|
228
243
|
|
@@ -5,15 +5,17 @@ module Origen
|
|
5
5
|
# Manages a single pattern sequence, i.e. an instance of PatternSequence is
|
6
6
|
# created for every Pattern.sequence do ... end block
|
7
7
|
class PatternSequence
|
8
|
-
def initialize(name, block)
|
8
|
+
def initialize(name, block, pre_block = nil)
|
9
9
|
@number_of_threads = 1
|
10
10
|
@name = name
|
11
11
|
@running_thread_ids = { main: true }
|
12
12
|
# The contents of the main Pattern.sequence block will be executed as a thread and treated
|
13
13
|
# like any other parallel block
|
14
|
-
thread = PatternThread.new(:main, self, block, true)
|
14
|
+
thread = PatternThread.new(:main, self, block, true, pre_block)
|
15
15
|
threads << thread
|
16
16
|
active_threads << thread
|
17
|
+
PatSeq.send(:current_sequence=, self)
|
18
|
+
@sync_ups = {}
|
17
19
|
end
|
18
20
|
|
19
21
|
# Execute the given pattern
|
@@ -45,7 +47,7 @@ module Origen
|
|
45
47
|
end
|
46
48
|
alias_method :in_parallel, :thread
|
47
49
|
|
48
|
-
def
|
50
|
+
def wait_for_threads_to_complete(*ids)
|
49
51
|
completed = false
|
50
52
|
blocked = false
|
51
53
|
ids = ids.map(&:to_sym)
|
@@ -71,10 +73,48 @@ module Origen
|
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|
74
|
-
alias_method :wait_for_thread, :
|
76
|
+
alias_method :wait_for_thread, :wait_for_threads_to_complete
|
77
|
+
alias_method :wait_for_threads, :wait_for_threads_to_complete
|
78
|
+
alias_method :wait_for_thread_to_complete, :wait_for_threads_to_complete
|
75
79
|
|
76
80
|
private
|
77
81
|
|
82
|
+
def sync_up(location, *ids)
|
83
|
+
options = ids.pop if ids.last.is_a?(Hash)
|
84
|
+
options ||= {}
|
85
|
+
ids = ids.map(&:to_sym)
|
86
|
+
if ids.empty? || ids.include?(:all)
|
87
|
+
ids = @running_thread_ids.keys
|
88
|
+
ids.delete(:main) unless options[:include_main]
|
89
|
+
end
|
90
|
+
# Just continue if this thread is not in the list
|
91
|
+
return unless ids.include?(current_thread.id)
|
92
|
+
# If we have entered the same sync up point after having previously completed it,
|
93
|
+
# then clear it and start again
|
94
|
+
if @sync_ups[location] && @sync_ups[location][:completed]
|
95
|
+
@sync_ups[location] = nil
|
96
|
+
end
|
97
|
+
# Don't need to worry about race conditions here as Origen only allows 1 thread
|
98
|
+
# to be active at a time
|
99
|
+
if @sync_ups[location]
|
100
|
+
@sync_ups[location][:arrived] << current_thread.id
|
101
|
+
else
|
102
|
+
@sync_ups[location] = { required: Set.new, arrived: Set.new, completed: false }
|
103
|
+
ids.each { |id| @sync_ups[location][:required] << id }
|
104
|
+
@sync_ups[location][:arrived] << current_thread.id
|
105
|
+
end
|
106
|
+
if @sync_ups[location][:required] == @sync_ups[location][:arrived]
|
107
|
+
@sync_ups[location][:completed] = true
|
108
|
+
end
|
109
|
+
blocked = false
|
110
|
+
until @sync_ups[location][:completed]
|
111
|
+
current_thread.waiting_for_thread(blocked)
|
112
|
+
blocked = true
|
113
|
+
Origen.log.debug "Waiting for sync_up: #{@sync_ups}"
|
114
|
+
end
|
115
|
+
current_thread.record_active if blocked
|
116
|
+
end
|
117
|
+
|
78
118
|
def thread_running?(id)
|
79
119
|
@running_thread_ids[id]
|
80
120
|
end
|
@@ -86,7 +126,11 @@ module Origen
|
|
86
126
|
def log_execution_profile
|
87
127
|
if threads.size > 1
|
88
128
|
thread_id_size = threads.map { |t| t.id.to_s.size }.max
|
89
|
-
|
129
|
+
begin
|
130
|
+
line_size = IO.console.winsize[1] - 35 - thread_id_size
|
131
|
+
rescue
|
132
|
+
line_size = 150
|
133
|
+
end
|
90
134
|
line_size -= 16 if tester.try(:sim?)
|
91
135
|
cycles_per_tick = (@cycle_count_stop / (line_size * 1.0)).ceil
|
92
136
|
if tester.try(:sim?)
|
@@ -81,8 +81,27 @@ module Origen
|
|
81
81
|
str
|
82
82
|
end
|
83
83
|
|
84
|
+
# Wait for the given threads to complete. If no IDs given it will wait for all currently running
|
85
|
+
# threads (except for the one who called this) to complete.
|
86
|
+
def wait_for_threads_to_complete(*ids)
|
87
|
+
@current_sequence.wait_for_threads_to_complete(*ids)
|
88
|
+
end
|
89
|
+
alias_method :wait_for_thread, :wait_for_threads_to_complete
|
90
|
+
alias_method :wait_for_threads, :wait_for_threads_to_complete
|
91
|
+
alias_method :wait_for_thread_to_complete, :wait_for_threads_to_complete
|
92
|
+
|
93
|
+
def sync_up(*ids)
|
94
|
+
if @current_sequence
|
95
|
+
@current_sequence.send(:sync_up, caller[0], *ids)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
84
99
|
private
|
85
100
|
|
101
|
+
def current_sequence=(seq)
|
102
|
+
@current_sequence = seq
|
103
|
+
end
|
104
|
+
|
86
105
|
def active=(val)
|
87
106
|
@active = val
|
88
107
|
end
|
@@ -14,7 +14,7 @@ module Origen
|
|
14
14
|
# A record of when the thread is active to construct the execution profile
|
15
15
|
attr_reader :events
|
16
16
|
|
17
|
-
def initialize(id, sequence, block, primary = false)
|
17
|
+
def initialize(id, sequence, block, primary = false, pre_block = nil)
|
18
18
|
if primary
|
19
19
|
@cycle_count_start = 0
|
20
20
|
else
|
@@ -24,6 +24,7 @@ module Origen
|
|
24
24
|
@id = id.to_sym
|
25
25
|
@sequence = sequence
|
26
26
|
@block = block
|
27
|
+
@pre_block = pre_block
|
27
28
|
@primary = primary
|
28
29
|
@running = Concurrent::Event.new
|
29
30
|
@waiting = Concurrent::Event.new
|
@@ -46,6 +47,7 @@ module Origen
|
|
46
47
|
@thread = Thread.new do
|
47
48
|
PatSeq.send(:thread=, self)
|
48
49
|
wait
|
50
|
+
@pre_block.call if @pre_block
|
49
51
|
@block.call(sequence)
|
50
52
|
sequence.send(:thread_completed, self)
|
51
53
|
record_cycle_count_stop
|
data/lib/origen/log.rb
CHANGED
@@ -274,6 +274,7 @@ module Origen
|
|
274
274
|
else
|
275
275
|
msg = format_msg(method.to_s.upcase, msg)
|
276
276
|
end
|
277
|
+
console.info msg if options[:verbose]
|
277
278
|
@custom_logs[method.to_sym].info(msg)
|
278
279
|
end
|
279
280
|
|
@@ -364,8 +365,10 @@ module Origen
|
|
364
365
|
end
|
365
366
|
end
|
366
367
|
|
367
|
-
def relog(msg)
|
368
|
-
if
|
368
|
+
def relog(msg, options = {})
|
369
|
+
if options[:log_file]
|
370
|
+
send options[:log_file], msg.sub(/.*\|\|\s*/, ''), options
|
371
|
+
elsif msg =~ /^\[(\w+)\] .*/
|
369
372
|
method = Regexp.last_match(1).downcase
|
370
373
|
if respond_to?(method)
|
371
374
|
send method, msg.sub(/.*\|\|\s*/, '')
|
@@ -27,6 +27,7 @@ module Origen
|
|
27
27
|
# @param [Hash] options Options to customize the run instance
|
28
28
|
# @option options [Array] :target String Array of target names on which to run regression
|
29
29
|
# @option options [Boolean] :build_reference (true) Build reference workspace automatically
|
30
|
+
# @option options [Symbol] :build_method (:init) whether to use a git init or git clone method to build the workspace
|
30
31
|
# @option options [Boolean] :send_email (false) Send results email when regression complete
|
31
32
|
# @option options [Boolean] :email_all_developers (false) If sending email, whether to email all developers or just user
|
32
33
|
# @option options [Boolean] :report_results (false) Whether to report results inline to console
|
@@ -35,6 +36,7 @@ module Origen
|
|
35
36
|
def run(options = {})
|
36
37
|
options = {
|
37
38
|
build_reference: true,
|
39
|
+
build_method: :init,
|
38
40
|
send_email: false,
|
39
41
|
email_all_developers: false,
|
40
42
|
report_results: false,
|
@@ -46,7 +48,7 @@ module Origen
|
|
46
48
|
Origen.lsf.clear_all
|
47
49
|
yield options
|
48
50
|
wait_for_completion(options) if options[:uses_lsf]
|
49
|
-
save_and_delete_output
|
51
|
+
save_and_delete_output(options)
|
50
52
|
else
|
51
53
|
if options[:build_reference]
|
52
54
|
@reference_tag = version_to_tag(options[:version] || get_version(options))
|
@@ -58,7 +60,8 @@ module Origen
|
|
58
60
|
disable_origen_version_check do
|
59
61
|
Dir.chdir reference_origen_root do
|
60
62
|
Bundler.with_clean_env do
|
61
|
-
|
63
|
+
# Origen 0.40.0 started using origen-owned binstubs
|
64
|
+
system 'rm -rf lbin' if Gem::Version.new(Origen.version) < Gem::Version.new('0.40.0')
|
62
65
|
# If regression is run using a service account, we need to setup the path/bundler manually
|
63
66
|
# The regression manager needs to be passed a --service_account option when initiated.
|
64
67
|
if options[:service_account]
|
@@ -125,7 +128,7 @@ module Origen
|
|
125
128
|
end
|
126
129
|
|
127
130
|
def summarize_results(options = {})
|
128
|
-
Origen.lsf.build_log
|
131
|
+
Origen.lsf.build_log(options)
|
129
132
|
stats = Origen.app.stats
|
130
133
|
if options[:report_results]
|
131
134
|
puts "Regression results: \n"
|
@@ -144,12 +147,16 @@ module Origen
|
|
144
147
|
|
145
148
|
# Saves all generated output (to the reference dir) and then
|
146
149
|
# deletes the output directory to save space
|
147
|
-
def save_and_delete_output
|
148
|
-
Origen.lsf.build_log
|
150
|
+
def save_and_delete_output(options = {})
|
151
|
+
Origen.lsf.build_log(options)
|
149
152
|
Origen.log.flush
|
150
153
|
Dir.chdir reference_origen_root do
|
151
154
|
Bundler.with_clean_env do
|
152
|
-
|
155
|
+
if options[:log_file]
|
156
|
+
system "bundle exec origen save all -f log/#{options[:log_file]}.txt"
|
157
|
+
else
|
158
|
+
system 'bundle exec origen save all'
|
159
|
+
end
|
153
160
|
end
|
154
161
|
end
|
155
162
|
FileUtils.rm_rf "#{reference_origen_root}/output"
|
@@ -214,7 +221,7 @@ module Origen
|
|
214
221
|
# Build the new reference workspace now.
|
215
222
|
unless File.exist?(@reference_workspace)
|
216
223
|
highlight { Origen.log.info 'Building reference workspace...' }
|
217
|
-
ws.build(@reference_workspace)
|
224
|
+
ws.build(@reference_workspace, options)
|
218
225
|
end
|
219
226
|
ws.set_reference_workspace(@reference_workspace)
|
220
227
|
else
|
@@ -229,7 +236,7 @@ module Origen
|
|
229
236
|
end
|
230
237
|
unless File.exist?(@reference_workspace)
|
231
238
|
highlight { Origen.log.info 'Building reference workspace...' }
|
232
|
-
ws.build(@reference_workspace)
|
239
|
+
ws.build(@reference_workspace, options)
|
233
240
|
end
|
234
241
|
ws.set_reference_workspace(@reference_workspace)
|
235
242
|
end
|
data/lib/origen/sub_blocks.rb
CHANGED
@@ -232,6 +232,22 @@ module Origen
|
|
232
232
|
end
|
233
233
|
alias_method :children, :sub_blocks
|
234
234
|
|
235
|
+
# Returns a hash containing all sub block groups thus far added
|
236
|
+
# if no arguments given.
|
237
|
+
# If given a code block, will serve as alias to sub_block_group method.
|
238
|
+
# Does not handle arguments, no need at this time.
|
239
|
+
def sub_block_groups(*args, &block)
|
240
|
+
if block_given?
|
241
|
+
sub_block_group(*args, &block)
|
242
|
+
else
|
243
|
+
if args.empty?
|
244
|
+
@sub_block_groups ||= {}.with_indifferent_access
|
245
|
+
else
|
246
|
+
fail 'sub_block_groups not meant to take arguments!'
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
235
251
|
# Delete all sub_blocks by emptying the Hash
|
236
252
|
def delete_sub_blocks
|
237
253
|
@sub_blocks = {}
|
@@ -309,7 +325,7 @@ module Origen
|
|
309
325
|
Origen.log.warning "The sub_block defined at #{Pathname.new(callers[0]).relative_path_from(Pathname.pwd)}:#{callers[1]} is overriding an existing method called #{name}"
|
310
326
|
end
|
311
327
|
define_singleton_method name do
|
312
|
-
|
328
|
+
sub_blocks[name]
|
313
329
|
end
|
314
330
|
if sub_blocks[name] && sub_blocks[name].is_a?(Placeholder)
|
315
331
|
sub_blocks[name].add_attributes(options)
|
@@ -362,21 +378,24 @@ module Origen
|
|
362
378
|
callers = Origen.split_caller_line caller[0]
|
363
379
|
Origen.log.warning "The sub_block_group defined at #{Pathname.new(callers[0]).relative_path_from(Pathname.pwd)}:#{callers[1]} is overriding an existing method called #{id}"
|
364
380
|
end
|
381
|
+
# Define a singleton method which will be called every time the sub_block_group is referenced
|
382
|
+
# This is not called here but later when referenced
|
365
383
|
define_singleton_method "#{id}" do
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
end
|
374
|
-
b # return array inside new singleton method
|
384
|
+
sub_block_groups[id]
|
385
|
+
end
|
386
|
+
# Instantiate group
|
387
|
+
if options[:class_name]
|
388
|
+
b = Object.const_get(options[:class_name]).new
|
389
|
+
else
|
390
|
+
b = [] # Will use Array if no class defined
|
375
391
|
end
|
392
|
+
# Add sub_blocks to group
|
393
|
+
my_group.each do |group_id|
|
394
|
+
b << send(group_id)
|
395
|
+
end
|
396
|
+
sub_block_groups[id] = b
|
376
397
|
@current_group = nil # close group
|
377
398
|
end
|
378
|
-
alias_method :sub_block_groups, :sub_block_group
|
379
|
-
alias_method :sub_blocks_groups, :sub_block_group
|
380
399
|
alias_method :sub_blocks_group, :sub_block_group
|
381
400
|
|
382
401
|
def namespace
|
@@ -385,10 +404,6 @@ module Origen
|
|
385
404
|
|
386
405
|
private
|
387
406
|
|
388
|
-
def get_sub_block(name)
|
389
|
-
sub_blocks[name]
|
390
|
-
end
|
391
|
-
|
392
407
|
def instantiate_sub_block(name, klass, options)
|
393
408
|
return sub_blocks[name] unless sub_blocks[name].is_a?(Placeholder)
|
394
409
|
sub_blocks[name] = klass.new(options.merge(parent: self, name: name))
|
@@ -38,7 +38,11 @@ END_OF_MESSAGE
|
|
38
38
|
|
39
39
|
begin
|
40
40
|
Origen.log.debug('Origen::Utility::Mailer Setup:')
|
41
|
-
|
41
|
+
# Must not save a user's password to the Origen log file! So build a shadow copy of the
|
42
|
+
# options hash and display that content in the log file with the auth_password removed.
|
43
|
+
options_reduced = options
|
44
|
+
options_reduced.delete(:auth_password)
|
45
|
+
options_reduced.each { |k, v| Origen.log.debug(" #{k}: #{v}") }
|
42
46
|
|
43
47
|
# Net::SMTP.start(options[:server], options[:port]) do |smtp|
|
44
48
|
# smtp.send_message msg, options[:from], addr
|
@@ -8,16 +8,16 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.8.11".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Stephen McGinty".freeze]
|
11
|
-
s.date = "2020-
|
11
|
+
s.date = "2020-05-26"
|
12
12
|
s.email = ["stephen.f.mcginty@gmail.com".freeze]
|
13
13
|
s.files = ["bin/boot.rb".freeze, "config/application.rb".freeze, "config/boot.rb".freeze, "config/commands.rb".freeze, "config/shared_commands.rb".freeze, "config/version.rb".freeze, "lib/origen_app_generators.rb".freeze, "lib/origen_app_generators/application.rb".freeze, "lib/origen_app_generators/base.rb".freeze, "lib/origen_app_generators/empty_application.rb".freeze, "lib/origen_app_generators/empty_plugin.rb".freeze, "lib/origen_app_generators/new.rb".freeze, "lib/origen_app_generators/new_app_tests.rb".freeze, "lib/origen_app_generators/origen_infrastructure/app_generator_plugin.rb".freeze, "lib/origen_app_generators/plugin.rb".freeze, "lib/origen_app_generators/test_engineering/common.rb".freeze, "lib/origen_app_generators/test_engineering/stand_alone_application.rb".freeze, "lib/origen_app_generators/test_engineering/test_block.rb".freeze, "templates/app_generators".freeze, "templates/app_generators/application".freeze, "templates/app_generators/application/.gitignore".freeze, "templates/app_generators/application/.irbrc".freeze, "templates/app_generators/application/.rspec".freeze, "templates/app_generators/application/.travis.yml".freeze, "templates/app_generators/application/Gemfile".freeze, "templates/app_generators/application/Rakefile".freeze, "templates/app_generators/application/app".freeze, "templates/app_generators/application/app/blocks".freeze, "templates/app_generators/application/app/blocks/top_level.rb".freeze, "templates/app_generators/application/app/lib".freeze, "templates/app_generators/application/app/lib/module.rb".freeze, "templates/app_generators/application/app/templates".freeze, "templates/app_generators/application/app/templates/web".freeze, "templates/app_generators/application/app/templates/web/index.md.erb".freeze, "templates/app_generators/application/app/templates/web/layouts".freeze, "templates/app_generators/application/app/templates/web/layouts/_basic.html.erb".freeze, "templates/app_generators/application/app/templates/web/partials".freeze, "templates/app_generators/application/app/templates/web/partials/_navbar.html.erb".freeze, "templates/app_generators/application/app/templates/web/release_notes.md.erb".freeze, "templates/app_generators/application/config".freeze, "templates/app_generators/application/config/application.rb".freeze, "templates/app_generators/application/config/boot.rb".freeze, "templates/app_generators/application/config/commands.rb".freeze, "templates/app_generators/application/config/maillist_dev.txt".freeze, "templates/app_generators/application/config/maillist_prod.txt".freeze, "templates/app_generators/application/config/version.rb".freeze, "templates/app_generators/application/doc".freeze, "templates/app_generators/application/doc/history".freeze, "templates/app_generators/application/dot_keep".freeze, "templates/app_generators/application/origen_core_session".freeze, "templates/app_generators/application/spec".freeze, "templates/app_generators/application/spec/spec_helper.rb".freeze, "templates/app_generators/application/target".freeze, "templates/app_generators/application/target/debug.rb".freeze, "templates/app_generators/application/target/default.rb".freeze, "templates/app_generators/application/target/production.rb".freeze, "templates/app_generators/new".freeze, "templates/app_generators/new/generator.rb".freeze, "templates/app_generators/new/info.md.erb".freeze, "templates/app_generators/origen_infrastructure".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app/lib".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app/lib/application.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app/lib/base.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app/lib/module.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/app/lib/plugin.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config/load_generators.rb".freeze, "templates/app_generators/plugin".freeze, "templates/app_generators/plugin/Gemfile".freeze, "templates/app_generators/plugin/Rakefile".freeze, "templates/app_generators/plugin/app".freeze, "templates/app_generators/plugin/app/templates".freeze, "templates/app_generators/plugin/app/templates/web".freeze, "templates/app_generators/plugin/app/templates/web/index.md.erb".freeze, "templates/app_generators/plugin/app/templates/web/partials".freeze, "templates/app_generators/plugin/app/templates/web/partials/_navbar_external.html.erb".freeze, "templates/app_generators/plugin/app/templates/web/partials/_navbar_internal.html.erb".freeze, "templates/app_generators/plugin/config".freeze, "templates/app_generators/plugin/config/boot.rb".freeze, "templates/app_generators/plugin/gemspec.rb".freeze, "templates/app_generators/test_engineering".freeze, "templates/app_generators/test_engineering/environment".freeze, "templates/app_generators/test_engineering/environment/j750.rb".freeze, "templates/app_generators/test_engineering/environment/uflex.rb".freeze, "templates/app_generators/test_engineering/environment/v93k.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application".freeze, "templates/app_generators/test_engineering/stand_alone_application/.keep".freeze, "templates/app_generators/test_engineering/test_block".freeze, "templates/app_generators/test_engineering/test_block/.keep".freeze]
|
14
14
|
s.homepage = "http://origen-sdk.org/origen_app_generators".freeze
|
15
15
|
s.licenses = ["MIT".freeze]
|
16
16
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze)
|
17
|
-
s.rubygems_version = "
|
17
|
+
s.rubygems_version = "3.0.3".freeze
|
18
18
|
s.summary = "Origen application generators".freeze
|
19
19
|
|
20
|
-
s.installed_by_version = "
|
20
|
+
s.installed_by_version = "3.0.3" if s.respond_to? :installed_by_version
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
s.specification_version = 4
|
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.57.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: 2020-
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -749,8 +749,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
749
749
|
- !ruby/object:Gem::Version
|
750
750
|
version: 1.8.11
|
751
751
|
requirements: []
|
752
|
-
|
753
|
-
rubygems_version: 2.6.12
|
752
|
+
rubygems_version: 3.0.3
|
754
753
|
signing_key:
|
755
754
|
specification_version: 4
|
756
755
|
summary: The Semiconductor Developer's Kit
|