origen_testers 0.14.0 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b2dcc656f1e0eea888097e0ebd1402d29d74f1f
4
- data.tar.gz: 99f3b89c7c42d55fba2a6fab344f01704ef7482e
3
+ metadata.gz: 432b93c069da178e789ff6d40afa25e4ba34eb02
4
+ data.tar.gz: 080a839243c3058dfb450dccbf5c63f06172dd9f
5
5
  SHA512:
6
- metadata.gz: f5e93bc0820e794e54c1e7563e55210f3770751a689dc76f53d32ec9f0d84d6cf9656a0c9a7834a0ccb0efbe3492f24c3f1dd3415b92a71fc74edf352221d6fa
7
- data.tar.gz: 791cc935f5ade96b8eecdba8cc8f3da5fcdf399f55e1744832521beab41147485f3baf8211f63c041c3ee557d8bfa6cfe879db67d9778862fa2bd3402acd5d82
6
+ metadata.gz: 2c5e2ed553068517cb0ceb2ac5caef371083adb5db690922e4ae9826f7ea077116dfe3eda974d263ad7c45f6551942ece6cbc00b043cd8b2928a5f64a7c4b294
7
+ data.tar.gz: 71d64f91fcd9eb494155dbc426de044db5fc1e3b27edd0f7687cc954bc74be50b1a4aef22414ae5e21ab5045439341a7428c576470cb4ae7ce1ba4f70c79d78d
@@ -23,32 +23,24 @@ case @command
23
23
  # require "#{Origen.root(:testers)}/lib/commands/latpc"
24
24
  # Need to see if --compile is included and setup compiler
25
25
  when "generate"
26
- @application_options << ["--compile", "Compile the current pattern or the list"]
27
- @application_options << ["-v", "--vector_comments", "Add the vector and cycle number to the vector comments"]
28
- if ARGV.include?('--compile')
29
- compiler_instance_name = ARGV[ARGV.index('--compile')+1]
30
- if compiler_instance_name.nil?
31
- $compiler = :use_app_default
32
- else
33
- ARGV.delete(compiler_instance_name)
34
- $compiler = compiler_instance_name.to_sym
35
- end
36
- ARGV.delete("--compile")
37
- end
38
- $_testers_enable_vector_comments = ARGV.delete("-v") || ARGV.delete("--vector_comments")
39
- $_testers_no_inline_comments = ARGV.delete("--no_inline_comments")
26
+ @application_options << ['--compile', 'Compile the current pattern or the list', ->(options) { options[:testers_compile_pat] = true }]
27
+ @application_options << ['--compiler NAME', String, 'Override the default application pattern compiler', ->(options, compiler) { options[:testers_compiler_instance_name] = compiler.to_sym }]
28
+ @application_options << ['--no_inline_comments', 'Disable the duplication of comments inline (V93k patterns)', ->(options) { options[:testers_no_inline_comments] = true }]
29
+ @application_options << ['-v', '--vector_comments', 'Add the vector and cycle number to the vector comments', lambda { |options| options[:testers_enable_vector_comments] = true }]
30
+
31
+ $_testers_enable_vector_comments = ARGV.delete("-v") || ARGV.delete("--vector_comments")
32
+ $_testers_no_inline_comments = ARGV.delete("--no_inline_comments")
40
33
 
41
34
  when "testers:build"
42
- require "#{Origen.root!}/lib/commands/build"
35
+ require "#{Origen.root!}/lib/commands/build"
43
36
  exit 0
44
37
 
45
38
  when "testers:run"
46
- require "#{Origen.root!}/lib/commands/run"
39
+ require "#{Origen.root!}/lib/commands/run"
47
40
  exit 0
48
41
 
49
-
50
42
  else
51
- @plugin_commands << " testers:build Build a test program from a collection of sub-programs"
52
- @plugin_commands << " testers:run Run the last test program generated for the current target"
43
+ @plugin_commands << " testers:build Build a test program from a collection of sub-programs"
44
+ @plugin_commands << " testers:run Run the last test program generated for the current target"
53
45
 
54
46
  end
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenTesters
2
2
  MAJOR = 0
3
- MINOR = 14
3
+ MINOR = 15
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
 
@@ -4,6 +4,7 @@ require_relative '../config/application.rb'
4
4
  require 'active_support/concern'
5
5
  require 'require_all'
6
6
  require 'atp'
7
+ require 'pathname'
7
8
  require 'origen_testers/origen_ext/generator/flow'
8
9
  require 'origen_testers/origen_ext/generator/resources'
9
10
  require 'origen_testers/origen_ext/application/runner'
@@ -42,6 +43,7 @@ require 'origen_testers/igxl_based_tester'
42
43
  require 'origen_testers/smartest_based_tester'
43
44
  require 'origen_testers/labview_based_tester'
44
45
  require 'origen_testers/pattern_compilers'
46
+ require 'origen_testers/pattern_compilers/runner'
45
47
 
46
48
  require 'origen_testers/callback_handlers'
47
49
  require 'origen_testers/origen_ext/pins/pin'
@@ -4,9 +4,13 @@ module OrigenTesters
4
4
 
5
5
  # Snoop the pattern path that was just created and then compile it
6
6
  # if the compiler was passed on the command line
7
- def pattern_generated(path_to_generated_pattern)
8
- current_compiler = select_compiler
9
- run_compiler(current_compiler, path_to_generated_pattern)
7
+ def pattern_generated(path_to_generated_pattern, job_options = {})
8
+ if job_options[:testers_compile_pat]
9
+ opts = {}
10
+ opts[:compiler_instance] = job_options[:testers_compiler_instance_name]
11
+ opts[:pattern_generated] = true
12
+ OrigenTesters::PatternCompilers::Runner.run_compiler(path_to_generated_pattern, opts)
13
+ end
10
14
  end
11
15
 
12
16
  # Listen for a pattern with .atp or .atp.gz extension. If found then compile the fileand kill the 'origen g' command
@@ -29,28 +33,6 @@ module OrigenTesters
29
33
  end
30
34
  true
31
35
  end
32
-
33
- private
34
-
35
- def select_compiler
36
- current_compiler = nil
37
- if $compiler == :use_app_default
38
- current_compiler = $dut.compiler
39
- fail "DUT compiler '#{current_compiler}' is not instantiated" if $dut.pattern_compilers[current_compiler].nil?
40
- elsif $compiler.is_a? Symbol
41
- current_compiler = $compiler
42
- fail "Command line compiler '#{current_compiler}' is not instantiated" if $dut.pattern_compilers[current_compiler].nil?
43
- end
44
- current_compiler
45
- end
46
-
47
- def run_compiler(current_compiler, pattern)
48
- unless current_compiler.nil?
49
- debug "Compiling pattern #{pattern} with compiler '#{current_compiler}'..."
50
- $dut.pattern_compilers[current_compiler].find_jobs(pattern)
51
- $dut.pattern_compilers[current_compiler].run
52
- end
53
- end
54
36
  end
55
37
 
56
38
  # Instantiate an instance of this class immediately when this file is required, this object will
@@ -24,7 +24,7 @@ module Origen
24
24
  else
25
25
  file = Origen.config.referenced_pattern_list
26
26
  end
27
- puts "Referenced pattern list written to: #{Pathname.new(file).relative_path_from(Pathname.pwd)}"
27
+ Origen.log.info "Referenced pattern list written to: #{Pathname.new(file).relative_path_from(Pathname.pwd)}"
28
28
  dir = Pathname.new(file).dirname
29
29
  FileUtils.mkdir_p(dir) unless dir.exist?
30
30
  File.open(file, 'w') do |f|
@@ -1,116 +1,170 @@
1
1
  module OrigenTesters
2
2
  module PatternCompilers
3
- require 'pathname'
4
- require_relative 'pattern_compilers/ultraflex_pattern_compiler'
5
-
6
- PLATFORMS = [:ultraflex]
7
-
8
- # Linux compiler executable path
9
- LINUX_PATTERN_COMPILER = "#{Origen.root!}/bin/latest/bin/atpcompiler"
10
-
11
- # Windows compiler executable path
12
- WINDOWS_PATTERN_COMPILER = "#{ENV['IGXLROOT']}/bin/apc.exe"
13
-
14
- # Hash wrapper for compiler instances, defaults to display currently enabled
15
- # tester platform. If none is set then user must supply a valid tester platform argument
16
- def pattern_compilers(id = nil)
3
+ require 'origen_testers/pattern_compilers/base'
4
+ require 'origen_testers/pattern_compilers/igxl_based'
5
+ require 'origen_testers/pattern_compilers/ultraflex'
6
+ require 'origen_testers/pattern_compilers/j750'
7
+ require 'origen_testers/pattern_compilers/v93k'
8
+
9
+ PLATFORMS = {
10
+ ultraflex: 'UltraFLEX',
11
+ j750: 'J750',
12
+ v93k: 'V93K'
13
+ }
14
+
15
+ # Hash wrapper for compiler instances, defaults to display currently enabled tester platform.
16
+ # If no tester is set then user must supply a valid tester platform argument
17
+ # User can also supply alternate tester platform (i.e. not the current tester target)
18
+ # pattern_compilers() => hash of compilers for current tester platform
19
+ # pattern_compilers(id1) => inspect options of compiler 'id1' for current tester platfrom
20
+ # pattern_compiler(platform: :v93k) => hash of compilers for specified tester platfrom (v93k)
21
+ # pattern_compiler(id2, platform: :v93k) => inspect options of compiler 'id2' for specified tester platfrom (v93k)
22
+ def pattern_compilers(id = nil, options = {})
23
+ id, options = nil, id if id.is_a? Hash
24
+ plat = options[:platform] || platform # use platform option or current tester platform
25
+
26
+ # Build up empty hash structure for all supported plaforms
17
27
  @pattern_compilers ||= begin
18
28
  hash = {}
19
- PLATFORMS.each { |platform| hash[platform] = {} }
29
+ PLATFORMS.keys.each { |p| hash[p] = {} }
20
30
  hash
21
31
  end
32
+
33
+ @default_pattern_compiler ||= begin
34
+ hash = {}
35
+ PLATFORMS.keys.each { |p| hash[p] = nil }
36
+ hash
37
+ end
38
+
22
39
  if id.nil?
23
- @pattern_compilers[platform]
40
+ @pattern_compilers[plat]
24
41
  else
25
- @pattern_compilers[platform][id].inspect_options
42
+ @pattern_compilers[plat][id].inspect_options
26
43
  end
27
44
  end
28
- alias_method :compilers, :pattern_compilers
45
+ # alias_method :compilers, :pattern_compilers # DEPRECATING
46
+
47
+ # Add a compiler for a particular tester platform and pattern type
48
+ def add_pattern_compiler(id, plat, options = {})
49
+ pattern_compilers
50
+ id = id.to_sym
51
+ plat = plat.to_sym
52
+ options[:location] = options[:location].to_sym unless options[:location].nil?
53
+
54
+ verify_unique_platform_id(id, plat) # do not allow duplicate ids for a given platform
55
+ @pattern_compilers[plat][id] = platform_compiler(plat).new(id, options)
56
+
57
+ default = options[:default] || false
58
+ @default_pattern_compiler[plat] = id if default
59
+ end
60
+ # alias_method :add_compiler, :add_pattern_compiler # DEPRECATING
61
+
62
+ # Get the default pattern compiler for the current of speficied platform
63
+ def default_pattern_compiler(p = platform)
64
+ @default_pattern_compiler[p.to_sym]
65
+ end
66
+
67
+ # Set a (already created) pattern compiler as the default for current or specified platform
68
+ def set_default_pattern_compiler(id, p = platform)
69
+ @default_pattern_compiler[p.to_sym] = id
70
+ end
29
71
 
72
+ # All platforms that have supported pattern compilers (returns Array)
30
73
  def pattern_compiler_platforms
31
- PLATFORMS
74
+ PLATFORMS.keys.sort
32
75
  end
33
- alias_method :compiler_platforms, :pattern_compiler_platforms
76
+ # alias_method :compiler_platforms, :pattern_compiler_platforms # DEPRECATING
34
77
 
35
- # Delete pattern compiler instances. If no argument default to current platform
78
+ # Delete all pattern compiler instances for a given platform. If no
79
+ # argument default to current platform
36
80
  def delete_pattern_compilers(p = platform)
37
81
  @pattern_compilers[p].delete_if { |k, v| true }
38
82
  end
39
- alias_method :delete_compilers, :delete_pattern_compilers
83
+ # alias_method :delete_compilers, :delete_pattern_compilers # DEPRECATING
40
84
 
41
85
  # Delete a pattern compiler instance.
42
- def delete_pattern_compiler(id)
43
- @pattern_compilers[platform].delete(id)
86
+ def delete_pattern_compiler(id, p = platform)
87
+ @pattern_compilers[p].delete(id)
44
88
  end
45
- alias_method :delete_compiler, :delete_pattern_compiler
46
-
47
- # Add a compiler for a particular tester platform and pattern type
48
- def add_pattern_compiler(id, platform, options = {})
49
- pattern_compilers
50
- id = id.to_sym
51
- platform = platform.to_sym
52
- options[:location] = options[:location].to_sym unless options[:location].nil?
53
- case platform
54
- when :ultraflex
55
- fail "Compiler ID #{id} for platform #{platform} already exists! Pick another name, delete the compiler, or clear all compilers" if @pattern_compilers[platform].keys.include? id
56
- @pattern_compilers[platform][id] = UltraFlexPatternCompiler.new(id, options)
57
- else
58
- fail "Platform #{platform} is not valid, please choose from #{PLATFORMS.join(', ')}"
89
+ # alias_method :delete_compiler, :delete_pattern_compiler # DEPRECATING
90
+
91
+ # Check compiler instance name is unique for given platform
92
+ def verify_unique_platform_id(id, platform, options = {})
93
+ if @pattern_compilers[platform].keys.include? id
94
+ fail_msg = "Compiler ID #{id} for platform #{platform} already exists! "
95
+ fail_msg += 'Pick another name, delete the compiler, or clear all compilers'
96
+ fail fail_msg
59
97
  end
60
98
  end
61
- alias_method :add_compiler, :add_pattern_compiler
62
99
 
63
100
  # Returns an array of the pattern compiler instance ids
64
101
  # for the currently selected tester platform.
65
102
  def pattern_compiler_instances(p = platform)
66
103
  # Check if nil which means no tester is defined so ask user to supply it
67
- fail "No tester platform defined so supply one of the following as an argument: #{PLATFORMS.join(', ')}" if p.nil?
104
+ if p.nil?
105
+ fail "No tester platform defined, supply one of the following as an argument: #{PLATFORMS.keys.sort.join(', ')}"
106
+ end
68
107
  p = p.to_sym
69
108
  @pattern_compilers[p].keys
70
109
  end
71
- alias_method :compiler_instances, :pattern_compiler_instances
110
+ # alias_method :compiler_instances, :pattern_compiler_instances # DEPRECATING
111
+
112
+ # Return the Compiler Class of the current or specified platform
113
+ def platform_compiler(p = platform)
114
+ if pattern_compiler_supported?(p)
115
+ "OrigenTesters::PatternCompilers::#{PLATFORMS[p]}PatternCompiler".constantize
116
+ else
117
+ fail "Platform #{platform} is not valid, please choose from #{PLATFORMS.keys.sort.join(', ')}"
118
+ end
119
+ end
72
120
 
73
- def pattern_compiler_options
74
- cmd = ''
75
- running_on_windows? ? cmd = "#{WINDOWS_PATTERN_COMPILER} -help" : cmd = "#{LINUX_PATTERN_COMPILER} -help"
76
- system cmd
121
+ # Execute the compiler with 'help' switch
122
+ def pattern_compiler_options(p = platform)
123
+ system("#{platform_compiler(p).compiler_options}")
77
124
  end
78
- alias_method :compiler_options, :pattern_compiler_options
125
+ # alias_method :compiler_options, :pattern_compiler_options # DEPRECATING
79
126
 
80
- def pattern_compiler_version
81
- cmd = ''
82
- running_on_windows? ? cmd = "#{WINDOWS_PATTERN_COMPILER} -version" : cmd = "#{LINUX_PATTERN_COMPILER} -version"
83
- system cmd
127
+ # Execute the compiler with 'version' swtich
128
+ def pattern_compiler_version(p = platform)
129
+ system("#{platform_compiler(p).compiler_version}")
84
130
  end
85
- alias_method :compiler_version, :pattern_compiler_version
131
+ # alias_method :compiler_version, :pattern_compiler_version # DEPRECATING
86
132
 
87
133
  # Check if the current tester is supported
88
- def pattern_compiler_supported?
89
- PLATFORMS.include? platform ? true : false
134
+ def pattern_compiler_supported?(p = platform)
135
+ PLATFORMS.keys.include?(p) ? true : false
90
136
  end
91
- alias_method :compiler_supported?, :pattern_compiler_supported?
137
+ # alias_method :compiler_supported?, :pattern_compiler_supported? # DEPRECATING
92
138
 
93
139
  private
94
140
 
95
- def running_on_windows?
96
- RUBY_PLATFORM == 'i386-mingw32'
97
- end
141
+ # # Check if the current tester is an Ultraflex
142
+ # def is_ultraflex?
143
+ # platform == :ultraflex ? true : false
144
+ # end
98
145
 
99
- # Check if the current tester is an Ultraflex
100
- def is_ultraflex?
101
- platform == :ultraflex ? true : false
102
- end
146
+ # # Check if the current tester is an Ultraflex
147
+ # def is_j750?
148
+ # platform == :j750 ? true : false
149
+ # end
103
150
 
151
+ # # Check if the current tester is an Ultraflex
152
+ # def is_v93k?
153
+ # platform == :v93k ? true : false
154
+ # end
155
+
156
+ # Return the current tester target
104
157
  def platform
105
- if $tester.nil?
158
+ if tester.nil?
106
159
  fail 'No tester instantiated, $tester is set to nil'
107
160
  else
108
- $tester.class.to_s.downcase.split('::').last.to_sym
161
+ tester.class.to_s.downcase.split('::').last.to_sym
109
162
  end
110
163
  end
111
164
 
112
- def target_enabled?
113
- Origen.target.name.nil? ? true : false
114
- end
165
+ # # Check if a target has been set
166
+ # def target_enabled?
167
+ # Origen.target.name.nil? ? true : false
168
+ # end
115
169
  end
116
170
  end
@@ -1,17 +1,19 @@
1
1
  module OrigenTesters
2
2
  module PatternCompilers
3
- class UltraFlexPatternCompiler
3
+ class BasePatternCompiler
4
4
  private
5
5
 
6
- # Check the file extension of a file, return status can be 'atp', 'list', or nil
6
+ # Check the file extension of a file, return status can be 'atp', 'avc', 'list', or nil
7
7
  def check_file_ext(file)
8
8
  status = nil
9
9
  ext = file.extname
10
10
  name = file.basename
11
11
  if ext == '.atp'
12
12
  status = 'atp'
13
+ elsif ext == '.avc'
14
+ status = 'avc'
13
15
  elsif ext == '.gz'
14
- # Ensure we have a .atp.gz
16
+ # Ensure we have a .atp.gz or .avc.gz
15
17
  sub_ext = name.to_s.split('.')[-2]
16
18
  if sub_ext == 'atp'
17
19
  status = 'atp'
@@ -52,6 +54,8 @@ module OrigenTesters
52
54
  case check_file_ext(file)
53
55
  when 'atp'
54
56
  files << file unless files.include?(file)
57
+ when 'avc'
58
+ files << file unless files.include?(file)
55
59
  when 'list'
56
60
  parse_list(file, files)
57
61
  end
@@ -0,0 +1,266 @@
1
+ require 'digest/md5'
2
+ module OrigenTesters
3
+ module PatternCompilers
4
+ class BasePatternCompiler
5
+ require 'origen_testers/pattern_compilers/assembler'
6
+ require 'origen_testers/pattern_compilers/job'
7
+
8
+ # ID will allow users to set default configurations for the compiler for unique pattern types
9
+ attr_accessor :id
10
+
11
+ # Compiler commands array
12
+ attr_accessor :jobs
13
+
14
+ def initialize(id, options = {})
15
+ unless Origen.site_config.origen_testers
16
+ fail 'Adding a pattern compiler without site config specifying bin location not allowed'
17
+ end
18
+
19
+ @id = id.to_sym
20
+
21
+ # The following are pattern compiler options that are common between all platforms, the specific platforms
22
+ # can add on additional options in their respective initialize methods.
23
+ @user_options = {
24
+ path: nil, # required: will be passed in or parsed from a .list file
25
+ reference_directory: nil, # optional: will be set to @path or Origen.app.config.pattern_output_directory
26
+ target: nil, # optional: allows user to temporarily set target and run compilation
27
+ recursive: false, # optional: controls whether to look for patterns in a directory recursively
28
+ }
29
+
30
+ @job_options = {
31
+ id: @id, # required
32
+ location: :local, # optional: controls whether the commands go to the LSF or run locally
33
+ clean: false, # optional: controls whether compiler log files are deleted after compilation
34
+ output_directory: nil, # optional:
35
+ verbose: false, # optional: controls whether the compiler output gets put to STDOUT
36
+ }
37
+ @compiler_options = {}
38
+ @compiler_options_with_args = {}
39
+
40
+ # Compiler jobs
41
+ @jobs = []
42
+ @files = []
43
+ end
44
+
45
+ # Return the id/name of the compiler instance
46
+ def name
47
+ @id
48
+ end
49
+
50
+ # Returns the number of jobs in the compiler
51
+ def count
52
+ @jobs.size
53
+ end
54
+
55
+ # Checks if the compiler queue is empty
56
+ def empty?
57
+ @jobs.empty?
58
+ end
59
+
60
+ # Allow users to search for a pattern in the job queue or default to return all jobs
61
+ def jobs(search = nil)
62
+ found = false
63
+ if search.nil?
64
+ inspect_jobs
65
+ found = true
66
+ elsif search.is_a? String
67
+ @jobs.each_with_index do |job, index|
68
+ if job.pattern.to_s.match(search)
69
+ inspect_jobs(index)
70
+ found = true
71
+ else
72
+ puts "No match found for #{search}"
73
+ end
74
+ end
75
+ elsif search.is_a? Regexp
76
+ @jobs.each_with_index do |job, index|
77
+ if search.match(job.pattern.to_s)
78
+ inspect_jobs(index)
79
+ found = true
80
+ else
81
+ puts "No match found for #{search}"
82
+ end
83
+ end
84
+ elsif search.is_a? Integer
85
+ if @jobs[search].nil?
86
+ puts "The compiler queue does not contain a job at index #{search}"
87
+ else
88
+ inspect_jobs(search)
89
+ found = true
90
+ end
91
+ else
92
+ fail 'Search argument must be of type String, Regexp, or Integer'
93
+ end
94
+ found
95
+ end
96
+
97
+ # Clear the job queue
98
+ def clear
99
+ @jobs = []
100
+ @files = []
101
+ end
102
+
103
+ def platform
104
+ if tester.nil?
105
+ fail 'No tester instantiated, $tester is set to nil'
106
+ else
107
+ tester.class.to_s.downcase.split('::').last.to_sym
108
+ end
109
+ end
110
+
111
+ # Check if the current tester is an Ultraflex
112
+ def is_ultraflex?
113
+ platform == :ultraflex ? true : false
114
+ end
115
+
116
+ # Check if the current tester is an J750
117
+ def is_j750?
118
+ platform == :j750 ? true : false
119
+ end
120
+
121
+ # Check if the current tester is an V93K
122
+ def is_v93k?
123
+ platform == :v93k ? true : false
124
+ end
125
+
126
+ # Output the compiler options to the console
127
+ def inspect_options(verbose = nil)
128
+ desc = []
129
+ # Find the longest option argument string
130
+ my_job_options = @job_options
131
+ my_job_options.delete(:compiler)
132
+ all_arguments = @user_options.values + my_job_options.values + @compiler_options.values + @compiler_options_with_args.values
133
+ min_argument_padding = 'Argument'.length + 2
134
+ argument_padding = all_arguments.max_by { |e| e.to_s.length }.to_s.length + 3
135
+ argument_padding = min_argument_padding if argument_padding < min_argument_padding
136
+ puts "\n"
137
+ header = '| Option ' + '| Argument'.ljust(argument_padding) + '| Required |'
138
+ desc << header
139
+ desc << '-' * header.length
140
+ [@user_options, my_job_options, @compiler_options, @compiler_options_with_args].each do |opt|
141
+ opt.each_pair do |k, v|
142
+ if k.match(/pinmap_workbook|path|id|directory|clean|location|recursive/i)
143
+ req = 'true '
144
+ else
145
+ next if v.nil? || v == false
146
+ req = 'false'
147
+ end
148
+ desc << "| #{k}".ljust(22) + "| #{v}".ljust(argument_padding) + "| #{req} |"
149
+ end
150
+ end
151
+ puts desc
152
+ end
153
+
154
+ private
155
+
156
+ def update_common_options(options = {})
157
+ @user_options.update_common(options)
158
+ @job_options.update_common(options)
159
+ @compiler_options.update_common(options)
160
+ @compiler_options_with_args.update_common(options)
161
+ end
162
+
163
+ def clean_and_verify_options
164
+ verify_exclusive_compiler_options
165
+ clean_path_options
166
+ set_reference_directory
167
+ create_output_directory
168
+
169
+ # Logfile is optional
170
+ unless @compiler_options[:logfile].nil?
171
+ @compiler_options[:logfile] = convert_to_pathname(@compiler_options[:logfile])
172
+ end
173
+
174
+ # Check if the LSF is setup in the application
175
+ if Origen.app.config.lsf.project.nil? || Origen.app.config.lsf.project.empty?
176
+ msg = 'LSF is not set at Origen.app.config.lsf.project, changing to local compilation'
177
+ Origen.log.warn msg
178
+ @job_options[:location] = :local
179
+ end
180
+ end
181
+
182
+ # Check to make sure @compiler_options and @compiler_options_with_args do not have any keys in common
183
+ def verify_exclusive_compiler_options
184
+ if @compiler_options.intersect? @compiler_options_with_args
185
+ fail_msg = 'Error: @compiler_options and @compiler_options_with_args share keys '
186
+ fail_msg += "#{@compiler_options.intersections(@compiler_options_with_args)}. "
187
+ fail_msg += 'They should be mutually exclusive, exiting...'
188
+ fail fail_msg
189
+ end
190
+ end
191
+
192
+ def clean_path_options
193
+ unless @user_options[:path].nil?
194
+ if @user_options[:path].is_a? Pathname
195
+ @path = @user_options[:path]
196
+ else
197
+ @path = Pathname.new(@user_options[:path])
198
+ end
199
+ @path = @path.expand_path
200
+ # path is set but output_directory is not so set output_directory to path
201
+ @job_options[:output_directory] = @path if @job_options[:output_directory].nil?
202
+ end
203
+ end
204
+
205
+ def set_reference_directory
206
+ if @user_options[:reference_directory].nil?
207
+ # Nothing passed for reference directory so set it to Origen.app.config.pattern_output_directory if valid
208
+ if File.directory? Origen.app.config.pattern_output_directory
209
+ @user_options[:reference_directory] = Pathname.new(Origen.app.config.pattern_output_directory)
210
+ elsif @path
211
+ if @path.directory?
212
+ @user_options[:reference_directory] = @path
213
+ else
214
+ @user_options[:reference_directory] = @path.dirname
215
+ end
216
+ end
217
+ elsif File.directory?(@user_options[:reference_directory])
218
+ @user_options[:reference_directory] = Pathname.new(@user_options[:reference_directory])
219
+ else
220
+ debug 'Reference directory not set, creating it...'
221
+ @user_options[:reference_directory] = Pathname.new(@user_options[:reference_directory])
222
+ FileUtils.mkdir_p(@user_options[:reference_directory])
223
+ end
224
+ @user_options[:reference_directory] = @user_options[:reference_directory].expand_path
225
+ # reference_directory must be a subset of @path. if it is not then set to @path if @path exists
226
+ unless @path.nil?
227
+ if @path.directory?
228
+ @user_options[:reference_directory] = @path unless @path.to_s.include? @user_options[:reference_directory].to_s
229
+ elsif @path.file?
230
+ @user_options[:reference_directory] = @path.dirname
231
+ else
232
+ fail "Path is set to #{@path} which is not a valid directory or file!"
233
+ end
234
+ end
235
+ end
236
+
237
+ def create_output_directory
238
+ # if output directory given, create it now, otherwise it will be created on the fly later
239
+ unless @job_options[:output_directory].nil?
240
+ @job_options[:output_directory] = convert_to_pathname(@job_options[:output_directory])
241
+ # output_directory can not exist, will create for user
242
+ unless @job_options[:output_directory].directory?
243
+ puts "Output directory #{@job_options[:output_directory]} does not exist, creating it..."
244
+ FileUtils.mkdir_p(@job_options[:output_directory])
245
+ end
246
+ end
247
+ end
248
+
249
+ def empty_msg
250
+ puts "No compiler jobs created, check the compiler options\n" if self.empty?
251
+ end
252
+
253
+ def convert_to_pathname(opt)
254
+ if opt.is_a? String
255
+ opt = Pathname.new(opt)
256
+ opt = opt.expand_path
257
+ elsif opt.is_a? Pathname
258
+ opt = opt.expand_path
259
+ else
260
+ fail "Option #{opt} is not a String, cannot convert to Pathname"
261
+ end
262
+ opt
263
+ end
264
+ end
265
+ end
266
+ end