origen 0.27.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/version.rb +1 -1
- data/lib/origen.rb +13 -0
- data/lib/origen/application/plugins.rb +3 -0
- data/lib/origen/commands.rb +1 -1
- data/lib/origen/commands/plugin.rb +240 -3
- data/lib/origen/core_ext.rb +1 -0
- data/lib/origen/core_ext/numeric.rb +6 -6
- data/lib/origen/core_ext/string.rb +24 -0
- data/lib/origen/core_ext/symbol.rb +5 -0
- data/lib/origen/model.rb +3 -0
- data/lib/origen/model/exporter.rb +238 -0
- data/lib/origen/parameters.rb +27 -6
- data/lib/origen/pins.rb +4 -0
- data/lib/origen/pins/pin.rb +26 -1
- data/lib/origen/power_domains/power_domain.rb +51 -11
- data/lib/origen/registers.rb +5 -4
- data/lib/origen/registers/bit_collection.rb +9 -4
- data/lib/origen/registers/reg.rb +66 -24
- data/lib/origen/site_config.rb +1 -1
- data/lib/origen/sub_blocks.rb +125 -38
- data/lib/origen/top_level.rb +6 -1
- data/lib/origen/users/user.rb +1 -1
- data/vendor/lib/models/origen/export1.rb +75 -0
- data/vendor/lib/models/origen/export1/block1.rb +13 -0
- data/vendor/lib/models/origen/export1/block1/x.rb +27 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6c14abeb7969c56b039ecae7c2b8895942cc31
|
4
|
+
data.tar.gz: 6537fdfdd336093de65eb0d122902adb9ceb21aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64d3ca87c62cf25de9082e6ce7c263a504bf1bc6ed7cc06f653989e06cb053a400e194cb3a280dbf6202ee939f1eea57c4fa6cb384d5af57bd24db99971bf07f
|
7
|
+
data.tar.gz: 6c730671056c7bf5d39f04b9dfa0578a1985006d347cf4c2c4a2f19d9bfc944b419f0304b421188573843672136ef4e19c01297a8660c3c0c5d8ac18b13c2cc6
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -162,6 +162,10 @@ unless defined? RGen::ORIGENTRANSITION
|
|
162
162
|
end
|
163
163
|
alias_method :application!, :app!
|
164
164
|
|
165
|
+
def has_plugin?(plugin)
|
166
|
+
_applications_lookup[:name][plugin.to_sym].nil? ? false : true
|
167
|
+
end
|
168
|
+
|
165
169
|
# @api private
|
166
170
|
def with_source_file(file)
|
167
171
|
@current_source_dir = Pathname.new(file).dirname
|
@@ -727,6 +731,15 @@ unless defined? RGen::ORIGENTRANSITION
|
|
727
731
|
@lsf ||= Origen::Application::LSF.new
|
728
732
|
end
|
729
733
|
|
734
|
+
# Let's Origen know about any domain specific acronyms used with an application, this will cause
|
735
|
+
# them to be translated between underscored and camel-cased versions correctly
|
736
|
+
def register_acronym(name)
|
737
|
+
require 'active_support/core_ext/string/inflections'
|
738
|
+
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
739
|
+
inflect.acronym(name)
|
740
|
+
end
|
741
|
+
end
|
742
|
+
|
730
743
|
private
|
731
744
|
|
732
745
|
def current_command=(val)
|
@@ -21,6 +21,9 @@ module Origen
|
|
21
21
|
if line =~ /^\s*gem\s+(("|')\w+("|')),.*(:path\s*=>|path:)/
|
22
22
|
fail "The following gem is defined as a path in your Gemfile, but that is not allowed in production: #{Regexp.last_match[1]}"
|
23
23
|
end
|
24
|
+
if line =~ /ORIGEN PLUGIN AUTO-GENERATED/
|
25
|
+
fail 'Fetched gems are currently being used in your Gemfile, but that is not allowed in production!'
|
26
|
+
end
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
data/lib/origen/commands.rb
CHANGED
@@ -228,7 +228,7 @@ end.compact
|
|
228
228
|
|
229
229
|
case @command
|
230
230
|
when 'generate', 'program', 'compile', 'merge', 'interactive', 'target', 'environment',
|
231
|
-
'save', 'lsf', 'web', 'time', 'dispatch', 'rc', 'lint', 'plugin', 'fetch', 'mode' # , 'add'
|
231
|
+
'save', 'lsf', 'web', 'time', 'dispatch', 'rc', 'lint', 'plugin', 'fetch', 'mode', 'gem' # , 'add'
|
232
232
|
|
233
233
|
require "origen/commands/#{@command}"
|
234
234
|
exit 0 unless @command == 'interactive'
|
@@ -1,4 +1,9 @@
|
|
1
1
|
require 'optparse'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'origen/version_string'
|
5
|
+
|
6
|
+
include Origen::Utility::InputCapture
|
2
7
|
|
3
8
|
options = {}
|
4
9
|
|
@@ -12,22 +17,110 @@ Usage: origen pl
|
|
12
17
|
|
13
18
|
Quickstart Examples:
|
14
19
|
origen pl # Displays the current plugin
|
15
|
-
origen pl added # Lists the included plugins
|
16
20
|
origen pl [plugin_name] # Sets the specified plugin as current plugin
|
17
21
|
origen pl reset # Resets the current plugin to none
|
22
|
+
origen pl added # Lists the included Origen plugins
|
23
|
+
origen pl added --all # Lists the included Origen plugins and external gem dependencies
|
24
|
+
origen pl fetch [plugin_name] # Populates plugin/gem source to a local repo (<app_root>/tmp/gems/)
|
25
|
+
origen pl clean [plugin_name|all] # Removes the local copy of the plugin/gem source
|
26
|
+
origen pl info [plugin_name] # Get additional details of the plugin
|
18
27
|
|
19
28
|
The following commands are available:
|
20
29
|
|
21
30
|
added Displays all plugins that are currently included in this app locally
|
31
|
+
reset Resets the current plugin to none
|
32
|
+
fetch Populates plugin/gem source to a local repo (<app_root>/tmp/gems/)
|
33
|
+
clean Removes the local copy of the plugin/gem source
|
34
|
+
info Displays detailed information about the plugin/gem
|
22
35
|
|
23
36
|
The following options are available:
|
24
37
|
EOT
|
38
|
+
opts.on('-a', '--allr', 'List all plugins/gems (including external)') { options[:debugger] = true }
|
25
39
|
opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
|
26
40
|
opts.on('-h', '--help', 'Show this message') { puts opts; exit }
|
27
41
|
end
|
28
42
|
|
29
43
|
opt_parser.parse! ARGV
|
30
44
|
|
45
|
+
QUIET_ATTRS = %w(
|
46
|
+
files test_files signing_key licenses rdoc_options
|
47
|
+
autorequire cert_chain post_install_message
|
48
|
+
)
|
49
|
+
|
50
|
+
def self._local_gems
|
51
|
+
gems = {}
|
52
|
+
Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name).map do |name, specs|
|
53
|
+
gems[name.to_sym] = {
|
54
|
+
name: name,
|
55
|
+
version: specs.map(&:version).join(','),
|
56
|
+
location: specs.map(&:full_gem_path).join(','),
|
57
|
+
authors: specs.map(&:authors).join(',')
|
58
|
+
}
|
59
|
+
end
|
60
|
+
gems
|
61
|
+
end
|
62
|
+
|
63
|
+
def self._local_gems_orig
|
64
|
+
Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self._session_gem_path
|
68
|
+
"#{Origen.app.root}/tmp/gems"
|
69
|
+
end
|
70
|
+
|
71
|
+
def self._application_gemfile
|
72
|
+
"#{Origen.app.root}/Gemfile"
|
73
|
+
end
|
74
|
+
|
75
|
+
def self._local_path_to_gem(gem)
|
76
|
+
"#{_session_gem_path}/#{Pathname(gem[:location]).basename}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def self._gem_basename(gem)
|
80
|
+
"#{Pathname(gem[:location]).basename}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def self._gem_rc_version(gem)
|
84
|
+
gem[:version]
|
85
|
+
end
|
86
|
+
|
87
|
+
def self._update_gemfile
|
88
|
+
content = File.read(_application_gemfile)
|
89
|
+
|
90
|
+
search_regexp = "# ORIGEN PLUGIN AUTO-GENERATED.*# /ORIGEN PLUGIN AUTO-GENERATED.*?\n"
|
91
|
+
|
92
|
+
if Origen.app.session.gems.keys.empty?
|
93
|
+
new_contents = content.gsub(/#{search_regexp}/m, '')
|
94
|
+
else
|
95
|
+
replacement_string = "# ORIGEN PLUGIN AUTO-GENERATED---------------DO NOT REMOVE THIS LINE-------------\n"
|
96
|
+
replacement_string += "# -- DO NOT CHECK IN WITH THIS SECTION!\n"
|
97
|
+
replacement_string += "# -- DO NOT HAND MODIFY!\n"
|
98
|
+
replacement_string += "# -- USE 'origen pl clean all' to reset\n"
|
99
|
+
replacement_string += "\n"
|
100
|
+
|
101
|
+
Origen.app.session.gems.keys.sort.each do |g|
|
102
|
+
replacement_string += "gem '#{g}', path: '#{Origen.app.session.gems[g.to_sym]}'\n"
|
103
|
+
replacement_string += "puts \"\\e[1;93;40mWARNING: Using session gem for '#{g}'\\e[0m\"\n"
|
104
|
+
end
|
105
|
+
|
106
|
+
replacement_string += "def gem(*args)\n"
|
107
|
+
replacement_string += " return if [#{Origen.app.session.gems.keys.sort.map { |e| "'" + e.to_s + "'" }.join(',')}].include? args[0]\n"
|
108
|
+
replacement_string += " super(*args)\n"
|
109
|
+
replacement_string += "end\n"
|
110
|
+
replacement_string += "#\n"
|
111
|
+
replacement_string += "# /ORIGEN PLUGIN AUTO-GENERATED---------------DO NOT REMOVE THIS LINE------------\n"
|
112
|
+
|
113
|
+
if content =~ /#{search_regexp}/m
|
114
|
+
new_contents = content.gsub(/#{search_regexp}/m, replacement_string)
|
115
|
+
else
|
116
|
+
new_contents = replacement_string + content
|
117
|
+
end
|
118
|
+
end
|
119
|
+
File.open(_application_gemfile, 'w') { |file| file.puts new_contents }
|
120
|
+
end
|
121
|
+
|
122
|
+
gems = _local_gems
|
123
|
+
|
31
124
|
if !ARGV[0]
|
32
125
|
if Origen.app.plugins.current
|
33
126
|
puts "Current plugin is: #{Origen.app.plugins.current.name}"
|
@@ -64,8 +157,153 @@ else
|
|
64
157
|
end
|
65
158
|
puts
|
66
159
|
exit 0
|
160
|
+
when 'fetch'
|
161
|
+
gem = ARGV[0]
|
162
|
+
if gem
|
163
|
+
if gems.key?(gem.to_sym)
|
164
|
+
# Initialize ./tmp/gems/
|
165
|
+
FileUtils.mkdir_p(_session_gem_path) unless Dir.exist? _session_gem_path
|
166
|
+
|
167
|
+
if Dir.exist? _local_path_to_gem(gems[gem.to_sym])
|
168
|
+
# check if already exists, ask for permission to blow away
|
169
|
+
puts ''
|
170
|
+
puts "Plugin/Gem '#{_gem_basename(gems[gem.to_sym])}' already exists locally, would you like to replace?"
|
171
|
+
puts "(This will delete and replace the exising copy at #{_local_path_to_gem(gems[gem.to_sym])})"
|
172
|
+
puts ''
|
173
|
+
get_text confirm: true
|
174
|
+
Origen::Log.console_only do
|
175
|
+
Dir.chdir Origen.root do
|
176
|
+
# Blow away these temporary files
|
177
|
+
system("rm -fr #{_local_path_to_gem(gems[gem.to_sym])}")
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
if Origen.has_plugin?(gem)
|
183
|
+
# Set up the requested plugin workspace
|
184
|
+
rc_url = Origen.app(gem.to_sym).config.rc_url || Origen.app(gem.to_sym).config.vault
|
185
|
+
if rc_url =~ /git/
|
186
|
+
Origen::RevisionControl::Git.git("clone #{rc_url} #{_gem_basename(gems[gem.to_sym])}", local: _session_gem_path, verbose: true)
|
187
|
+
else
|
188
|
+
# Use Origen::RevisionControl for DesignSync
|
189
|
+
rc = Origen::RevisionControl.new remote: rc_url, local: _local_path_to_gem(gems[gem.to_sym])
|
190
|
+
tag = Origen::VersionString.new(_gem_rc_version(gems[gem.to_sym]))
|
191
|
+
tag = tag.prefixed if tag.semantic?
|
192
|
+
rc.build version: tag
|
193
|
+
end
|
194
|
+
else
|
195
|
+
puts 'Not an Origen plugin, only COPYING source.'
|
196
|
+
FileUtils.cp_r(gems[gem.to_sym][:location], _session_gem_path)
|
197
|
+
end
|
198
|
+
|
199
|
+
# FileUtils.cp_r(gems[gem.to_sym][:location], _session_gem_path)
|
200
|
+
unless options[:dont_use]
|
201
|
+
Origen.app.session.gems[gem.to_sym] = "#{_local_path_to_gem(gems[gem.to_sym])}"
|
202
|
+
end
|
67
203
|
|
68
|
-
|
204
|
+
_update_gemfile
|
205
|
+
|
206
|
+
puts "Fetched #{gem} to tmp/gems/#{_gem_basename(gems[gem.to_sym])}"
|
207
|
+
puts ''
|
208
|
+
else
|
209
|
+
puts "Error: '#{gem}' is not a currently used plugin/gem. Use 'origen pl list' for gem list."
|
210
|
+
end
|
211
|
+
else
|
212
|
+
puts "Error: Must specify plugin/gem to be fetched. Use 'origen pl -h' for usage"
|
213
|
+
end
|
214
|
+
when 'clean'
|
215
|
+
gem = ARGV[0]
|
216
|
+
if gem
|
217
|
+
if gem == 'all'
|
218
|
+
if Dir.exist? _session_gem_path
|
219
|
+
puts ''
|
220
|
+
puts 'You are about to delete all local plugin/gems (tmp/gems/). IS THAT CORRECT?'
|
221
|
+
puts ''
|
222
|
+
get_text confirm: true
|
223
|
+
Origen::Log.console_only do
|
224
|
+
Dir.chdir Origen.root do
|
225
|
+
system("rm -fr #{_session_gem_path}")
|
226
|
+
end
|
227
|
+
end
|
228
|
+
unless Origen.app.session.gems.keys.empty?
|
229
|
+
Origen.app.session.gems.keys.sort.each do |g|
|
230
|
+
Origen.app.session.gems.delete_key(g)
|
231
|
+
end
|
232
|
+
_update_gemfile
|
233
|
+
end
|
234
|
+
else
|
235
|
+
puts 'There are no local plugins/gems present, nothing to clean.'
|
236
|
+
end
|
237
|
+
elsif gems.key?(gem.to_sym)
|
238
|
+
if Dir.exist? _local_path_to_gem(gems[gem.to_sym])
|
239
|
+
# check if already exists, ask for permission to blow away
|
240
|
+
puts ''
|
241
|
+
puts "You are about to delete the local copy of '#{gem}' (tmp/gems/#{_gem_basename(gems[gem.to_sym])}). IS THAT CORRECT?"
|
242
|
+
puts ''
|
243
|
+
get_text confirm: true
|
244
|
+
Origen::Log.console_only do
|
245
|
+
Dir.chdir Origen.root do
|
246
|
+
system("rm -fr #{_local_path_to_gem(gems[gem.to_sym])}")
|
247
|
+
end
|
248
|
+
end
|
249
|
+
Origen.app.session.gems.delete_key(gem.to_sym)
|
250
|
+
_update_gemfile
|
251
|
+
else
|
252
|
+
puts "Plugin/Gem '#{gem}' is not locally present, nothing to clean."
|
253
|
+
end
|
254
|
+
end
|
255
|
+
else
|
256
|
+
puts "Error: Must specify plugin/gem to be cleaned or 'all'. Use 'origen pl -h' for usage"
|
257
|
+
end
|
258
|
+
when 'info'
|
259
|
+
gem = ARGV[0]
|
260
|
+
if gem
|
261
|
+
if gems.key?(gem.to_sym)
|
262
|
+
a = _local_gems_orig[gem].to_yaml.split(/\n+/)
|
263
|
+
skip = true
|
264
|
+
|
265
|
+
if options[:gem_location] || options[:gem_version]
|
266
|
+
puts '================================================================================='
|
267
|
+
puts "Gem Name: #{gems[gem.to_sym][:name]}"
|
268
|
+
puts "Version: #{gems[gem.to_sym][:version]}" if options[:gem_version]
|
269
|
+
puts "Location: #{gems[gem.to_sym][:location]}" if options[:gem_location]
|
270
|
+
puts '================================================================================='
|
271
|
+
else
|
272
|
+
puts '================================================================================='
|
273
|
+
puts "Gem Name: #{gems[gem.to_sym][:name]}"
|
274
|
+
puts "Version: #{gems[gem.to_sym][:version]}"
|
275
|
+
puts "Location: #{gems[gem.to_sym][:location]}"
|
276
|
+
puts '---------------------------------------------------------------------------------'
|
277
|
+
puts 'Details:'
|
278
|
+
a.each do |line|
|
279
|
+
if line =~ /^ (\w+):(.*)$/
|
280
|
+
topic = Regexp.last_match(1)
|
281
|
+
if QUIET_ATTRS.include? topic
|
282
|
+
skip = true
|
283
|
+
else
|
284
|
+
skip = false
|
285
|
+
end
|
286
|
+
end
|
287
|
+
puts " #{line}" unless skip
|
288
|
+
end
|
289
|
+
puts '---------------------------------------------------------------------------------'
|
290
|
+
puts '================================================================================='
|
291
|
+
end
|
292
|
+
else
|
293
|
+
puts "Error: '#{gem}' not a valid command or plugin/gem. Use 'origen pl -h' for usage or 'origen pl list' for plugin/gem list."
|
294
|
+
end
|
295
|
+
else
|
296
|
+
puts "Error: Must specify plugin/gem for the info command. Use 'origen pl -h' for usage"
|
297
|
+
end
|
298
|
+
when 'list'
|
299
|
+
longest_key = gems.keys.max_by(&:length)
|
300
|
+
puts ''
|
301
|
+
printf "%-#{longest_key.length}s %-15s %s\n", 'Gem', 'Version', 'Location'
|
302
|
+
puts '--------------------------------------------------------------------------------------------------------------'
|
303
|
+
gems.each do |k, v|
|
304
|
+
printf "%-#{longest_key.length}s %-15s %s\n", k, v[:version], v[:location]
|
305
|
+
end
|
306
|
+
puts ''
|
69
307
|
# Origen.plugins_manager.list
|
70
308
|
# when 'describe'
|
71
309
|
# puts Origen.plugins_manager.describe(ARGV.shift)
|
@@ -86,7 +324,6 @@ else
|
|
86
324
|
# end
|
87
325
|
|
88
326
|
else
|
89
|
-
|
90
327
|
Origen.app.plugins.current = input.to_sym
|
91
328
|
if Origen.app.plugins.current
|
92
329
|
puts "#{Origen.app.plugins.current.name} is now set as the current plugin."
|
data/lib/origen/core_ext.rb
CHANGED
@@ -57,7 +57,7 @@ class Numeric
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
%w(Hz hz Ts ts bps sps ohm Ohm a A v V s S).each do |m|
|
60
|
+
%w(Hz hz Ts ts bps sps ohm Ohm a A v V s S f F).each do |m|
|
61
61
|
define_method "as_#{m}" do
|
62
62
|
as_units(m)
|
63
63
|
end
|
@@ -134,31 +134,31 @@ class Numeric
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
-
%w(v V s S a A Hz Ts Ohm ohm O o).each do |m|
|
137
|
+
%w(v V s S a A Hz Ts Ohm ohm O o f F).each do |m|
|
138
138
|
define_method m do
|
139
139
|
self
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
143
|
-
%w(mv mV ms mS ma mA mo mO mOhm mohm).each do |m|
|
143
|
+
%w(mv mV ms mS ma mA mo mO mOhm mohm mf mF).each do |m|
|
144
144
|
define_method m do
|
145
145
|
self / 1_000.0
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
|
-
%w(uv uV us uS ua uA).each do |m|
|
149
|
+
%w(uv uV us uS ua uA uf uF).each do |m|
|
150
150
|
define_method m do
|
151
151
|
self / 1_000_000.0
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
%w(nv nV ns nS na nA).each do |m|
|
155
|
+
%w(nv nV ns nS na nA nf nF).each do |m|
|
156
156
|
define_method m do
|
157
157
|
self / 1_000_000_000.0
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
%w(pv pV ps pS pa pA).each do |m|
|
161
|
+
%w(pv pV ps pS pa pA pf pF).each do |m|
|
162
162
|
define_method m do
|
163
163
|
self / 1_000_000_000_000.0
|
164
164
|
end
|
@@ -141,6 +141,30 @@ class String
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
+
# Boolean if the string is uppercase
|
145
|
+
# Will not work with odd character sets
|
146
|
+
def is_upcase?
|
147
|
+
self == upcase
|
148
|
+
end
|
149
|
+
alias_method :is_uppercase?, :is_upcase?
|
150
|
+
|
151
|
+
# Boolean if the string is uppercase
|
152
|
+
# Will not work with odd character sets
|
153
|
+
def is_downcase?
|
154
|
+
self == downcase
|
155
|
+
end
|
156
|
+
alias_method :is_lowercase?, :is_downcase?
|
157
|
+
|
158
|
+
# Convert Excel/Spreadsheet column to integer
|
159
|
+
def excel_col_index
|
160
|
+
str = split('').map(&:upcase).join('')
|
161
|
+
offset = 'A'.ord - 1
|
162
|
+
str.chars.inject(0) { |x, c| x * 26 + c.ord - offset }
|
163
|
+
end
|
164
|
+
alias_method :xls_col_index, :excel_col_index
|
165
|
+
alias_method :xlsx_col_index, :excel_col_index
|
166
|
+
alias_method :spreadsheet_col_index, :excel_col_index
|
167
|
+
|
144
168
|
private
|
145
169
|
|
146
170
|
# Convert a verilog number string to an integer
|
data/lib/origen/model.rb
CHANGED
@@ -7,6 +7,8 @@ module Origen
|
|
7
7
|
module Model
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
+
autoload :Exporter, 'origen/model/exporter'
|
11
|
+
|
10
12
|
included do
|
11
13
|
attr_writer :ip_name
|
12
14
|
attr_accessor :version
|
@@ -29,6 +31,7 @@ module Origen
|
|
29
31
|
include Origen::Tests
|
30
32
|
include Origen::PowerDomains
|
31
33
|
include Origen::Clocks
|
34
|
+
include Origen::Model::Exporter
|
32
35
|
end
|
33
36
|
|
34
37
|
module ClassMethods
|