origen 0.4.0 → 0.4.1
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 +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
|