origen 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/origen +22 -5
- data/config/{development.rb → boot.rb} +0 -0
- data/config/version.rb +1 -1
- data/lib/origen.rb +6 -2
- data/lib/origen/application.rb +24 -7
- data/lib/origen/application/target.rb +21 -0
- data/lib/origen/chips.rb +281 -0
- data/lib/origen/chips/chip.rb +167 -0
- data/lib/origen/chips/design_entry.rb +36 -0
- data/lib/origen/chips/doc_entry.rb +36 -0
- data/lib/origen/chips/note.rb +14 -0
- data/lib/origen/controller.rb +16 -5
- data/lib/origen/generator/job.rb +1 -3
- data/lib/origen/generator/pattern.rb +14 -12
- data/lib/origen/model.rb +23 -2
- data/lib/origen/site_config.rb +6 -1
- data/lib/origen/specs.rb +1 -0
- data/lib/origen/specs/note.rb +2 -1
- data/lib/origen/sub_blocks.rb +62 -33
- data/lib/origen/users.rb +4 -3
- data/lib/origen/users/user.rb +2 -2
- metadata +9 -7
- data/config/environment.rb +0 -0
- data/config/rgen.policy +0 -7
- data/config/users.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64c45eb89cc8ad305b8cf99ada8741d36a745c1b
|
4
|
+
data.tar.gz: 343beb79e30953b72ea3f048a7676e065538817d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25d2cd159aa19e7c50b4cb8982aa4b7fd777da7e312545ec12917bc6a642afafc0a549368d8265bca7934a52b36899f5f865a67556e6a748c783166e8780105f
|
7
|
+
data.tar.gz: f599582cd7e4048a7d2169365cb783d129f342027a866e46e260c90e9d19ababbdc9f8b19cad64b81c1c9399c6e8a93933e0675c750741a015a5380a88916633
|
data/bin/origen
CHANGED
@@ -9,6 +9,10 @@ end
|
|
9
9
|
|
10
10
|
ORIGEN_MIN_GCC_VERSION = "4.6.3"
|
11
11
|
|
12
|
+
# Keep a note of the pwd at the time when Origen was first loaded, this is initially used
|
13
|
+
# by the site_config lookup.
|
14
|
+
$_origen_invocation_pwd ||= Pathname.pwd
|
15
|
+
|
12
16
|
load File.expand_path('../../lib/origen/operating_systems.rb', __FILE__)
|
13
17
|
load File.expand_path('../../lib/origen/site_config.rb', __FILE__)
|
14
18
|
|
@@ -184,17 +188,30 @@ else
|
|
184
188
|
require "origen"
|
185
189
|
end
|
186
190
|
|
187
|
-
# If this script has been invoked from within an Origen application then open
|
188
|
-
# up all commands, if not then only allow the command to create a new Origen
|
189
|
-
# application.
|
190
|
-
# Note that the Origen core workspace is now a fully fledged Origen application in
|
191
|
-
# its own right.
|
192
191
|
begin
|
192
|
+
# If this script has been invoked from within an Origen application then open
|
193
|
+
# up all commands, if not then only allow the command to create a new Origen
|
194
|
+
# application.
|
193
195
|
if origen_root
|
194
196
|
require "origen/commands"
|
195
197
|
else
|
196
198
|
require "origen/commands_global"
|
197
199
|
end
|
200
|
+
rescue Exception => e
|
201
|
+
unless e.is_a?(SystemExit) && e.status == 0
|
202
|
+
puts
|
203
|
+
puts e.message
|
204
|
+
if Origen.app_loaded?
|
205
|
+
# Only print out the application stack trace by default, if verbose logging is
|
206
|
+
# enabled then output the full thing
|
207
|
+
e.backtrace.each do |line|
|
208
|
+
path = Pathname.new(line)
|
209
|
+
puts line if !path.absolute? || Origen.log.level == :verbose
|
210
|
+
end
|
211
|
+
else
|
212
|
+
puts e.backtrace
|
213
|
+
end
|
214
|
+
end
|
198
215
|
ensure
|
199
216
|
if Origen.app_loaded?
|
200
217
|
Origen.app.listeners_for(:on_origen_shutdown).each do |listener|
|
File without changes
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'English'
|
2
2
|
require 'pathname'
|
3
|
+
# Keep a note of the pwd at the time when Origen was first loaded, this is initially used
|
4
|
+
# by the site_config lookup.
|
5
|
+
$_origen_invocation_pwd ||= Pathname.pwd
|
3
6
|
require 'fileutils'
|
4
7
|
require 'origen/site_config'
|
5
8
|
require 'origen/operating_systems'
|
@@ -46,6 +49,7 @@ module Origen
|
|
46
49
|
autoload :CodeGenerators, 'origen/code_generators'
|
47
50
|
autoload :Encodings, 'origen/encodings'
|
48
51
|
autoload :Log, 'origen/log'
|
52
|
+
autoload :Chips, 'origen/chips'
|
49
53
|
|
50
54
|
APP_CONFIG = File.join('config', 'application.rb')
|
51
55
|
|
@@ -435,6 +439,8 @@ module Origen
|
|
435
439
|
Origen.import_manager.require!
|
436
440
|
Origen.remote_manager.require!
|
437
441
|
end
|
442
|
+
boot = File.join(root, 'config', 'boot.rb')
|
443
|
+
require boot if File.exist?(boot)
|
438
444
|
env = File.join(root, 'config', 'environment.rb')
|
439
445
|
require env if File.exist?(env)
|
440
446
|
dev = File.join(root, 'config', 'development.rb')
|
@@ -587,8 +593,6 @@ module Origen
|
|
587
593
|
# Returns the current top-level (DUT) object if one has been defined (by
|
588
594
|
# instantiating an object that includes Origen::TopLevel).
|
589
595
|
def top_level
|
590
|
-
# TODO: This is called a lot and should probably be cached and expired
|
591
|
-
# on before_target_load
|
592
596
|
application.top_level
|
593
597
|
end
|
594
598
|
|
data/lib/origen/application.rb
CHANGED
@@ -95,7 +95,11 @@ module Origen
|
|
95
95
|
RakeLoader.new.load_tasks
|
96
96
|
end
|
97
97
|
|
98
|
-
# Returns
|
98
|
+
# Returns a revision controller instance (e.g. Origen::RevisionControl::Git) which has
|
99
|
+
# been configured to point to the local workspace and the remote repository
|
100
|
+
# as defined by Origen.app.config.rc_url. If the revision control URL has not been
|
101
|
+
# defined, or it does not resolve to a recognized revision control system, then this
|
102
|
+
# method will return nil.
|
99
103
|
def revision_controller
|
100
104
|
if current?
|
101
105
|
if config.rc_url
|
@@ -109,8 +113,7 @@ module Origen
|
|
109
113
|
local: root,
|
110
114
|
remote: config.rc_url
|
111
115
|
)
|
112
|
-
|
113
|
-
fail "The revision control type could not be worked out from the value config.rc_url: #{config.rc_url}"
|
116
|
+
|
114
117
|
end
|
115
118
|
else
|
116
119
|
@revision_controller ||= RevisionControl::DesignSync.new(
|
@@ -207,7 +210,10 @@ module Origen
|
|
207
210
|
|
208
211
|
# Returns the current top-level object (the DUT)
|
209
212
|
def top_level
|
210
|
-
|
213
|
+
@top_level ||= begin
|
214
|
+
t = toplevel_listeners.first
|
215
|
+
t.controller ? t.controller : t if t
|
216
|
+
end
|
211
217
|
end
|
212
218
|
|
213
219
|
def listeners_for(*args)
|
@@ -219,7 +225,7 @@ module Origen
|
|
219
225
|
}.merge(options)
|
220
226
|
listeners = callback_listeners
|
221
227
|
if Origen.top_level
|
222
|
-
listeners -= [Origen.top_level]
|
228
|
+
listeners -= [Origen.top_level.model]
|
223
229
|
if options[:top_level]
|
224
230
|
if options[:top_level] == :last
|
225
231
|
listeners = listeners + [Origen.top_level]
|
@@ -228,7 +234,13 @@ module Origen
|
|
228
234
|
end
|
229
235
|
end
|
230
236
|
end
|
231
|
-
listeners = listeners.select { |l| l.respond_to?(callback) }
|
237
|
+
listeners = listeners.select { |l| l.respond_to?(callback) }.map do |l|
|
238
|
+
if l.try(:is_an_origen_model?)
|
239
|
+
l.respond_to_directly?(callback) ? l : l.controller
|
240
|
+
else
|
241
|
+
l
|
242
|
+
end
|
243
|
+
end
|
232
244
|
if max && listeners.size > max
|
233
245
|
fail "You can only define a #{callback} callback #{max > 1 ? (max.to_s + 'times') : 'once'}, however you have declared it #{listeners.size} times for instances of: #{listeners.map(&:class)}"
|
234
246
|
end
|
@@ -636,7 +648,11 @@ module Origen
|
|
636
648
|
Origen.target.set_signature(@target_load_options)
|
637
649
|
$dut = nil
|
638
650
|
load environment.file if environment.file
|
639
|
-
|
651
|
+
if target.proc
|
652
|
+
target.proc.call
|
653
|
+
else
|
654
|
+
load target.file!
|
655
|
+
end
|
640
656
|
ensure
|
641
657
|
$_target_options = nil
|
642
658
|
end
|
@@ -712,6 +728,7 @@ module Origen
|
|
712
728
|
end
|
713
729
|
|
714
730
|
def clear_dynamic_resources(type = :transient)
|
731
|
+
@top_level = nil
|
715
732
|
if type == :transient
|
716
733
|
@transient_resources = nil
|
717
734
|
else
|
@@ -16,6 +16,12 @@ module Origen
|
|
16
16
|
SAVE_FILE = "#{DIR}/.default" # :nodoc:
|
17
17
|
DEFAULT_FILE = "#{DIR}/default.rb" # :nodoc:
|
18
18
|
|
19
|
+
# Not a clean unload, but allows objects to be re-instantiated for testing
|
20
|
+
# @api private
|
21
|
+
def unload!
|
22
|
+
Origen.app.unload_target!
|
23
|
+
end
|
24
|
+
|
19
25
|
# Implement a target loop based on the supplied options.
|
20
26
|
# The options can contain the keys :target or :targets or neither.
|
21
27
|
#
|
@@ -159,7 +165,18 @@ module Origen
|
|
159
165
|
# attribute of the application.
|
160
166
|
#
|
161
167
|
# Calling this method does not affect the default target setting in the workspace.
|
168
|
+
#
|
169
|
+
# The target can also be set to a proc to be called instead, this is really
|
170
|
+
# intended to be used for testing purposes:
|
171
|
+
# Origen.target.temporary = -> { $dut = SomeLocalClass.new }
|
162
172
|
def temporary=(name)
|
173
|
+
if name.is_a?(Proc)
|
174
|
+
self.file = nil
|
175
|
+
@proc = name
|
176
|
+
return
|
177
|
+
else
|
178
|
+
@proc = nil
|
179
|
+
end
|
163
180
|
tgts = resolve_mapping(name)
|
164
181
|
targets = tgts.is_a?(Array) ? tgts : find(tgts)
|
165
182
|
if targets.size == 0
|
@@ -189,6 +206,10 @@ module Origen
|
|
189
206
|
alias_method :switch, :temporary=
|
190
207
|
alias_method :switch_to, :temporary=
|
191
208
|
|
209
|
+
def proc
|
210
|
+
@proc
|
211
|
+
end
|
212
|
+
|
192
213
|
# Returns a signature for the current target, can be used to track target
|
193
214
|
# changes in cases where the name is not unique - i.e. when using a
|
194
215
|
# configurable target
|
data/lib/origen/chips.rb
ADDED
@@ -0,0 +1,281 @@
|
|
1
|
+
module Origen
|
2
|
+
module Chips
|
3
|
+
autoload :Chip, 'origen/chips/chip.rb'
|
4
|
+
autoload :Design_Entry, 'origen/chips/design_entry.rb'
|
5
|
+
autoload :Doc_Entry, 'origen/chips/doc_entry.rb'
|
6
|
+
autoload :RSS_Note, 'origen/chips/note.rb'
|
7
|
+
|
8
|
+
attr_accessor :_chips, :_designs, :_docs, :_notes
|
9
|
+
|
10
|
+
SPEC_TYPES = [:dc, :ac, :temperature, :supply]
|
11
|
+
|
12
|
+
NOTE_TYPES = [:spec, :doc, :mode, :feature, :sighting]
|
13
|
+
|
14
|
+
SpecTableAttr = Struct.new(:table_text, :show, :padding)
|
15
|
+
|
16
|
+
# A regular Array but print specs to the console via their ID for brevity and
|
17
|
+
# consistency with other APIs (e.g. $dut.regs # => [:reg1, :reg2])
|
18
|
+
class ChipArray < Array
|
19
|
+
def inspect
|
20
|
+
map(&:name).inspect
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns a hash of hash containing all specs/modes
|
25
|
+
# If no spec is specified then all specs are returned via inspect
|
26
|
+
# If a spec is specified, a spec object will be returned if found
|
27
|
+
# in the current mode. If a mode option is passed and no spec
|
28
|
+
# is passed it will filter the specs inspect display by the mode
|
29
|
+
# and visa-versa
|
30
|
+
def chips(s = nil, options = {})
|
31
|
+
options = {
|
32
|
+
group: nil,
|
33
|
+
family: nil,
|
34
|
+
performance: nil,
|
35
|
+
part: nil,
|
36
|
+
chip: nil
|
37
|
+
}.update(options || {})
|
38
|
+
_chips
|
39
|
+
if s.nil?
|
40
|
+
return show_chips(options)
|
41
|
+
elsif s.is_a? Hash
|
42
|
+
options.update(s)
|
43
|
+
return show_chips(options)
|
44
|
+
else
|
45
|
+
options[:chip] = s
|
46
|
+
return show_chips(options)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Define and instantiate a Spec object
|
51
|
+
def chip(name, description, selector = {}, options = {}, &block)
|
52
|
+
# return chips(name, group) unless block_given?
|
53
|
+
_chips
|
54
|
+
name = name_audit(name)
|
55
|
+
group = selector[:group]
|
56
|
+
family = selector[:family]
|
57
|
+
performance = selector[:performance]
|
58
|
+
previous_parts = selector[:previous_parts]
|
59
|
+
power = selector[:power]
|
60
|
+
chip_holder = Chip.new(name, description, previous_parts, power, options)
|
61
|
+
if has_chip?(name, group: group, family: family, performance: performance, creating_chip: true)
|
62
|
+
fail "Chip already exists for chip: #{name}, group: #{group}, family: #{family} for object #{self}"
|
63
|
+
end
|
64
|
+
@_chips[group][family][performance][name] = chip_holder
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns Boolean based on whether the calling object has any defined specs
|
68
|
+
# If the mode option is selected then the search is narrowed
|
69
|
+
def has_chips?(options = {})
|
70
|
+
_chips
|
71
|
+
options = {
|
72
|
+
group: nil,
|
73
|
+
family: nil,
|
74
|
+
performance: nil,
|
75
|
+
chip: nil,
|
76
|
+
creating_chip: false
|
77
|
+
}.update(options)
|
78
|
+
if @_chips.nil? || @_chips == {}
|
79
|
+
return false
|
80
|
+
else
|
81
|
+
return !!show_chips(options)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Check if the current IP has a spec
|
86
|
+
def has_chip?(s, options = {})
|
87
|
+
_chips
|
88
|
+
options = {
|
89
|
+
group: nil,
|
90
|
+
family: nil,
|
91
|
+
performance: nil,
|
92
|
+
chip: nil,
|
93
|
+
creating_spec: false
|
94
|
+
}.update(options)
|
95
|
+
options[:chip] = s
|
96
|
+
!!show_chips(options)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Define and instantiate a Note object
|
100
|
+
def note(id, type, feature)
|
101
|
+
_notes
|
102
|
+
@_notes[id][type] = RSS_Note.new(id, type, feature)
|
103
|
+
end
|
104
|
+
|
105
|
+
def doc(date, type, revision, description, options = {})
|
106
|
+
_docs
|
107
|
+
@_docs[type][revision] = Doc_Entry.new(date, type, revision, description, options)
|
108
|
+
end
|
109
|
+
|
110
|
+
def design(date, type, revision, description, options = {})
|
111
|
+
_designs
|
112
|
+
@_designs[type][revision] = Design_Entry.new(date, type, revision, description, options)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Returns a Note object from the notes hash
|
116
|
+
def notes(options = {})
|
117
|
+
options = {
|
118
|
+
id: nil,
|
119
|
+
type: nil
|
120
|
+
}.update(options)
|
121
|
+
notes_found = Hash.new do |h, k|
|
122
|
+
h[k] = {}
|
123
|
+
end
|
124
|
+
_notes.filter(options[:id]).each do |id, hash|
|
125
|
+
hash.filter(options[:type]).each do |type, note|
|
126
|
+
notes_found[id][type] = note
|
127
|
+
end
|
128
|
+
end
|
129
|
+
if notes_found.empty?
|
130
|
+
return nil
|
131
|
+
elsif notes_found.size == 1
|
132
|
+
notes_found.values.first.values.first
|
133
|
+
else
|
134
|
+
return notes_found
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def docs(options = {})
|
139
|
+
options = {
|
140
|
+
type: nil,
|
141
|
+
rev: nil
|
142
|
+
}.update(options)
|
143
|
+
docs_to_be_shown = []
|
144
|
+
filter_hash(_docs, options[:type]).each do |type, hash|
|
145
|
+
filter_hash(hash, options[:rev]).each do |revision, hash_|
|
146
|
+
docs_to_be_shown << hash_
|
147
|
+
end
|
148
|
+
end
|
149
|
+
docs_to_be_shown
|
150
|
+
end
|
151
|
+
|
152
|
+
def designs(options = {})
|
153
|
+
options = {
|
154
|
+
type: nil,
|
155
|
+
rev: nil
|
156
|
+
}.update(options)
|
157
|
+
designs_to_be_shown = []
|
158
|
+
filter_hash(_designs, options[:type]).each do |type, hash|
|
159
|
+
filter_hash(hash, options[:rev]).each do |revision, hash_|
|
160
|
+
designs_to_be_shown << hash_
|
161
|
+
end
|
162
|
+
end
|
163
|
+
designs_to_be_shown
|
164
|
+
end
|
165
|
+
|
166
|
+
# Delete all specs
|
167
|
+
def delete_all_chips
|
168
|
+
@_chips = nil
|
169
|
+
end
|
170
|
+
|
171
|
+
# Delete all notes
|
172
|
+
def delete_all_notes
|
173
|
+
@_notes = nil
|
174
|
+
end
|
175
|
+
|
176
|
+
# Delete all doc
|
177
|
+
def delete_all_docs
|
178
|
+
@_docs = nil
|
179
|
+
end
|
180
|
+
|
181
|
+
def delete_all_designs
|
182
|
+
@_designs = nil
|
183
|
+
end
|
184
|
+
|
185
|
+
private
|
186
|
+
|
187
|
+
def _chips
|
188
|
+
# 4D hash with group, family, and performance
|
189
|
+
@_chips ||= Hash.new do |h, k|
|
190
|
+
h[k] = Hash.new do |hh, kk|
|
191
|
+
hh[kk] = Hash.new do |hhh, kkk|
|
192
|
+
hhh[kkk] = {}
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# Two-dimensional hash with note id and type as the keys
|
199
|
+
def _notes
|
200
|
+
@_notes ||= Hash.new do |h, k|
|
201
|
+
h[k] = {}
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# Document Type and Revision Number :: 2-D Hash
|
206
|
+
def _docs
|
207
|
+
@_docs ||= Hash.new do |h, k|
|
208
|
+
h[k] = {}
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Document Type and Revision Number :: 2-D Hash
|
213
|
+
def _designs
|
214
|
+
@_designs ||= Hash.new do |h, k|
|
215
|
+
h[k] = {}
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# Return a hash based on the filter provided
|
220
|
+
def filter_hash(hash, filter)
|
221
|
+
fail 'Hash argument is not a Hash!' unless hash.is_a? Hash
|
222
|
+
filtered_hash = {}
|
223
|
+
select_logic = case filter
|
224
|
+
when String then 'k[Regexp.new(filter)]'
|
225
|
+
when (Fixnum || Integer || Float || Numeric) then "k[Regexp.new('#{filter}')]"
|
226
|
+
when Regexp then 'k[filter]'
|
227
|
+
when Symbol then
|
228
|
+
'k == filter'
|
229
|
+
when NilClass then true # Return all specs if a filter is set to nil (i.e. user doesn't care about this filter)
|
230
|
+
else true
|
231
|
+
end
|
232
|
+
# rubocop:disable UnusedBlockArgument
|
233
|
+
filtered_hash = hash.select do |k, v|
|
234
|
+
[TrueClass, FalseClass].include?(select_logic.class) ? select_logic : eval(select_logic)
|
235
|
+
end
|
236
|
+
filtered_hash
|
237
|
+
end
|
238
|
+
|
239
|
+
# Filters the 4D hash to find specs for all user visible API
|
240
|
+
def show_chips(options = {})
|
241
|
+
options = {
|
242
|
+
group: nil,
|
243
|
+
family: nil,
|
244
|
+
performance: nil,
|
245
|
+
part: nil,
|
246
|
+
chips_to_be_shown: ChipArray.new,
|
247
|
+
creating_chip: false
|
248
|
+
}.update(options)
|
249
|
+
chips_to_be_shown = options[:chips_to_be_shown]
|
250
|
+
filter_hash(_chips, options[:group]).each do |_group, hash|
|
251
|
+
filter_hash(hash, options[:family]).each do |_family, hash_|
|
252
|
+
filter_hash(hash_, options[:performance]).each do |_performance, hash__|
|
253
|
+
filter_hash(hash__, options[:part]).each do |_part, chip|
|
254
|
+
chips_to_be_shown << chip
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
# If no specs were found must check the possibility another search
|
260
|
+
# should be started with mode set to :local or :global
|
261
|
+
if chips_to_be_shown.empty?
|
262
|
+
# Don't want to re-call this method if the callee is trying to create a spec and just wants to know
|
263
|
+
# if there is a spec with the exact same options
|
264
|
+
if options[:creating_chip] == false
|
265
|
+
# Doesn't make sense to recall the method however if the mode is already set to :global or :local
|
266
|
+
options[:chips_to_be_shown] = chips_to_be_shown
|
267
|
+
Origen.log.debug "re-calling show_chips with options #{options}"
|
268
|
+
return show_chips(options)
|
269
|
+
end
|
270
|
+
Origen.log.debug "Returning no chips for options #{options}"
|
271
|
+
return nil
|
272
|
+
elsif chips_to_be_shown.size == 1
|
273
|
+
Origen.log.debug "returning one spec #{chips_to_be_shown.first.part_name}"
|
274
|
+
return chips_to_be_shown.first
|
275
|
+
else
|
276
|
+
Origen.log.debug "returning an array of specs during initial search: #{chips_to_be_shown}"
|
277
|
+
return chips_to_be_shown
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
module Origen
|
2
|
+
module Chips
|
3
|
+
class Chip
|
4
|
+
# Part Name for the SoC, usually this will be the ID
|
5
|
+
attr_accessor :part_name
|
6
|
+
|
7
|
+
# Description for the Part, will be used as part of the RSS feed
|
8
|
+
attr_accessor :description
|
9
|
+
|
10
|
+
# Previous Roadmap Parts. This will allow for a backwards viewable list so that
|
11
|
+
# previous parts can have an upgrade path
|
12
|
+
attr_accessor :previous_parts
|
13
|
+
|
14
|
+
# Power Number
|
15
|
+
attr_accessor :power
|
16
|
+
|
17
|
+
# L2 Ram Size
|
18
|
+
attr_accessor :l2_ram
|
19
|
+
|
20
|
+
# L3 Ram Size
|
21
|
+
attr_accessor :l3_ram
|
22
|
+
|
23
|
+
# Package for the Part
|
24
|
+
attr_accessor :package_type
|
25
|
+
|
26
|
+
# Speed for the Cores
|
27
|
+
attr_accessor :core_speed
|
28
|
+
|
29
|
+
attr_accessor :_designs, :_docs, :_notes
|
30
|
+
|
31
|
+
def initialize(part_name, description, previous_parts, power, options = {})
|
32
|
+
@part_name = part_name
|
33
|
+
@description = description
|
34
|
+
@previous_parts = previous_parts
|
35
|
+
@power = power
|
36
|
+
@l2_ram = options[:l2_ram]
|
37
|
+
@l3_ram = options[:l3_ram]
|
38
|
+
@package_type = options[:package_type]
|
39
|
+
@core_speed = options[:core_speed]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Define and instantiate a Note object
|
43
|
+
def note(id, type, feature)
|
44
|
+
_notes
|
45
|
+
@_notes[id][type] = RSS_Note.new(id, type, feature)
|
46
|
+
end
|
47
|
+
|
48
|
+
def doc(date, type, revision, description, options = {})
|
49
|
+
_docs
|
50
|
+
@_docs[type][revision] = Doc_Entry.new(date, type, revision, description, options)
|
51
|
+
end
|
52
|
+
|
53
|
+
def design(date, type, revision, description, options = {})
|
54
|
+
_designs
|
55
|
+
@_designs[type][revision] = Design_Entry.new(date, type, revision, description, options)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns a Note object from the notes hash
|
59
|
+
def notes(options = {})
|
60
|
+
options = {
|
61
|
+
id: nil,
|
62
|
+
type: nil
|
63
|
+
}.update(options)
|
64
|
+
notes_found = Hash.new do |h, k|
|
65
|
+
h[k] = {}
|
66
|
+
end
|
67
|
+
_notes.filter(options[:id]).each do |id, hash|
|
68
|
+
hash.filter(options[:type]).each do |type, note|
|
69
|
+
notes_found[id][type] = note
|
70
|
+
end
|
71
|
+
end
|
72
|
+
if notes_found.empty?
|
73
|
+
return nil
|
74
|
+
elsif notes_found.size == 1
|
75
|
+
notes_found.values.first.values.first
|
76
|
+
else
|
77
|
+
return notes_found
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def docs(options = {})
|
82
|
+
options = {
|
83
|
+
type: nil,
|
84
|
+
rev: nil
|
85
|
+
}.update(options)
|
86
|
+
docs_to_be_shown = []
|
87
|
+
filter_hash(_docs, options[:type]).each do |type, hash|
|
88
|
+
filter_hash(hash, options[:rev]).each do |revision, hash_|
|
89
|
+
docs_to_be_shown << hash_
|
90
|
+
end
|
91
|
+
end
|
92
|
+
docs_to_be_shown
|
93
|
+
end
|
94
|
+
|
95
|
+
def designs(options = {})
|
96
|
+
options = {
|
97
|
+
type: nil,
|
98
|
+
rev: nil
|
99
|
+
}.update(options)
|
100
|
+
designs_to_be_shown = []
|
101
|
+
filter_hash(_designs, options[:type]).each do |type, hash|
|
102
|
+
filter_hash(hash, options[:rev]).each do |revision, hash_|
|
103
|
+
designs_to_be_shown << hash_
|
104
|
+
end
|
105
|
+
end
|
106
|
+
designs_to_be_shown
|
107
|
+
end
|
108
|
+
|
109
|
+
# Delete all notes
|
110
|
+
def delete_all_notes
|
111
|
+
@_notes = nil
|
112
|
+
end
|
113
|
+
|
114
|
+
# Delete all doc
|
115
|
+
def delete_all_docs
|
116
|
+
@_docs = nil
|
117
|
+
end
|
118
|
+
|
119
|
+
def delete_all_designs
|
120
|
+
@_designs = nil
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
# Two-dimensional hash with note id and type as the keys
|
126
|
+
def _notes
|
127
|
+
@_notes ||= Hash.new do |h, k|
|
128
|
+
h[k] = {}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Document Type and Revision Number :: 2-D Hash
|
133
|
+
def _docs
|
134
|
+
@_docs ||= Hash.new do |h, k|
|
135
|
+
h[k] = {}
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Document Type and Revision Number :: 2-D Hash
|
140
|
+
def _designs
|
141
|
+
@_designs ||= Hash.new do |h, k|
|
142
|
+
h[k] = {}
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Return a hash based on the filter provided
|
147
|
+
def filter_hash(hash, filter)
|
148
|
+
fail 'Hash argument is not a Hash!' unless hash.is_a? Hash
|
149
|
+
filtered_hash = {}
|
150
|
+
select_logic = case filter
|
151
|
+
when String then 'k[Regexp.new(filter)]'
|
152
|
+
when (Fixnum || Integer || Float || Numeric) then "k[Regexp.new('#{filter}')]"
|
153
|
+
when Regexp then 'k[filter]'
|
154
|
+
when Symbol then
|
155
|
+
'k == filter'
|
156
|
+
when NilClass then true # Return all specs if a filter is set to nil (i.e. user doesn't care about this filter)
|
157
|
+
else true
|
158
|
+
end
|
159
|
+
# rubocop:disable UnusedBlockArgument
|
160
|
+
filtered_hash = hash.select do |k, v|
|
161
|
+
[TrueClass, FalseClass].include?(select_logic.class) ? select_logic : eval(select_logic)
|
162
|
+
end
|
163
|
+
filtered_hash
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Origen
|
2
|
+
module Chips
|
3
|
+
class Design_Entry
|
4
|
+
# date that the document was released
|
5
|
+
attr_accessor :date
|
6
|
+
|
7
|
+
# document type, e.g. Reference Manual, One Pager, Data Sheet
|
8
|
+
attr_accessor :type
|
9
|
+
|
10
|
+
# revision
|
11
|
+
attr_accessor :revision
|
12
|
+
|
13
|
+
# nda
|
14
|
+
attr_accessor :nda
|
15
|
+
|
16
|
+
# released status
|
17
|
+
attr_accessor :release
|
18
|
+
|
19
|
+
# location
|
20
|
+
attr_accessor :location
|
21
|
+
|
22
|
+
# description of the item
|
23
|
+
attr_accessor :description
|
24
|
+
|
25
|
+
def initialize(date, type, revision, description, options = {})
|
26
|
+
@date = date
|
27
|
+
@type = type
|
28
|
+
@revision = revision
|
29
|
+
@description = description
|
30
|
+
@nda = options[:nda]
|
31
|
+
@release = options[:release]
|
32
|
+
@location = options[:location]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Origen
|
2
|
+
module Chips
|
3
|
+
class Doc_Entry
|
4
|
+
# date that the document was released
|
5
|
+
attr_accessor :date
|
6
|
+
|
7
|
+
# document type, e.g. Reference Manual, One Pager, Data Sheet
|
8
|
+
attr_accessor :type
|
9
|
+
|
10
|
+
# revision
|
11
|
+
attr_accessor :revision
|
12
|
+
|
13
|
+
# nda
|
14
|
+
attr_accessor :nda
|
15
|
+
|
16
|
+
# released status
|
17
|
+
attr_accessor :release
|
18
|
+
|
19
|
+
# location
|
20
|
+
attr_accessor :location
|
21
|
+
|
22
|
+
# description
|
23
|
+
attr_accessor :description
|
24
|
+
|
25
|
+
def initialize(date, type, revision, description, options = {})
|
26
|
+
@date = date
|
27
|
+
@type = type
|
28
|
+
@revision = revision
|
29
|
+
@description = description
|
30
|
+
@nda = options[:nda]
|
31
|
+
@release = options[:release]
|
32
|
+
@location = options[:location]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Origen
|
2
|
+
module Chips
|
3
|
+
# This class is used to store spec note information used to document IP
|
4
|
+
class RSS_Note
|
5
|
+
attr_accessor :id, :type, :feature
|
6
|
+
|
7
|
+
def initialize(id, type, feature)
|
8
|
+
@id = id
|
9
|
+
@type = type
|
10
|
+
@feature = feature
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/origen/controller.rb
CHANGED
@@ -53,6 +53,7 @@ module Origen
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
# Returns the controller's model
|
56
57
|
def model
|
57
58
|
@model ||= begin
|
58
59
|
if self.class.path_to_model
|
@@ -61,12 +62,22 @@ module Origen
|
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
65
|
+
# Means that when dealing with a controller/model pair, you can
|
66
|
+
# always call obj.model and obj.controller to get the one you want,
|
67
|
+
# regardless of the one you currently have.
|
68
|
+
def controller
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
64
72
|
def respond_to?(*args)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
73
|
+
super || !!(!@respond_directly && model && model.respond_to_directly?(*args))
|
74
|
+
end
|
75
|
+
|
76
|
+
def respond_to_directly?(*args)
|
77
|
+
@respond_directly = true
|
78
|
+
result = respond_to?(*args)
|
79
|
+
@respond_directly = false
|
80
|
+
result
|
70
81
|
end
|
71
82
|
|
72
83
|
# Used to proxy all method and attribute requests not implemented on the controller
|
data/lib/origen/generator/job.rb
CHANGED
@@ -224,28 +224,30 @@ module Origen
|
|
224
224
|
c2 '*' * 75
|
225
225
|
c2 'ENVIRONMENT:'
|
226
226
|
c2 ' Application'
|
227
|
-
if Origen.app.rc
|
228
|
-
|
229
|
-
|
230
|
-
|
227
|
+
if Origen.app.rc
|
228
|
+
if Origen.app.rc.git?
|
229
|
+
c2 " Source: #{Origen.config.rc_url}"
|
230
|
+
else
|
231
|
+
c2 " Vault: #{Origen.config.vault}"
|
232
|
+
end
|
231
233
|
end
|
232
234
|
c2 " Version: #{Origen.app.version}"
|
233
235
|
c2 " Workspace: #{Origen.root}"
|
234
|
-
if Origen.app.rc.git?
|
236
|
+
if Origen.app.rc && Origen.app.rc.git?
|
235
237
|
begin
|
236
|
-
|
237
|
-
|
238
|
+
@branch ||= Origen.app.rc.current_branch
|
239
|
+
@commit ||= Origen.app.rc.current_commit
|
240
|
+
status = "#{@branch}(#{@commit})"
|
241
|
+
@pattern_local_mods = !Origen.app.rc.local_modifications.empty? unless @pattern_local_mods_fetched
|
242
|
+
@pattern_local_mods_fetched = true
|
243
|
+
status += ' (+local edits)' if @pattern_local_mods
|
238
244
|
c2 " Branch: #{status}"
|
239
245
|
rescue
|
240
246
|
# No problem, we did our best
|
241
247
|
end
|
242
248
|
end
|
243
249
|
c2 ' Origen'
|
244
|
-
|
245
|
-
c2 ' Source: https://github.com/Origen-SDK/origen'
|
246
|
-
else
|
247
|
-
c2 " Vault: #{Origen.config.vault}"
|
248
|
-
end
|
250
|
+
c2 ' Source: https://github.com/Origen-SDK/origen'
|
249
251
|
c2 " Version: #{Origen.version}"
|
250
252
|
c2 " Workspace: #{Origen.top}"
|
251
253
|
unless Origen.plugins.empty?
|
data/lib/origen/model.rb
CHANGED
@@ -27,6 +27,17 @@ module Origen
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
def is_an_origen_model?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
# Means that when dealing with a controller/model pair, you can
|
35
|
+
# always call obj.model and obj.controller to get the one you want,
|
36
|
+
# regardless of the one you currently have.
|
37
|
+
def model
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
30
41
|
def log
|
31
42
|
Origen.log
|
32
43
|
end
|
@@ -81,8 +92,7 @@ module Origen
|
|
81
92
|
def _resolve_controller_class
|
82
93
|
klass = self.class
|
83
94
|
while klass != Object
|
84
|
-
|
85
|
-
controller_class = "#{model_class}Controller"
|
95
|
+
controller_class = "#{klass}Controller"
|
86
96
|
if eval("defined? #{controller_class}")
|
87
97
|
return eval(controller_class)
|
88
98
|
elsif eval("defined? ::#{controller_class}")
|
@@ -248,6 +258,17 @@ module Origen
|
|
248
258
|
end
|
249
259
|
end
|
250
260
|
|
261
|
+
def respond_to?(*args)
|
262
|
+
super || !!(!@respond_directly && controller && controller.respond_to_directly?(*args))
|
263
|
+
end
|
264
|
+
|
265
|
+
def respond_to_directly?(*args)
|
266
|
+
@respond_directly = true
|
267
|
+
result = respond_to?(*args)
|
268
|
+
@respond_directly = false
|
269
|
+
result
|
270
|
+
end
|
271
|
+
|
251
272
|
private
|
252
273
|
|
253
274
|
def _modes
|
data/lib/origen/site_config.rb
CHANGED
@@ -39,7 +39,12 @@ module Origen
|
|
39
39
|
|
40
40
|
def configs
|
41
41
|
@configs ||= begin
|
42
|
-
|
42
|
+
# This global is set when Origen is first required, it generally means that what is considered
|
43
|
+
# to be the pwd for the purposes of looking for a site_config file is the place from where the
|
44
|
+
# user invoked Origen. Otherwise if the running app switches the PWD it can lead to confusing
|
45
|
+
# behavior - this was a particular problem when testing the new app generator which switches the
|
46
|
+
# pwd to /tmp to build the new app
|
47
|
+
path = $_origen_invocation_pwd
|
43
48
|
configs = []
|
44
49
|
# Add any site_configs from where we are currently running from, i.e. the application
|
45
50
|
# directory area
|
data/lib/origen/specs.rb
CHANGED
data/lib/origen/specs/note.rb
CHANGED
@@ -2,7 +2,7 @@ module Origen
|
|
2
2
|
module Specs
|
3
3
|
# This class is used to store spec note information used to document IP
|
4
4
|
class Note
|
5
|
-
attr_accessor :id, :type, :mode, :audience, :text, :markup
|
5
|
+
attr_accessor :id, :type, :mode, :audience, :text, :markup, :internal_comment
|
6
6
|
|
7
7
|
def initialize(id, type, options = {})
|
8
8
|
@id = id
|
@@ -11,6 +11,7 @@ module Origen
|
|
11
11
|
@audience = options[:audience]
|
12
12
|
@text = options[:text]
|
13
13
|
@markup = options[:markup]
|
14
|
+
@internal_comment = options[:internal_comment]
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
data/lib/origen/sub_blocks.rb
CHANGED
@@ -11,6 +11,13 @@ module Origen
|
|
11
11
|
# address API, but will accept any of these
|
12
12
|
@reg_base_address = options.delete(:reg_base_address) || options.delete(:reg_base_address) ||
|
13
13
|
options.delete(:base_address) || options.delete(:base) || 0
|
14
|
+
if options[:_instance]
|
15
|
+
if @reg_base_address.is_a?(Array)
|
16
|
+
@reg_base_address = @reg_base_address[options[:_instance]]
|
17
|
+
elsif options[:base_address_step]
|
18
|
+
@reg_base_address = @reg_base_address + (options[:_instance] * options[:base_address_step])
|
19
|
+
end
|
20
|
+
end
|
14
21
|
@domain_names = [options.delete(:domain) || options.delete(:domains)].flatten.compact
|
15
22
|
@domain_specified = !@domain_names.empty?
|
16
23
|
@path = options.delete(:path)
|
@@ -187,8 +194,12 @@ module Origen
|
|
187
194
|
include Path
|
188
195
|
|
189
196
|
# Returns a hash containing all immediate children of the given sub-block
|
190
|
-
def sub_blocks
|
191
|
-
|
197
|
+
def sub_blocks(*args)
|
198
|
+
if args.empty?
|
199
|
+
@sub_blocks ||= {}.with_indifferent_access
|
200
|
+
else
|
201
|
+
sub_block(*args)
|
202
|
+
end
|
192
203
|
end
|
193
204
|
alias_method :children, :sub_blocks
|
194
205
|
|
@@ -223,46 +234,64 @@ module Origen
|
|
223
234
|
end
|
224
235
|
|
225
236
|
def sub_block(name, options = {})
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
237
|
+
if i = options.delete(:instances)
|
238
|
+
a = []
|
239
|
+
options[:_instance] = i
|
240
|
+
i.times do |j|
|
241
|
+
o = options.dup
|
242
|
+
o[:_instance] = j
|
243
|
+
a << sub_block("#{name}#{j}", o)
|
244
|
+
end
|
245
|
+
define_singleton_method "#{name}s" do
|
246
|
+
a
|
247
|
+
end
|
248
|
+
a
|
249
|
+
else
|
250
|
+
class_name = options.delete(:class_name)
|
251
|
+
if class_name
|
231
252
|
begin
|
232
|
-
klass = eval(class_name)
|
253
|
+
klass = eval("::#{namespace}::#{class_name}")
|
233
254
|
rescue
|
234
255
|
begin
|
235
|
-
klass = eval(
|
256
|
+
klass = eval(class_name)
|
236
257
|
rescue
|
237
|
-
|
238
|
-
|
258
|
+
begin
|
259
|
+
klass = eval("#{self.class}::#{class_name}")
|
260
|
+
rescue
|
261
|
+
puts "Could not find class: #{class_name}"
|
262
|
+
raise 'Unknown sub block class!'
|
263
|
+
end
|
239
264
|
end
|
240
265
|
end
|
266
|
+
else
|
267
|
+
klass = Origen::SubBlock
|
241
268
|
end
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
269
|
+
unless klass.respond_to?(:includes_origen_model)
|
270
|
+
puts 'Any class which is to be instantiated as a sub_block must include Origen::Model,'
|
271
|
+
puts "add this to #{klass}:"
|
272
|
+
puts ''
|
273
|
+
puts ' include Origen::Model'
|
274
|
+
puts ''
|
275
|
+
fail 'Sub block does not include Origen::Model!'
|
276
|
+
end
|
277
|
+
block = klass.new(options.merge(parent: self))
|
278
|
+
block.name = name
|
279
|
+
if sub_blocks[name]
|
280
|
+
fail "You have already defined a sub-block named #{name} within class #{self.class}"
|
281
|
+
else
|
282
|
+
sub_blocks[name] = block
|
283
|
+
if respond_to?(name)
|
284
|
+
# puts "Tried to create a sub-block named #{name} in #{self.class}, but it already has a method with this name!"
|
285
|
+
# puts "To avoid confusion rename one of them and try again!"
|
286
|
+
# raise "Non-unique sub-block name!"
|
287
|
+
else
|
288
|
+
define_singleton_method name do
|
289
|
+
sub_blocks[name]
|
290
|
+
end
|
291
|
+
end
|
263
292
|
end
|
293
|
+
block
|
264
294
|
end
|
265
|
-
block
|
266
295
|
end
|
267
296
|
|
268
297
|
def namespace
|
data/lib/origen/users.rb
CHANGED
@@ -8,9 +8,10 @@ module Origen
|
|
8
8
|
# Had to do some shenanigans here due to Origen.root not being available
|
9
9
|
# when this file is included, only load the users from the app once a user
|
10
10
|
# method is first called
|
11
|
-
return @app_users if @app_users
|
12
|
-
require File.join(Origen.root, 'config', 'users')
|
13
|
-
@app_users = users
|
11
|
+
# return @app_users if @app_users
|
12
|
+
# require File.join(Origen.root, 'config', 'users')
|
13
|
+
# @app_users = users
|
14
|
+
[]
|
14
15
|
end
|
15
16
|
|
16
17
|
# Returns a user object representing the current user, will return a default
|
data/lib/origen/users/user.rb
CHANGED
@@ -66,7 +66,7 @@ module Origen
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def name
|
69
|
-
@name
|
69
|
+
@name ||= name_from_rc || @id
|
70
70
|
end
|
71
71
|
|
72
72
|
def name_from_rc
|
@@ -74,7 +74,7 @@ module Origen
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def email
|
77
|
-
@email
|
77
|
+
@email ||= email_from_rc || begin
|
78
78
|
if Origen.site_config.email_domain
|
79
79
|
"#{id}@#{Origen.site_config.email_domain}"
|
80
80
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -390,17 +390,14 @@ extra_rdoc_files: []
|
|
390
390
|
files:
|
391
391
|
- bin/origen
|
392
392
|
- config/application.rb
|
393
|
+
- config/boot.rb
|
393
394
|
- config/commands.rb
|
394
|
-
- config/development.rb
|
395
|
-
- config/environment.rb
|
396
|
-
- config/rgen.policy
|
397
395
|
- config/rubocop/easy.yml
|
398
396
|
- config/rubocop/easy_disabled.yml
|
399
397
|
- config/rubocop/easy_enabled.yml
|
400
398
|
- config/rubocop/strict.yml
|
401
399
|
- config/rubocop/strict_disabled.yml
|
402
400
|
- config/rubocop/strict_enabled.yml
|
403
|
-
- config/users.rb
|
404
401
|
- config/version.rb
|
405
402
|
- helpers/url.rb
|
406
403
|
- lib/c99/doc_interface.rb
|
@@ -431,6 +428,11 @@ files:
|
|
431
428
|
- lib/origen/callbacks.rb
|
432
429
|
- lib/origen/chip_mode.rb
|
433
430
|
- lib/origen/chip_package.rb
|
431
|
+
- lib/origen/chips.rb
|
432
|
+
- lib/origen/chips/chip.rb
|
433
|
+
- lib/origen/chips/design_entry.rb
|
434
|
+
- lib/origen/chips/doc_entry.rb
|
435
|
+
- lib/origen/chips/note.rb
|
434
436
|
- lib/origen/client.rb
|
435
437
|
- lib/origen/code_generators.rb
|
436
438
|
- lib/origen/code_generators/actions.rb
|
@@ -720,7 +722,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
720
722
|
version: 1.8.11
|
721
723
|
requirements: []
|
722
724
|
rubyforge_project:
|
723
|
-
rubygems_version: 2.
|
725
|
+
rubygems_version: 2.4.5
|
724
726
|
signing_key:
|
725
727
|
specification_version: 4
|
726
728
|
summary: A Semiconductor Developer's Kit
|
data/config/environment.rb
DELETED
File without changes
|
data/config/rgen.policy
DELETED
data/config/users.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# This file defines the users associated with your project, it is basically the
|
2
|
-
# mailing list for release notes.
|
3
|
-
# This module must define a method named "users" which returns an array of user
|
4
|
-
# objects.
|
5
|
-
# You can split your users into "admin" and "user" groups, the main difference
|
6
|
-
# between the two is that admin users will get all tag emails, users will get
|
7
|
-
# emails on external/official releases only.
|
8
|
-
# Users are also prohibited from running the tag_project script, but this is
|
9
|
-
# really just to prevent a casual user from executing it inadvertently and it is
|
10
|
-
# not intended to be a serious security gate.
|
11
|
-
module Origen
|
12
|
-
module Users
|
13
|
-
def users
|
14
|
-
@users ||= [
|
15
|
-
# Admins
|
16
|
-
User.new('Stephen McGinty', 'stephen.f.mcginty@gmail.com', :admin),
|
17
|
-
]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|