origen_memory_image 0.5.2 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dbd9fff5f4d4a999086de046e0c99a016a475f15
4
- data.tar.gz: a06173b18adeab5d1ce72f919cfa6b239bc04712
2
+ SHA256:
3
+ metadata.gz: 90f929c547d4a00df7450faf892f6f4ebed1c56d18b64e9315d810dd7774f55c
4
+ data.tar.gz: e209715c41348a5975f549f27babdc1d4e2c0473f6e935fff12148d2f2e7a5f0
5
5
  SHA512:
6
- metadata.gz: 549bd0444aa5942e410d5ceece65c21bed5d4561932e1632e9ca605838f8599eafeb4dd50cf6b24616564645b90b3eaf67550e6a6ea86d07fb2f2b6be38f7298
7
- data.tar.gz: cb109a9dc9fa36c486e8026ea5804ce7dd721882ecb2da6e76e63e915c6a07fcb6abd3ef3973632d1a8b766a4050ef0e94702135f669c5e7226bda6c1ce4b308
6
+ metadata.gz: 2319ac1964ce679181d45b9b79343604a90aad3149d3015ab1e8daf3e1edaf2045bf41aaba40680f371131f6278a363187caf2407b60fd7508cb4ecdc3792cdc
7
+ data.tar.gz: c8dae0921e4490b7a108cfbbb0a1ef0d93585fe8191c8e61dd2ef3debf624bd6333771d2f7ee24de638cb265f33653729e8def0e7bcc6812eeac689470f89a90
@@ -0,0 +1 @@
1
+ require "origen_memory_image"
@@ -1,8 +1,7 @@
1
1
  module OrigenMemoryImage
2
2
  MAJOR = 0
3
- MINOR = 5
4
- BUGFIX = 2
3
+ MINOR = 8
4
+ BUGFIX = 1
5
5
  DEV = nil
6
-
7
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
7
  end
@@ -1,8 +1,13 @@
1
1
  require 'origen'
2
2
  require_relative '../config/application.rb'
3
- require_relative '../config/environment.rb'
4
3
 
5
4
  module OrigenMemoryImage
5
+ autoload :Base, 'origen_memory_image/base'
6
+ autoload :SRecord, 'origen_memory_image/s_record'
7
+ autoload :Hex, 'origen_memory_image/hex'
8
+ autoload :Binary, 'origen_memory_image/binary'
9
+ autoload :IntelHex, 'origen_memory_image/intel_hex'
10
+
6
11
  def self.new(file, options = {})
7
12
  unless options[:source] == String
8
13
  file = Origen.file_handler.clean_path_to(file)
@@ -16,11 +21,19 @@ module OrigenMemoryImage
16
21
  if options[:source] == String
17
22
  snippet = file.split("\n")
18
23
  else
19
- snippet = File.foreach(file.to_s).first(1)
24
+ snippet = File.foreach(file.to_s).first(10)
20
25
  end
21
26
  case
27
+ # Always do the binary first since the others won't be able to process
28
+ # a binary snippet
29
+ when options[:type] == :binary || (options[:source] != String && Binary.match?(file))
30
+ Binary
31
+ when options[:source] == String && Binary.match?(snippet, true)
32
+ Binary
22
33
  when options[:type] == :srecord || SRecord.match?(snippet)
23
34
  SRecord
35
+ when options[:type] == :intel_hex || IntelHex.match?(snippet)
36
+ IntelHex
24
37
  when options[:type] == :hex || Hex.match?(snippet)
25
38
  Hex
26
39
  else
@@ -8,6 +8,7 @@ module OrigenMemoryImage
8
8
  else
9
9
  @file = file
10
10
  end
11
+ @ljust_partial_data = options[:ljust_partial_data]
11
12
  end
12
13
 
13
14
  # Returns the code execution start address as an int
@@ -50,7 +51,7 @@ module OrigenMemoryImage
50
51
 
51
52
  if options[:flip_endianness] || options[:endianness_change]
52
53
  data.map do |v|
53
- [v[0], flip_endianness(v[1], 4)]
54
+ [v[0], flip_endianness(v[1], options[:data_width_in_bytes])]
54
55
  end
55
56
  else
56
57
  data
@@ -0,0 +1,69 @@
1
+ module OrigenMemoryImage
2
+ class Binary < Base
3
+ def self.match?(file, snippet = false)
4
+ if snippet
5
+ file.all? { |l| l.strip =~ /^[01]*$/ }
6
+ else
7
+ # detect whether the data is mostly not alpha numeric
8
+ filedata = (File.read(file, 256) || '')
9
+ (filedata.gsub(/\s+/, '').gsub(/\w/, '').length.to_f / filedata.length.to_f) > 0.3
10
+ end
11
+ end
12
+
13
+ # Always returns 0 since binary files do not contain addresses
14
+ def start_address
15
+ 0
16
+ end
17
+
18
+ def create_test_file
19
+ data = [
20
+ 0x1EE0021C, 0x22401BE0, 0x021C2243,
21
+ 0x18E0021C, 0x5A780A43, 0x03E0034B,
22
+ 0xF7215A78, 0x0A400020, 0x22E08442,
23
+ 0x22D31FE0, 0x84421FD9, 0x1CE08442,
24
+ 0x002B20D1, 0x03E0012A, 0x01D1002B,
25
+ 0x1BD00223, 0x2340022A, 0x02D1002B,
26
+ 0x15D103E0, 0x032A01D1, 0x78000018,
27
+ 0x7C000018, 0x82000018, 0x88000018
28
+ ]
29
+ data = data.map { |d| d.to_s(2).rjust(32, '0') }.join
30
+ File.open('examples/bin1.bin', 'wb') do |output|
31
+ output.write [data].pack('B*')
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ # Returns an array containing all address/data from the given s-record
38
+ # No address manipulation is performed, that is left to the caller to apply
39
+ # any scrambling as required by the target system
40
+ def extract_addr_data(options = {})
41
+ options = {
42
+ data_width_in_bytes: 4
43
+ }.merge(options)
44
+
45
+ result = []
46
+ width = options[:data_width_in_bytes]
47
+ address = 0
48
+
49
+ if file
50
+ raw = File.binread(file)
51
+ bytes = raw.unpack('C*')
52
+ else
53
+ raw = lines.map(&:strip).join
54
+ bytes = raw.scan(/.{1,8}/).map { |s| s.to_i(2) }
55
+ end
56
+
57
+ bytes.each_slice(width) do |d|
58
+ v = 0
59
+ width.times do |i|
60
+ v |= d[i] << ((width - 1 - i) * 8) if d[i]
61
+ end
62
+ result << [address, v]
63
+ address += width
64
+ end
65
+
66
+ result
67
+ end
68
+ end
69
+ end
@@ -46,7 +46,11 @@ module OrigenMemoryImage
46
46
  end
47
47
  # If a partial word is left over
48
48
  if (remainder = data.length % (2 * options[:data_width_in_bytes])) > 0
49
- result << [@address, data[data.length - remainder..data.length].to_i(16)]
49
+ if @ljust_partial_data
50
+ result << [@address, data[data.length - remainder..data.length].ljust(options[:data_width_in_bytes] * 2, '0').to_i(16)]
51
+ else
52
+ result << [@address, data[data.length - remainder..data.length].to_i(16)]
53
+ end
50
54
  end
51
55
  end
52
56
  end
@@ -0,0 +1,98 @@
1
+ module OrigenMemoryImage
2
+ class IntelHex < Base
3
+ def self.match?(snippet)
4
+ snippet.all? do |line|
5
+ line.empty? || line =~ /^:[0-9A-Fa-f]{6}0[0-5]/
6
+ end
7
+ end
8
+
9
+ def start_address
10
+ @start_address ||= begin
11
+ addrs = []
12
+ lines.each do |line|
13
+ line = line.strip
14
+ if start_linear_address?(line)
15
+ addrs << decode(line)[:data].to_i(16)
16
+ end
17
+ end
18
+ addrs.last || 0
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def decode(line)
25
+ d = {}
26
+ if line =~ /^:([0-9A-Fa-f]{2})([0-9A-Fa-f]{4})(\d\d)([0-9A-Fa-f]+)([0-9A-Fa-f]{2})$/
27
+ d[:byte_count] = Regexp.last_match(1).to_i(16)
28
+ d[:address] = Regexp.last_match(2).to_i(16)
29
+ d[:record_type] = Regexp.last_match(3).to_i(16)
30
+ d[:data] = Regexp.last_match(4)
31
+ d[:checksum] = Regexp.last_match(5).to_i(16)
32
+ else
33
+ fail "Invalid line encountered in Intel Hex formatted file: #{line}"
34
+ end
35
+ d
36
+ end
37
+
38
+ def data?(line)
39
+ !!(line =~ /^:[0-9A-Fa-f]{6}00/)
40
+ end
41
+
42
+ def extended_segment_address?(line)
43
+ !!(line =~ /^:[0-9A-Fa-f]{6}02/)
44
+ end
45
+
46
+ def extended_linear_address?(line)
47
+ !!(line =~ /^:[0-9A-Fa-f]{6}04/)
48
+ end
49
+
50
+ def start_linear_address?(line)
51
+ !!(line =~ /^:[0-9A-Fa-f]{6}05/)
52
+ end
53
+
54
+ def upper_addr
55
+ @upper_addr || 0
56
+ end
57
+
58
+ def segment_address
59
+ @segment_address || 0
60
+ end
61
+
62
+ # Returns an array containing all address/data from the given s-record
63
+ # No address manipulation is performed, that is left to the caller to apply
64
+ # any scrambling as required by the target system
65
+ def extract_addr_data(options = {})
66
+ options = {
67
+ data_width_in_bytes: 4
68
+ }.merge(options)
69
+
70
+ result = []
71
+ lines.each do |line|
72
+ line = line.strip
73
+ if extended_segment_address?(line)
74
+ @segment_address = decode(line)[:data].to_i(16) * 16
75
+
76
+ elsif extended_linear_address?(line)
77
+ @upper_addr = (decode(line)[:data].to_i(16)) << 16
78
+
79
+ elsif data?(line)
80
+ d = decode(line)
81
+ addr = d[:address] + segment_address + upper_addr
82
+
83
+ data = d[:data]
84
+ data_matcher = '\w\w' * options[:data_width_in_bytes]
85
+ data.scan(/#{data_matcher}/).each do |data_packet|
86
+ result << [addr, data_packet.to_i(16)]
87
+ addr += options[:data_width_in_bytes]
88
+ end
89
+ # If a partial word is left over
90
+ if (remainder = data.length % (2 * options[:data_width_in_bytes])) > 0
91
+ result << [addr, data[data.length - remainder..data.length].to_i(16)]
92
+ end
93
+ end
94
+ end
95
+ result
96
+ end
97
+ end
98
+ end
@@ -202,7 +202,11 @@ module OrigenMemoryImage
202
202
  end
203
203
  # If a partial word is left over
204
204
  if (remainder = data.length % (2 * options[:data_width_in_bytes])) > 0
205
- result << [addr, data[data.length - remainder..data.length].to_i(16)]
205
+ if @ljust_partial_data
206
+ result << [addr, data[data.length - remainder..data.length].ljust(options[:data_width_in_bytes] * 2, '0').to_i(16)]
207
+ else
208
+ result << [addr, data[data.length - remainder..data.length].to_i(16)]
209
+ end
206
210
  end
207
211
  end
208
212
  end
@@ -58,6 +58,25 @@ my_srec = OrigenMemoryImage.new("source_files/test_atd.abs.S19")
58
58
  my_hex = OrigenMemoryImage.new("source_files/math.hex")
59
59
  ~~~
60
60
 
61
+ By default any partial data words are right justified. Change this behavior to left justified like this:
62
+
63
+ ~~~ruby
64
+ my_srec = OrigenMemoryImage.new("source_files/test_atd.abs.S19", ljust_partial_data: true)
65
+ my_hex = OrigenMemoryImage.new("source_files/math.hex", ljust_partial_data: true)
66
+ ~~~
67
+
68
+ Partial data example:
69
+
70
+ ~~~
71
+ 0304FE
72
+
73
+ # Default interpretation into 32-bit word:
74
+ 0x0003_04FE
75
+
76
+ # Left justified interpretation into 32-bit word:
77
+ 0x0304_FE00
78
+ ~~~
79
+
61
80
  Memory images can also be created directly from a string:
62
81
 
63
82
  ~~~ruby
@@ -135,6 +154,32 @@ The data lines can be grouped into any size:
135
154
  780000187C0000188200001888000018
136
155
  ~~~
137
156
 
157
+ #### Binary Files
158
+
159
+ A binary file:
160
+
161
+ ~~~text
162
+ 00001101000101010000111100010011
163
+ 00001110000101000001000000010010
164
+ 00000000000000000000010000010111
165
+ 00000100000000110000010100000110
166
+ ~~~
167
+
168
+ #### Intel Hex
169
+
170
+ Any valid Intel Hex file:
171
+
172
+ ~~~text
173
+ :020000040022D8
174
+ :10010000214601360121470136007EFE09D2190140
175
+ :100110002146017E17C20001FF5F16002148011928
176
+ :020000040023D7
177
+ :10012000194E79234623965778239EDA3F01B2CAA7
178
+ :100130003F0156702B5E712B722B732146013421C7
179
+ :0400000500000000F7
180
+ :00000001FF
181
+ ~~~
182
+
138
183
  ### How To Setup a Development Environment
139
184
 
140
185
  [Clone the repository from Github](https://github.com/Origen-SDK/origen_memory_image).
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_memory_image
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.8.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: 2016-01-06 00:00:00.000000000 Z
11
+ date: 2021-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -46,14 +46,14 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - config/application.rb
49
+ - config/boot.rb
49
50
  - config/commands.rb
50
- - config/development.rb
51
- - config/environment.rb
52
- - config/users.rb
53
51
  - config/version.rb
54
52
  - lib/origen_memory_image.rb
55
53
  - lib/origen_memory_image/base.rb
54
+ - lib/origen_memory_image/binary.rb
56
55
  - lib/origen_memory_image/hex.rb
56
+ - lib/origen_memory_image/intel_hex.rb
57
57
  - lib/origen_memory_image/s_record.rb
58
58
  - templates/web/index.md.erb
59
59
  - templates/web/layouts/_basic.html.erb
@@ -77,11 +77,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  - !ruby/object:Gem::Version
78
78
  version: 1.8.11
79
79
  requirements: []
80
- rubyforge_project:
81
- rubygems_version: 2.2.2
80
+ rubygems_version: 3.1.4
82
81
  signing_key:
83
82
  specification_version: 4
84
83
  summary: Provides a standard API for consuming memory image files in any format e.g.
85
84
  s-record, hex
86
85
  test_files: []
87
- has_rdoc:
@@ -1,12 +0,0 @@
1
- # This file is similar to environment.rb and will be loaded
2
- # automatically at the start of each invocation of Origen.
3
- #
4
- # However the major difference is that it will not be loaded
5
- # if the application is imported by a 3rd party app - in that
6
- # case only environment.rb is loaded.
7
- #
8
- # Therefore this file should be used to load anything you need
9
- # to setup a development environment for this app, normally
10
- # this would be used to load some dummy classes to instantiate
11
- # your objects so that they can be tested and/or interacted with
12
- # in the console.
@@ -1,40 +0,0 @@
1
- # This file will be required by Origen before your target is loaded, you
2
- # can use this to require all of your files, which is the easiest way
3
- # to get started. As your experience grows you may wish to require only the
4
- # minimum files required to allow the target to be initialized and let
5
- # each class require its own dependencies.
6
- #
7
- # It is recommended that you keep all of your application logic in lib/
8
- # The lib directory has already been added to the search path and so any files
9
- # in there can be referenced from here with a relative path.
10
- #
11
- # Note that pattern files do not need to be referenced from here and these
12
- # will be located automatically by origen.
13
- #
14
- # Examples
15
- # --------
16
- # This says load the file "lib/pioneer.rb" the first time anyone makes a
17
- # reference to the class name 'Pioneer'.
18
- #autoload :Pioneer, "pioneer"
19
- #
20
- # This is generally preferable to using require which will load the file
21
- # regardless of whether it is needed by the current target or not:
22
- #require "pioneer"
23
- #
24
- # Sometimes you have to use require however:-
25
- # 1. When defining a test program interface:
26
- #require "interfaces/j750"
27
- # 2. If you want to extend a class defined by an imported plugin, in
28
- # this case your must use required and supply a full path (to distinguish
29
- # it from the one in the parent application):
30
- #require "#{Origen.root}/c90_top_level/p2"
31
-
32
- # Plugins should not use a wildcard import of the lib directory to help
33
- # prevent long start up times, only require what is necessary to boot and
34
- # use autoload for everything else.
35
- module OrigenMemoryImage
36
- autoload :Base, "origen_memory_image/base"
37
- autoload :SRecord, "origen_memory_image/s_record"
38
- autoload :Hex, "origen_memory_image/hex"
39
- end
40
- require "origen_memory_image"
@@ -1,18 +0,0 @@
1
- # This file defines the users associated with your project, it is basically the
2
- # mailing list for release notes.
3
- #
4
- # You can split your users into "admin" and "user" groups, the main difference
5
- # between the two is that admin users will get all tag emails, users will get
6
- # emails on external/official releases only.
7
- #
8
- # Users are also prohibited from running the "origen tag" task, but this is
9
- # really just to prevent a casual user from executing it inadvertently and is
10
- # not intended to be a serious security gate.
11
- module Origen
12
- module Users
13
- def users
14
- @users ||= [
15
- ]
16
- end
17
- end
18
- end