cross_origen 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/config/version.rb +1 -2
- data/lib/cross_origen/ip_xact.rb +244 -36
- data/lib/cross_origen_dev/dut.rb +69 -10
- data/templates/test/ip_xact_1685-2009.xml.erb +1 -0
- data/templates/test/ip_xact_sub_block_1685.xml.erb +1 -0
- data/templates/web/examples.md.erb +2 -1
- data/templates/web/examples/ip_xact_export.md.erb +1 -1
- data/templates/web/examples/ip_xact_export_1685_2009.md.erb +32 -0
- data/templates/web/index.md.erb +4 -2
- metadata +8 -7
- data/bin/fix_my_workspace +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9cbda922846a3192f534c1eeca9e5986e9d8ccbbffb0ecc40c3d1b4ab78ab199
|
4
|
+
data.tar.gz: 6fe704ff82b2a145cdcb53ace6c3f505f85778f45c76276f45d80bf8efb96a72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dc7ade444c8d342e87fadbb265a0756a703fa6043a4139692dac5b0cf93b0c27583f79d405b932597df8d81735b9e969c49404ce072acae7e3a854a7a83319c
|
7
|
+
data.tar.gz: f7e12c505f30f7ae7fdecd9e5e1bb9446c43659b9413972288b0c7ff244eec80cbe10bda6cf70d757112ed698c2f7e8b8d35d93482a248192c84673966c3af15
|
data/config/version.rb
CHANGED
data/lib/cross_origen/ip_xact.rb
CHANGED
@@ -6,6 +6,9 @@ module CrossOrigen
|
|
6
6
|
|
7
7
|
AddressBlock = Struct.new(:name, :base_address, :range, :width)
|
8
8
|
|
9
|
+
# Create a shorthand way to reference Origen Core's Bit ACCESS_CODES
|
10
|
+
@@access_hash = Origen::Registers::Bit.const_get(:ACCESS_CODES)
|
11
|
+
|
9
12
|
# Import/reader that currently only supports creating registers and bit fields
|
10
13
|
def import(file, options = {}) # rubocop:disable CyclomaticComplexity
|
11
14
|
require 'kramdown'
|
@@ -57,24 +60,65 @@ module CrossOrigen
|
|
57
60
|
size = fetch register.at_xpath('spirit:size'), get_text: true, to_i: true
|
58
61
|
addr_offset = fetch register.at_xpath('spirit:addressOffset'), get_text: true, to_dec: true
|
59
62
|
access = fetch register.at_xpath('spirit:access'), get_text: true
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
#
|
64
|
-
reset_value
|
63
|
+
# Determine if a reset is defined for the register
|
64
|
+
if register.at_xpath('spirit:reset').nil?
|
65
|
+
# If a reset does not exist, need to set the reset_value to 0, as Origen does not (yet) have a concept
|
66
|
+
# of a register without a reset.
|
67
|
+
reset_value = 0
|
65
68
|
else
|
66
|
-
#
|
67
|
-
reset_value =
|
69
|
+
# If a reset exists, determine the reset_value (required) and reset_mask (if defined)
|
70
|
+
reset_value = fetch register.at_xpath('spirit:reset/spirit:value'), get_text: true, to_dec: true
|
71
|
+
reset_mask = fetch register.at_xpath('spirit:reset/spirit:mask'), get_text: true, to_dec: true
|
72
|
+
# Issue #8 fix - reset_mask is optional, keep reset value as imported when a mask is not defined.
|
73
|
+
# Only perform AND-ing if mask is defined. Only zero-out the reset_value if reset_value was nil.
|
74
|
+
if reset_value.nil?
|
75
|
+
# Set default for reset_value attribute if none was provided and issue a warning.
|
76
|
+
reset_value = 0
|
77
|
+
Origen.log.warning "Register #{name.upcase} was defined as having a reset, but did not have a defined reset value. This is not compliant with IP-XACT standard."
|
78
|
+
Origen.log.warning "The reset value for #{name.upcase} has been defined as 0x0 as a result."
|
79
|
+
elsif reset_mask.nil?
|
80
|
+
# If mask is undefined, leave reset_value alone.
|
81
|
+
else
|
82
|
+
# Do a logical bitwise AND with the reset value and mask
|
83
|
+
reset_value = reset_value & reset_mask
|
84
|
+
end
|
68
85
|
end
|
86
|
+
# Future expansion: pull in HDL path as abs_path in Origen.
|
69
87
|
addr_block_obj.reg name, addr_offset, size: size, access: access, description: reg_description(register) do |reg|
|
70
88
|
register.xpath('spirit:field').each do |field|
|
71
89
|
name = fetch field.at_xpath('spirit:name'), downcase: true, to_sym: true, get_text: true
|
72
90
|
bit_offset = fetch field.at_xpath('spirit:bitOffset'), get_text: true, to_i: true
|
73
91
|
bit_width = fetch field.at_xpath('spirit:bitWidth'), get_text: true, to_i: true
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
92
|
+
xml_access = fetch field.at_xpath('spirit:access'), get_text: true
|
93
|
+
# Newer IP-XACT standards list access as < read or write>-< descriptor >, such as
|
94
|
+
# "read-write", "read-only", or "read-writeOnce"
|
95
|
+
if xml_access =~ /\S+\-\S+/ || xml_access == 'writeOnce'
|
96
|
+
# This filter alone is not capable of interpreting the 1685-2009 (and 2014). Therefore
|
97
|
+
# must reverse-interpret the content of access_hash (see top of file).
|
98
|
+
#
|
99
|
+
# First get the base access type, ie: read-write, read-only, etc.
|
100
|
+
# base_access = fetch field.at_xpath('spirit:access'), get_text: true
|
101
|
+
base_access = xml_access
|
102
|
+
# Next grab any modified write values or read actions
|
103
|
+
mod_write = fetch field.at_xpath('spirit:modifiedWriteValue'), get_text: true
|
104
|
+
read_action = fetch field.at_xpath('spirit:readAction'), get_text: true
|
105
|
+
# Using base_access, mod_write, and read_action, look up the corresponding access
|
106
|
+
# acronym from access_hash, noting it is not possible to differentiate write-only
|
107
|
+
# from write-only, read zero and read-write from dc.
|
108
|
+
#
|
109
|
+
# Matched needs to be tracked, as there is no way to differentiate :rw and :dc in IP-XACT.
|
110
|
+
# Everything imported will default to :rw, never :dc.
|
111
|
+
matched = false
|
112
|
+
@@access_hash.each_key do |key|
|
113
|
+
if @@access_hash[key][:base] == base_access && @@access_hash[key][:write] == mod_write && @@access_hash[key][:read] == read_action && !matched
|
114
|
+
access = key.to_sym
|
115
|
+
matched = true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
# Older IP-XACT standards appear to also accept short acronyms like "ro", "w1c", "rw",
|
119
|
+
# etc.
|
120
|
+
elsif xml_access =~ /\S+/
|
121
|
+
access = xml_access.downcase.to_sym
|
78
122
|
else
|
79
123
|
# default to read-write if access is not specified
|
80
124
|
access = :rw
|
@@ -93,7 +137,7 @@ module CrossOrigen
|
|
93
137
|
end
|
94
138
|
end
|
95
139
|
model.export(filename, include_timestamp: CrossOrigen.include_timestamp?)
|
96
|
-
owner.import(filename)
|
140
|
+
owner.import(filename, options)
|
97
141
|
end
|
98
142
|
|
99
143
|
def doc(path, options = {})
|
@@ -117,6 +161,14 @@ xsi:schemaLocation="$REGMEM_HOME/builder/ipxact/schema/ipxact
|
|
117
161
|
end
|
118
162
|
|
119
163
|
# Returns a string representing the owner object in IP-XACT XML
|
164
|
+
# Usable / Available options:
|
165
|
+
# :vendor = Company name/web address, ex: 'nxp.com'
|
166
|
+
# :library = IP Library
|
167
|
+
# :schema = '1685-2009' or default of Spirit 1.4 (when no :schema option passed)
|
168
|
+
# :bus_interface = only 'AMBA3' supported at this time
|
169
|
+
# :mmap_name = Optionally set the memoryMap name to something other than the module name
|
170
|
+
# :mmap_ref = memoryMapRef name, ex: 'UserMap'
|
171
|
+
# :addr_block_name = addressBlock -> Name, ex: 'ATX'
|
120
172
|
def owner_to_xml(options = {})
|
121
173
|
require 'nokogiri'
|
122
174
|
|
@@ -126,21 +178,43 @@ xsi:schemaLocation="$REGMEM_HOME/builder/ipxact/schema/ipxact
|
|
126
178
|
|
127
179
|
@format = options[:format]
|
128
180
|
|
129
|
-
schemas
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
181
|
+
# Compatible schemas: Spirit 1.4, 1685-2009
|
182
|
+
# Assume Spirit 1.4 if no schema provided
|
183
|
+
if options[:schema] == '1685-2009' # Magillem tool uses alternate schema
|
184
|
+
schemas = [
|
185
|
+
'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009',
|
186
|
+
'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd'
|
187
|
+
]
|
188
|
+
else # Assume Spirit 1.4 if not
|
189
|
+
schemas = [
|
190
|
+
'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4',
|
191
|
+
'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4/index.xsd'
|
192
|
+
]
|
193
|
+
end
|
194
|
+
|
195
|
+
if uvm? && !(options[:schema] == '1685-2009')
|
134
196
|
schemas << '$IREG_GEN/XMLSchema/SPIRIT/VendorExtensions.xsd'
|
135
197
|
end
|
136
198
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
199
|
+
if options[:schema] == '1685-2009' # Magillem tool uses alternate schema
|
200
|
+
headers = {
|
201
|
+
'xmlns:spirit' => 'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009',
|
202
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
203
|
+
'xsi:schemaLocation' => schemas.join(' ')
|
204
|
+
}
|
205
|
+
else # Assume Spirit 1.4 if not
|
206
|
+
headers = {
|
207
|
+
'xmlns:spirit' => 'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4',
|
208
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
209
|
+
'xsi:schemaLocation' => schemas.join(' ')
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
213
|
+
if uvm? && !(options[:schema] == '1685-2009')
|
143
214
|
headers['xmlns:vendorExtensions'] = '$IREG_GEN/XMLSchema/SPIRIT'
|
215
|
+
# Else:
|
216
|
+
# Do nothing ?
|
217
|
+
# headers['xmlns:vendorExtensions'] = '$UVM_RGM_HOME/builder/ipxact/schema'
|
144
218
|
end
|
145
219
|
|
146
220
|
builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
@@ -151,19 +225,48 @@ xsi:schemaLocation="$REGMEM_HOME/builder/ipxact/schema/ipxact
|
|
151
225
|
# I guess this should really be the register owner's owner's name?
|
152
226
|
spirit.name try(:ip_name) || owner.class.to_s.split('::').last
|
153
227
|
spirit.version try(:ip_version, :version, :revision)
|
228
|
+
# The 1685-2009 schema allows for a bus interface. AMBA3 (slave) supported so far.
|
229
|
+
if options[:schema] == '1685-2009'
|
230
|
+
if options[:bus_interface] == 'AMBA3'
|
231
|
+
spirit.busInterfaces do
|
232
|
+
spirit.busInterface do
|
233
|
+
spirit.name 'Slave'
|
234
|
+
bustype_header = {
|
235
|
+
'spirit:vendor' => options[:vendor] || 'Origen',
|
236
|
+
'spirit:library' => 'amba3',
|
237
|
+
'spirit:name' => 'APB3',
|
238
|
+
'spirit:version' => '1.0'
|
239
|
+
}
|
240
|
+
xml['spirit'].busType bustype_header
|
241
|
+
spirit.slave do
|
242
|
+
mmapref_header = {
|
243
|
+
'spirit:memoryMapRef' => options[:mmap_ref] || 'APB'
|
244
|
+
}
|
245
|
+
xml['spirit'].memoryMapRef mmapref_header
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
154
251
|
spirit.memoryMaps do
|
155
252
|
memory_maps.each do |map_name, _map|
|
156
253
|
spirit.memoryMap do
|
157
|
-
|
254
|
+
# Optionally assign memory map name to something other than the module name in Ruby,
|
255
|
+
# default to 'RegisterMap'
|
256
|
+
spirit.name options[:mmap_name] || 'RegisterMap'
|
158
257
|
address_blocks do |domain_name, _domain, sub_block|
|
159
258
|
spirit.addressBlock do
|
259
|
+
# When registers reside at the top level, do not assign an address block name
|
160
260
|
if sub_block == owner
|
161
|
-
|
162
|
-
|
261
|
+
if options[:addr_block_name].nil?
|
262
|
+
spirit.name nil
|
263
|
+
else
|
264
|
+
spirit.name options[:addr_block_name]
|
265
|
+
end
|
163
266
|
else
|
164
267
|
spirit.name address_block_name(domain_name, sub_block)
|
165
|
-
spirit.baseAddress sub_block.base_address.to_hex
|
166
268
|
end
|
269
|
+
spirit.baseAddress sub_block.base_address.to_hex
|
167
270
|
spirit.range range(sub_block)
|
168
271
|
spirit.width width(sub_block)
|
169
272
|
sub_block.regs.each do |name, reg|
|
@@ -189,7 +292,94 @@ xsi:schemaLocation="$REGMEM_HOME/builder/ipxact/schema/ipxact
|
|
189
292
|
spirit.description try(bits, :brief_description, :name_full, :full_name)
|
190
293
|
spirit.bitOffset bits.position
|
191
294
|
spirit.bitWidth bits.size
|
192
|
-
|
295
|
+
# When exporting to 1685-2009 schema, need to handle special cases (writeOnce),
|
296
|
+
# modifiedWriteValue, and readAction fields.
|
297
|
+
if options[:schema] == '1685-2009'
|
298
|
+
if bits.writable? && bits.readable?
|
299
|
+
if bits.access == :w1
|
300
|
+
spirit.access 'read-writeOnce'
|
301
|
+
else
|
302
|
+
spirit.access 'read-write'
|
303
|
+
end
|
304
|
+
elsif bits.writable?
|
305
|
+
if bits.access == :wo1
|
306
|
+
spirit.access 'writeOnce'
|
307
|
+
else
|
308
|
+
spirit.access 'write-only'
|
309
|
+
end
|
310
|
+
elsif bits.readable?
|
311
|
+
spirit.access 'read-only'
|
312
|
+
end
|
313
|
+
if bits.readable?
|
314
|
+
unless @@access_hash[bits.access][:read].nil?
|
315
|
+
spirit.readAction @@access_hash[bits.access][:read]
|
316
|
+
end
|
317
|
+
end
|
318
|
+
if bits.writable?
|
319
|
+
unless @@access_hash[bits.access][:write].nil?
|
320
|
+
spirit.modifiedWriteValue @@access_hash[bits.access][:write]
|
321
|
+
end
|
322
|
+
end
|
323
|
+
else # Assume Spirit 1.4 if not
|
324
|
+
spirit.access bits.access
|
325
|
+
end
|
326
|
+
# HDL paths provide hooks for a testbench to directly manipulate the
|
327
|
+
# registers without having to go through a bus interface or read/write
|
328
|
+
# protocol. Because the hierarchical path to a register block can vary
|
329
|
+
# greatly between devices, allow the user to provide an abs_path value
|
330
|
+
# and define "full_reg_path" to assist.
|
331
|
+
#
|
332
|
+
# When registers reside at the top level without a specified path, use 'top'.
|
333
|
+
if reg.owner.path.nil? || reg.owner.path.empty?
|
334
|
+
regpath = 'top'
|
335
|
+
else
|
336
|
+
regpath = reg.owner.path
|
337
|
+
end
|
338
|
+
# If :full_reg_path is defined, the :abs_path metadata for a register will
|
339
|
+
# be used for regpath. This can be assigned at an address block (sub-block)
|
340
|
+
# level.
|
341
|
+
unless options[:full_reg_path].nil? == true
|
342
|
+
regpath = reg.path
|
343
|
+
end
|
344
|
+
if options[:schema] == '1685-2009'
|
345
|
+
spirit.parameters do
|
346
|
+
spirit.parameter do
|
347
|
+
spirit.name '_hdlPath_'
|
348
|
+
# HDL path needs to be to the declared bit field name, NOT to the bus slice
|
349
|
+
# that Origen's "abs_path" will yield. Ex:
|
350
|
+
#
|
351
|
+
# ~~~ ruby
|
352
|
+
# reg :myreg, 0x0, size: 32 do |reg|
|
353
|
+
# bits 7..4, :bits_high
|
354
|
+
# bits 3..0, :bits_low
|
355
|
+
# end
|
356
|
+
# ~~~
|
357
|
+
#
|
358
|
+
# The abs_path to ...regs(:myreg).bits(:bits_low).abs_path will yield
|
359
|
+
# "myreg.myreg[3:0]", not "myreg.bits_low". This is not an understood path
|
360
|
+
# in Origen (myreg[3:0] does not exist in either myreg's RegCollection or BitCollection),
|
361
|
+
# and does not sync with how RTL would create bits_low[3:0].
|
362
|
+
# Therefore, use the path to "myreg"'s owner appended with bits.name (bits_low here).
|
363
|
+
#
|
364
|
+
# This can be done in a register or sub_blocks definition by defining register
|
365
|
+
# metadata for "abs_path". If the reg owner's path weren't used, but instead the
|
366
|
+
# reg's path, that would imply each register was a separate hierarchical path in
|
367
|
+
# RTL (ex: "top.myblock.regblock.myreg.myreg_bits"), which is normally not the case.
|
368
|
+
# The most likely path would be "top.myblock.regblock.myreg_bits.
|
369
|
+
spirit.value "#{regpath}.#{bits.name}"
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
# C. Hume - Unclear which vendorExtensions should be included by default, if any.
|
374
|
+
# Future improvment: Allow passing of vendorExtensions enable & value hash/string
|
375
|
+
# if options[:schema] == '1685-2009'
|
376
|
+
# spirit.vendorExtensions do
|
377
|
+
# vendorext = { 'xmlns:vendorExtensions' => '$UVM_RGM_HOME/builder/ipxact/schema' }
|
378
|
+
# xml['vendorExtensions'].hdl_path vendorext, "#{reg.path}.#{bits.name}"
|
379
|
+
# end
|
380
|
+
# end
|
381
|
+
|
382
|
+
# Allow optional inclusion of bit field values and descriptions
|
193
383
|
if options[:include_bit_field_values]
|
194
384
|
if bits.bit_value_descriptions[0]
|
195
385
|
bits.bit_value_descriptions.each do |val, desc|
|
@@ -201,28 +391,46 @@ xsi:schemaLocation="$REGMEM_HOME/builder/ipxact/schema/ipxact
|
|
201
391
|
end
|
202
392
|
end
|
203
393
|
end
|
204
|
-
if uvm?
|
394
|
+
if uvm? && !(options[:schema] == '1685-2009')
|
205
395
|
spirit.vendorExtensions do
|
206
|
-
xml['vendorExtensions'].hdl_path bits.
|
396
|
+
xml['vendorExtensions'].hdl_path "#{regpath}.#{bits.name}"
|
207
397
|
end
|
208
398
|
end
|
209
399
|
end
|
210
400
|
end
|
211
401
|
end
|
212
402
|
end
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
end
|
403
|
+
# Unclear whether addressBlock vendor extensions are supported in Spirit 1.4
|
404
|
+
# if uvm?
|
405
|
+
# spirit.vendorExtensions do
|
406
|
+
# xml['vendorExtensions'].hdl_path sub_block.path(relative_to: owner)
|
407
|
+
# end
|
408
|
+
# end
|
409
|
+
end
|
410
|
+
end
|
411
|
+
# Assume byte addressing if not specified
|
412
|
+
if owner.methods.include?(:lau) == false
|
413
|
+
if methods.include?(:lau) == true
|
414
|
+
spirit.addressUnitBits lau
|
415
|
+
else
|
416
|
+
spirit.addressUnitBits 8
|
218
417
|
end
|
418
|
+
else
|
419
|
+
spirit.addressUnitBits owner.lau
|
219
420
|
end
|
220
421
|
end
|
221
422
|
end
|
222
423
|
end
|
223
424
|
end
|
224
425
|
end
|
225
|
-
|
426
|
+
# When testing with 'origen examples', travis_ci (bash) will end up with empty tags -
|
427
|
+
# '<spirit:description/>' that do not appear on some user's tshell environments. To
|
428
|
+
# prevent false errors for this issue, force Nokogiri to use self-closing tags
|
429
|
+
# ('<spirit:description></spirit:description>'), but keep the XML formatted for readability.
|
430
|
+
# All tags with no content will appear as '<spirit:tag_name></spirit:tag_name>'.
|
431
|
+
#
|
432
|
+
builder.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
|
433
|
+
Nokogiri::XML::Node::SaveOptions::FORMAT)
|
226
434
|
end
|
227
435
|
|
228
436
|
private
|
data/lib/cross_origen_dev/dut.rb
CHANGED
@@ -22,6 +22,7 @@ module CrossOrigenDev
|
|
22
22
|
cr_import(path: "#{Origen.root}/imports/ipxact.xml")
|
23
23
|
end
|
24
24
|
|
25
|
+
# Import Spirit 1.4 version of ATX
|
25
26
|
def add_atx2
|
26
27
|
sub_block :atx2, class_name: 'ATX2', base_address: 0x6000_0000
|
27
28
|
end
|
@@ -31,7 +32,21 @@ module CrossOrigenDev
|
|
31
32
|
include CrossOrigen
|
32
33
|
|
33
34
|
def initialize
|
34
|
-
cr_import(path: "#{Origen.root}/approved/ip_xact_sub_block.xml")
|
35
|
+
cr_import(path: "#{Origen.root}/approved/ip_xact_sub_block.xml", refresh: true)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Import 1685-2009 version of ATX
|
40
|
+
def add_atx3
|
41
|
+
sub_block :atx3, class_name: 'ATX3', base_address: 0x7000_0000
|
42
|
+
end
|
43
|
+
|
44
|
+
class ATX3
|
45
|
+
include Origen::Model
|
46
|
+
include CrossOrigen
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
cr_import(path: "#{Origen.root}/approved/ip_xact_sub_block_1685.xml", refresh: true)
|
35
50
|
end
|
36
51
|
end
|
37
52
|
|
@@ -40,21 +55,65 @@ module CrossOrigenDev
|
|
40
55
|
include CrossOrigen
|
41
56
|
|
42
57
|
def initialize
|
43
|
-
# A manually defined
|
58
|
+
# A manually defined set of registers for testing the conversion of any specific attributes
|
44
59
|
|
45
|
-
# **
|
46
|
-
#
|
60
|
+
# ** MPU Clock Divider Register **
|
61
|
+
#
|
62
|
+
# The MCLKDIV register is used to divide down the frequency of the OSCCLK input. If the MCLKDIV
|
47
63
|
# register is set to value "N", then the output (beat) frequency of the clock divider is OSCCLK / (N+1). The
|
48
|
-
# resulting beats are, in turn, counted by the
|
49
|
-
# operations.
|
64
|
+
# resulting beats are, in turn, counted by the TIMER module to control the duration of operations.
|
50
65
|
# This is a test of potentially problematic characters ' " \' \" < >
|
51
66
|
reg :mclkdiv, 0x0, size: 16, bit_order: 'decrement' do
|
52
|
-
# **Oscillator (Hi)** -
|
53
|
-
#
|
67
|
+
# **Oscillator (Hi)** - Clock source selection. (Note that in addition to this firmware-controlled bit, the
|
68
|
+
# clock source is also dependent on test and power control discretes).
|
54
69
|
#
|
55
|
-
# 0 |
|
56
|
-
# 1 |
|
70
|
+
# 0 | Clock is the externally supplied bus clock bus_clk
|
71
|
+
# 1 | Clock is the internal oscillator from the hardblock
|
57
72
|
bit 15, :osch, reset: 1, access: :rw
|
73
|
+
# **Divider Value**
|
74
|
+
#
|
75
|
+
# Used to set clock divider value and test multi-bit import in CrossOrigen
|
76
|
+
bits 3..0, :div
|
77
|
+
end
|
78
|
+
|
79
|
+
# **Access Type Test Register**
|
80
|
+
#
|
81
|
+
# This register tests the IP-XACT export of various bit access types, such as write-one-to-clear,
|
82
|
+
# read-only, etc.
|
83
|
+
reg :access_types, 0x4, size: 32 do
|
84
|
+
# Test read-only access.
|
85
|
+
bit 31, :readonly, access: :ro
|
86
|
+
# Test read-write access.
|
87
|
+
bit 30, :readwrite, access: :rw
|
88
|
+
# Test read-clear access, where a read clears the value afterwards.
|
89
|
+
bit 29, :readclear, access: :rc
|
90
|
+
# Test read-set access, where a read sets the bit afterwards.
|
91
|
+
bit 28, :readset, access: :rs
|
92
|
+
# Test writable, clear-on-read access, etc...
|
93
|
+
bit 27, :writablereadclear, access: :wrc
|
94
|
+
bit 26, :writablereadset, access: :wrs
|
95
|
+
bit 25, :writeclear, access: :wc
|
96
|
+
bit 24, :writeset, access: :ws
|
97
|
+
bit 23, :writesetreadclear, access: :wsrc
|
98
|
+
bit 22, :writeclearreadset, access: :wcrs
|
99
|
+
bit 21, :write1toclear, access: :w1c
|
100
|
+
bit 20, :write1toset, access: :w1s
|
101
|
+
bit 19, :write1totoggle, access: :w1t
|
102
|
+
bit 18, :write0toclear, access: :w0c
|
103
|
+
bit 17, :write0toset, access: :w0s
|
104
|
+
bit 16, :write0totoggle, access: :w0t
|
105
|
+
bit 15, :write1tosetreadclear, access: :w1src
|
106
|
+
bit 14, :write1toclearreadset, access: :w1crs
|
107
|
+
bit 13, :write0tosetreadclear, access: :w0src
|
108
|
+
bit 12, :write0toclearreadset, access: :w0crs
|
109
|
+
bit 11, :writeonly, access: :wo
|
110
|
+
bit 10, :writeonlyclear, access: :woc
|
111
|
+
bit 9, :writeonlyreadzero, access: :worz
|
112
|
+
bit 8, :writeonlyset, access: :wos
|
113
|
+
bit 7, :writeonce, access: :w1
|
114
|
+
bit 6, :writeonlyonce, access: :wo1
|
115
|
+
bit 5, :readwritenocheck, access: :dc
|
116
|
+
bit 4, :readonlyclearafter, access: :rowz
|
58
117
|
end
|
59
118
|
end
|
60
119
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= $dut.to_ip_xact :format => :uvm, :schema=> '1685-2009', :mmap_name => 'RegisterMap', :vendor => 'origen-sdk.org', :library => 'id', :name => 'ipxact', :mmap_ref => 'test', :bus_interface => 'AMBA3' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= $dut.atx.to_ip_xact :format => :uvm, :schema=> '1685-2009', :mmap_name => 'RegisterMap', :vendor => 'origen-sdk.org', :library => 'id', :name => 'ipxact_1685_2009' %>
|
@@ -6,7 +6,8 @@ The following examples are available which are used for testing but
|
|
6
6
|
also provide some code examples of how to use the plugin for the various
|
7
7
|
supported formats:
|
8
8
|
|
9
|
-
* [IP-XACT Export](<%= path "examples/ip_xact_export" %>)
|
9
|
+
* [Spirit 1.4 IP-XACT Export](<%= path "examples/ip_xact_export" %>)
|
10
|
+
* [IEEE 1685-2009 IP-XACT Export](<%= path "examples/ip_xact_export_1685_2009" %>)
|
10
11
|
* [RALF Export](<%= path "examples/ralf_export" %>)
|
11
12
|
* [Origen Export](<%= path "examples/origen_export" %>)
|
12
13
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
% render "layouts/basic.html", tab: :examples do
|
2
|
+
|
3
|
+
## IP-XACT Export (IEEE 1685-2009)
|
4
|
+
|
5
|
+
This page shows IEEE 1685-2009 IP-XACT formatted XML that has been generated from an Origen
|
6
|
+
representation of a module.
|
7
|
+
|
8
|
+
The exporter has the following options:
|
9
|
+
|
10
|
+
* **:format** - nil by default, can be set to :uvm to include the associated vendor
|
11
|
+
extentions
|
12
|
+
* **:include_bit_field_values** - true by default, when false the bit field values
|
13
|
+
fields will not be output
|
14
|
+
* **:schema** - nil by default, which assumes a Spirit 1.4 format. '1685-2009' is also supported.
|
15
|
+
* **:mmap_name** - nil by default, can be set to any string name for the memory map name.
|
16
|
+
* **:mmap_ref** - nil by default, can be set to any string name for the memory map reference used by a downstream tool.
|
17
|
+
* **:vendor** - nil by default, can be set to any string name for the company name.
|
18
|
+
* **:library** - nil by default, can be set to any string name for the library used by a downstream tool (ex: Magillem XML -> UVM conversion)
|
19
|
+
%#* **:name** - nil by default, can be set to any string name for the an overall device/model name.
|
20
|
+
%#* **:bus_interface** - nil by default, can be set to 'AMBA3' for an AMBA3 bus interface.
|
21
|
+
|
22
|
+
For this example, targeting CrossOrigen's target/debug.rb, the code to generate this page is:
|
23
|
+
|
24
|
+
~~~eruby
|
25
|
+
<%= "<" + "%= $dut.to_ip_xact :format => :uvm, :schema=> '1685-2009', :mmap_name => 'RegisterMap', :vendor => 'origen-sdk.org', :library => 'id', :mmap_ref => 'test' %" + ">" %>
|
26
|
+
~~~
|
27
|
+
|
28
|
+
~~~xml
|
29
|
+
<%= $dut.to_ip_xact :format => :uvm, :schema=> '1685-2009', :mmap_name => 'RegisterMap', :vendor => 'origen-sdk.org', :library => 'id', :mmap_ref => 'test' %>
|
30
|
+
~~~
|
31
|
+
|
32
|
+
% end
|
data/templates/web/index.md.erb
CHANGED
@@ -35,7 +35,7 @@ Currently the following formats are supported:
|
|
35
35
|
* CMSIS-SVD - Import registers and hierarchy
|
36
36
|
* RALF (Synopsys format) - Export registers
|
37
37
|
|
38
|
-
See the [
|
38
|
+
See the [Examples](<%= path "examples" %>) for format specific documentation, but
|
39
39
|
most formats should follow this basic structure...
|
40
40
|
|
41
41
|
#### Data Import
|
@@ -100,7 +100,9 @@ and then compiled through Origen:
|
|
100
100
|
<%= "<" + "%= $dut.to_ip_xact %" + ">" %>
|
101
101
|
~~~
|
102
102
|
|
103
|
-
|
103
|
+
Please explore the [Examples](<%= path "examples" %>) page to see the differences between Spirit 1.4 and IEEE 1685-2009 IP-XACT export settings.
|
104
|
+
|
105
|
+
In the future, support may be added to export directly to a 3rd party tool if
|
104
106
|
it provides such an API.
|
105
107
|
|
106
108
|
### How To Setup a Development Environment
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cross_origen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.59.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.59.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sanitize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,7 +45,6 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- bin/fix_my_workspace
|
49
48
|
- config/application.rb
|
50
49
|
- config/boot.rb
|
51
50
|
- config/commands.rb
|
@@ -65,11 +64,14 @@ files:
|
|
65
64
|
- templates/test/default.ralf.erb
|
66
65
|
- templates/test/headers_default.h.erb
|
67
66
|
- templates/test/ip_xact.xml.erb
|
67
|
+
- templates/test/ip_xact_1685-2009.xml.erb
|
68
68
|
- templates/test/ip_xact_sub_block.xml.erb
|
69
|
+
- templates/test/ip_xact_sub_block_1685.xml.erb
|
69
70
|
- templates/web/_history.md
|
70
71
|
- templates/web/example.md.erb
|
71
72
|
- templates/web/examples.md.erb
|
72
73
|
- templates/web/examples/ip_xact_export.md.erb
|
74
|
+
- templates/web/examples/ip_xact_export_1685_2009.md.erb
|
73
75
|
- templates/web/examples/origen_export.md.erb
|
74
76
|
- templates/web/examples/ralf_export.md.erb
|
75
77
|
- templates/web/index.md.erb
|
@@ -94,8 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
96
|
- !ruby/object:Gem::Version
|
95
97
|
version: 1.8.11
|
96
98
|
requirements: []
|
97
|
-
|
98
|
-
rubygems_version: 2.6.7
|
99
|
+
rubygems_version: 3.1.4
|
99
100
|
signing_key:
|
100
101
|
specification_version: 4
|
101
102
|
summary: Translators for importing and exporting Origen data to/from 3rd party formats
|
data/bin/fix_my_workspace
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$VERBOSE = nil # Don't care about world writable dir warnings and the like
|
3
|
-
|
4
|
-
if $_fix_my_workspace_version_check
|
5
|
-
$_fix_my_workspace_version = '0.7.0'
|
6
|
-
else
|
7
|
-
if File.exist?(File.expand_path('../../lib/origen.rb', __FILE__))
|
8
|
-
# If this script is being run from within an origen-core workspace, use that Origen-core,
|
9
|
-
# not the system-installed origen-core version.
|
10
|
-
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
11
|
-
require 'origen'
|
12
|
-
else
|
13
|
-
# Use system-installed Origen (the gem in system Ruby)
|
14
|
-
require 'origen'
|
15
|
-
end
|
16
|
-
|
17
|
-
if !Origen.site_config.gem_manage_bundler
|
18
|
-
puts 'Sorry but you have opted to manage Bundler yourself via your Origen site config, and this means'
|
19
|
-
puts 'that I cannot make certain assumptions about how your workspace is configured.'
|
20
|
-
puts 'You will need to either resolve this problem yourself, or else change the value of'
|
21
|
-
puts 'gem_mange_bundler to true.'
|
22
|
-
puts 'See here for more details on how to do that: http://origen-sdk.org/origen/guides/starting/company/'
|
23
|
-
|
24
|
-
else
|
25
|
-
ENV['BUNDLE_GEMFILE'] = File.join(Origen.root, 'Gemfile')
|
26
|
-
ENV['BUNDLE_PATH'] = File.expand_path(Origen.site_config.gem_install_dir)
|
27
|
-
ENV['BUNDLE_BIN'] = File.join(Origen.root, 'lbin')
|
28
|
-
|
29
|
-
# Force copy system gems to local gems
|
30
|
-
if Origen.site_config.gem_use_from_system
|
31
|
-
local_gem_dir = "#{ENV['BUNDLE_PATH']}/ruby/#{Pathname.new(Gem.dir).basename}"
|
32
|
-
gem_dir = Pathname.new(Gem.dir)
|
33
|
-
|
34
|
-
Origen.site_config.gem_use_from_system.each do |gem, version|
|
35
|
-
begin
|
36
|
-
# This will raise an error if the system doesn't have this gem installed, that
|
37
|
-
# will be rescued below
|
38
|
-
spec = Gem::Specification.find_by_name(gem, version)
|
39
|
-
|
40
|
-
local_dir = File.join(local_gem_dir, Pathname.new(spec.gem_dir).relative_path_from(gem_dir))
|
41
|
-
FileUtils.mkdir_p local_dir
|
42
|
-
FileUtils.cp_r("#{spec.gem_dir}/.", local_dir)
|
43
|
-
|
44
|
-
local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.cache_file).relative_path_from(gem_dir)))
|
45
|
-
FileUtils.mkdir_p local_file.dirname
|
46
|
-
FileUtils.cp(spec.cache_file, local_file)
|
47
|
-
|
48
|
-
if spec.extension_dir && File.exist?(spec.extension_dir)
|
49
|
-
local_dir = File.join(local_gem_dir, Pathname.new(spec.extension_dir).relative_path_from(gem_dir))
|
50
|
-
FileUtils.mkdir_p local_dir
|
51
|
-
FileUtils.cp_r("#{spec.extension_dir}/.", local_dir)
|
52
|
-
end
|
53
|
-
|
54
|
-
local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.spec_file).relative_path_from(gem_dir)))
|
55
|
-
FileUtils.mkdir_p local_file.dirname
|
56
|
-
FileUtils.cp(spec.spec_file, local_file)
|
57
|
-
|
58
|
-
rescue Gem::LoadError
|
59
|
-
# This just means that one of the gems that should be copied from the system
|
60
|
-
# was not actually installed in the system, so nothing we can do about that here
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# Delete lbin
|
66
|
-
FileUtils.rm_rf(ENV['BUNDLE_BIN']) if File.exist?(ENV['BUNDLE_BIN'])
|
67
|
-
|
68
|
-
# Run bundler with correct switches
|
69
|
-
cmd = "bundle install --gemfile #{ENV['BUNDLE_GEMFILE']} --binstubs #{ENV['BUNDLE_BIN']} --path #{ENV['BUNDLE_PATH']}"
|
70
|
-
`chmod o-w #{Origen.root}` # Stops some annoying world writable warnings during install
|
71
|
-
`chmod o-w #{Origen.root}/bin` if File.exist?("#{Origen.root}/bin")
|
72
|
-
`chmod o-w #{Origen.root}/.bin` if File.exist?("#{Origen.root}/.bin")
|
73
|
-
|
74
|
-
# Try again, this time updating the bundle
|
75
|
-
if system(cmd)
|
76
|
-
fixed = true
|
77
|
-
elsif system 'bundle update'
|
78
|
-
fixed = true
|
79
|
-
end
|
80
|
-
|
81
|
-
if File.exist?(ENV['BUNDLE_BIN'])
|
82
|
-
`chmod o-w #{ENV['BUNDLE_BIN']}`
|
83
|
-
|
84
|
-
# Make .bat versions of all executables, Bundler should really be doing this when running
|
85
|
-
# on windows
|
86
|
-
if Origen.os.windows?
|
87
|
-
Dir.glob("#{ENV['BUNDLE_BIN']}/*").each do |bin|
|
88
|
-
unless bin =~ /.bat$/
|
89
|
-
bat = "#{bin}.bat"
|
90
|
-
unless File.exist?(bat)
|
91
|
-
File.open(bat, 'w') { |f| f.write('@"ruby.exe" "%~dpn0" %*') }
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
system 'origen -v' if fixed
|
99
|
-
end
|
100
|
-
end
|