origen 0.28.2 → 0.29.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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/origen +14 -2
  3. data/config/version.rb +2 -2
  4. data/lib/origen.rb +72 -45
  5. data/lib/origen/application.rb +29 -19
  6. data/lib/origen/application/deployer.rb +3 -1
  7. data/lib/origen/application/runner.rb +10 -8
  8. data/lib/origen/chip_mode.rb +1 -1
  9. data/lib/origen/commands.rb +24 -12
  10. data/lib/origen/commands/version.rb +1 -1
  11. data/lib/origen/commands_global.rb +32 -8
  12. data/lib/origen/core_ext.rb +1 -2
  13. data/lib/origen/core_ext/enumerable.rb +2 -2
  14. data/lib/origen/core_ext/integer.rb +85 -0
  15. data/lib/origen/core_ext/numeric.rb +28 -4
  16. data/lib/origen/global_app.rb +9 -0
  17. data/lib/origen/log.rb +1 -1
  18. data/lib/origen/model_initializer.rb +6 -1
  19. data/lib/origen/netlist/list.rb +2 -2
  20. data/lib/origen/org_file.rb +125 -0
  21. data/lib/origen/org_file/interceptable.rb +44 -0
  22. data/lib/origen/org_file/interceptor.rb +100 -0
  23. data/lib/origen/parameters/set.rb +1 -1
  24. data/lib/origen/pins.rb +4 -0
  25. data/lib/origen/pins/function_proxy.rb +8 -0
  26. data/lib/origen/pins/pin.rb +90 -38
  27. data/lib/origen/pins/pin_collection.rb +61 -21
  28. data/lib/origen/ports/port.rb +1 -1
  29. data/lib/origen/registers.rb +1 -1
  30. data/lib/origen/registers/reg.rb +1 -1
  31. data/lib/origen/remote_manager.rb +25 -15
  32. data/lib/origen/site_config.rb +140 -13
  33. data/lib/origen/specs/checkers.rb +2 -2
  34. data/lib/origen/sub_blocks.rb +6 -1
  35. data/lib/origen/value.rb +119 -0
  36. data/lib/origen/value/bin_str_val.rb +72 -0
  37. data/lib/origen/value/hex_str_val.rb +100 -0
  38. data/origen_site_config.yml +15 -8
  39. metadata +12 -6
  40. data/lib/origen/core_ext/bignum.rb +0 -38
  41. data/lib/origen/core_ext/fixnum.rb +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b668d7712bef8be358291fe9bec47914b1738b43
4
- data.tar.gz: f24c2df62d2f22ec88a6e9d417205129e5923ce4
3
+ metadata.gz: 8d5351ecf83d751f998bd4d0a533dd7bb741a08a
4
+ data.tar.gz: ea50032d8fbcf618062720ee47e40b8d0416cf0f
5
5
  SHA512:
6
- metadata.gz: e0eafb6914409f6a5ebdf07c03e769caf9457858570050d89ff4af0e4cd0672d5153802d31d448eb00c18b89dce97ef66908ef34972fec196f32c5f94dd4ba6a
7
- data.tar.gz: e4616d302bd38753d3abd11feabc11a5e21cdc8bfe32f42415ec859eb094df3c93a5ff7412f42acdd11010e80f179bda5edec7fc145fa587fd1c52e5f3fc0c50
6
+ metadata.gz: 117326d05b4e9c7a7adc06d6ca8c16025eb31bae81db228922c965358e5898e6cd039f9fa8d6d8e38f61c63450850c60a1e408e87de86e3235847700d42ed761
7
+ data.tar.gz: 66b8a64e922594ada9b81c7369cbe8a468033aa6f4ac98452ed05716a346686229ff49b9ef55896378825c64a6614d834b7d2b7b1274c0cdc5e67b8fac500e45
data/bin/origen CHANGED
@@ -43,6 +43,7 @@ else
43
43
  end
44
44
  end
45
45
 
46
+ # If running inside an application workspace
46
47
  if origen_root
47
48
  # Force everyone to have a consistent way of installing gems with bundler
48
49
  ENV['BUNDLE_GEMFILE'] = File.join(origen_root, 'Gemfile')
@@ -58,6 +59,8 @@ if origen_root
58
59
  end
59
60
 
60
61
  boot_app = true
62
+
63
+ # If running outside an application and a user or central tool Origen bundle is to be used
61
64
  elsif Origen.site_config.gem_manage_bundler && (Origen.site_config.user_install_enable || Origen.site_config.tool_repo_install_dir)
62
65
  # Force everyone to have a consistent way of installing gems with bundler.
63
66
  # In this case, we aren't running from an Origen application, so build everything at Origen.home instead
@@ -91,8 +94,17 @@ elsif Origen.site_config.gem_manage_bundler && (Origen.site_config.user_install_
91
94
  ENV['BUNDLE_GEMFILE'] = gemfile
92
95
  ENV['BUNDLE_PATH'] = File.expand_path(Origen.site_config.gem_install_dir)
93
96
  ENV['BUNDLE_BIN'] = File.join(origen_root, 'lbin')
94
-
95
- boot_app = false
97
+
98
+ origen_exec = File.join(ENV['BUNDLE_BIN'], 'origen')
99
+
100
+ # If the user/tool bundle already exists but we have not been invoked through that, abort this thread
101
+ # and re-launch under the required bundler environment
102
+ if File.exist?(origen_exec) && !ENV['BUNDLE_BIN_PATH'] && File.exist?(ENV['BUNDLE_PATH'])
103
+ exec Gem.ruby, origen_exec, *ARGV
104
+ exit 0
105
+ else
106
+ boot_app = false
107
+ end
96
108
  end
97
109
 
98
110
  if origen_root && File.exist?(ENV['BUNDLE_GEMFILE']) && Origen.site_config.gem_manage_bundler && (boot_app || Origen.site_config.user_install_enable || Origen.site_config.tool_repo_install_dir)
@@ -1,7 +1,7 @@
1
1
  module Origen
2
2
  MAJOR = 0
3
- MINOR = 28
4
- BUGFIX = 2
3
+ MINOR = 29
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -65,6 +65,8 @@ unless defined? RGen::ORIGENTRANSITION
65
65
  autoload :Tests, 'origen/tests'
66
66
  autoload :PowerDomains, 'origen/power_domains'
67
67
  autoload :Clocks, 'origen/clocks'
68
+ autoload :Value, 'origen/value'
69
+ autoload :OrgFile, 'origen/org_file'
68
70
 
69
71
  attr_reader :switch_user
70
72
 
@@ -79,10 +81,23 @@ unless defined? RGen::ORIGENTRANSITION
79
81
  class GitError < OrigenError; status_code(11); end
80
82
  class DesignSyncError < OrigenError; status_code(12); end
81
83
  class RevisionControlUninitializedError < OrigenError; status_code(13); end
84
+ class SyntaxError < OrigenError; status_code(14); end
82
85
 
83
86
  class << self
84
87
  include Origen::Utility::TimeAndDate
85
88
 
89
+ # Uniformly justifies the given help command line for display in a command line help output
90
+ def clean_help_line(str)
91
+ if str =~ /^\s\s\s\s\s\s\s*(.*)/
92
+ (' ' * 20) + Regexp.last_match(1)
93
+ # http://rubular.com/r/MKmU4xZgO2
94
+ elsif str =~ /^\s*([^\s]+)\s+*(.*)/
95
+ ' ' + Regexp.last_match(1).ljust(19) + Regexp.last_match(2)
96
+ else
97
+ str
98
+ end
99
+ end
100
+
86
101
  def enable_profiling
87
102
  @profiling = true
88
103
  end
@@ -272,17 +287,19 @@ unless defined? RGen::ORIGENTRANSITION
272
287
 
273
288
  # Returns true if Origen is running in an application workspace
274
289
  def in_app_workspace?
275
- path = Pathname.new(Dir.pwd)
276
- until path.root? || File.exist?(File.join(path, APP_CONFIG))
277
- path = path.parent
290
+ @in_app_workspace ||= begin
291
+ path = Pathname.new(Dir.pwd)
292
+ until path.root? || File.exist?(File.join(path, APP_CONFIG))
293
+ path = path.parent
294
+ end
295
+ !path.root?
278
296
  end
279
- !path.root?
280
297
  end
281
298
 
282
299
  # Shortcut method to find if Origen was invoked from within an application or from
283
300
  # the global Origen install. This is just the opposite of in_app_workspace?
284
301
  def running_globally?
285
- !in_app_workspace?
302
+ @running_globally ||= !in_app_workspace?
286
303
  end
287
304
  alias_method :invoked_globally?, :running_globally?
288
305
 
@@ -299,7 +316,10 @@ unless defined? RGen::ORIGENTRANSITION
299
316
  path = path.parent
300
317
  end
301
318
  if path.root?
302
- path = top
319
+ @running_globally = true
320
+ path = Pathname.new($_origen_invocation_pwd || Dir.pwd)
321
+ else
322
+ @in_app_workspace = true
303
323
  end
304
324
  path
305
325
  end
@@ -451,47 +471,54 @@ unless defined? RGen::ORIGENTRANSITION
451
471
  # automatically the first time the application is referenced via Origen.app
452
472
  def load_application(options = {})
453
473
  @application ||= begin
454
- # Make sure the top-level root is always in the load path, it seems that some existing
455
- # plugins do some strange things to require stuff from the top-level app and rely on this
456
- path = File.join(root, 'lib')
457
- $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
458
- # This flag is set so that when a thread starts with no app it remains with no app. This
459
- # was an issue when building a new app with the fetch command and when the thread did a
460
- # chdir to the new app directory (to fetch it) Origen.log would try to load the partial app.
461
- @running_outside_an_app = true unless in_app_workspace?
462
- return nil if @running_outside_an_app
463
- # Load the app's plugins and other gem requirements
464
- if File.exist?(File.join(root, 'Gemfile')) && !@with_boot_environment
465
- # Don't understand the rules here, belt and braces approach for now to make
466
- # sure that all Origen plugins are auto-required (otherwise Origen won't know
467
- # about them to plug them into the application)
468
- Bundler.require
469
- Bundler.require(:development)
470
- Bundler.require(:runtime)
471
- Bundler.require(:default)
472
- end
473
- @plugins_loaded = true
474
- # Now load the app
475
- @loading_top_level = true
476
- require File.join(root, APP_CONFIG)
477
- @application = _applications_lookup[:root][root.to_s]
478
- @loading_top_level = false
479
- if @with_boot_environment
480
- @application.plugins.disable_current
474
+ # If running globally (outside of an app workspace), instantiate a bare bones app to help
475
+ # many of Origen's features that expect an app to be present.
476
+ if running_globally?
477
+ @plugins_loaded = true
478
+ # Now load the app
479
+ @loading_top_level = true
480
+ require 'origen/global_app'
481
+ @application = _applications_lookup[:root][root.to_s]
482
+ @loading_top_level = false
483
+ @application_loaded = true
484
+ @application
481
485
  else
482
- Origen.remote_manager.require!
486
+ # Make sure the top-level root is always in the load path, it seems that some existing
487
+ # plugins do some strange things to require stuff from the top-level app and rely on this
488
+ path = File.join(root, 'lib')
489
+ $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
490
+ if File.exist?(File.join(root, 'Gemfile')) && !@with_boot_environment
491
+ # Don't understand the rules here, belt and braces approach for now to make
492
+ # sure that all Origen plugins are auto-required (otherwise Origen won't know
493
+ # about them to plug them into the application)
494
+ Bundler.require
495
+ Bundler.require(:development)
496
+ Bundler.require(:runtime)
497
+ Bundler.require(:default)
498
+ end
499
+ @plugins_loaded = true
500
+ # Now load the app
501
+ @loading_top_level = true
502
+ require File.join(root, APP_CONFIG)
503
+ @application = _applications_lookup[:root][root.to_s]
504
+ @loading_top_level = false
505
+ if @with_boot_environment
506
+ @application.plugins.disable_current
507
+ else
508
+ Origen.remote_manager.require!
509
+ end
510
+ boot = File.join(root, 'config', 'boot.rb')
511
+ require boot if File.exist?(boot)
512
+ env = File.join(root, 'config', 'environment.rb')
513
+ require env if File.exist?(env)
514
+ dev = File.join(root, 'config', 'development.rb')
515
+ require dev if File.exist?(dev)
516
+ validate_origen_dev_configuration!
517
+ ([@application] + Origen.app.plugins).each(&:on_loaded)
518
+ @application_loaded = true
519
+ Array(@after_app_loaded_blocks).each { |b| b.call(@application) }
520
+ @application
483
521
  end
484
- boot = File.join(root, 'config', 'boot.rb')
485
- require boot if File.exist?(boot)
486
- env = File.join(root, 'config', 'environment.rb')
487
- require env if File.exist?(env)
488
- dev = File.join(root, 'config', 'development.rb')
489
- require dev if File.exist?(dev)
490
- validate_origen_dev_configuration!
491
- ([@application] + Origen.app.plugins).each(&:on_loaded)
492
- @application_loaded = true
493
- Array(@after_app_loaded_blocks).each { |b| b.call(@application) }
494
- @application
495
522
  end
496
523
  end
497
524
 
@@ -31,20 +31,26 @@ module Origen
31
31
  # Somehow using the old import system and version file format we can get in here when
32
32
  # loading the version, this can be removed in future when the imports API is retired
33
33
  unless caller[0] =~ /version.rb.*/
34
- root = Pathname.new(caller[0].sub(/(\\|\/)?config(\\|\/)application.rb.*/, '')).realpath
35
- app = base.instance
36
- app.root = root.to_s
37
- if Origen.plugins_loaded? && !Origen.loading_top_level?
38
- # This situation of a plugin being loaded after the top-level app could occur if the app
39
- # doesn't require the plugin until later, in that case there is nothing the plugin owner
40
- # can do and we just need to accept that this can happen.
41
- # Origen.log.warning "The #{app.name} plugin is using a non-standard loading mechanism, upgrade to a newer version of it to get rid of this warning (please report a bug to its owner if this warning persists)"
34
+ if base.to_s == 'OrigenGlobalApplication'
35
+ app = base.instance
36
+ app.root = Origen.root
42
37
  Origen.register_application(app)
43
- # Origen.app.plugins << app
44
38
  else
45
- Origen.register_application(app)
39
+ root = Pathname.new(caller[0].sub(/(\\|\/)?config(\\|\/)application.rb.*/, '')).realpath
40
+ app = base.instance
41
+ app.root = root.to_s
42
+ if Origen.plugins_loaded? && !Origen.loading_top_level?
43
+ # This situation of a plugin being loaded after the top-level app could occur if the app
44
+ # doesn't require the plugin until later, in that case there is nothing the plugin owner
45
+ # can do and we just need to accept that this can happen.
46
+ # Origen.log.warning "The #{app.name} plugin is using a non-standard loading mechanism, upgrade to a newer version of it to get rid of this warning (please report a bug to its owner if this warning persists)"
47
+ Origen.register_application(app)
48
+ # Origen.app.plugins << app
49
+ else
50
+ Origen.register_application(app)
51
+ end
52
+ app.add_lib_to_load_path!
46
53
  end
47
- app.add_lib_to_load_path!
48
54
  end
49
55
  end
50
56
 
@@ -372,15 +378,19 @@ END
372
378
  def version(options = {})
373
379
  @version = nil if options[:refresh]
374
380
  return @version if @version
375
- load File.join(root, 'config', 'version.rb')
376
- if defined? eval(namespace)::VERSION
377
- @version = Origen::VersionString.new(eval(namespace)::VERSION)
381
+ if Origen.running_globally?
382
+ @version = Origen.version
378
383
  else
379
- # The eval of the class is required here as somehow when plugins are imported under the old
380
- # imports system and with the old version file format we can end up with two copies of the
381
- # same class constant. Don't understand it, but it is fixed with the move to gems and the
382
- # namespace-based version file format.
383
- @version = Origen::VersionString.new(eval(self.class.to_s)::VERSION)
384
+ load File.join(root, 'config', 'version.rb')
385
+ if defined? eval(namespace)::VERSION
386
+ @version = Origen::VersionString.new(eval(namespace)::VERSION)
387
+ else
388
+ # The eval of the class is required here as somehow when plugins are imported under the old
389
+ # imports system and with the old version file format we can end up with two copies of the
390
+ # same class constant. Don't understand it, but it is fixed with the move to gems and the
391
+ # namespace-based version file format.
392
+ @version = Origen::VersionString.new(eval(self.class.to_s)::VERSION)
393
+ end
384
394
  end
385
395
  @version
386
396
  end
@@ -61,7 +61,9 @@ module Origen
61
61
  # which is will build and checkout as required
62
62
  def git_repo
63
63
  @git_repo ||= begin
64
- local = Pathname.new("#{Origen.app.workspace_manager.imports_directory}/git/#{Origen.config.web_directory.gsub('/', '-').symbolize}")
64
+ local_path = "#{Origen.config.web_directory.gsub('/', '-').symbolize}"
65
+ local_path.gsub!(':', '-') if Origen.os.windows?
66
+ local = Pathname.new("#{Origen.app.workspace_manager.imports_directory}/git/#{local_path}")
65
67
  if git_sub_dir
66
68
  remote = Origen.config.web_directory.sub("\/#{git_sub_dir}", '')
67
69
  else
@@ -228,14 +228,16 @@ module Origen
228
228
  # submitted the job.
229
229
  Origen.file_handler.set_output_directory(options.merge(create: Origen.running_locally?))
230
230
  Origen.file_handler.set_reference_directory(options.merge(create: Origen.running_locally?))
231
- tmp = "#{Origen.root}/tmp"
232
- FileUtils.mkdir(tmp) unless File.exist?(tmp)
233
- if Origen.running_locally?
234
- mkdir Origen::Log.log_file_directory
235
- mkdir "#{Origen.root}/.lsf"
236
- end
237
- if options[:lsf]
238
- mkdir Origen.app.lsf_manager.log_file_directory
231
+ unless Origen.running_globally?
232
+ tmp = "#{Origen.root}/tmp"
233
+ FileUtils.mkdir(tmp) unless File.exist?(tmp)
234
+ if Origen.running_locally?
235
+ mkdir Origen::Log.log_file_directory
236
+ mkdir "#{Origen.root}/.lsf"
237
+ end
238
+ if options[:lsf]
239
+ mkdir Origen.app.lsf_manager.log_file_directory
240
+ end
239
241
  end
240
242
  end
241
243
 
@@ -46,7 +46,7 @@ module Origen
46
46
  # The data rate unit was validated on init so it is good to go
47
47
  # in theory but should still check if it returns a numeric
48
48
  value = @data_rate.send(@data_rate_unit.to_sym)
49
- if [Fixnum, Bignum, Float, Integer, Numeric].include? value.class
49
+ if value.is_a?(Numeric)
50
50
  return value
51
51
  else
52
52
  Origen.log.error "@data_rate '#{@data_rate}' conversion using @data_rate_unit '#{@data_rate_unit}' did not product a Numeric, exiting..."
@@ -217,7 +217,7 @@ if shared_commands && shared_commands.size != 0
217
217
  end
218
218
 
219
219
  # Get a list of registered plugins and get the global launcher
220
- @global_launcher = Origen._applications_lookup[:name].map do |plugin_name, plugin|
220
+ @global_launcher = Origen._applications_lookup[:name].dup.map do |plugin_name, plugin|
221
221
  shared = plugin.config.shared || {}
222
222
  if shared[:global_launcher]
223
223
  file = "#{plugin.root}/#{shared[:global_launcher]}"
@@ -253,6 +253,8 @@ else
253
253
  Usage: origen COMMAND [ARGS]
254
254
 
255
255
  The core origen commands are:
256
+ EOT
257
+ cmds = <<-EOT
256
258
  environment Display or set the environment (short-cut alias: "e")
257
259
  target Display or set the target (short-cut alias: "t")
258
260
  mode Display or set the mode (short-cut alias: "m")
@@ -269,32 +271,42 @@ The core origen commands are:
269
271
  web Web page tools, see -h for details
270
272
  time Tools for test time analysis and forecasting
271
273
  lint Lint and style check (and correct) your application code
272
-
273
274
  EOT
275
+ cmds.split(/\n/).each do |line|
276
+ puts Origen.clean_help_line(line)
277
+ end
278
+ puts
274
279
  if @application_commands && !@application_commands.empty?
275
- puts <<-EOT
276
- In addition to these the application has added:
277
- #{@application_commands}
278
- EOT
280
+ puts 'In addition to these the application has added:'
281
+ @application_commands.split(/\n/).each do |cmds|
282
+ cmds.split(/\n/).each do |line|
283
+ puts Origen.clean_help_line(line)
284
+ end
285
+ end
286
+ puts
279
287
  end
280
288
 
281
289
  if @plugin_commands && !@plugin_commands.empty?
282
290
  puts 'The following commands are provided by plugins:'
283
- @plugin_commands.each do |str|
284
- puts str
291
+ @plugin_commands.each do |cmds|
292
+ cmds.split(/\n/).each do |line|
293
+ puts Origen.clean_help_line(line)
294
+ end
285
295
  end
296
+ puts
286
297
  end
287
298
 
288
299
  if @global_launcher && !@global_launcher.empty?
289
- puts ''
290
300
  puts 'The following global commands are provided by plugins:'
291
- @global_commands.each do |str|
292
- puts str
301
+ @global_commands.each do |cmds|
302
+ cmds.split(/\n/).each do |line|
303
+ puts Origen.clean_help_line(line)
304
+ end
293
305
  end
306
+ puts
294
307
  end
295
308
 
296
309
  puts <<-EOT
297
-
298
310
  All commands can be run with -d (or --debugger) to enable the debugger.
299
311
  All commands can be run with --coverage to enable code coverage.
300
312
  Many commands can be run with -h (or --help) for more information.
@@ -1,2 +1,2 @@
1
- puts "Application: #{Origen.app.version}" if Origen.app_loaded?
1
+ puts "Application: #{Origen.app.version}" if Origen.app_loaded? && !Origen.running_globally?
2
2
  puts " Origen: #{Origen.version}"
@@ -23,10 +23,29 @@ if ENV['BUNDLE_GEMFILE']
23
23
  Bundler.require(:development)
24
24
  Bundler.require(:runtime)
25
25
  Bundler.require(:default)
26
+ else
27
+ # If we're not running from a Bundler build, which we aren't here,
28
+ # get a list of installed system gems. Go through this list finding and get any that has a dependency
29
+ # on Origen. If so, assume that gem is a plugin.
30
+ # For all plugins, require it to register as a plugin.
31
+ # The global handler below will take it from there.
32
+ Gem::Specification.each do |gem|
33
+ gem.dependencies.each do |d|
34
+ if d.name == 'origen'
35
+ require gem.name
36
+ end
37
+ end
38
+ end
26
39
  end
27
40
 
41
+ # Load the global app and an empty target, this helps to ensure that all of Origen's functionality
42
+ # is available to global commands, since many features implicitly assume the presence of an app
43
+ Origen.app
44
+ Origen.target.temporary = -> {}
45
+ Origen.load_target
46
+
28
47
  # Get a list of registered plugins and get the global launcher
29
- @global_launcher = Origen._applications_lookup[:name].map do |plugin_name, plugin|
48
+ @global_launcher = Origen._applications_lookup[:name].dup.map do |plugin_name, plugin|
30
49
  shared = plugin.config.shared || {}
31
50
  if shared[:global_launcher]
32
51
  file = "#{plugin.root}/#{shared[:global_launcher]}"
@@ -90,25 +109,30 @@ else
90
109
  Usage: origen COMMAND [ARGS]
91
110
 
92
111
  The following commands are available:
112
+ EOT
113
+ cmds = <<-EOT
93
114
  new Create a new Origen application or plugin. "origen new my_app" creates a
94
115
  new origen application workspace in "./my_app"
95
116
  interactive Start an interactive Origen console (short-cut alias: "i"), this is just
96
117
  IRB with the 'origen' lib loaded automatically
97
118
  EOT
98
-
119
+ cmds.split(/\n/).each do |line|
120
+ puts Origen.clean_help_line(line)
121
+ end
122
+ puts
99
123
  if @global_launcher && !@global_launcher.empty?
100
- puts ''
101
124
  puts 'The following global commands are provided by plugins:'
102
- @global_commands.each do |str|
103
- puts str
125
+ @global_commands.each do |cmds|
126
+ cmds.split(/\n/).each do |line|
127
+ puts Origen.clean_help_line(line)
128
+ end
104
129
  end
130
+ puts
105
131
  end
106
132
 
107
133
  puts <<-EOT
108
-
109
134
  Many commands can be run with -h (or --help) for more information.
135
+
110
136
  EOT
111
- # fetch Automatically creates the workspace for the requested plugin and
112
- # populates the latest version of the plugin (short-cut alias: "f")
113
137
  exit 0
114
138
  end