origen 0.38.0 → 0.40.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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/bin/origen +1 -236
  3. data/config/application.rb +10 -1
  4. data/config/version.rb +1 -1
  5. data/lib/origen/{boot_api.rb → boot/api.rb} +2 -2
  6. data/lib/origen/boot/app.rb +324 -0
  7. data/lib/origen/boot.rb +287 -0
  8. data/lib/origen/commands/archive.rb +175 -0
  9. data/lib/origen/commands/extract.rb +43 -0
  10. data/lib/origen/commands/new.rb +33 -23
  11. data/lib/origen/commands.rb +4 -1
  12. data/lib/origen/commands_global.rb +3 -2
  13. data/lib/origen/operating_systems.rb +4 -0
  14. data/lib/origen/revision_control.rb +1 -1
  15. data/lib/origen/site_config.rb +4 -1
  16. data/lib/origen.rb +3 -2
  17. data/origen_app_generators/Gemfile +16 -0
  18. data/origen_app_generators/Gemfile.lock +147 -0
  19. data/origen_app_generators/LICENSE +21 -0
  20. data/origen_app_generators/README.md +368 -0
  21. data/origen_app_generators/Rakefile +10 -0
  22. data/origen_app_generators/bin/boot.rb +37 -0
  23. data/{bin → origen_app_generators/bin}/fix_my_workspace +0 -0
  24. data/origen_app_generators/config/application.rb +153 -0
  25. data/origen_app_generators/config/boot.rb +1 -0
  26. data/origen_app_generators/config/commands.rb +63 -0
  27. data/origen_app_generators/config/shared_commands.rb +172 -0
  28. data/origen_app_generators/config/version.rb +8 -0
  29. data/origen_app_generators/doc/history +213 -0
  30. data/origen_app_generators/lib/origen_app_generators/application.rb +62 -0
  31. data/origen_app_generators/lib/origen_app_generators/base.rb +231 -0
  32. data/origen_app_generators/lib/origen_app_generators/empty_application.rb +15 -0
  33. data/origen_app_generators/lib/origen_app_generators/empty_plugin.rb +15 -0
  34. data/origen_app_generators/lib/origen_app_generators/new.rb +162 -0
  35. data/origen_app_generators/lib/origen_app_generators/origen_infrastructure/app_generator_plugin.rb +109 -0
  36. data/origen_app_generators/lib/origen_app_generators/plugin.rb +58 -0
  37. data/origen_app_generators/lib/origen_app_generators/sub_block_parser.rb +81 -0
  38. data/origen_app_generators/lib/origen_app_generators/test_engineering/stand_alone_application.rb +236 -0
  39. data/origen_app_generators/lib/origen_app_generators/test_engineering/test_block.rb +162 -0
  40. data/origen_app_generators/lib/origen_app_generators.rb +123 -0
  41. data/origen_app_generators/lib/tasks/app_generators.rake +6 -0
  42. data/origen_app_generators/lib/tasks/new_app_tests.rake +8 -0
  43. data/origen_app_generators/origen_app_generators.gemspec +33 -0
  44. data/origen_app_generators/spec/spec_helper.rb +49 -0
  45. data/origen_app_generators/spec/sub_block_spec.rb +36 -0
  46. data/origen_app_generators/target/debug.rb +8 -0
  47. data/origen_app_generators/target/default.rb +8 -0
  48. data/origen_app_generators/target/production.rb +0 -0
  49. data/origen_app_generators/templates/app_generators/application/Gemfile +19 -0
  50. data/origen_app_generators/templates/app_generators/application/Rakefile +7 -0
  51. data/origen_app_generators/templates/app_generators/application/config/application.rb +125 -0
  52. data/origen_app_generators/templates/app_generators/application/config/boot.rb +4 -0
  53. data/origen_app_generators/templates/app_generators/application/config/commands.rb +79 -0
  54. data/origen_app_generators/templates/app_generators/application/config/maillist_dev.txt +4 -0
  55. data/origen_app_generators/templates/app_generators/application/config/maillist_prod.txt +3 -0
  56. data/origen_app_generators/templates/app_generators/application/config/version.rb +8 -0
  57. data/origen_app_generators/templates/app_generators/application/doc/history +0 -0
  58. data/origen_app_generators/templates/app_generators/application/dot_keep +0 -0
  59. data/origen_app_generators/templates/app_generators/application/lib/app.rake +6 -0
  60. data/origen_app_generators/templates/app_generators/application/lib/module.rb +22 -0
  61. data/origen_app_generators/templates/app_generators/application/lib/top_level.rb +12 -0
  62. data/origen_app_generators/templates/app_generators/application/origen_core_session +2 -0
  63. data/origen_app_generators/templates/app_generators/application/spec/spec_helper.rb +44 -0
  64. data/origen_app_generators/templates/app_generators/application/target/debug.rb +8 -0
  65. data/origen_app_generators/templates/app_generators/application/target/default.rb +1 -0
  66. data/origen_app_generators/templates/app_generators/application/target/production.rb +4 -0
  67. data/origen_app_generators/templates/app_generators/application/templates/web/index.md.erb +19 -0
  68. data/origen_app_generators/templates/app_generators/application/templates/web/layouts/_basic.html.erb +13 -0
  69. data/origen_app_generators/templates/app_generators/application/templates/web/partials/_navbar.html.erb +20 -0
  70. data/origen_app_generators/templates/app_generators/application/templates/web/release_notes.md.erb +5 -0
  71. data/origen_app_generators/templates/app_generators/new/generator.rb +102 -0
  72. data/origen_app_generators/templates/app_generators/new/info.md.erb +9 -0
  73. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/config/load_generators.rb +6 -0
  74. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/lib/application.rb +54 -0
  75. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/lib/base.rb +55 -0
  76. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/lib/module.rb +28 -0
  77. data/origen_app_generators/templates/app_generators/origen_infrastructure/app_generator_plugin/lib/plugin.rb +64 -0
  78. data/origen_app_generators/templates/app_generators/plugin/Gemfile +26 -0
  79. data/origen_app_generators/templates/app_generators/plugin/Rakefile +10 -0
  80. data/origen_app_generators/templates/app_generators/plugin/config/boot.rb +24 -0
  81. data/origen_app_generators/templates/app_generators/plugin/gemspec.rb +42 -0
  82. data/origen_app_generators/templates/app_generators/plugin/lib/README +4 -0
  83. data/origen_app_generators/templates/app_generators/plugin/lib_dev/README +5 -0
  84. data/origen_app_generators/templates/app_generators/plugin/templates/web/index.md.erb +37 -0
  85. data/origen_app_generators/templates/app_generators/plugin/templates/web/partials/_navbar_external.html.erb +20 -0
  86. data/origen_app_generators/templates/app_generators/plugin/templates/web/partials/_navbar_internal.html.erb +20 -0
  87. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/Gemfile +23 -0
  88. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/environment/j750.rb +1 -0
  89. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/environment/jlink.rb +1 -0
  90. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/environment/uflex.rb +1 -0
  91. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/environment/v93k.rb +1 -0
  92. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/ip_block.rb +23 -0
  93. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/ip_block_controller.rb +5 -0
  94. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/top_level.rb +33 -0
  95. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/lib/top_level_controller.rb +21 -0
  96. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/pattern/example.rb +4 -0
  97. data/origen_app_generators/templates/app_generators/test_engineering/stand_alone_application/target/top_level.rb +4 -0
  98. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/j750.rb +2 -0
  99. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/ultraflex.rb +2 -0
  100. data/origen_app_generators/templates/app_generators/test_engineering/test_block/environment/v93k.rb +2 -0
  101. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/controller.rb +12 -0
  102. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/interface.rb +21 -0
  103. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib/model.rb +18 -0
  104. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib_dev/dut.rb +27 -0
  105. data/origen_app_generators/templates/app_generators/test_engineering/test_block/lib_dev/dut_controller.rb +26 -0
  106. data/origen_app_generators/templates/app_generators/test_engineering/test_block/pattern/example.rb +5 -0
  107. data/origen_app_generators/templates/app_generators/test_engineering/test_block/program/prb1.rb +11 -0
  108. data/origen_app_generators/templates/app_generators/test_engineering/test_block/target/default.rb +2 -0
  109. data/origen_site_config.yml +13 -2
  110. data/templates/git/gitignore.erb +0 -1
  111. metadata +99 -4
@@ -0,0 +1,236 @@
1
+ module OrigenAppGenerators
2
+ module TestEngineering
3
+ require 'origen_app_generators/sub_block_parser'
4
+ # Generates a generic application shell
5
+ class StandAloneApplication < Application
6
+ desc 'A stand alone test engineering application'
7
+
8
+ # Any methods that are not protected will get invoked in the order that they are
9
+ # defined when the generator is run, method naming is irrelevant unless you want
10
+ # to override a method that is defined by the parent class
11
+
12
+ def get_user_input
13
+ # The methods to get the common user input that applies to all applications will
14
+ # get called at the start automatically, you have a chance here to ask any additional
15
+ # questions that are specific to the type of application being generated
16
+ get_top_level_names
17
+ get_sub_block_names
18
+ end
19
+
20
+ def generate_files
21
+ # Calling this will build all files, directories and symlinks contained in the
22
+ # hash returned by the filelist method
23
+ build_filelist
24
+ end
25
+
26
+ def modify_files
27
+ # If you want to modify any of the generated files you can do so now, you have access
28
+ # to all of the Thor Action methods described here:
29
+ # http://www.rubydoc.info/github/wycats/thor/Thor/Actions
30
+ # See the enable method in lib/app_generators/new.rb for some examples of using these.
31
+ end
32
+
33
+ def conclude
34
+ # Print out anything you think the user should know about their new application at the end
35
+ puts "New app created at: #{destination_root}"
36
+ end
37
+
38
+ protected
39
+
40
+ def sub_block_parser
41
+ @sub_block_parser ||= SubBlockParser.new
42
+ end
43
+
44
+ def get_top_level_names
45
+ puts
46
+ puts 'NAME YOUR TOP-LEVEL DEVICE(S)'
47
+ puts
48
+ puts 'What do you want to call the top-level class that represents your device?'
49
+ puts 'By default it will be called TopLevel, but if you want this application to support multiple devices you should'
50
+ puts 'give them unique names.'
51
+ puts 'Separate multiple names with a comma: Falcon, Eagle, Vulture'
52
+ puts
53
+
54
+ valid = false
55
+ until valid
56
+ @top_level_names = get_text(single: true, default: 'TopLevel').strip.split(',').map do |name|
57
+ name.strip.gsub(/\s+/, '_').camelize
58
+ end
59
+ unless @top_level_names.empty?
60
+ # Should we check anything here?
61
+ valid = true
62
+ end
63
+ end
64
+ @top_level_names
65
+ end
66
+
67
+ def get_sub_block_names
68
+ puts
69
+ puts 'DEFINE YOUR SUB-BLOCKS'
70
+ puts
71
+ puts 'What sub-blocks does this device contain?'
72
+ puts 'You can leave this blank, but entering some details of the sub-blocks you will want to involve in your tests'
73
+ puts 'will save you some manual setup of the associated models and controllers.'
74
+ puts 'You can specify layers of hierarchy and multiple instantiations, here are some examples:'
75
+ puts
76
+ puts ' A RAM, OSC, PLL and 2 ATDs at the top-level: ram, osc, pll, atd(2)'
77
+ puts ' With 3 COMMS blocks with embedded components: ram, osc, pll, atd(2), comms[ram(2), osc](3)'
78
+ if @top_level_names.size > 1
79
+ puts
80
+ puts 'If you want different modules for each of your top-level devices you can do:'
81
+ puts
82
+ puts " #{@top_level_names[0]}[ram, atd(2)], #{@top_level_names[1]}[ram(2), atd(4)]"
83
+ end
84
+ puts
85
+
86
+ valid = false
87
+ until valid
88
+ input = get_text(single: true).strip
89
+ if input.empty?
90
+ @sub_blocks_lookup = {}
91
+ valid = true
92
+ else
93
+ begin
94
+ @sub_blocks_lookup = sub_block_parser.parse(input)
95
+ valid = true
96
+ rescue
97
+ valid = false
98
+ end
99
+ end
100
+ end
101
+ @sub_blocks_lookup
102
+ end
103
+
104
+ # Returns a hash that looks like:
105
+ #
106
+ # {"Falcon"=>{"RAM"=>{}, "ATD"=>{:instances=>2}}, "Eagle"=>{"RAM"=>{:instances=>2}, "ATD"=>{:instances=>4}}}
107
+ def top_level_sub_blocks
108
+ blocks = {}
109
+ # Make sure that each top-level object has a sub blocks assignment
110
+ if @top_level_names.any? { |n| @sub_blocks_lookup[n] }
111
+ @top_level_names.each do |name|
112
+ if @sub_blocks_lookup[name]
113
+ blocks[name] = @sub_blocks_lookup[name][:children] || {}
114
+ else
115
+ blocks[name] = {}
116
+ end
117
+ end
118
+ # Duplicate the given sub blocks to all top-level objects if none have been specified
119
+ else
120
+ @top_level_names.each do |name|
121
+ blocks[name] = @sub_blocks_lookup
122
+ end
123
+ end
124
+ blocks
125
+ end
126
+
127
+ # Returns a hash with all sub-blocks at the top-level, e.g.:
128
+ #
129
+ # {"RAM"=>{}, "ATD"=>{}, "Comms"=>{"RAM"=>{:instances=>2}, "Osc"=>{}}, "Osc"=>{}}
130
+ def sub_blocks
131
+ blocks = {}
132
+ top_level_sub_blocks.each do |top, attrs|
133
+ extract_sub_blocks(attrs) do |name, attrs|
134
+ if blocks[name]
135
+ if blocks[name] != (attrs[:children] || {})
136
+ Origen.log.warning "The app builder does not currently support different sub-block definitions for block #{name}"
137
+ Origen.log.warning 'Only the first defintion has been built'
138
+ end
139
+ else
140
+ blocks[name] = attrs[:children] || {}
141
+ end
142
+ end
143
+ end
144
+ blocks
145
+ end
146
+
147
+ def extract_sub_blocks(blocks, &block)
148
+ blocks.each do |name, attrs|
149
+ yield name, attrs
150
+ extract_sub_blocks(attrs[:children], &block) if attrs[:children]
151
+ end
152
+ end
153
+
154
+ # Defines the filelist for the generator, the default list is inherited from the
155
+ # parent class (Application).
156
+ # The filelist can contain references to generate files, directories or symlinks in the
157
+ # new application.
158
+ #
159
+ # Generally to make your generator more maintainable try and re-use as much as possible
160
+ # from the parent generator, this means that your generator will automatically stay up
161
+ # to date with the latest conventions
162
+ #
163
+ # The master templates live in templates/app_generators/application, but
164
+ # DO NOT MODIFY THESE FILES DIRECTLY.
165
+ # Either add or remove things post-generation in the modify_files method or copy the
166
+ # master file to the equivalent sub-directory of templates/app_generators/test_engineering/generic_stand_alone_application
167
+ # which will override the version in the master directory.
168
+ #
169
+ # Additional files can be added or removed from the filelist as shown below.
170
+ def filelist
171
+ @filelist ||= begin
172
+ list = super # Always pick up the parent list
173
+ # Example of how to remove a file from the parent list
174
+ list.delete(:lib_top_level)
175
+ list.delete(:target_debug)
176
+ list.delete(:target_production)
177
+ list.delete(:target_default)
178
+ # Example of how to add a file, in this case the file will be compiled and copied to
179
+ # the same location in the new app
180
+ @top_level_names.each_with_index do |name, i|
181
+ list["top_level_model_#{i}"] = { source: 'lib/top_level.rb',
182
+ dest: "lib/#{@name}/#{name.underscore}.rb",
183
+ options: { name: name, sub_blocks: top_level_sub_blocks[name] }
184
+ }
185
+
186
+ list["top_level_controller_#{i}"] = { source: 'lib/top_level_controller.rb',
187
+ dest: "lib/#{@name}/#{name.underscore}_controller.rb",
188
+ options: { name: name }
189
+ }
190
+
191
+ list["target_#{name}"] = { source: 'target/top_level.rb',
192
+ dest: "target/#{name.underscore}.rb",
193
+ options: { name: name }
194
+ }
195
+ if i == 0
196
+ list[:target_default] = { source: "#{name.underscore}.rb", # Relative to the file being linked to
197
+ dest: 'target/default.rb', # Relative to destination_root
198
+ type: :symlink }
199
+ end
200
+ end
201
+
202
+ sub_blocks.each do |name, blocks|
203
+ list["ip_block_#{name}"] = { source: 'lib/ip_block.rb',
204
+ dest: "lib/#{@name}/#{name.underscore}.rb",
205
+ options: { name: name, sub_blocks: blocks }
206
+ }
207
+
208
+ list["ip_block_controller_#{name}"] = { source: 'lib/ip_block_controller.rb',
209
+ dest: "lib/#{@name}/#{name.underscore}_controller.rb" }
210
+ end
211
+
212
+ list[:environment_j750] = { source: 'environment/j750.rb' }
213
+ list[:environment_uflex] = { source: 'environment/uflex.rb' }
214
+ list[:environment_v93k] = { source: 'environment/v93k.rb' }
215
+ list[:environment_jlink] = { source: 'environment/jlink.rb' }
216
+ # Alternatively specifying a different destination, typically you would do this when
217
+ # the final location is dynamic
218
+ # list[:gemspec] = { source: 'gemspec.rb', dest: "#{@name}.gemspec" }
219
+ # Example of how to create a directory
220
+ # list[:pattern_dir] = { dest: "pattern", type: :directory }
221
+ # Example of how to create a symlink
222
+ list[:environment_default] = { source: 'j750.rb', # Relative to the file being linked to
223
+ dest: 'environment/default.rb', # Relative to destination_root
224
+ type: :symlink }
225
+ # Test engineering source directories
226
+ list[:program_dir] = { dest: 'program', type: :directory }
227
+ list[:pattern_dir] = { dest: 'pattern', type: :directory }
228
+ # Example source files
229
+ list[:pattern_example] = { source: 'pattern/example.rb' }
230
+ # Remember to return the final list
231
+ list
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,162 @@
1
+ module OrigenAppGenerators
2
+ module TestEngineering
3
+ # Generates a generic plugin shell
4
+ class TestBlock < Plugin
5
+ desc 'An IP test module intended to plugin into a top-level (SoC) application'
6
+
7
+ def initialize(*args)
8
+ @audience = :internal
9
+ super
10
+ end
11
+
12
+ def get_user_input
13
+ # The methods to get the common user input that applies to all applications will
14
+ # get called at the start automatically, you have a chance here to ask any additional
15
+ # questions that are specific to the type of application being generated
16
+ get_ip_names
17
+ get_sub_block_name
18
+ end
19
+
20
+ def generate_files
21
+ @runtime_dependencies = [
22
+ ['origen_testers', '>= 0.6.1']
23
+ ]
24
+ build_filelist
25
+ end
26
+
27
+ def final_modifications
28
+ prepend_to_file "lib/#{@name}.rb", "require 'origen_testers'\n"
29
+ # Add require line
30
+ doc_helpers = /gem 'origen_doc_helpers'/
31
+ inject_into_file 'Gemfile', "\ngem 'origen_jtag'\ngem 'origen_arm_debug'\n",
32
+ after: doc_helpers
33
+ end
34
+
35
+ def conclude
36
+ puts "New test module created at: #{destination_root}"
37
+ puts
38
+ puts 'Generate an example pattern by running "origen g example"'
39
+ end
40
+
41
+ protected
42
+
43
+ def get_ip_names
44
+ puts
45
+ puts 'NAME THE IP BLOCKS THAT THIS MODULE WILL SUPPORT'
46
+ puts
47
+ puts "You don't need to name them all up front, but you must declare at least one."
48
+ puts 'We recommend that you use the official name(s) for the IP(s) as used by your design team.'
49
+ puts 'Separate multiple names with a comma: FLASH_C40_512K, FLASH_C40_2M'
50
+ puts
51
+
52
+ valid = false
53
+ until valid
54
+ @ip_names = get_text(single: true).strip.split(',').map do |name|
55
+ n = name.strip.symbolize.to_s.upcase
56
+ unless n.empty?
57
+ n
58
+ end
59
+ end.compact
60
+ unless @ip_names.empty?
61
+ # Should we check anything here?
62
+ valid = true
63
+ end
64
+ end
65
+ @ip_names
66
+ end
67
+
68
+ def get_sub_block_name
69
+ puts
70
+ puts "WHAT SHOULD BE THE PATH TO #{@ip_names.first} WHEN IT IS INSTANTIATED IN AN SOC?"
71
+ puts
72
+ puts 'Your IP(s) will be instantiated by a top-level (SoC) model, at which point it should be given a generic nickname'
73
+ puts 'that will provide an easy way to access it.'
74
+ puts 'For example, if you had an IP model for an NVM block, the IP name might be "FLASH_C40_512K_128K", but when it is'
75
+ puts 'instantiated it would be given the name "flash", allowing it be easily accessed as "dut.flash".'
76
+ puts
77
+
78
+ valid = false
79
+ until valid
80
+ @sub_block_name = get_text(single: true).strip.split(',').map do |name|
81
+ n = name.strip.symbolize.to_s.downcase
82
+ unless n.empty?
83
+ n
84
+ end
85
+ end.compact
86
+ unless @sub_block_name.empty?
87
+ # Should we check anything here?
88
+ valid = true
89
+ end
90
+ end
91
+ @sub_block_name = @sub_block_name.first
92
+ end
93
+
94
+ # Defines the filelist for the generator, the default list is inherited from the
95
+ # parent class (Plugin).
96
+ # The filelist can contain references to generate files, directories or symlinks in the
97
+ # new application.
98
+ #
99
+ # Generally to make your generator more maintainable try and re-use as much as possible
100
+ # from the parent generator, this means that your generator will automatically stay up
101
+ # to date with the latest conventions
102
+ #
103
+ # The master templates live in templates/app_generators/plugin, but
104
+ # DO NOT MODIFY THESE FILES DIRECTLY.
105
+ # Either add or remove things post-generation in the modify_files method or copy the
106
+ # master file to the equivalent sub-directory of templates/app_generators/test_engineering/mpg_test_block
107
+ # which will override the version in the master directory.
108
+ #
109
+ # Additional files can be added or removed from the filelist as shown below.
110
+ def filelist
111
+ @filelist ||= begin
112
+ list = super # Always pick up the parent list
113
+ # Example of how to remove a file from the parent list
114
+ list.delete(:target_debug)
115
+ list.delete(:target_production)
116
+ # Example of how to add a file, in this case the file will be compiled and copied to
117
+ # the same location in the new app
118
+ list[:target_default] = { source: 'target/default.rb' }
119
+ list[:environment_v93k] = { source: 'environment/v93k.rb' }
120
+ list[:environment_j750] = { source: 'environment/j750.rb' }
121
+ list[:environment_ultraflex] = { source: 'environment/ultraflex.rb' }
122
+ list[:program_prb1] = { source: 'program/prb1.rb' }
123
+ list[:lib_interface] = { source: 'lib/interface.rb', dest: "lib/#{@name}/interface.rb" }
124
+ # Alternatively specifying a different destination, typically you would do this when
125
+ # the final location is dynamic
126
+ # list[:gemspec] = { source: 'gemspec.rb', dest: "#{@name}.gemspec" }
127
+ # Example of how to create a directory
128
+ list[:pattern_dir] = { dest: 'pattern', type: :directory }
129
+ # Example of how to create a symlink
130
+ list[:environment_default] = { source: 'ultraflex.rb', # Relative to the file being linked to
131
+ dest: 'environment/default.rb', # Relative to destination_root
132
+ type: :symlink }
133
+ list[:dev_dut] = { source: 'lib_dev/dut.rb',
134
+ dest: "lib/#{@name}_dev/dut.rb",
135
+ options: { class_name: @ip_names.first, sub_block_name: @sub_block_name }
136
+ }
137
+ list[:dev_dutc] = { source: 'lib_dev/dut_controller.rb',
138
+ dest: "lib/#{@name}_dev/dut_controller.rb"
139
+ }
140
+
141
+ @ip_names.each_with_index do |name, i|
142
+ list["ip_#{i}"] = { source: 'lib/model.rb',
143
+ dest: "lib/#{@name}/#{name.underscore}.rb",
144
+ options: { name: name }
145
+ }
146
+
147
+ list["ip_controller_#{i}"] = { source: 'lib/controller.rb',
148
+ dest: "lib/#{@name}/#{name.underscore}_controller.rb",
149
+ options: { name: name }
150
+ }
151
+ end
152
+
153
+ list[:pattern_example] = { source: 'pattern/example.rb',
154
+ options: { sub_block_name: @sub_block_name }
155
+ }
156
+ # Remember to return the final list
157
+ list
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,123 @@
1
+ require 'origen'
2
+ require_relative '../config/application.rb'
3
+ require 'colored'
4
+ require 'origen_app_generators/base'
5
+ require 'origen_app_generators/application'
6
+ require 'origen_app_generators/plugin'
7
+ require 'origen_app_generators/empty_application'
8
+ require 'origen_app_generators/empty_plugin'
9
+ require 'origen_app_generators/new'
10
+ require 'origen_app_generators/test_engineering/test_block'
11
+ require 'origen_app_generators/test_engineering/stand_alone_application'
12
+ require 'origen_app_generators/origen_infrastructure/app_generator_plugin'
13
+
14
+ module OrigenAppGenerators
15
+ extend Origen::Utility::InputCapture
16
+
17
+ TEST_INPUTS = [
18
+ # 0 - Empty app
19
+ ['0', '0', :default, :default, :default],
20
+ # 1 - Empty plugin
21
+ ['0', '1', :default, :default, 'A test block', 'yes', :default],
22
+ # 2 - Stand alone test engineering app
23
+ ['2', '0', :default, :default, 'Falcon, Eagle', 'Falcon[ram, atd(2), comm[ram(2), osc](3)], Eagle[ram(2), atd(4)]', [:default, 'origen g example']],
24
+ # 3 - Test module
25
+ ['2', '1', :default, :default, 'Test module for all flash IPs', 'FLASH_512K, FLASH_1024K', 'flash', [:default, 'origen g example']],
26
+ # 4 - An app generators plugin
27
+ ['1', '0', :default, :default, 'My application generators', :default]
28
+ ] # END_OF_TEST_INPUTS Don't remove this comment, it is used by the app_gen:new command!
29
+
30
+ # As you add new generators to this app they will be entered here, this enables the
31
+ # mechanism to register them with the 'origen new' command.
32
+ # You should generally not modify this by hand, instead use the 'origen app_gen:new'
33
+ # command every time you want to create a new generator, and this will be filled in
34
+ # for you.
35
+ AVAILABLE = {
36
+ 'Test Engineering' => [
37
+ OrigenAppGenerators::TestEngineering::TestBlock,
38
+ OrigenAppGenerators::TestEngineering::StandAloneApplication
39
+ ],
40
+ 'Origen Infrastructure' => [
41
+ OrigenAppGenerators::OrigenInfrastructure::AppGeneratorPlugin
42
+ ]
43
+ }
44
+
45
+ # @api private
46
+ def self.add_generators(new_generators, options = {})
47
+ new_generators.each do |domain, gens|
48
+ gens.each { |gen| template_dirs[gen] ||= options[:template_dir] if options[:template_dir] }
49
+ if generators[domain]
50
+ gens.each { |g| generators[domain].unshift(g) }
51
+ new_generators.delete(domain)
52
+ end
53
+ end
54
+ @generators = new_generators.merge(generators)
55
+ end
56
+
57
+ # @api private
58
+ def self.unload_generators
59
+ @generators = {}
60
+ end
61
+
62
+ # @api private
63
+ def self.generators
64
+ @generators ||= AVAILABLE
65
+ end
66
+
67
+ # @api private
68
+ def self.template_dirs
69
+ @template_dirs ||= {}
70
+ end
71
+
72
+ # @api private
73
+ def self.invoke(path)
74
+ puts
75
+ puts 'CHOOSE AN APPLICATION DOMAIN'
76
+ puts
77
+ puts "Domain-specific application templates are available for the following areas (enter '0' to build an empty generic one)"
78
+ puts
79
+ i = 0
80
+ accept = [0]
81
+ puts '0 - Empty / Not listed'
82
+ generators.reverse_each do |domain, _generators|
83
+ i += 1
84
+ accept << i
85
+ puts "#{i} - #{domain}"
86
+ end
87
+ puts
88
+ selection = get_text(single: true, default: '0', accept: accept).to_i
89
+ if selection == 0
90
+ puts
91
+ puts "WHAT TYPE OF APPLICATION DO YOU WANT TO BUILD? (if you don't know go with 'application')"
92
+ puts
93
+ puts '0 - Application'
94
+ puts '1 - Plugin'
95
+ puts
96
+ accept = [0, 1]
97
+ selection = get_text(single: true, accept: accept, default: 0).to_i
98
+
99
+ case selection
100
+ when 0
101
+ OrigenAppGenerators::EmptyApplication.start [path]
102
+ when 1
103
+ OrigenAppGenerators::EmptyPlugin.start [path]
104
+ end
105
+ else
106
+ domain = generators.to_a
107
+ domain = domain[domain.size - selection]
108
+ puts
109
+ puts "CHOOSE FROM THE FOLLOWING #{domain[0].upcase} APPLICATION TEMPLATES"
110
+ puts
111
+ accept = []
112
+ i = 0
113
+ domain[1].reverse_each do |generator|
114
+ accept << i
115
+ puts "#{i} - #{generator.desc}"
116
+ i += 1
117
+ end
118
+ puts
119
+ selection = get_text(single: true, accept: accept).to_i
120
+ domain[1][domain[1].size - 1 - selection].start [path]
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,6 @@
1
+ # You can define any Rake tasks to support your application here (or in any file
2
+ # ending in .rake in this directory).
3
+ #
4
+ # Rake (Ruby Make) is very useful for creating build scripts, see this short video
5
+ # for a quick introduction:
6
+ # http://railscasts.com/episodes/66-custom-rake-tasks
@@ -0,0 +1,8 @@
1
+ # This file has been added by origen_app_generators to test that the target can be
2
+ # loaded within this application, it will not be included in your final application
3
+ # builds once your generator has been released.
4
+ namespace :new_app_tests do
5
+ task :load_target do
6
+ Origen.app.target.load!
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: origen_app_generators 1.2.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "origen_app_generators".freeze
6
+ s.version = "1.2.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.8.11".freeze) if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib".freeze]
10
+ s.authors = ["Stephen McGinty".freeze]
11
+ s.date = "2018-12-10"
12
+ s.email = ["stephen.f.mcginty@gmail.com".freeze]
13
+ s.files = ["bin/boot.rb".freeze, "bin/fix_my_workspace".freeze, "config/application.rb".freeze, "config/boot.rb".freeze, "config/commands.rb".freeze, "config/shared_commands.rb".freeze, "config/version.rb".freeze, "lib/origen_app_generators.rb".freeze, "lib/origen_app_generators/application.rb".freeze, "lib/origen_app_generators/base.rb".freeze, "lib/origen_app_generators/empty_application.rb".freeze, "lib/origen_app_generators/empty_plugin.rb".freeze, "lib/origen_app_generators/new.rb".freeze, "lib/origen_app_generators/origen_infrastructure/app_generator_plugin.rb".freeze, "lib/origen_app_generators/plugin.rb".freeze, "lib/origen_app_generators/sub_block_parser.rb".freeze, "lib/origen_app_generators/test_engineering/stand_alone_application.rb".freeze, "lib/origen_app_generators/test_engineering/test_block.rb".freeze, "lib/tasks/app_generators.rake".freeze, "lib/tasks/new_app_tests.rake".freeze, "templates/app_generators".freeze, "templates/app_generators/application".freeze, "templates/app_generators/application/.gitignore".freeze, "templates/app_generators/application/.irbrc".freeze, "templates/app_generators/application/.rspec".freeze, "templates/app_generators/application/.travis.yml".freeze, "templates/app_generators/application/Gemfile".freeze, "templates/app_generators/application/Rakefile".freeze, "templates/app_generators/application/config".freeze, "templates/app_generators/application/config/application.rb".freeze, "templates/app_generators/application/config/boot.rb".freeze, "templates/app_generators/application/config/commands.rb".freeze, "templates/app_generators/application/config/maillist_dev.txt".freeze, "templates/app_generators/application/config/maillist_prod.txt".freeze, "templates/app_generators/application/config/version.rb".freeze, "templates/app_generators/application/doc".freeze, "templates/app_generators/application/doc/history".freeze, "templates/app_generators/application/dot_keep".freeze, "templates/app_generators/application/lib".freeze, "templates/app_generators/application/lib/app.rake".freeze, "templates/app_generators/application/lib/module.rb".freeze, "templates/app_generators/application/lib/top_level.rb".freeze, "templates/app_generators/application/origen_core_session".freeze, "templates/app_generators/application/spec".freeze, "templates/app_generators/application/spec/spec_helper.rb".freeze, "templates/app_generators/application/target".freeze, "templates/app_generators/application/target/debug.rb".freeze, "templates/app_generators/application/target/default.rb".freeze, "templates/app_generators/application/target/production.rb".freeze, "templates/app_generators/application/templates".freeze, "templates/app_generators/application/templates/web".freeze, "templates/app_generators/application/templates/web/index.md.erb".freeze, "templates/app_generators/application/templates/web/layouts".freeze, "templates/app_generators/application/templates/web/layouts/_basic.html.erb".freeze, "templates/app_generators/application/templates/web/partials".freeze, "templates/app_generators/application/templates/web/partials/_navbar.html.erb".freeze, "templates/app_generators/application/templates/web/release_notes.md.erb".freeze, "templates/app_generators/new".freeze, "templates/app_generators/new/generator.rb".freeze, "templates/app_generators/new/info.md.erb".freeze, "templates/app_generators/origen_infrastructure".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config/load_generators.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/application.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/base.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/module.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/plugin.rb".freeze, "templates/app_generators/plugin".freeze, "templates/app_generators/plugin/Gemfile".freeze, "templates/app_generators/plugin/Rakefile".freeze, "templates/app_generators/plugin/config".freeze, "templates/app_generators/plugin/config/boot.rb".freeze, "templates/app_generators/plugin/gemspec.rb".freeze, "templates/app_generators/plugin/lib".freeze, "templates/app_generators/plugin/lib/README".freeze, "templates/app_generators/plugin/lib_dev".freeze, "templates/app_generators/plugin/lib_dev/README".freeze, "templates/app_generators/plugin/templates".freeze, "templates/app_generators/plugin/templates/web".freeze, "templates/app_generators/plugin/templates/web/index.md.erb".freeze, "templates/app_generators/plugin/templates/web/partials".freeze, "templates/app_generators/plugin/templates/web/partials/_navbar_external.html.erb".freeze, "templates/app_generators/plugin/templates/web/partials/_navbar_internal.html.erb".freeze, "templates/app_generators/test_engineering".freeze, "templates/app_generators/test_engineering/stand_alone_application".freeze, "templates/app_generators/test_engineering/stand_alone_application/Gemfile".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/j750.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/jlink.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/uflex.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/v93k.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/ip_block.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/ip_block_controller.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/top_level.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/top_level_controller.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/pattern".freeze, "templates/app_generators/test_engineering/stand_alone_application/pattern/example.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/target".freeze, "templates/app_generators/test_engineering/stand_alone_application/target/top_level.rb".freeze, "templates/app_generators/test_engineering/test_block".freeze, "templates/app_generators/test_engineering/test_block/environment".freeze, "templates/app_generators/test_engineering/test_block/environment/j750.rb".freeze, "templates/app_generators/test_engineering/test_block/environment/ultraflex.rb".freeze, "templates/app_generators/test_engineering/test_block/environment/v93k.rb".freeze, "templates/app_generators/test_engineering/test_block/lib".freeze, "templates/app_generators/test_engineering/test_block/lib/controller.rb".freeze, "templates/app_generators/test_engineering/test_block/lib/interface.rb".freeze, "templates/app_generators/test_engineering/test_block/lib/model.rb".freeze, "templates/app_generators/test_engineering/test_block/lib_dev".freeze, "templates/app_generators/test_engineering/test_block/lib_dev/dut.rb".freeze, "templates/app_generators/test_engineering/test_block/lib_dev/dut_controller.rb".freeze, "templates/app_generators/test_engineering/test_block/pattern".freeze, "templates/app_generators/test_engineering/test_block/pattern/example.rb".freeze, "templates/app_generators/test_engineering/test_block/program".freeze, "templates/app_generators/test_engineering/test_block/program/prb1.rb".freeze, "templates/app_generators/test_engineering/test_block/target".freeze, "templates/app_generators/test_engineering/test_block/target/default.rb".freeze]
14
+ s.homepage = "http://origen-sdk.org/origen_app_generators".freeze
15
+ s.licenses = ["MIT".freeze]
16
+ s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze)
17
+ s.rubygems_version = "2.7.6".freeze
18
+ s.summary = "Origen application generators".freeze
19
+
20
+ s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version
21
+
22
+ if s.respond_to? :specification_version then
23
+ s.specification_version = 4
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<origen>.freeze, [">= 0.23.0"])
27
+ else
28
+ s.add_dependency(%q<origen>.freeze, [">= 0.23.0"])
29
+ end
30
+ else
31
+ s.add_dependency(%q<origen>.freeze, [">= 0.23.0"])
32
+ end
33
+ end
@@ -0,0 +1,49 @@
1
+ $VERBOSE=nil # Don't care about world writable dir warnings and the like
2
+
3
+ require 'pathname'
4
+ if File.exist? File.expand_path("../Gemfile", Pathname.new(__FILE__).realpath)
5
+ require 'rubygems'
6
+ require 'bundler/setup'
7
+ else
8
+ # If running on windows, can't use Origen helpers 'till we load it...
9
+ if RUBY_PLATFORM == 'i386-mingw32'
10
+ `where origen`.split("\n").find do |match|
11
+ match =~ /(.*)\\bin\\origen$/
12
+ end
13
+ origen_top = $1.gsub("\\", "/")
14
+ else
15
+ origen_top = `which origen`.strip.sub("/bin/origen", "")
16
+ end
17
+
18
+ $LOAD_PATH.unshift "#{origen_top}/lib"
19
+ end
20
+
21
+ require "origen"
22
+
23
+ require "rspec/legacy_formatters"
24
+ require "#{Origen.top}/spec/format/origen_formatter"
25
+
26
+ if RUBY_VERSION >= '2.0.0'
27
+ require "byebug"
28
+ else
29
+ require 'debugger'
30
+ end
31
+ require 'pry'
32
+
33
+ def load_target(target="default")
34
+ Origen.target.switch_to target
35
+ Origen.target.load!
36
+ end
37
+
38
+ RSpec.configure do |config|
39
+ config.formatter = OrigenFormatter
40
+ # rspec-expectations config goes here. You can use an alternate
41
+ # assertion/expectation library such as wrong or the stdlib/minitest
42
+ # assertions if you prefer.
43
+ config.expect_with :rspec do |expectations|
44
+ # Enable only the newer, non-monkey-patching expect syntax.
45
+ # For more details, see:
46
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
47
+ expectations.syntax = :should
48
+ end
49
+ end