origen 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/version.rb +1 -1
- data/lib/origen.rb +2 -2
- data/lib/origen/application.rb +4 -20
- data/lib/origen/application/configuration.rb +1 -6
- data/lib/origen/application/runner.rb +7 -1
- data/lib/origen/commands.rb +9 -7
- data/lib/origen/commands/mode.rb +12 -0
- data/lib/origen/mode.rb +4 -0
- data/lib/origen/specs/spec.rb +87 -0
- data/lib/origen/utility.rb +0 -1
- metadata +5 -17
- data/lib/origen/application/configuration_manager.rb +0 -78
- data/lib/origen/commands/dispatch.rb +0 -22
- data/lib/origen/commands/merge.rb +0 -55
- data/lib/origen/commands/modifications.rb +0 -12
- data/lib/origen/pdm.rb +0 -218
- data/lib/origen/tester/command_based_tester.rb +0 -46
- data/lib/origen/utility/s_record.rb +0 -205
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fe0ad7591f9323eff79e183c8c5c8137b186fec
|
4
|
+
data.tar.gz: c595cfe53a37c4a736cb46f47902bdc57cc23e07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d56224e505b1e7267486868b70501e04487c9b945a862fe41304c5357b2aba21242d3b36bdd6f8745f64de161ca6cc6e5ef50b53df52eb6735b663aed5dff2a0
|
7
|
+
data.tar.gz: 33cdd8e0f5f62a14cdb8914b7358bcce28e71a7b9f29e2f9bcd709fc6d93b4dbb3def50815be0af3d88b4760e7e2ee925cf033a6e8960d52602c90b4df621adc
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -565,11 +565,11 @@ unless defined? RGen::ORIGENTRANSITION
|
|
565
565
|
# Returns an object tracking the Origen execution mode/configuration, an
|
566
566
|
# instance of Origen::Mode
|
567
567
|
def mode
|
568
|
-
|
568
|
+
@mode ||= Origen::Mode.new
|
569
569
|
end
|
570
570
|
|
571
571
|
def mode=(val)
|
572
|
-
|
572
|
+
mode.set(val)
|
573
573
|
end
|
574
574
|
|
575
575
|
# Returns the current top-level (DUT) object if one has been defined (by
|
data/lib/origen/application.rb
CHANGED
@@ -13,7 +13,6 @@ module Origen
|
|
13
13
|
autoload :Plugins, 'origen/application/plugins'
|
14
14
|
autoload :LSF, 'origen/application/lsf'
|
15
15
|
autoload :Runner, 'origen/application/runner'
|
16
|
-
autoload :ConfigurationManager, 'origen/application/configuration_manager'
|
17
16
|
autoload :LSFManager, 'origen/application/lsf_manager'
|
18
17
|
autoload :Release, 'origen/application/release'
|
19
18
|
autoload :Deployer, 'origen/application/deployer'
|
@@ -468,21 +467,11 @@ module Origen
|
|
468
467
|
@db ||= Database::KeyValueStores.new(self)
|
469
468
|
end
|
470
469
|
|
471
|
-
def session
|
470
|
+
def session(reload = false)
|
471
|
+
@session = nil if reload
|
472
472
|
@session ||= Database::KeyValueStores.new(self, persist: false)
|
473
473
|
end
|
474
474
|
|
475
|
-
def pdm_component
|
476
|
-
return @pdm_component if @pdm_component
|
477
|
-
require "#{Origen.root}/config/pdm_component"
|
478
|
-
begin
|
479
|
-
@pdm_component = (eval "#{Origen.app.class}::PDMComponent").new
|
480
|
-
rescue
|
481
|
-
# Try legacy case where the namespace was just Application
|
482
|
-
@pdm_component = ::Application::PDMComponent.new
|
483
|
-
end
|
484
|
-
end
|
485
|
-
|
486
475
|
def versions
|
487
476
|
version_tracker.versions
|
488
477
|
end
|
@@ -497,11 +486,6 @@ module Origen
|
|
497
486
|
end
|
498
487
|
alias_method :stats, :statistics
|
499
488
|
|
500
|
-
def configuration_manager
|
501
|
-
@cm ||= ConfigurationManager.new
|
502
|
-
end
|
503
|
-
alias_method :cm, :configuration_manager
|
504
|
-
|
505
489
|
def pattern_iterators
|
506
490
|
@pattern_iterators ||= []
|
507
491
|
end
|
@@ -644,7 +628,7 @@ module Origen
|
|
644
628
|
# declares here, the objects registered with origen should be refreshed accordingly
|
645
629
|
clear_dynamic_resources
|
646
630
|
load_event(:transient) do
|
647
|
-
Origen.
|
631
|
+
Origen.mode = Origen.app.session.origen_core[:mode] || :production # Important since a production target may rely on the default
|
648
632
|
begin
|
649
633
|
$_target_options = @target_load_options
|
650
634
|
Origen.target.set_signature(@target_load_options)
|
@@ -659,7 +643,7 @@ module Origen
|
|
659
643
|
$_target_options = nil
|
660
644
|
end
|
661
645
|
@target_instantiated = true
|
662
|
-
Origen.
|
646
|
+
Origen.mode = :debug if options[:force_debug]
|
663
647
|
listeners_for(:on_create).each(&:on_create)
|
664
648
|
# Keep this within the load_event to ensure any objects that are further instantiated objects
|
665
649
|
# will be associated with (and cleared out upon reload of) the current target
|
@@ -8,7 +8,7 @@ module Origen
|
|
8
8
|
|
9
9
|
attr_accessor :name, :initials, :instructions,
|
10
10
|
:history_file, :release_directory, :release_email_subject,
|
11
|
-
:production_targets,
|
11
|
+
:production_targets,
|
12
12
|
:vault, :output_directory, :reference_directory,
|
13
13
|
:semantically_version, :log_directory, :pattern_name_translator,
|
14
14
|
:pattern_directory, :pattern_output_directory, :pattern_prefix, :pattern_postfix,
|
@@ -59,7 +59,6 @@ module Origen
|
|
59
59
|
|
60
60
|
def initialize(app)
|
61
61
|
@app = app
|
62
|
-
@mode = Origen::Mode.new
|
63
62
|
@name = 'Unknown'
|
64
63
|
@initials = 'NA'
|
65
64
|
@semantically_version = false
|
@@ -174,10 +173,6 @@ module Origen
|
|
174
173
|
yield Origen.generator.create_iterator
|
175
174
|
end
|
176
175
|
|
177
|
-
def mode=(val)
|
178
|
-
@mode.set(val)
|
179
|
-
end
|
180
|
-
|
181
176
|
def lsf
|
182
177
|
app.lsf.configuration
|
183
178
|
end
|
@@ -235,7 +235,13 @@ module Origen
|
|
235
235
|
# The caller would have already verified the status before submission
|
236
236
|
if Origen.running_locally?
|
237
237
|
if Origen.mode.production?
|
238
|
-
Origen.app.
|
238
|
+
unless Origen.app.rc.local_modifications.empty?
|
239
|
+
puts <<-EOT
|
240
|
+
Your workspace has local modifications that are preventing the requested action
|
241
|
+
- run 'origen rc mods' to see them.
|
242
|
+
EOT
|
243
|
+
exit 1
|
244
|
+
end
|
239
245
|
end
|
240
246
|
end
|
241
247
|
end
|
data/lib/origen/commands.rb
CHANGED
@@ -12,14 +12,14 @@ ORIGEN_COMMAND_ALIASES = {
|
|
12
12
|
'-t' => 'target', # For legacy reasons
|
13
13
|
'e' => 'environment',
|
14
14
|
'-e' => 'environment',
|
15
|
-
'mods' => 'modifications',
|
16
|
-
'-o' => 'modifications', # Legacy
|
17
15
|
'l' => 'lsf',
|
18
16
|
'i' => 'interactive',
|
19
17
|
'c' => 'compile',
|
20
18
|
'pl' => 'plugin',
|
21
19
|
'-v' => 'version',
|
22
|
-
'--version' => 'version'
|
20
|
+
'--version' => 'version',
|
21
|
+
'-version' => 'version',
|
22
|
+
'm' => 'mode'
|
23
23
|
}
|
24
24
|
|
25
25
|
@command = ARGV.shift
|
@@ -213,7 +213,7 @@ end
|
|
213
213
|
|
214
214
|
case @command
|
215
215
|
when 'generate', 'program', 'compile', 'merge', 'interactive', 'target', 'environment',
|
216
|
-
'save', 'lsf', 'web', 'time', 'dispatch', 'rc', 'lint', 'plugin', 'fetch' # , 'add'
|
216
|
+
'save', 'lsf', 'web', 'time', 'dispatch', 'rc', 'lint', 'plugin', 'fetch', 'mode' # , 'add'
|
217
217
|
|
218
218
|
require "origen/commands/#{@command}"
|
219
219
|
exit 0 unless @command == 'interactive'
|
@@ -234,19 +234,21 @@ else
|
|
234
234
|
Usage: origen COMMAND [ARGS]
|
235
235
|
|
236
236
|
The core origen commands are:
|
237
|
-
environment Display or set the
|
238
|
-
target Display or set the
|
237
|
+
environment Display or set the environment (short-cut alias: "e")
|
238
|
+
target Display or set the target (short-cut alias: "t")
|
239
|
+
mode Display or set the mode (short-cut alias: "m")
|
240
|
+
plugin Display or set the plugin (short-cut alias: "pl")
|
239
241
|
generate Generate a test pattern (short-cut alias: "g")
|
240
242
|
program Generate a test program (short-cut alias: "p")
|
241
243
|
interactive Start an interactive Origen console (short-cut alias: "i")
|
242
244
|
compile Compile a template file or directory (short-cut alias: "c")
|
245
|
+
|
243
246
|
rc Revision control commands, see -h for details
|
244
247
|
save Save the new or changed files from the last run or a given log file
|
245
248
|
lsf Monitor and manage LSF jobs (short-cut alias: "l")
|
246
249
|
web Web page tools, see -h for details
|
247
250
|
time Tools for test time analysis and forecasting
|
248
251
|
lint Lint and style check (and correct) your application code
|
249
|
-
plugin Manage Origen plugins (short-cut alias: "pl")
|
250
252
|
|
251
253
|
EOT
|
252
254
|
if @application_commands && !@application_commands.empty?
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Origen
|
2
|
+
mode = ARGV.shift
|
3
|
+
if mode
|
4
|
+
Origen.mode = mode
|
5
|
+
Origen.app.session.origen_core[:mode] = Origen.mode.to_s
|
6
|
+
puts "Origen mode now set to: #{Origen.mode}"
|
7
|
+
else
|
8
|
+
puts Origen.app.session.origen_core[:mode] || 'production'
|
9
|
+
end
|
10
|
+
|
11
|
+
exit 0
|
12
|
+
end
|
data/lib/origen/mode.rb
CHANGED
data/lib/origen/specs/spec.rb
CHANGED
@@ -113,6 +113,70 @@ module Origen
|
|
113
113
|
super
|
114
114
|
end
|
115
115
|
|
116
|
+
# Returns the trace_matrix name. The Trace Matrix Name is composed of
|
117
|
+
# * @name
|
118
|
+
# * @type
|
119
|
+
# * @subtype
|
120
|
+
# * @mode
|
121
|
+
def trace_matrix_name
|
122
|
+
name_set = trace_matrix_name_choose
|
123
|
+
ret_name = ''
|
124
|
+
case name_set
|
125
|
+
when 0
|
126
|
+
ret_name = ''
|
127
|
+
when 1
|
128
|
+
ret_name = "#{@mode}"
|
129
|
+
when 2
|
130
|
+
ret_name = "#{@sub_type}"
|
131
|
+
when 3
|
132
|
+
ret_name = "#{@sub_type}_#{@mode}"
|
133
|
+
when 4
|
134
|
+
ret_name = "#{@type}"
|
135
|
+
when 5
|
136
|
+
ret_name = "#{@type}_#{@mode}"
|
137
|
+
when 6
|
138
|
+
ret_name = "#{@type}_#{@sub_type}"
|
139
|
+
when 7
|
140
|
+
ret_name = "#{@type}_#{@sub_type}_#{@mode}"
|
141
|
+
when 8
|
142
|
+
ret_name = "#{small_name}"
|
143
|
+
when 9
|
144
|
+
ret_name = "#{small_name}_#{@mode}"
|
145
|
+
when 10
|
146
|
+
ret_name = "#{small_name}_#{@sub_type}"
|
147
|
+
when 11
|
148
|
+
ret_name = "#{small_name}_#{@sub_type}_#{@mode}"
|
149
|
+
when 12
|
150
|
+
ret_name = "#{small_name}_#{@type}"
|
151
|
+
when 13
|
152
|
+
ret_name = "#{small_name}_#{@type}_#{@mode}"
|
153
|
+
when 14
|
154
|
+
ret_name = "#{small_name}_#{@type}_#{@sub_type}"
|
155
|
+
when 15
|
156
|
+
ret_name = "#{small_name}_#{@type}_#{@sub_type}_#{@mode}"
|
157
|
+
else
|
158
|
+
ret_name = 'Bad trace matrix code'
|
159
|
+
end
|
160
|
+
ret_name
|
161
|
+
end
|
162
|
+
|
163
|
+
# This will create the trace matrix name to be placed into a dita phrase element
|
164
|
+
# End goal will be
|
165
|
+
# {code:xml}
|
166
|
+
# <ph audience="internal">trace_matrix_name</ph>
|
167
|
+
# {code}
|
168
|
+
def trace_matrix_name_to_dita
|
169
|
+
tmp_doc = Nokogiri::XML('<foo><bar /></foo>', nil, 'EUC-JP')
|
170
|
+
|
171
|
+
tmp_node = Nokogiri::XML::Node.new('lines', tmp_doc)
|
172
|
+
tmp_node1 = Nokogiri::XML::Node.new('i', tmp_doc)
|
173
|
+
tmp_node.set_attribute('audience', 'trace-matrix-id')
|
174
|
+
text_node1 = Nokogiri::XML::Text.new("[#{trace_matrix_name}]", tmp_node)
|
175
|
+
tmp_node1 << text_node1
|
176
|
+
tmp_node << tmp_node1
|
177
|
+
tmp_node.at_xpath('.').to_xml
|
178
|
+
end
|
179
|
+
|
116
180
|
def method_missing(method, *args, &block)
|
117
181
|
ivar = "@#{method.to_s.gsub('=', '')}"
|
118
182
|
ivar_sym = ":#{ivar}"
|
@@ -206,6 +270,16 @@ module Origen
|
|
206
270
|
|
207
271
|
private
|
208
272
|
|
273
|
+
def small_name
|
274
|
+
if @name.to_s[0..@ip_name.to_s.length].include? @ip_name.to_s
|
275
|
+
ret_name = @name.to_s[@ip_name.to_s.length + 1..-1]
|
276
|
+
else
|
277
|
+
ret_name = @name.to_s
|
278
|
+
end
|
279
|
+
ret_name = ret_name.partition('-').last if ret_name.include? '-'
|
280
|
+
ret_name
|
281
|
+
end
|
282
|
+
|
209
283
|
# This assumes the limit objects are Structs
|
210
284
|
def diff_limits(limit_one, limit_two = nil)
|
211
285
|
diff_results = Hash.new do |h, k|
|
@@ -228,6 +302,19 @@ module Origen
|
|
228
302
|
end
|
229
303
|
diff_results
|
230
304
|
end
|
305
|
+
|
306
|
+
def trace_matrix_name_choose
|
307
|
+
name_set = 0
|
308
|
+
name_set = 8 unless @name.nil?
|
309
|
+
name_set += 4 unless @type.nil?
|
310
|
+
name_set += 2 unless @sub_type.nil?
|
311
|
+
unless @mode.nil?
|
312
|
+
unless (@mode.to_s.include? 'local') || (@mode.to_s.include? 'global')
|
313
|
+
name_set += 1
|
314
|
+
end
|
315
|
+
end
|
316
|
+
name_set
|
317
|
+
end
|
231
318
|
end
|
232
319
|
end
|
233
320
|
end
|
data/lib/origen/utility.rb
CHANGED
@@ -2,7 +2,6 @@ module Origen
|
|
2
2
|
module Utility
|
3
3
|
autoload :Diff, 'origen/utility/diff'
|
4
4
|
autoload :Mailer, 'origen/utility/mailer'
|
5
|
-
autoload :SRecord, 'origen/utility/s_record'
|
6
5
|
autoload :CSV, 'origen/utility/csv_data'
|
7
6
|
autoload :TimeAndDate, 'origen/utility/time_and_date'
|
8
7
|
autoload :InputCapture, 'origen/utility/input_capture'
|
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.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -386,14 +386,14 @@ dependencies:
|
|
386
386
|
requirements:
|
387
387
|
- - "~>"
|
388
388
|
- !ruby/object:Gem::Version
|
389
|
-
version: '0
|
389
|
+
version: '0'
|
390
390
|
type: :development
|
391
391
|
prerelease: false
|
392
392
|
version_requirements: !ruby/object:Gem::Requirement
|
393
393
|
requirements:
|
394
394
|
- - "~>"
|
395
395
|
- !ruby/object:Gem::Version
|
396
|
-
version: '0
|
396
|
+
version: '0'
|
397
397
|
- !ruby/object:Gem::Dependency
|
398
398
|
name: origen_debuggers
|
399
399
|
requirement: !ruby/object:Gem::Requirement
|
@@ -401,9 +401,6 @@ dependencies:
|
|
401
401
|
- - "~>"
|
402
402
|
- !ruby/object:Gem::Version
|
403
403
|
version: '0'
|
404
|
-
- - ">="
|
405
|
-
- !ruby/object:Gem::Version
|
406
|
-
version: 0.5.1
|
407
404
|
type: :development
|
408
405
|
prerelease: false
|
409
406
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -411,9 +408,6 @@ dependencies:
|
|
411
408
|
- - "~>"
|
412
409
|
- !ruby/object:Gem::Version
|
413
410
|
version: '0'
|
414
|
-
- - ">="
|
415
|
-
- !ruby/object:Gem::Version
|
416
|
-
version: 0.5.1
|
417
411
|
description:
|
418
412
|
email:
|
419
413
|
- stephen.f.mcginty@gmail.com
|
@@ -445,7 +439,6 @@ files:
|
|
445
439
|
- lib/origen/application.rb
|
446
440
|
- lib/origen/application/command_dispatcher.rb
|
447
441
|
- lib/origen/application/configuration.rb
|
448
|
-
- lib/origen/application/configuration_manager.rb
|
449
442
|
- lib/origen/application/deployer.rb
|
450
443
|
- lib/origen/application/environment.rb
|
451
444
|
- lib/origen/application/lsf.rb
|
@@ -481,15 +474,13 @@ files:
|
|
481
474
|
- lib/origen/commands.rb
|
482
475
|
- lib/origen/commands/add.rb
|
483
476
|
- lib/origen/commands/compile.rb
|
484
|
-
- lib/origen/commands/dispatch.rb
|
485
477
|
- lib/origen/commands/environment.rb
|
486
478
|
- lib/origen/commands/fetch.rb
|
487
479
|
- lib/origen/commands/generate.rb
|
488
480
|
- lib/origen/commands/interactive.rb
|
489
481
|
- lib/origen/commands/lint.rb
|
490
482
|
- lib/origen/commands/lsf.rb
|
491
|
-
- lib/origen/commands/
|
492
|
-
- lib/origen/commands/modifications.rb
|
483
|
+
- lib/origen/commands/mode.rb
|
493
484
|
- lib/origen/commands/new.rb
|
494
485
|
- lib/origen/commands/plugin.rb
|
495
486
|
- lib/origen/commands/program.rb
|
@@ -544,7 +535,6 @@ files:
|
|
544
535
|
- lib/origen/parameters/live.rb
|
545
536
|
- lib/origen/parameters/missing.rb
|
546
537
|
- lib/origen/parameters/set.rb
|
547
|
-
- lib/origen/pdm.rb
|
548
538
|
- lib/origen/pins.rb
|
549
539
|
- lib/origen/pins/function_proxy.rb
|
550
540
|
- lib/origen/pins/ground_pin.rb
|
@@ -583,7 +573,6 @@ files:
|
|
583
573
|
- lib/origen/specs/spec.rb
|
584
574
|
- lib/origen/specs/version_history.rb
|
585
575
|
- lib/origen/sub_blocks.rb
|
586
|
-
- lib/origen/tester/command_based_tester.rb
|
587
576
|
- lib/origen/top_level.rb
|
588
577
|
- lib/origen/users.rb
|
589
578
|
- lib/origen/users/ldap.rb
|
@@ -595,7 +584,6 @@ files:
|
|
595
584
|
- lib/origen/utility/file_diff.rb
|
596
585
|
- lib/origen/utility/input_capture.rb
|
597
586
|
- lib/origen/utility/mailer.rb
|
598
|
-
- lib/origen/utility/s_record.rb
|
599
587
|
- lib/origen/utility/time_and_date.rb
|
600
588
|
- lib/origen/version_string.rb
|
601
589
|
- lib/tasks/gem.rake
|
@@ -1,78 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
class Application
|
3
|
-
# All access to the configuration management system should be done
|
4
|
-
# through methods of this class, an instance of which is accessible via
|
5
|
-
# Origen.app.cm
|
6
|
-
#
|
7
|
-
# Where possible external arguments relating to the underlying CM tool should
|
8
|
-
# not be used, try and keep method names and arguments generic.
|
9
|
-
#
|
10
|
-
# Right now it supports Design Sync only, but by eliminating interaction
|
11
|
-
# with DS outside of this class it means that a future change to the CM
|
12
|
-
# system should be easily handled by simply swapping in a new ConfigurationManager
|
13
|
-
# class.
|
14
|
-
class ConfigurationManager
|
15
|
-
def initialize
|
16
|
-
@cm = Origen::Utility::DesignSync.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def modified_objects_in_workspace?
|
20
|
-
@cm.modified_objects?(workspace_dirs, rec: true, fullpath: true)
|
21
|
-
end
|
22
|
-
|
23
|
-
def modified_objects_in_workspace_list
|
24
|
-
@cm.modified_objects(workspace_dirs, rec: true, fullpath: true)
|
25
|
-
end
|
26
|
-
|
27
|
-
def unmanaged_objects_in_workspace?
|
28
|
-
@cm.modified_objects?(workspace_dirs, rec: true, unmanaged: true, managed: false, fullpath: true)
|
29
|
-
end
|
30
|
-
|
31
|
-
def unmanaged_objects_in_workspace_list
|
32
|
-
@cm.modified_objects(workspace_dirs, rec: true, unmanaged: true, managed: false, fullpath: true)
|
33
|
-
end
|
34
|
-
|
35
|
-
def modified_objects_in_repository?
|
36
|
-
@cm.modified_objects?(workspace_dirs, rec: true, fullpath: true, remote: true)
|
37
|
-
end
|
38
|
-
|
39
|
-
def modified_objects_in_repository_list
|
40
|
-
@cm.modified_objects(workspace_dirs, rec: true, fullpath: true, remote: true)
|
41
|
-
end
|
42
|
-
|
43
|
-
def workspace_dirs
|
44
|
-
"#{Origen.root} " + Origen.app.config.external_app_dirs.join(' ')
|
45
|
-
end
|
46
|
-
|
47
|
-
# Fetch the latest version of the application
|
48
|
-
def fetch_latest(options = {})
|
49
|
-
options = {
|
50
|
-
force: false
|
51
|
-
}.merge(options)
|
52
|
-
@cm.populate(workspace_dirs, rec: true, verbose: true, force: options[:force])
|
53
|
-
end
|
54
|
-
|
55
|
-
def diff_cmd(options = {})
|
56
|
-
@cm.diff_cmd(options)
|
57
|
-
end
|
58
|
-
|
59
|
-
def import(*args)
|
60
|
-
@cm.import(*args)
|
61
|
-
end
|
62
|
-
|
63
|
-
def ensure_workspace_unmodified!
|
64
|
-
if modified_objects_in_workspace?
|
65
|
-
puts <<-EOT
|
66
|
-
Your workspace has local modifications that are preventing the requested action
|
67
|
-
- run 'origen rc mods' to see them.
|
68
|
-
EOT
|
69
|
-
exit 1
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def method_missing(method, *args, &blk)
|
74
|
-
@cm.send(method, *args, &blk)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# begin
|
2
|
-
if Origen.command_dispatcher.snapshots_exist?
|
3
|
-
ix = ARGV.index('--snapshot_rev')
|
4
|
-
if ix
|
5
|
-
ARGV.delete_at(ix)
|
6
|
-
version = ARGV[ix]
|
7
|
-
ARGV.delete_at(ix)
|
8
|
-
else
|
9
|
-
version = :latest
|
10
|
-
end
|
11
|
-
|
12
|
-
Origen.command_dispatcher.create_workspace(version) do |workspace|
|
13
|
-
workspace.execute(ARGV)
|
14
|
-
end
|
15
|
-
|
16
|
-
else
|
17
|
-
fail 'Sorry no worker snapshots could be found!'
|
18
|
-
end
|
19
|
-
|
20
|
-
# rescue
|
21
|
-
# Origen.command_dispatcher.record_error
|
22
|
-
# end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
|
3
|
-
options = {}
|
4
|
-
Origen.log.deprecate <<-END
|
5
|
-
|
6
|
-
********************************************************************************************
|
7
|
-
The 'merge' command has now been deprecated as the same functionality can be achieved by
|
8
|
-
performing the following tasks:
|
9
|
-
|
10
|
-
origen compile [COMPILE DIRECTORY/FILE] -r [DIRECTORY/FILE FOR COMPARISON]
|
11
|
-
|
12
|
-
By using the -r switch, it overrides the default reference directory which origen uses,
|
13
|
-
therefore essentially allowing origen to diff between your output directory and any directory
|
14
|
-
of your choice (for example ASCII UTIL export directory)
|
15
|
-
*********************************************************************************************
|
16
|
-
END
|
17
|
-
# App options are options that the application can supply to extend this command
|
18
|
-
app_options = @application_options || []
|
19
|
-
opt_parser = OptionParser.new do |opts|
|
20
|
-
opts.banner = <<-EOT
|
21
|
-
The reverse of 'origen compile' to help merge any changes made to compiled files back to the source.
|
22
|
-
The arguments are the same as the compile command, so run the merge with the same arguments and it will merge instead of compile.
|
23
|
-
Changes are processed as follows:
|
24
|
-
* Any files with a non-erb source are simply copied back if they have changes.
|
25
|
-
* Any files that don't have a source copy are ignored.
|
26
|
-
* Any differences in files with an ERB source are left to the user to resolve. Origen tries to help by giving you the
|
27
|
-
commands to execute to show the differences and the files that must be edited.
|
28
|
-
|
29
|
-
Usage: origen merge [space separated files, lists or directories] [options]
|
30
|
-
EOT
|
31
|
-
opts.on('-t', '--target NAME', String, 'Override the default target, NAME can be a full path or a fragment of a target file name') { |t| options[:target] = t }
|
32
|
-
opts.on('-c', '--continue', 'Continue on error (to the next file)') { options[:continue] = true }
|
33
|
-
opts.on('-m', '--mode MODE', Origen::Mode::MODES, 'Force the Origen operating mode:', ' ' + Origen::Mode::MODES.join(', ')) { |_m| }
|
34
|
-
opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
|
35
|
-
opts.on('-f', '--file FILE', String, 'Override the default log file') { |o| options[:log_file] = o }
|
36
|
-
opts.on('-o', '--output DIR', String, 'Override the default output directory') { |o| options[:output] = o }
|
37
|
-
opts.on('-r', '--reference DIR', String, 'Override the default reference directory') { |o| options[:reference] = o }
|
38
|
-
app_options.each do |app_option|
|
39
|
-
opts.on(*app_option) {}
|
40
|
-
end
|
41
|
-
opts.separator ''
|
42
|
-
opts.on('-h', '--help', 'Show this message') { puts opts; exit 0 }
|
43
|
-
end
|
44
|
-
|
45
|
-
opt_parser.parse! ARGV
|
46
|
-
options[:patterns] = ARGV
|
47
|
-
options[:job_type] = :merge # To let the generator know a merge job has been requested
|
48
|
-
|
49
|
-
Origen.load_application
|
50
|
-
Origen.target.temporary = options[:target] if options[:target]
|
51
|
-
Origen.app.load_target!
|
52
|
-
|
53
|
-
Origen.app.runner.generate(options)
|
54
|
-
|
55
|
-
exit 0
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
Origen.load_application
|
3
|
-
if Origen.app.cm.modified_objects_in_workspace?
|
4
|
-
puts 'Your workspace has the following modifications:'
|
5
|
-
Origen.app.cm.modified_objects_in_workspace_list.each do |file|
|
6
|
-
puts ' ' + Origen.app.cm.diff_cmd + ' ' + file
|
7
|
-
end
|
8
|
-
else
|
9
|
-
puts 'Your workspace is clean!'
|
10
|
-
end
|
11
|
-
exit 0
|
12
|
-
end
|
data/lib/origen/pdm.rb
DELETED
@@ -1,218 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
module PDM
|
3
|
-
autoload :WebService, 'origen/pdm/web_service'
|
4
|
-
autoload :PI, 'origen/pdm/pi'
|
5
|
-
autoload :Tracker, 'origen/pdm/tracker'
|
6
|
-
|
7
|
-
require 'origen/pdm/attributes'
|
8
|
-
|
9
|
-
include Attributes
|
10
|
-
|
11
|
-
# Set true to use the PDM test system rather than the live system.
|
12
|
-
# The test system can be found at: http://designpdmtest.freescale.net/Agile
|
13
|
-
attr_accessor :pdm_use_test_system
|
14
|
-
|
15
|
-
# This should be set to the PDM version number that the current object represents.
|
16
|
-
# For example if the object represents C90TFS_NVM_tester_010, then set this
|
17
|
-
# attribute to 10.
|
18
|
-
#
|
19
|
-
# This attribute is required to be set when including a component in a BOM, otherwise
|
20
|
-
# it is not required to be set when releasing a new version.
|
21
|
-
#
|
22
|
-
# It can also be set to :latest to pick up the latest version number for the component.
|
23
|
-
attr_accessor :pdm_version_number
|
24
|
-
|
25
|
-
# Set this attribute to create a branch point release from the given version. If this
|
26
|
-
# attribute is not set then all releases will simply supercede the last release.
|
27
|
-
attr_accessor :pdm_branch_version_number
|
28
|
-
|
29
|
-
# Set this to specify which version the new release should supercede.
|
30
|
-
# If un-specified the new release will automatically supercede the last version on the
|
31
|
-
# trunk.
|
32
|
-
attr_accessor :pdm_supercedes_version_number
|
33
|
-
|
34
|
-
# Set this attribute to include components in the BOM, it should be set to an array
|
35
|
-
# of objects, each of which must also include the Origen::PDM module and have the
|
36
|
-
# pdm_version_number attribute set.
|
37
|
-
attr_accessor :pdm_bom
|
38
|
-
|
39
|
-
# If you begin automating PDM releases on a component that already exists on PDM, then
|
40
|
-
# you must set this attribute to let Origen know what the latest part number is on PDM.
|
41
|
-
#
|
42
|
-
# For example if the latest component is called C90TFS_NVM_tester_010 at the time of
|
43
|
-
# setting up the component in Origen then set this attribute to 10.
|
44
|
-
#
|
45
|
-
# If the object does not exist on PDM yet then you can leave this blank and Origen will
|
46
|
-
# create and begin tracking the component from the initial version.
|
47
|
-
attr_accessor :pdm_initial_version_number
|
48
|
-
|
49
|
-
attr_accessor :pdm_meta_tags
|
50
|
-
|
51
|
-
def self.update_ticket(tkt)
|
52
|
-
pdm_pi.update_ticket(tkt)
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.pdm_pi(_options = {})
|
56
|
-
@pdm_pi ||= PI.new(use_test_system: true)
|
57
|
-
end
|
58
|
-
|
59
|
-
def pdm_base_url
|
60
|
-
if pdm_use_test_system
|
61
|
-
host = 'http://designpdmtest.freescale.net'
|
62
|
-
else
|
63
|
-
host = 'http://designpdm.freescale.net'
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns the url for specific component version on PDM, i.e. if the model represents
|
68
|
-
# pdm component C90TFS_NVM_tester_010 then the link to that component version will be
|
69
|
-
# returned
|
70
|
-
def pdm_url
|
71
|
-
"#{pdm_base_url}/Agile/object/#{pdm_part_type}/#{pdm_part_number}"
|
72
|
-
end
|
73
|
-
|
74
|
-
# Returns the url for component's item group on PDM, i.e. if the model represents
|
75
|
-
# pdm component C90TFS_NVM_tester_010 then the link to C90TFS_NVM_tester will be
|
76
|
-
# returned
|
77
|
-
def pdm_item_group_url
|
78
|
-
"#{pdm_base_url}/Agile/object/Item Group/#{pdm_part_name}"
|
79
|
-
end
|
80
|
-
|
81
|
-
# The PI API, returns an instance of Origen::PDM::PI
|
82
|
-
def pdm_pi
|
83
|
-
@pdm_pi ||= PI.new(use_test_system: pdm_use_test_system)
|
84
|
-
end
|
85
|
-
|
86
|
-
# The PDM Web Service API, returns an instance of Origen::PDM::WebService
|
87
|
-
def pdm_web_service
|
88
|
-
@pdm_web_service ||= WebService.new
|
89
|
-
end
|
90
|
-
|
91
|
-
# When talking to PDM we need to use the 'Part Number' which is comprised
|
92
|
-
# of the part name plus a numeric revision.
|
93
|
-
#
|
94
|
-
# For example 'C90TFS_NVM_tester' is the part name, 'C90TFS_NVM_tester_058' is a
|
95
|
-
# possible part number.
|
96
|
-
def pdm_part_number
|
97
|
-
pdm_part_name + '_%03d' % _pdm_version_number
|
98
|
-
end
|
99
|
-
|
100
|
-
def pdm_branch_part_number
|
101
|
-
if pdm_branch_version_number
|
102
|
-
pdm_part_name + '_%03d' % pdm_branch_version_number
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
# Returns the latest part number regardless of whether it is on a branch or not
|
107
|
-
def pdm_latest_part_number
|
108
|
-
if pdm_latest_version_number
|
109
|
-
pdm_part_name + '_%03d' % pdm_latest_version_number
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# Returns the latest part number that is not on a branch
|
114
|
-
def pdm_latest_trunk_part_number
|
115
|
-
if pdm_latest_trunk_version_number
|
116
|
-
pdm_part_name + '_%03d' % pdm_latest_trunk_version_number
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def pdm_supercedes_part_number
|
121
|
-
if pdm_supercedes_version_number
|
122
|
-
pdm_part_name + '_%03d' % pdm_supercedes_version_number
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def pdm_bom
|
127
|
-
[]
|
128
|
-
end
|
129
|
-
|
130
|
-
def pdm_meta_tags
|
131
|
-
[]
|
132
|
-
end
|
133
|
-
|
134
|
-
def _pdm_version_number
|
135
|
-
if pdm_version_number && pdm_version_number != :latest
|
136
|
-
pdm_version_number
|
137
|
-
else
|
138
|
-
pdm_latest_version_number ||
|
139
|
-
fail("You must set the pdm_version_number attribute of #{self.class}")
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def pdm_latest_version_number
|
144
|
-
if pdm_tracker.latest_version_number
|
145
|
-
if pdm_initial_version_number &&
|
146
|
-
pdm_initial_version_number > pdm_tracker.latest_version_number
|
147
|
-
pdm_initial_version_number
|
148
|
-
else
|
149
|
-
pdm_tracker.latest_version_number
|
150
|
-
end
|
151
|
-
else
|
152
|
-
pdm_initial_version_number
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def pdm_latest_trunk_version_number
|
157
|
-
if pdm_tracker.latest_trunk_version_number
|
158
|
-
if pdm_initial_version_number &&
|
159
|
-
pdm_initial_version_number > pdm_tracker.latest_trunk_version_number
|
160
|
-
pdm_initial_version_number
|
161
|
-
else
|
162
|
-
pdm_tracker.latest_trunk_version_number
|
163
|
-
end
|
164
|
-
else
|
165
|
-
pdm_initial_version_number
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def pdm_supercedes_version_number
|
170
|
-
@pdm_supercedes_version_number || pdm_latest_trunk_version_number
|
171
|
-
end
|
172
|
-
|
173
|
-
def pdm_component_binding
|
174
|
-
binding
|
175
|
-
end
|
176
|
-
|
177
|
-
def pdm_tracker
|
178
|
-
@pdm_tracker ||= Tracker.new(component: self)
|
179
|
-
end
|
180
|
-
|
181
|
-
# Pulls the BOM from PDM into an array of hashes with the following keys:
|
182
|
-
#
|
183
|
-
# * :pdm_part_name (e.g. C90TFS_NVM_tester)
|
184
|
-
# * :pdm_version_number (e.g. 058 (actually returned as 58))
|
185
|
-
# * :pdm_version (e.g. Rel20121002)
|
186
|
-
def pdm_remote_bom
|
187
|
-
pdm_pi.catbom(self)
|
188
|
-
end
|
189
|
-
|
190
|
-
# Release a new component version to PDM
|
191
|
-
def pdm_release!(options = {})
|
192
|
-
options = {
|
193
|
-
release_bom: false
|
194
|
-
}.merge(options)
|
195
|
-
ret = pdm_pi.release!(self)
|
196
|
-
pdm_tracker.release!
|
197
|
-
ret
|
198
|
-
end
|
199
|
-
|
200
|
-
# This method is called before permanently saving a released component in the store,
|
201
|
-
# override it to set instance variables for anything you wish to save.
|
202
|
-
#
|
203
|
-
# Normally it is best to assign the result of any pdm attributes that come from
|
204
|
-
# methods as instance variables so that the current state of the component can
|
205
|
-
# be reconstructed later.
|
206
|
-
def freeze
|
207
|
-
end
|
208
|
-
|
209
|
-
def pdm_prepare_for_store
|
210
|
-
freeze
|
211
|
-
# Clear these so as not to waste effort Marshalling them
|
212
|
-
@pdm_pi = nil
|
213
|
-
@pdm_web_service = nil
|
214
|
-
@pdm_tracker = nil
|
215
|
-
@pi_attributes = nil
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
module Tester
|
3
|
-
# A base class that can be used to model command-based, rather than
|
4
|
-
# vector-based testers.
|
5
|
-
class CommandBasedTester
|
6
|
-
include Tester
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@vector_based = false
|
10
|
-
end
|
11
|
-
|
12
|
-
# Write a string directly to the output file without being processed
|
13
|
-
# or modified in any way
|
14
|
-
def direct_write(str)
|
15
|
-
microcode str
|
16
|
-
end
|
17
|
-
alias_method :dw, :direct_write
|
18
|
-
|
19
|
-
# Concept of a cycle not supported, print out an error to the output
|
20
|
-
# file to alert the user that execution has hit code that is not
|
21
|
-
# compatible with a command based tester.
|
22
|
-
def cycle(*_args)
|
23
|
-
microcode '*** Cycle called ***'
|
24
|
-
end
|
25
|
-
|
26
|
-
# Concept of a subroutine not supported, print out an error to the output
|
27
|
-
# file to alert the user that execution has hit code that is not
|
28
|
-
# compatible with a command based tester.
|
29
|
-
def call_subroutine(sub)
|
30
|
-
microcode "Call_subroutine called to #{sub}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def format_vector(vec)
|
34
|
-
vec.microcode
|
35
|
-
end
|
36
|
-
|
37
|
-
# Loop the content embedded in the supplied block
|
38
|
-
def loop(_name = nil, number_of_loops)
|
39
|
-
number_of_loops.times do
|
40
|
-
yield
|
41
|
-
end
|
42
|
-
end
|
43
|
-
alias_method :loop_vector, :loop
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,205 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
module Utility
|
3
|
-
# A class to handle the parsing of S-records
|
4
|
-
#
|
5
|
-
# An S-record file consists of a sequence of specially formatted ASCII character strings. An S-record will
|
6
|
-
# be less than or equal to 78 bytes in length.
|
7
|
-
# The order of S-records within a file is of no significance and no particular order may be assumed.
|
8
|
-
#
|
9
|
-
# The general format of an S-record follows:
|
10
|
-
#
|
11
|
-
# +-------------------//------------------//-----------------------+
|
12
|
-
# | type | count | address | data | checksum |
|
13
|
-
# +-------------------//------------------//-----------------------+
|
14
|
-
#
|
15
|
-
# type -- A char[2] field. These characters describe the type of record (S0, S1, S2, S3, S5, S7, S8, or S9).
|
16
|
-
# count -- A char[2] field. These characters when paired and interpreted as a hexadecimal value, display
|
17
|
-
# the count of remaining character pairs in the record.
|
18
|
-
#
|
19
|
-
# address -- A char[4,6, or 8] field. These characters grouped and interpreted as a hexadecimal value,
|
20
|
-
# display the address at which the data field is to be loaded into memory. The length of the field depends
|
21
|
-
# on the number of bytes necessary to hold the address. A 2-byte address uses 4 characters, a 3-byte
|
22
|
-
# address uses 6 characters, and a 4-byte address uses 8 characters.
|
23
|
-
#
|
24
|
-
# data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent
|
25
|
-
# the memory loadable data or descriptive information.
|
26
|
-
#
|
27
|
-
# data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent
|
28
|
-
# checksum -- A char[2] field. These characters when paired and interpreted as a hexadecimal value display
|
29
|
-
# the least significant byte of the ones complement of the sum of the byte values represented by the pairs
|
30
|
-
# of characters making up the count, the address, and the data fields.
|
31
|
-
#
|
32
|
-
# data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent
|
33
|
-
# Each record is terminated with a line feed. If any additional or different record terminator(s) or delay
|
34
|
-
# characters are needed during transmission to the target system it is the responsibility of the
|
35
|
-
# transmitting program to provide them.
|
36
|
-
#
|
37
|
-
# data -- A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent
|
38
|
-
# S0 Record. The type of record is 'S0' (0x5330). The address field is unused and will be filled with zeros
|
39
|
-
# (0x0000). The header information within the data field is divided into the following subfields.
|
40
|
-
#
|
41
|
-
# * mname is char[20] and is the module name.
|
42
|
-
# * ver is char[2] and is the version number.
|
43
|
-
# * rev is char[2] and is the revision number.
|
44
|
-
# * description is char[0-36] and is a text comment.
|
45
|
-
#
|
46
|
-
# Each of the subfields is composed of ASCII bytes whose associated characters, when paired, represent one
|
47
|
-
# byte hexadecimal values in the case of the version and revision numbers, or represent the hexadecimal
|
48
|
-
# values of the ASCII characters comprising the module name and description.
|
49
|
-
#
|
50
|
-
# S1 Record. The type of record field is 'S1' (0x5331). The address field is intrepreted as a 2-byte
|
51
|
-
# address. The data field is composed of memory loadable data.
|
52
|
-
#
|
53
|
-
# S2 Record. The type of record field is 'S2' (0x5332). The address field is intrepreted as a 3-byte
|
54
|
-
# address. The data field is composed of memory loadable data.
|
55
|
-
#
|
56
|
-
# S3 Record. The type of record field is 'S3' (0x5333). The address field is intrepreted as a 4-byte
|
57
|
-
# address. The data field is composed of memory loadable data.
|
58
|
-
#
|
59
|
-
# S5 Record. The type of record field is 'S5' (0x5335). The address field is intrepreted as a 2-byte value
|
60
|
-
# and contains the count of S1, S2, and S3 records previously transmitted. There is no data field.
|
61
|
-
#
|
62
|
-
# S7 Record. The type of record field is 'S7' (0x5337). The address field contains the starting execution
|
63
|
-
# address and is intrepreted as 4-byte address. There is no data field.
|
64
|
-
#
|
65
|
-
# S8 Record. The type of record field is 'S8' (0x5338). The address field contains the starting execution
|
66
|
-
# address and is intrepreted as 3-byte address. There is no data field.
|
67
|
-
#
|
68
|
-
# S9 Record. The type of record field is 'S9' (0x5339). The address field contains the starting execution
|
69
|
-
# address and is intrepreted as 2-byte address. There is no data field.
|
70
|
-
#
|
71
|
-
# EXAMPLE
|
72
|
-
#
|
73
|
-
# Shown below is a typical S-record format file.
|
74
|
-
#
|
75
|
-
# S00600004844521B
|
76
|
-
# S1130000285F245F2212226A000424290008237C2A
|
77
|
-
# S11300100002000800082629001853812341001813
|
78
|
-
# S113002041E900084E42234300182342000824A952
|
79
|
-
# S107003000144ED492
|
80
|
-
# S5030004F8
|
81
|
-
# S9030000FC
|
82
|
-
#
|
83
|
-
# The file consists of one S0 record, four S1 records, one S5 record and an S9 record.
|
84
|
-
#
|
85
|
-
# The S0 record is comprised as follows:
|
86
|
-
#
|
87
|
-
# * S0 S-record type S0, indicating it is a header record.
|
88
|
-
# * 06 Hexadecimal 06 (decimal 6), indicating that six character pairs (or ASCII bytes) follow.
|
89
|
-
# * 00 00 Four character 2-byte address field, zeroes in this example.
|
90
|
-
# * 48 44 52 ASCII H, D, and R - "HDR".
|
91
|
-
# * 1B The checksum.
|
92
|
-
#
|
93
|
-
# The first S1 record is comprised as follows:
|
94
|
-
#
|
95
|
-
# * S1 S-record type S1, indicating it is a data record to be loaded at a 2-byte address.
|
96
|
-
# * 13 Hexadecimal 13 (decimal 19), indicating that nineteen character pairs, representing a 2 byte address,
|
97
|
-
# * 16 bytes of binary data, and a 1 byte checksum, follow.
|
98
|
-
# * 00 00 Four character 2-byte address field; hexidecimal address 0x0000, where the data which follows is to
|
99
|
-
# be loaded.
|
100
|
-
# * 28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen character pairs representing the actual binary
|
101
|
-
# data.
|
102
|
-
# * 2A The checksum.
|
103
|
-
# * The second and third S1 records each contain 0x13 (19) character pairs and are ended with checksums of 13
|
104
|
-
# and 52, respectively. The fourth S1 record contains 07 character pairs and has a checksum of 92.
|
105
|
-
#
|
106
|
-
# The S5 record is comprised as follows:
|
107
|
-
#
|
108
|
-
# * S5 S-record type S5, indicating it is a count record indicating the number of S1 records
|
109
|
-
# * 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
|
110
|
-
# * 00 04 Hexadecimal 0004 (decimal 4), indicating that there are four data records previous to this record.
|
111
|
-
# * F8 The checksum.
|
112
|
-
#
|
113
|
-
# The S9 record is comprised as follows:
|
114
|
-
#
|
115
|
-
# * S9 S-record type S9, indicating it is a termination record.
|
116
|
-
# * 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow.
|
117
|
-
# * 00 00 The address field, hexadecimal 0 (decimal 0) indicating the starting execution address.
|
118
|
-
# * FC The checksum.
|
119
|
-
#
|
120
|
-
# --------------------------------------------------------------------------------
|
121
|
-
#
|
122
|
-
# Instructor Notes
|
123
|
-
#
|
124
|
-
# There isn't any evidence that Motorola ever has made use of the header information within the data field
|
125
|
-
# of the S0 record, as described above. This must have been used by some third party vendors.
|
126
|
-
# This is the only place that a 78-byte limit on total record length or 64-byte limit on data length is
|
127
|
-
# documented. These values shouldn't be trusted for the general case.
|
128
|
-
# The count field can have values in the range of 0x3 (2 bytes of address + 1 byte checksum = 3, a not
|
129
|
-
# very useful record) to 0xff; this is the count of remaining character pairs, including checksum.
|
130
|
-
# If you write code to convert S-Records, you should always assume that a record can be as long as 514
|
131
|
-
# (decimal) characters in length (255 * 2 = 510, plus 4 characters for the type and count fields), plus
|
132
|
-
# any terminating character(s). That is, in establishing an input buffer in C, you would declare it to be
|
133
|
-
# an array of 515 chars, thus leaving room for the terminating null character.
|
134
|
-
class SRecord
|
135
|
-
# Supply a path to the S-record file, this should be a relative path from the top
|
136
|
-
# level of your project workspace (Origen.root)
|
137
|
-
def initialize(file)
|
138
|
-
@file = file
|
139
|
-
end
|
140
|
-
|
141
|
-
# Parses the S-record and returns either an array of address and data values like this:
|
142
|
-
# * \[addr, data, addr, data, addr, data\]
|
143
|
-
# Or if a block is supplied it will pass back a single address and a single data value
|
144
|
-
# in turn.
|
145
|
-
# ==== Options
|
146
|
-
# * :data_width_in_bytes - By default the returned data items will be 1 byte wide, set
|
147
|
-
# this option to have it parsed and passed back in N byte wide packets
|
148
|
-
# ==== Example
|
149
|
-
# srec = SRecord.new("srecs/test_atd.abs.S19")
|
150
|
-
# $top.write_addr_data(srec.parse) # Let write_addr_data handle the processing
|
151
|
-
# # As above but pass the data to the top block in 16-bit packets
|
152
|
-
# $top.write_addr_data(srec.parse(:data_width_in_bytes => 2))
|
153
|
-
#
|
154
|
-
# # Handle the processing from here...
|
155
|
-
# srec.parse do |addr,data|
|
156
|
-
# $top.write(addr, data)
|
157
|
-
# end
|
158
|
-
def parse(options = {})
|
159
|
-
addr_data = extract_addr_data(options)
|
160
|
-
if block_given?
|
161
|
-
addr_data.each_slice(2) do |pair|
|
162
|
-
yield pair[0], pair[1]
|
163
|
-
end
|
164
|
-
else
|
165
|
-
addr_data
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
private
|
170
|
-
|
171
|
-
# Returns an array containing all address/data from the given s-record
|
172
|
-
# No address manipulation is performed, that is left to the caller to apply
|
173
|
-
# any scrambling as required by the target system
|
174
|
-
def extract_addr_data(options = {}) # :nodoc:
|
175
|
-
options = { data_width_in_bytes: 1
|
176
|
-
}.merge(options)
|
177
|
-
|
178
|
-
result = []
|
179
|
-
File.readlines(Origen.file_handler.clean_path_to(@file)).each do |line|
|
180
|
-
# Only if the line is an s-record with data...
|
181
|
-
if line =~ /^S([1-3])/
|
182
|
-
type = Regexp.last_match[1].to_i(16) # S-record type, 1-3
|
183
|
-
# Set the matcher to capture x number of bytes dependent on the s-rec type
|
184
|
-
addr_matcher = '\w\w' * (1 + type)
|
185
|
-
line.strip =~ /^S\d\w\w(#{addr_matcher})(\w*)\w\w$/ # $1 = address, $2 = data
|
186
|
-
addr = Regexp.last_match[1].to_i(16)
|
187
|
-
data = Regexp.last_match[2]
|
188
|
-
data_matcher = '\w\w' * options[:data_width_in_bytes]
|
189
|
-
data.scan(/#{data_matcher}/).each do |data_packet|
|
190
|
-
result << addr
|
191
|
-
result << data_packet.to_i(16)
|
192
|
-
addr += options[:data_width_in_bytes]
|
193
|
-
end
|
194
|
-
# If a partial word is left over
|
195
|
-
if (remainder = data.length % (2 * options[:data_width_in_bytes])) > 0
|
196
|
-
result << addr
|
197
|
-
result << data[data.length - remainder..data.length].to_i(16)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
result
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|