cross_origen 1.1.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|