cross_origen 0.6.1 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f7582c611769181fb35ca1c63a9de7d0b91fb55
4
- data.tar.gz: 12b85146240f75f5135419ef20420a9cc5f1ca20
3
+ metadata.gz: 7a8a97d56c4be0c17d49a9486ec425b34eab92fc
4
+ data.tar.gz: 19f08b7708edb0fd9b1b1da7bd2b7a0e59b98766
5
5
  SHA512:
6
- metadata.gz: fd24d373d4d19d60f230db4d84feddf85eae354c2699a2f8405c0188e98d4cf0c926f1f8cb51f92bfe00d82a3eb3df9a9a94b6471f6e7584e86469aaee925017
7
- data.tar.gz: 4a4143ef8cfef70ea40eed6a13859b329687b47cf19eee009416f480afa4eaebb552610c03372b7af6ca7dd5fc3bf0602f55f23dff07bed145902b0d0c115dd6
6
+ metadata.gz: de17ae91904278a13727d3ae7d2e1d3f48e1e45a29177e31155a6281a0d3623b17eaf33e7aabb9d13f553f337a37a205d9c00a02c4c12e2bae378f26a0ce9025
7
+ data.tar.gz: e20b7196527a69f0bedacbe778843beb1dde1da11495405d820cb9a89d106c3f787f3e1e61d184106dc05e9bfbc54ee1aa293269a6a62a87d45307b359a30515
@@ -0,0 +1,92 @@
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.6.0'
6
+ else
7
+ require 'origen'
8
+
9
+ if !Origen.site_config.gem_manage_bundler
10
+ puts 'Sorry but you have opted to manage Bundler yourself via your Origen site config, and this means'
11
+ puts 'that I cannot make certain assumptions about how your workspace is configured.'
12
+ puts 'You will need to either resolve this problem yourself, or else change the value of'
13
+ puts 'gem_mange_bundler to true.'
14
+ puts 'See here for more details on how to do that: http://origen-sdk.org/origen/guides/starting/company/'
15
+
16
+ else
17
+ ENV['BUNDLE_GEMFILE'] = File.join(Origen.root, 'Gemfile')
18
+ ENV['BUNDLE_PATH'] = File.expand_path(Origen.site_config.gem_install_dir)
19
+ ENV['BUNDLE_BIN'] = File.join(Origen.root, 'lbin')
20
+
21
+ # Force copy system gems to local gems
22
+ if Origen.site_config.gem_use_from_system
23
+ local_gem_dir = "#{ENV['BUNDLE_PATH']}/ruby/#{Pathname.new(Gem.dir).basename}"
24
+ gem_dir = Pathname.new(Gem.dir)
25
+
26
+ Origen.site_config.gem_use_from_system.each do |gem, version|
27
+ begin
28
+ # This will raise an error if the system doesn't have this gem installed, that
29
+ # will be rescued below
30
+ spec = Gem::Specification.find_by_name(gem, version)
31
+
32
+ local_dir = File.join(local_gem_dir, Pathname.new(spec.gem_dir).relative_path_from(gem_dir))
33
+ FileUtils.mkdir_p local_dir
34
+ FileUtils.cp_r("#{spec.gem_dir}/.", local_dir)
35
+
36
+ local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.cache_file).relative_path_from(gem_dir)))
37
+ FileUtils.mkdir_p local_file.dirname
38
+ FileUtils.cp(spec.cache_file, local_file)
39
+
40
+ if spec.extension_dir && File.exist?(spec.extension_dir)
41
+ local_dir = File.join(local_gem_dir, Pathname.new(spec.extension_dir).relative_path_from(gem_dir))
42
+ FileUtils.mkdir_p local_dir
43
+ FileUtils.cp_r("#{spec.extension_dir}/.", local_dir)
44
+ end
45
+
46
+ local_file = Pathname.new(File.join(local_gem_dir, Pathname.new(spec.spec_file).relative_path_from(gem_dir)))
47
+ FileUtils.mkdir_p local_file.dirname
48
+ FileUtils.cp(spec.spec_file, local_file)
49
+
50
+ rescue Gem::LoadError
51
+ # This just means that one of the gems that should be copied from the system
52
+ # was not actually installed in the system, so nothing we can do about that here
53
+ end
54
+ end
55
+ end
56
+
57
+ # Delete lbin
58
+ FileUtils.rm_rf(ENV['BUNDLE_BIN']) if File.exist?(ENV['BUNDLE_BIN'])
59
+
60
+ # Run bundler with correct switches
61
+ cmd = "bundle install --gemfile #{ENV['BUNDLE_GEMFILE']} --binstubs #{ENV['BUNDLE_BIN']} --path #{ENV['BUNDLE_PATH']}"
62
+ `chmod o-w #{Origen.root}` # Stops some annoying world writable warnings during install
63
+ `chmod o-w #{Origen.root}/bin` if File.exist?("#{Origen.root}/bin")
64
+ `chmod o-w #{Origen.root}/.bin` if File.exist?("#{Origen.root}/.bin")
65
+
66
+ # Try again, this time updating the bundle
67
+ if system(cmd)
68
+ fixed = true
69
+ elsif system 'bundle update'
70
+ fixed = true
71
+ end
72
+
73
+ if File.exist?(ENV['BUNDLE_BIN'])
74
+ `chmod o-w #{ENV['BUNDLE_BIN']}`
75
+
76
+ # Make .bat versions of all executables, Bundler should really be doing this when running
77
+ # on windows
78
+ if Origen.os.windows?
79
+ Dir.glob("#{ENV['BUNDLE_BIN']}/*").each do |bin|
80
+ unless bin =~ /.bat$/
81
+ bat = "#{bin}.bat"
82
+ unless File.exist?(bat)
83
+ File.open(bat, 'w') { |f| f.write('@"ruby.exe" "%~dpn0" %*') }
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ system 'origen -v' if fixed
91
+ end
92
+ end
@@ -14,6 +14,13 @@ class CrossOrigenApplication < Origen::Application
14
14
  #:files => ["lib", "config/application.rb"],
15
15
  }
16
16
 
17
+ config.shared = {
18
+ # :patterns => "pattern/shared",
19
+ # :templates => "templates",
20
+ # :programs => "program",
21
+ :command_launcher => "config/shared_commands.rb"
22
+ }
23
+
17
24
  # Prevent these from showing up in 'origen rc unman'
18
25
  config.unmanaged_dirs = %w()
19
26
  config.unmanaged_files = %w()
@@ -31,5 +31,6 @@ module CrossOrigen
31
31
  autoload :IpXact, "cross_origen/ip_xact"
32
32
  autoload :DesignSync, "cross_origen/design_sync"
33
33
  autoload :OrigenFormat, "cross_origen/origen_format"
34
+ autoload :CMSISSVD, "cross_origen/cmsis_svd"
34
35
  end
35
36
  require "cross_origen"
@@ -0,0 +1,18 @@
1
+ # The requested command is passed in here as @command
2
+ case @command
3
+
4
+ when "cr:import"
5
+ require "cross_origen/commands/import"
6
+ # Important to exit when a command has been fulfilled or else Origen core will try and execute it
7
+ exit 0
8
+
9
+ # Always leave an else clause to allow control to fall back through to the Origen command handler.
10
+ # You probably want to also add the command details to the help shown via 'origen -h',
11
+ # you can do this bb adding the required text to @plugin_commands before handing control back to
12
+ # Origen.
13
+ else
14
+ @plugin_commands << <<-EOT
15
+ cr:import Import peripheral and register data from 3rd party formats
16
+ EOT
17
+
18
+ end
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module CrossOrigen
2
2
  MAJOR = 0
3
- MINOR = 6
4
- BUGFIX = 1
3
+ MINOR = 7
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -0,0 +1,143 @@
1
+ module CrossOrigen
2
+ class CMSISSVD < XMLDoc
3
+ def import(file, options = {}) # rubocop:disable CyclomaticComplexity
4
+ with_output_file(options) do |f|
5
+ doc(file, options) do |doc|
6
+ f.puts '# This file was automatically generated from a CMSIS-SVD input file'
7
+ f.puts '# Name: ' + (fetch(doc.xpath('device/name'), get_text: true) || '')
8
+ f.puts '# Version: ' + (fetch(doc.xpath('device/version'), get_text: true) || '')
9
+ f.puts "# Created at #{Time.now.strftime('%e %b %Y %H:%M%p')} by #{User.current.name}"
10
+ f.puts '# rubocop:disable all'
11
+ f.puts 'module ImportedCMSISSVD'
12
+ f.puts ' def initialize(*args)'
13
+ f.puts ' instantiate_imported_cmsis_svd_data'
14
+ f.puts ' end'
15
+ f.puts ''
16
+ f.puts ' def instantiate_imported_cmsis_svd_data'
17
+
18
+ # Create sub-blocks
19
+ indexes = {}
20
+ doc.xpath('device/peripherals/peripheral').each do |p|
21
+ name = fetch(p.xpath('groupName'), get_text: true)
22
+ name = name.to_s.downcase.symbolize
23
+ ba = extract(p, 'baseAddress', format: :integer, hex: true)
24
+ if j = peripheral_groups(doc)[name] > 1
25
+ indexes[name] ||= 0
26
+ f.puts " sub_block :#{name}#{indexes[name]}, base_address: #{ba.to_hex}"
27
+ indexes[name] += 1
28
+ else
29
+ f.puts " sub_block :#{name}, base_address: #{ba.to_hex}"
30
+ end
31
+ end
32
+ f.puts ''
33
+
34
+ # Add registers to each sub-block
35
+ indexes = {}
36
+ doc.xpath('device/peripherals/peripheral').each do |p|
37
+ sb = fetch(p.xpath('groupName'), get_text: true)
38
+ sb = sb.to_s.downcase.symbolize
39
+ if j = peripheral_groups(doc)[sb] > 1
40
+ indexes[sb] ||= 0
41
+ ix = indexes[sb]
42
+ indexes[sb] += 1
43
+ sb = "#{sb}#{ix}"
44
+ end
45
+
46
+ p.xpath('registers/register').each do |r|
47
+ name = extract(r, 'name')
48
+ di = extract(r, 'dim', format: :integer)
49
+ dim = !!di
50
+ if dim
51
+ dinc = extract(r, 'dimIncrement', format: :integer)
52
+ dvals = extract(r, 'dimIndex').split(',')
53
+ else
54
+ di = 1
55
+ end
56
+ offset = extract(r, 'addressOffset', format: :integer, hex: true)
57
+ size = extract(r, 'size', format: :integer)
58
+ reset = extract(r, 'resetValue', format: :integer, hex: true)
59
+ desc = (extract(r, 'description') || '').gsub("'", %q(\\\'))
60
+
61
+ di.times do |i|
62
+ if dim
63
+ n = name.sub('[%s]', dvals[i])
64
+ addr = offset + (i * dinc)
65
+ else
66
+ n = name
67
+ addr = offset
68
+ end
69
+ f.puts " #{sb}.add_reg :#{n.downcase.symbolize}, #{addr.to_hex}, size: #{size}#{reset ? ', reset: ' + reset.to_hex : ''}, description: '#{desc}' do |reg|"
70
+ r.xpath('fields/field').each do |b|
71
+ bn = extract(b, 'name')
72
+ unless bn == 'RESERVED'
73
+ bn = bn.to_s.downcase.symbolize
74
+ lsb = extract(b, 'lsb', format: :integer)
75
+ msb = extract(b, 'msb', format: :integer)
76
+ access = extract(b, 'access')
77
+ desc = (extract(r, 'description') || '').gsub("'", %q(\\\'))
78
+ case access
79
+ when 'read-only'
80
+ ac = :ro
81
+ else
82
+ ac = :rw
83
+ end
84
+ if lsb == msb
85
+ f.puts " reg.bit #{lsb}, :#{bn}, access: :#{ac}, description: '#{desc}'"
86
+ else
87
+ f.puts " reg.bit #{msb}..#{lsb}, :#{bn}, access: :#{ac}, description: '#{desc}'"
88
+ end
89
+ end
90
+ end
91
+ f.puts ' end'
92
+ end
93
+ end
94
+ end
95
+
96
+ f.puts ' end'
97
+
98
+ # Create accessor methods to return an array of peripherals in the case
99
+ # where there are many in a group
100
+ peripheral_groups(doc).each do |name, size|
101
+ name = name.to_s.downcase.symbolize
102
+ if size > 1
103
+ f.puts ''
104
+ f.puts " def #{name}"
105
+ f.print ' ['
106
+ size.times do |i|
107
+ if i == 0
108
+ f.print "#{name}0"
109
+ else
110
+ f.print ", #{name}#{i}"
111
+ end
112
+ end
113
+ f.puts ']'
114
+ f.puts ' end'
115
+ end
116
+ end
117
+
118
+ f.puts 'end'
119
+ f.puts '# rubocop:enable all'
120
+ end
121
+ end
122
+ end
123
+
124
+ def peripheral_groups(doc)
125
+ @peripheral_groups ||= begin
126
+ g = {}
127
+ doc.xpath('device/peripherals/peripheral').each do |p|
128
+ group = fetch(p.xpath('groupName'), get_text: true)
129
+ group = group.to_s.downcase.symbolize
130
+ g[group] ||= 0
131
+ g[group] += 1
132
+ end
133
+ g
134
+ end
135
+ end
136
+
137
+ def with_output_file(options = {})
138
+ path = options[:output] || 'imported_cmsis_svd.rb'
139
+ File.open(path, 'w') { |f| yield f }
140
+ puts "Successfully imported to #{path}"
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,32 @@
1
+ options = {}
2
+ opt_parser = OptionParser.new do |opts|
3
+ opts.banner = <<-END
4
+ Usage: origen cr:import FILE [options]
5
+
6
+ Import the given file into Origen format.
7
+ This will output a Ruby module that can then be included in an Origen model
8
+ to add the contained registers, sub-blocks, etc.
9
+
10
+ END
11
+ opts.on('-o', '--output PATH', String, 'Override the default output file') { |t| options[:output] = t }
12
+ end
13
+ opt_parser.parse! ARGV
14
+
15
+ file = ARGV[0]
16
+ unless file
17
+ puts 'You must supply a file to import!'
18
+ exit
19
+ end
20
+
21
+ unless File.exist?(file)
22
+ puts 'That file does not exist!'
23
+ exit
24
+ end
25
+
26
+ snippet = IO.read(file, 2000) # Read first 2000 characters
27
+ case snippet
28
+ when /CMSIS-SVD.xsd/
29
+ CrossOrigen::CMSISSVD.new(nil).import(file, options)
30
+ else
31
+ puts 'Unknown file format!'
32
+ end
@@ -21,15 +21,18 @@ module CrossOrigen
21
21
  incl: "\# This file is created by Origen via CrossOrigen::OrigenFormat#export, and is read-only"
22
22
  }
23
23
 
24
- attr_reader :obj, :top_level_class, :top_level_hierarchy, :output_dir, :top_level_path, :incl_path, :incl_dir, :file_content
24
+ attr_reader :obj, :top_level_class, :top_level_hierarchy, :output_dir, :top_level_path, :incl_path, :incl_dir, :file_content, :inst_level
25
25
 
26
26
  def initialize(options = {})
27
27
  options = {
28
- obj: $dut,
29
- path: "#{Origen.root!}/output"
28
+ obj: $dut,
29
+ path: "#{Origen.root!}/output",
30
+ instantiate_level: :top
30
31
  }.update(options)
31
32
  @obj = options[:obj]
32
33
  @output_dir = options[:path]
34
+ @inst_level = options[:instantiate_level]
35
+ fail "@instantiate_level must be either set to ':top' or ':sub_block'" unless [:top, :sub_block].include?(@inst_level)
33
36
  @top_level_path = "#{output_dir}/top_level.rb"
34
37
  @incl_path = "#{output_dir}/sub_blocks.rb"
35
38
  @incl_dir = "#{output_dir}/import"
@@ -72,12 +75,22 @@ module CrossOrigen
72
75
  bom_file.puts(FILE_COMMENTS[:incl])
73
76
  bom_file.puts("require_relative 'sub_blocks'")
74
77
  @top_level_hierarchy.each do |name, obj|
78
+ if @inst_level == :sub_block && @top_level_hierarchy.keys.last == name
79
+ obj = 'module'
80
+ name = 'SubBlocks'
81
+ end
75
82
  bom_file.puts("#{indent}#{obj} #{name.split('::').last}")
76
83
  indent += ' '
77
84
  end
78
85
  bom_file.puts("#{indent}include Origen::Model")
79
86
  bom_file.puts('')
80
- bom_file.puts("#{indent}def initialize(options = {})")
87
+ if @inst_level == :sub_block
88
+ bom_file.puts("#{indent}def instantiate_sub_blocks(options = {})")
89
+ elsif @inst_level == :top
90
+ bom_file.puts("#{indent}def initialize(options = {})")
91
+ else
92
+ fail '@instantiate_level not set to an acceptable value [:top, :sub_block]'
93
+ end
81
94
  indent += ' '
82
95
  # This method is recursive (indirectly) so file_content should find all BoM and include file strings
83
96
  create_file_content(@obj, indent)
data/lib/cross_origen.rb CHANGED
@@ -64,8 +64,9 @@ module CrossOrigen
64
64
  # The Ruby files are created at options[:path] (app output directory by default)
65
65
  def cr_to_origen(options = {})
66
66
  options = {
67
- obj: $dut,
68
- path: Origen.app.config.output_directory
67
+ obj: $dut,
68
+ path: Origen.app.config.output_directory,
69
+ instantiate_level: :top
69
70
  }.update(options)
70
71
  # This method assumes and checks for $self to contain Origen::Model
71
72
  error "ERROR: #{options[:obj].class} does not contain Origen::Model as required" unless options[:obj].class < Origen::Model
@@ -1,96 +1,151 @@
1
- % render "layouts/basic.html", tab: :examples do
2
-
3
- ## Origen Export
4
-
5
- This page shows how to create static read-only Ruby files from
6
- models created by importing 3rd party data (e.g. IP-XACT). The Ruby files can then be
7
- used for day-day running of your application and this will significantly improve
8
- the boot up speed vs. re-importing the data every time.
9
-
10
- The Ruby files can be periodically refreshed as new versions of the master
11
- data are released.
12
-
13
- The user only need provide the output path where they want the
14
- Ruby files to be written.
15
-
16
- ### Implementation
17
-
18
- Here is an example of how to create the static Ruby files.
19
-
20
- ~~~ruby
21
- $dut.to_origen(path: "#{Origen.root}/output/exported")
22
- ~~~
23
-
24
- ### Output
25
-
26
- At the output path the following files are created:
27
-
28
- * top_level.rb: The top-level object, this is the one that should be instantiated
29
-
30
- ~~~ruby
31
- # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only
32
- require_relative 'sub_blocks'
33
- module CrossOrigen
34
- module Test
35
- class DUT
36
- include Origen::Model
37
-
38
- def initialize(options = {})
39
- sub_block :atx, base_address: 0xDEADBEEF, class_name: 'ATX'
40
- sub_block # ...
41
- end
42
- end
43
- end
44
- end
45
- ~~~
46
-
47
- * sub_blocks.rb: include file for the sub_block class files
48
-
49
- ~~~ruby
50
- # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only
51
- require_relative 'import/atx.rb'
52
- require_relative # ...
53
- ~~~
54
-
55
- * import/\<sub_block\>.rb: models the individual sub_block object
56
-
57
- ~~~ruby
58
- # -*- encoding : utf-8 -*-
59
- # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only.
60
- # If you need to make changes, re-open the class
61
- module CrossOrigen
62
- module Test
63
- class DUT
64
- class ATX # rubocop:disable ClassLength
65
- include Origen::Model
66
-
67
- def initialize(options = {})
68
- instantiate_registers(options)
69
- end
70
-
71
- # rubocop:disable LineLength
72
- # rubocop:disable StringLiterals
73
- def instantiate_registers(options = {}) # rubocop:disable MethodLength
74
- # ** MGATE Clock Divider Register **
75
- # The MCLKDIV register is used to divide down the frequency of the HBOSCCLK input. If the MCLKDIV
76
- # register is set to value "N", then the output (beat) frequency of the clock divider is OSCCLK / (N+1). The
77
- # resulting beats are, in turn, counted by the PTIMER module to control the duration of Flash high-voltage
78
- # operations.
79
- reg :mclkdiv, 0x0, size: 16 do |reg|
80
- # **Oscillator (Hi)** - Firmware FMU clk source selection. (Note that in addition to this firmware-controlled bit, the
81
- # FMU clock source is also dependent on test and power control discretes).
82
- #
83
- # 0 | FMU clock is the externally supplied bus clock ipg_clk
84
- # 1 | FMU clock is the internal oscillator from the TFS hardblock
85
- reg.bit 15, :osch, reset: 0b1, access: :rw
86
- # ...
87
- end
88
- # ...
89
- end
90
- end
91
- end
92
- end
93
- end
94
- ~~~
95
-
96
- % end
1
+ % render "layouts/basic.html", tab: :examples do
2
+
3
+ ## Origen Export
4
+
5
+ This page shows how to create static read-only Ruby files from
6
+ models created by importing 3rd party data (e.g. IP-XACT). The Ruby files can then be
7
+ used for day-day running of your application and this will significantly improve
8
+ the boot up speed vs. re-importing the data every time.
9
+
10
+ The Ruby files can be periodically refreshed as new versions of the master
11
+ data are released.
12
+
13
+ The user only need provide the output path where they want the
14
+ Ruby files to be written.
15
+
16
+ ### Implementation
17
+
18
+ There are two methods for instantiating device models:
19
+
20
+ 1. As a named Origen TopLevel class with a method #instantiate_sub_blocks to model the device
21
+ 2. As a generic SubBlocks module to model the device
22
+
23
+ Option #1 is the default behavior and is handled in this manner:
24
+
25
+ ~~~ruby
26
+ $dut.to_origen(path: "#{Origen.root}/output/exported")
27
+ ~~~
28
+
29
+ ### Output
30
+
31
+ At the output path the following files are created:
32
+
33
+ * top_level.rb: The top-level object, this is the one that should be instantiated
34
+
35
+ ~~~ruby
36
+ # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only
37
+ require_relative 'sub_blocks'
38
+ module CrossOrigen
39
+ module Test
40
+ class DUT
41
+ include Origen::Model
42
+
43
+ def initialize(options = {})
44
+ sub_block :atx, base_address: 0xDEADBEEF, class_name: 'ATX'
45
+ sub_block # ...
46
+ end
47
+ end
48
+ end
49
+ end
50
+ ~~~
51
+
52
+ * sub_blocks.rb: include file for the sub_block class files
53
+
54
+ ~~~ruby
55
+ # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only
56
+ require_relative 'import/atx.rb'
57
+ require_relative # ...
58
+ ~~~
59
+
60
+ * import/\<sub_block\>.rb: models the individual sub_block object
61
+
62
+ ~~~ruby
63
+ # -*- encoding : utf-8 -*-
64
+ # This file is created by Origen, CrossOrigen::OrigenFormat#export, and is read-only.
65
+ # If you need to make changes, re-open the class
66
+ module CrossOrigen
67
+ module Test
68
+ class DUT
69
+ class ATX # rubocop:disable ClassLength
70
+ include Origen::Model
71
+
72
+ def initialize(options = {})
73
+ instantiate_registers(options)
74
+ end
75
+
76
+ # rubocop:disable LineLength
77
+ # rubocop:disable StringLiterals
78
+ def instantiate_registers(options = {}) # rubocop:disable MethodLength
79
+ # ** MGATE Clock Divider Register **
80
+ # The MCLKDIV register is used to divide down the frequency of the HBOSCCLK input. If the MCLKDIV
81
+ # register is set to value "N", then the output (beat) frequency of the clock divider is OSCCLK / (N+1). The
82
+ # resulting beats are, in turn, counted by the PTIMER module to control the duration of Flash high-voltage
83
+ # operations.
84
+ reg :mclkdiv, 0x0, size: 16 do |reg|
85
+ # **Oscillator (Hi)** - Firmware FMU clk source selection. (Note that in addition to this firmware-controlled bit, the
86
+ # FMU clock source is also dependent on test and power control discretes).
87
+ #
88
+ # 0 | FMU clock is the externally supplied bus clock ipg_clk
89
+ # 1 | FMU clock is the internal oscillator from the TFS hardblock
90
+ reg.bit 15, :osch, reset: 0b1, access: :rw
91
+ # ...
92
+ end
93
+ # ...
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ ~~~
100
+
101
+ Why option #2? Some Origen applications may serve multiple products and want the ability to swap the current
102
+ TopLevel model using target instantitation.
103
+
104
+ ~~~ruby
105
+ origen i -t my_product
106
+ ~~~
107
+
108
+ Here is a generic example of how an application may use option #2 in
109
+ combination with the CrossOrigen import feature. By passing the 'instantiate_level: :sub_block' to the #to_origen
110
+ method, the device model is changed to a SubBlocks module implementation. Notice that the #to_origen method is called
111
+ inside the #on_load_target callback. This is necessary as the #to_origen method accesses Origen.app.output_directory,
112
+ which is not available until the target is instantiated.
113
+
114
+ ~~~ruby
115
+
116
+ module MyOrigenApp
117
+ class Product
118
+ include Origen::TopLevel
119
+ include CrossOrigen
120
+
121
+ attr_accessor :curr_prod, :curr_prod_xml, :top_origen_path
122
+
123
+ def initialize(options = {})
124
+ options = {
125
+ curr_product: nil
126
+ }.update(options)
127
+ @curr_prod = options [:curr_product]
128
+ @curr_prod_xml = Pathname.new("#{Origen.root}/vendor/mycompany/products/#{curr_prod}/product_ipxact.xml")
129
+ @top_origen_path = Pathname.new("#{Origen.root}/vendor/mycompany/products/#{curr_prod}/top_level.rb")
130
+ # Import or instantiate registers
131
+ if @top_origen_path.exist?
132
+ Origen.log.info("Instantiating registers from Origen source for product #{curr_prod}...")
133
+ require @top_origen_path.to_s.chomp(".rb")
134
+ extend SubBlocks
135
+ instantiate_sub_blocks()
136
+ else
137
+ Origen.log.info("Importing IP-XACT registers for #{curr_prod}...")
138
+ cr_import(path: @curr_prod_xml)
139
+ end
140
+ end
141
+
142
+ def on_load_target
143
+ to_origen(path: @top_origen_path, instantiate_level: :sub_block)
144
+ end
145
+
146
+ end
147
+ end
148
+
149
+ ~~~
150
+
151
+ % end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cross_origen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.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: 2016-04-04 00:00:00.000000000 Z
11
+ date: 2017-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.2'
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
26
  version: '0.2'
27
27
  - !ruby/object:Gem::Dependency
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
- - !ruby/object:Gem::Dependency
42
- name: origen_doc_helpers
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 0.2.0
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 0.2.0
55
41
  description:
56
42
  email:
57
43
  - stephen.f.mcginty@gmail.com
@@ -59,13 +45,17 @@ executables: []
59
45
  extensions: []
60
46
  extra_rdoc_files: []
61
47
  files:
48
+ - bin/fix_my_workspace
62
49
  - config/application.rb
63
50
  - config/commands.rb
64
51
  - config/development.rb
65
52
  - config/environment.rb
53
+ - config/shared_commands.rb
66
54
  - config/users.rb
67
55
  - config/version.rb
68
56
  - lib/cross_origen.rb
57
+ - lib/cross_origen/cmsis_svd.rb
58
+ - lib/cross_origen/commands/import.rb
69
59
  - lib/cross_origen/design_sync.rb
70
60
  - lib/cross_origen/headers.rb
71
61
  - lib/cross_origen/ip_xact.rb
@@ -109,9 +99,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
99
  version: 1.8.11
110
100
  requirements: []
111
101
  rubyforge_project:
112
- rubygems_version: 2.6.2
102
+ rubygems_version: 2.6.7
113
103
  signing_key:
114
104
  specification_version: 4
115
105
  summary: Translators for importing and exporting Origen data to/from 3rd party formats
116
106
  test_files: []
117
- has_rdoc: