origen 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/origen +3 -1
- data/config/boot.rb +1 -7
- data/config/commands.rb +0 -1
- data/config/version.rb +2 -2
- data/lib/c99/{j750_interface.rb → ate_interface.rb} +3 -11
- data/lib/c99/doc_interface.rb +1 -1
- data/lib/origen.rb +9 -30
- data/lib/origen/application.rb +10 -8
- data/lib/origen/application/configuration.rb +13 -26
- data/lib/origen/application/plugins.rb +122 -0
- data/lib/origen/application/plugins_manager.rb +16 -254
- data/lib/origen/application/release.rb +2 -2
- data/lib/origen/application/runner.rb +2 -4
- data/lib/origen/chips.rb +0 -0
- data/lib/origen/chips/chip.rb +0 -0
- data/lib/origen/chips/design_entry.rb +0 -0
- data/lib/origen/chips/doc_entry.rb +0 -0
- data/lib/origen/chips/note.rb +0 -0
- data/lib/origen/commands.rb +4 -44
- data/lib/origen/commands/compile.rb +1 -2
- data/lib/origen/commands/generate.rb +1 -1
- data/lib/origen/commands/interactive.rb +1 -2
- data/lib/origen/commands/plugin.rb +49 -56
- data/lib/origen/commands/program.rb +1 -1
- data/lib/origen/commands/rc.rb +2 -2
- data/lib/origen/commands/version.rb +2 -17
- data/lib/origen/commands_global.rb +3 -0
- data/lib/origen/file_handler.rb +10 -10
- data/lib/origen/generator.rb +1 -1
- data/lib/origen/generator/job.rb +1 -1
- data/lib/origen/generator/pattern.rb +2 -2
- data/lib/origen/generator/pattern_finder.rb +10 -9
- data/lib/origen/pins/pin.rb +0 -0
- data/lib/origen/regression_manager.rb +0 -0
- data/lib/origen/remote_manager.rb +2 -8
- data/lib/origen/revision_control/design_sync.rb +0 -0
- data/lib/origen/revision_control/git.rb +0 -0
- data/lib/origen/specs.rb +0 -0
- data/lib/origen/specs/checkers.rb +0 -0
- data/lib/origen/specs/creation_info.rb +0 -0
- data/lib/origen/specs/exhibit.rb +0 -0
- data/lib/origen/specs/spec.rb +0 -0
- data/lib/origen/utility.rb +0 -1
- data/lib/origen/utility/diff.rb +0 -0
- metadata +42 -119
- data/lib/origen/import_manager.rb +0 -596
- data/lib/origen/nvm.rb +0 -6
- data/lib/origen/nvm/block_array.rb +0 -72
- data/lib/origen/tester.rb +0 -56
- data/lib/origen/tester/api.rb +0 -277
- data/lib/origen/tester/bdm/bdm.rb +0 -25
- data/lib/origen/tester/doc/doc.rb +0 -226
- data/lib/origen/tester/doc/generator.rb +0 -126
- data/lib/origen/tester/doc/generator/flow.rb +0 -71
- data/lib/origen/tester/doc/generator/flow_line.rb +0 -203
- data/lib/origen/tester/doc/generator/test.rb +0 -68
- data/lib/origen/tester/doc/generator/test_group.rb +0 -66
- data/lib/origen/tester/doc/generator/tests.rb +0 -47
- data/lib/origen/tester/doc/model.rb +0 -162
- data/lib/origen/tester/generator.rb +0 -271
- data/lib/origen/tester/generator/flow_control_api.rb +0 -606
- data/lib/origen/tester/generator/identity_map.rb +0 -25
- data/lib/origen/tester/generator/placeholder.rb +0 -13
- data/lib/origen/tester/generator/test_numberer.rb +0 -25
- data/lib/origen/tester/interface.rb +0 -154
- data/lib/origen/tester/j750/files.rb +0 -45
- data/lib/origen/tester/j750/generator.rb +0 -203
- data/lib/origen/tester/j750/generator/flow.rb +0 -123
- data/lib/origen/tester/j750/generator/flow_line.rb +0 -288
- data/lib/origen/tester/j750/generator/patgroup.rb +0 -111
- data/lib/origen/tester/j750/generator/patgroups.rb +0 -41
- data/lib/origen/tester/j750/generator/patset.rb +0 -111
- data/lib/origen/tester/j750/generator/patsets.rb +0 -41
- data/lib/origen/tester/j750/generator/templates/flow.txt.erb +0 -9
- data/lib/origen/tester/j750/generator/templates/instances.txt.erb +0 -16
- data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +0 -8
- data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +0 -10
- data/lib/origen/tester/j750/generator/test_instance.rb +0 -846
- data/lib/origen/tester/j750/generator/test_instance_group.rb +0 -60
- data/lib/origen/tester/j750/generator/test_instances.rb +0 -182
- data/lib/origen/tester/j750/j750.rb +0 -845
- data/lib/origen/tester/j750/j750_hpt.rb +0 -35
- data/lib/origen/tester/j750/parser.rb +0 -104
- data/lib/origen/tester/j750/parser/ac_spec.rb +0 -11
- data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/j750/parser/dc_spec.rb +0 -36
- data/lib/origen/tester/j750/parser/dc_specs.rb +0 -50
- data/lib/origen/tester/j750/parser/descriptions.rb +0 -340
- data/lib/origen/tester/j750/parser/flow.rb +0 -111
- data/lib/origen/tester/j750/parser/flow_line.rb +0 -207
- data/lib/origen/tester/j750/parser/flows.rb +0 -23
- data/lib/origen/tester/j750/parser/pattern_set.rb +0 -94
- data/lib/origen/tester/j750/parser/pattern_sets.rb +0 -33
- data/lib/origen/tester/j750/parser/test_instance.rb +0 -322
- data/lib/origen/tester/j750/parser/test_instances.rb +0 -26
- data/lib/origen/tester/j750/parser/timeset.rb +0 -15
- data/lib/origen/tester/j750/parser/timesets.rb +0 -0
- data/lib/origen/tester/jlink/jlink.rb +0 -33
- data/lib/origen/tester/parser.rb +0 -24
- data/lib/origen/tester/parser/description_lookup.rb +0 -64
- data/lib/origen/tester/parser/searchable_array.rb +0 -32
- data/lib/origen/tester/parser/searchable_hash.rb +0 -32
- data/lib/origen/tester/time.rb +0 -338
- data/lib/origen/tester/timing.rb +0 -253
- data/lib/origen/tester/ultraflex/files.rb +0 -45
- data/lib/origen/tester/ultraflex/generator.rb +0 -200
- data/lib/origen/tester/ultraflex/generator/flow.rb +0 -119
- data/lib/origen/tester/ultraflex/generator/flow_line.rb +0 -269
- data/lib/origen/tester/ultraflex/generator/patgroup.rb +0 -111
- data/lib/origen/tester/ultraflex/generator/patgroups.rb +0 -41
- data/lib/origen/tester/ultraflex/generator/patset.rb +0 -111
- data/lib/origen/tester/ultraflex/generator/patsets.rb +0 -41
- data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +0 -9
- data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +0 -16
- data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +0 -8
- data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +0 -10
- data/lib/origen/tester/ultraflex/generator/test_instance.rb +0 -622
- data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +0 -60
- data/lib/origen/tester/ultraflex/generator/test_instances.rb +0 -174
- data/lib/origen/tester/ultraflex/parser.rb +0 -104
- data/lib/origen/tester/ultraflex/parser/ac_spec.rb +0 -11
- data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/ultraflex/parser/dc_spec.rb +0 -36
- data/lib/origen/tester/ultraflex/parser/dc_specs.rb +0 -50
- data/lib/origen/tester/ultraflex/parser/descriptions.rb +0 -342
- data/lib/origen/tester/ultraflex/parser/flow.rb +0 -111
- data/lib/origen/tester/ultraflex/parser/flow_line.rb +0 -207
- data/lib/origen/tester/ultraflex/parser/flows.rb +0 -23
- data/lib/origen/tester/ultraflex/parser/pattern_set.rb +0 -94
- data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +0 -33
- data/lib/origen/tester/ultraflex/parser/test_instance.rb +0 -262
- data/lib/origen/tester/ultraflex/parser/test_instances.rb +0 -26
- data/lib/origen/tester/ultraflex/parser/timeset.rb +0 -15
- data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
- data/lib/origen/tester/ultraflex/ultraflex.rb +0 -759
- data/lib/origen/tester/v93k/generator.rb +0 -80
- data/lib/origen/tester/v93k/generator/flow.rb +0 -63
- data/lib/origen/tester/v93k/generator/flow_node.rb +0 -17
- data/lib/origen/tester/v93k/generator/flow_node/print.rb +0 -10
- data/lib/origen/tester/v93k/generator/pattern.rb +0 -16
- data/lib/origen/tester/v93k/generator/pattern_master.rb +0 -54
- data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +0 -6
- data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +0 -11
- data/lib/origen/tester/v93k/generator/templates/template.flow.erb +0 -121
- data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +0 -9
- data/lib/origen/tester/v93k/generator/test_function.rb +0 -103
- data/lib/origen/tester/v93k/generator/test_functions.rb +0 -79
- data/lib/origen/tester/v93k/generator/test_method.rb +0 -46
- data/lib/origen/tester/v93k/generator/test_methods.rb +0 -75
- data/lib/origen/tester/v93k/generator/test_suite.rb +0 -54
- data/lib/origen/tester/v93k/generator/test_suites.rb +0 -65
- data/lib/origen/tester/v93k/v93k.rb +0 -420
- data/lib/origen/tester/vector.rb +0 -86
- data/lib/origen/tester/vector_generator.rb +0 -637
- data/lib/origen/tester/vector_pipeline.rb +0 -150
- data/lib/origen/utility/design_sync.rb +0 -494
- data/lib/origen/version_checker.rb +0 -117
data/lib/origen/tester/vector.rb
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module Origen
|
|
2
|
-
module Tester
|
|
3
|
-
# A simple class to model a vector
|
|
4
|
-
class Vector
|
|
5
|
-
attr_accessor :repeat, :microcode, :timeset, :pin_vals,
|
|
6
|
-
:number, :cycle_number, :dont_compress,
|
|
7
|
-
:comments
|
|
8
|
-
|
|
9
|
-
def initialize(attrs = {})
|
|
10
|
-
attrs.each do |attribute, value|
|
|
11
|
-
send("#{attribute}=", value)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def comments
|
|
16
|
-
@comments ||= []
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def update(attrs = {})
|
|
20
|
-
attrs.each do |attribute, value|
|
|
21
|
-
send("#{attribute}=", value)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Updates the pin values to reflect the value currently held by the given pin
|
|
26
|
-
def update_pin_val(pin)
|
|
27
|
-
vals = pin_vals.split(' ')
|
|
28
|
-
if pin.belongs_to_a_pin_group? && !pin.is_a?(Origen::Pins::PinCollection)
|
|
29
|
-
port = nil
|
|
30
|
-
pin.groups.each { |i| port = i[1] if port.nil? && Origen.tester.ordered_pins.include?(i[1]) } # see if group is included in ordered pins
|
|
31
|
-
if port
|
|
32
|
-
ix = Origen.tester.ordered_pins.index(port) # find index of port
|
|
33
|
-
i = port.index(pin)
|
|
34
|
-
else
|
|
35
|
-
ix = Origen.tester.ordered_pins.index(pin)
|
|
36
|
-
i = 0
|
|
37
|
-
end
|
|
38
|
-
else
|
|
39
|
-
ix = Origen.tester.ordered_pins.index(pin)
|
|
40
|
-
i = 0
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
if Origen.pin_bank.pin_groups.keys.include? pin.id
|
|
44
|
-
val = pin.map { |p| Origen.tester.format_pin_state(p) }.join('')
|
|
45
|
-
vals[ix] = val
|
|
46
|
-
else
|
|
47
|
-
val = Origen.tester.format_pin_state(pin)
|
|
48
|
-
vals[ix][i] = val
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
self.pin_vals = vals.join(' ')
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def ordered_pins
|
|
55
|
-
Origen.app.pin_map.sort_by { |_id, pin| pin.order }.map { |_id, pin| pin }
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def microcode=(val)
|
|
59
|
-
if has_microcode? && @microcode != val
|
|
60
|
-
fail "Trying to assign microcode: #{val}, but vector already has microcode: #{@microcode}"
|
|
61
|
-
else
|
|
62
|
-
@microcode = val
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Since repeat 0 is non-intuitive every vector implicitly has a repeat of 1
|
|
67
|
-
def repeat
|
|
68
|
-
@repeat || 1
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def has_microcode?
|
|
72
|
-
@microcode && !@microcode.empty?
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def ==(obj)
|
|
76
|
-
if obj.is_a?(Vector)
|
|
77
|
-
self.has_microcode? == obj.has_microcode? &&
|
|
78
|
-
timeset == obj.timeset &&
|
|
79
|
-
pin_vals == obj.pin_vals
|
|
80
|
-
else
|
|
81
|
-
super obj
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,637 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
module Origen
|
|
3
|
-
module Tester
|
|
4
|
-
module VectorGenerator
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
|
|
7
|
-
require 'erb'
|
|
8
|
-
|
|
9
|
-
included do
|
|
10
|
-
attr_accessor :compress
|
|
11
|
-
attr_accessor :expand_repeats
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def vector_group_size
|
|
15
|
-
@vector_group_size || 1
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def vector_group_size=(number)
|
|
19
|
-
if number > 1 && number.odd?
|
|
20
|
-
fail 'Only even numbers can be supplied for the vector_group_size!'
|
|
21
|
-
end
|
|
22
|
-
# Each pattern should run with its own tester instance, but just in case
|
|
23
|
-
@pipeline = nil
|
|
24
|
-
@vector_group_size = number
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def with_vector_group_size(number)
|
|
28
|
-
orig = vector_group_size
|
|
29
|
-
self.vector_group_size = number
|
|
30
|
-
yield
|
|
31
|
-
self.vector_group_size = orig
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Returns an array of pin IDs that are currently inhibited (will not
|
|
35
|
-
# be included when vectors are generated)
|
|
36
|
-
def inhibited_pins
|
|
37
|
-
@inhibited_pins ||= []
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# init vector count when first accessed, otherwise return value
|
|
41
|
-
def vec_count
|
|
42
|
-
@vec_count ||= 0
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# increment vector count
|
|
46
|
-
def inc_vec_count(num = 1)
|
|
47
|
-
vec_count if @vec_count.nil? # define if not already
|
|
48
|
-
@vec_count = @vec_count + num
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# decrement vector count
|
|
52
|
-
def dec_vec_count(num = 1)
|
|
53
|
-
vec_count if @vec_count.nil? # define if not already
|
|
54
|
-
@vec_count = @vec_count - num
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# init cycle count when first accessed, otherwise return value
|
|
58
|
-
def cycle_count
|
|
59
|
-
@cycle_count ||= 0
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# increment cycle count
|
|
63
|
-
def inc_cycle_count(num = 1)
|
|
64
|
-
cycle_count if @cycle_count.nil? # define if not already
|
|
65
|
-
@cycle_count = @cycle_count + num
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# reset_cycle_count
|
|
69
|
-
def reset_cycle_count(num = 0)
|
|
70
|
-
cycle_count if @cycle_count.nil? # define if not already
|
|
71
|
-
@cycle_count = num
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Call to prevent the given pins from appearing in the generated vectors.
|
|
75
|
-
#
|
|
76
|
-
# This is a convenient way to inhibit something like a J750 mux pin from
|
|
77
|
-
# appearing in the patterns when generating the pattern for a different
|
|
78
|
-
# platform.
|
|
79
|
-
#
|
|
80
|
-
# When used this
|
|
81
|
-
# method must be called before the first vector is generated - it will not be retrospectively
|
|
82
|
-
# applied to existing vectors.
|
|
83
|
-
def inhibit_pin(*pins)
|
|
84
|
-
pins.each do |pin|
|
|
85
|
-
inhibited_pins << pin
|
|
86
|
-
end
|
|
87
|
-
inhibited_pins.uniq!
|
|
88
|
-
inhibited_pins.compact!
|
|
89
|
-
inhibited_pins
|
|
90
|
-
end
|
|
91
|
-
alias_method :inhibit_pins, :inhibit_pin
|
|
92
|
-
|
|
93
|
-
# Render content directly into a pattern, any options will be passed to the template
|
|
94
|
-
def render(template, options = {})
|
|
95
|
-
# Record the current file, this can be used to resolve any relative path
|
|
96
|
-
# references in the file about to be compiled
|
|
97
|
-
Origen.file_handler.current_file = template
|
|
98
|
-
# Ran into crosstalk problems when rendering ERB templates recursively, setting eoutvar based
|
|
99
|
-
# on the name of the file will causes each template to be rendered into its own 'bank'.
|
|
100
|
-
# Not sure why the final gsub is needed but seems to fail to parse correctly otherwise.
|
|
101
|
-
eoutvar = Pathname.new(template).basename('.*').basename('.*').to_s.gsub('-', '_')
|
|
102
|
-
# Make the file name available to the template
|
|
103
|
-
Origen.generator.compiler.options[:file] = template
|
|
104
|
-
options.each { |k, v| Origen.generator.compiler.options[k] = v }
|
|
105
|
-
code = Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result)
|
|
106
|
-
code.strip!
|
|
107
|
-
push_microcode code
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# If the tester defines a method named template this method will compile
|
|
111
|
-
# whatever template file is returned by that method.
|
|
112
|
-
#
|
|
113
|
-
# This method is called automatically after the body section of a Pattern.create
|
|
114
|
-
# operation has completed.
|
|
115
|
-
def render_template
|
|
116
|
-
_render(:template)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Same as the render method, except the template method should be called body_template.
|
|
120
|
-
def render_body
|
|
121
|
-
_render(:body_template)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# If the tester defines a method named footer_template this method will compile
|
|
125
|
-
# whatever template file is returned by that method.
|
|
126
|
-
#
|
|
127
|
-
# This method is called automatically during the footer section of a Pattern.create
|
|
128
|
-
# operation.
|
|
129
|
-
def render_footer
|
|
130
|
-
_render(:footer_template)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# If the tester defines a method named header_template this method will compile
|
|
134
|
-
# whatever template file is returned by that method.
|
|
135
|
-
#
|
|
136
|
-
# This method is called automatically during the header section of a Pattern.create
|
|
137
|
-
# operation.
|
|
138
|
-
def render_header
|
|
139
|
-
_render(:header_template)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def _render(method) # :nodoc:
|
|
143
|
-
if self.respond_to?(method)
|
|
144
|
-
template = send(method)
|
|
145
|
-
# Record the current file, this can be used to resolve any relative path
|
|
146
|
-
# references in the file about to be compiled
|
|
147
|
-
Origen.file_handler.current_file = template
|
|
148
|
-
# Ran into crosstalk problems when rendering ERB templates recursively, setting eoutvar based
|
|
149
|
-
# on the name of the file will causes each template to be rendered into its own 'bank'.
|
|
150
|
-
# Not sure why the final gsub is needed but seems to fail to parse correctly otherwise.
|
|
151
|
-
eoutvar = Pathname.new(template).basename('.*').basename('.*').to_s.gsub('-', '_')
|
|
152
|
-
# Make the file name available to the template
|
|
153
|
-
Origen.generator.compiler.options[:file] = template
|
|
154
|
-
push_microcode Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result)
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def stage
|
|
159
|
-
Origen.generator.stage
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def push_comment(msg)
|
|
163
|
-
# Comments are stored verbatim for now, can't see much use for a dedicated comment object
|
|
164
|
-
stage.store msg unless @inhibit_comments
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
def push_microcode(code, options = {})
|
|
168
|
-
unless @inhibit_vectors
|
|
169
|
-
if options[:offset] && options[:offset] != 0
|
|
170
|
-
stage.insert_from_end code, options[:offset]
|
|
171
|
-
else
|
|
172
|
-
stage.store code
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
alias_method :microcode, :push_microcode
|
|
177
|
-
|
|
178
|
-
def last_vector(offset = 0)
|
|
179
|
-
stage.last_vector(offset)
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def last_object(offset = 0)
|
|
183
|
-
stage.last_object(offset)
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
# Allows the attributes for the next vector to be setup prior
|
|
187
|
-
# to generating it.
|
|
188
|
-
#
|
|
189
|
-
# A block can be optionally supplied to act as a clean up method,
|
|
190
|
-
# that is the block will be saved and executed after the next
|
|
191
|
-
# cycle has been generated.
|
|
192
|
-
#
|
|
193
|
-
# See the V93K store_next_cycle method for an example of using
|
|
194
|
-
# this.
|
|
195
|
-
def preset_next_vector(attrs = {}, &block)
|
|
196
|
-
@preset_next_vector = attrs
|
|
197
|
-
@preset_next_vector_cleanup = block
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
# Called by every $tester.cycle command to push a vector to the stage object
|
|
201
|
-
def push_vector(attrs = {})
|
|
202
|
-
attrs = {
|
|
203
|
-
dont_compress: @dont_compress
|
|
204
|
-
}.merge(attrs)
|
|
205
|
-
unless @inhibit_vectors
|
|
206
|
-
if @preset_next_vector
|
|
207
|
-
attrs = @preset_next_vector.merge(attrs) do |key, preset, current|
|
|
208
|
-
if preset && current && current != ''
|
|
209
|
-
fail "Value for #{key} set by preset_next_vector clashed with the next vector!"
|
|
210
|
-
else
|
|
211
|
-
preset || current
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
@preset_next_vector = nil
|
|
215
|
-
end
|
|
216
|
-
stage.store Vector.new(attrs)
|
|
217
|
-
inc_vec_count
|
|
218
|
-
inc_cycle_count(attrs[:repeat] || 1)
|
|
219
|
-
if @preset_next_vector_cleanup
|
|
220
|
-
@preset_next_vector_cleanup.call
|
|
221
|
-
@preset_next_vector_cleanup = nil
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
alias_method :vector, :push_vector
|
|
226
|
-
|
|
227
|
-
def update_vector(attrs = {})
|
|
228
|
-
unless @inhibit_vectors
|
|
229
|
-
offset = (attrs.delete(:offset) || 0).abs
|
|
230
|
-
stage.last_vector(offset).update(attrs)
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
def update_vector_pin_val(pin, options = {})
|
|
235
|
-
unless @inhibit_vectors
|
|
236
|
-
offset = (options.delete(:offset) || 0).abs
|
|
237
|
-
stage.last_vector(offset).update_pin_val(pin)
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
# Adds the given microcode to the last vector if possible. If not possible (meaning the
|
|
242
|
-
# vector already contains microcode) then a new cycle will be added with the given
|
|
243
|
-
# microcode.
|
|
244
|
-
def add_microcode_to_last_or_cycle(code)
|
|
245
|
-
cycle if !stage.last_vector || stage.last_vector.has_microcode?
|
|
246
|
-
stage.last_vector.update(microcode: code)
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
# Final pass of a generator vector array which returns lines suitable for writing to the
|
|
250
|
-
# output file. This gives the tester model a chance to concatenate repeats and any other
|
|
251
|
-
# last optimization/formatting changes it wishes to make.
|
|
252
|
-
#
|
|
253
|
-
# At this point vector array contains a combination of non-vector lines and uncompressed
|
|
254
|
-
# Vector objects (vector lines)
|
|
255
|
-
#
|
|
256
|
-
def format(vector_array, section)
|
|
257
|
-
# Go through vector_array and print out both
|
|
258
|
-
# vectors and non-vectors to pattern (via 'yield line')
|
|
259
|
-
vector_array.each do |vec|
|
|
260
|
-
# These may eventually be merged to the same method, but splitting for now
|
|
261
|
-
# so that multi mode development can proceed without upsetting single mode
|
|
262
|
-
if vector_group_size > 1
|
|
263
|
-
multi_mode_optimize(vec, section: section) do |line|
|
|
264
|
-
yield line
|
|
265
|
-
end
|
|
266
|
-
else
|
|
267
|
-
optimize(vec, section: section) do |line|
|
|
268
|
-
yield line
|
|
269
|
-
end
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
# now flush buffer if there is still a vector
|
|
273
|
-
if vector_group_size > 1
|
|
274
|
-
pipeline.empty do |vector|
|
|
275
|
-
expand_vector(vector) do |line|
|
|
276
|
-
yield line
|
|
277
|
-
end
|
|
278
|
-
end
|
|
279
|
-
else
|
|
280
|
-
if @buffered_vector
|
|
281
|
-
expand_vector(@buffered_vector) do |line|
|
|
282
|
-
yield line
|
|
283
|
-
end
|
|
284
|
-
@buffered_vector = nil
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
# Tester models can overwrite this if they wish to inject any additional pattern lines
|
|
290
|
-
# at final pattern dump time
|
|
291
|
-
def before_write_pattern_line(line)
|
|
292
|
-
[line]
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
def pipeline
|
|
296
|
-
@pipeline ||= VectorPipeline.new(vector_group_size)
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
def multi_mode_optimize(vec, _options = {})
|
|
300
|
-
pipeline << vec
|
|
301
|
-
pipeline.flush do |vector|
|
|
302
|
-
expand_vector(vector) do |line|
|
|
303
|
-
yield line
|
|
304
|
-
end
|
|
305
|
-
end
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
def optimize(vec, options = {})
|
|
309
|
-
options = { section: false
|
|
310
|
-
}.merge(options)
|
|
311
|
-
|
|
312
|
-
# Flush the buffer if this vector is not compressible or if it doesn't
|
|
313
|
-
# match the existing buffer (to get ready for new vector)
|
|
314
|
-
if @buffered_vector && (!(compressable_vector?(vec) && vec == @buffered_vector) ||
|
|
315
|
-
@buffered_vector.repeat == @max_repeat_loop)
|
|
316
|
-
expand_vector(@buffered_vector) do |line|
|
|
317
|
-
# if last vector in pattern then pad if insufficient vectors
|
|
318
|
-
if options[:section] == :footer && (@min_pattern_vectors) && (vec_count < @min_pattern_vectors)
|
|
319
|
-
yield "#{comment_char} PADDING VECTORS ADDED TO MEET MIN #{@min_pattern_vectors} FOR PATTERN"
|
|
320
|
-
(@min_pattern_vectors - vec_count + 1).times do
|
|
321
|
-
yield line
|
|
322
|
-
end
|
|
323
|
-
inc_vec_count(@min_pattern_vectors - vec_count)
|
|
324
|
-
else
|
|
325
|
-
yield line
|
|
326
|
-
end
|
|
327
|
-
end
|
|
328
|
-
@buffered_vector = nil
|
|
329
|
-
end
|
|
330
|
-
if compressable_vector?(vec)
|
|
331
|
-
# The new vector has already been identified as equal to the buffer
|
|
332
|
-
# so just increment vector if buffered already, otherwise it is the
|
|
333
|
-
# first encounter with this vector and create buffer with it
|
|
334
|
-
if @buffered_vector
|
|
335
|
-
# simply increment repeat count
|
|
336
|
-
@buffered_vector.repeat += vec.repeat
|
|
337
|
-
# decrement vector count only once with each added repeat
|
|
338
|
-
dec_vec_count(1)
|
|
339
|
-
# if new repeat exceeds @max_repeat_loop
|
|
340
|
-
if @buffered_vector.repeat > @max_repeat_loop
|
|
341
|
-
delay(@buffered_vector.repeat) do |options|
|
|
342
|
-
@buffered_vector.repeat = options[:repeat]
|
|
343
|
-
if options[:repeat] == @max_repeat_loop
|
|
344
|
-
expand_vector(@buffered_vector) do |line|
|
|
345
|
-
yield line
|
|
346
|
-
end
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
end
|
|
350
|
-
else
|
|
351
|
-
# not buffered vector, set buffer to vector
|
|
352
|
-
@buffered_vector = vec
|
|
353
|
-
end
|
|
354
|
-
else
|
|
355
|
-
# not compressible
|
|
356
|
-
expand_vector(vec) do |line|
|
|
357
|
-
yield line
|
|
358
|
-
end
|
|
359
|
-
end
|
|
360
|
-
end
|
|
361
|
-
alias_method :buffer, :optimize
|
|
362
|
-
|
|
363
|
-
def dont_compress
|
|
364
|
-
if block_given?
|
|
365
|
-
orig = @dont_compress
|
|
366
|
-
@dont_compress = true
|
|
367
|
-
yield
|
|
368
|
-
@dont_compress = orig
|
|
369
|
-
else
|
|
370
|
-
@dont_compress
|
|
371
|
-
end
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
def dont_compress=(val)
|
|
375
|
-
@dont_compress = val
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
def compressable_vector?(vec)
|
|
379
|
-
!!(compress && vec.is_a?(Vector) && !vec.has_microcode? &&
|
|
380
|
-
vec.pin_vals && !vec.dont_compress)
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
# expands (uncompresses to pattern) vector if desired or leaves it as is
|
|
384
|
-
# allows for tracking and formatting of vector
|
|
385
|
-
# if comment then return without modification
|
|
386
|
-
def expand_vector(vec)
|
|
387
|
-
if vec.is_a?(Vector)
|
|
388
|
-
if expand_repeats
|
|
389
|
-
vec.repeat.times do
|
|
390
|
-
vec.repeat = 1
|
|
391
|
-
yield track_and_format_vector(vec)
|
|
392
|
-
end
|
|
393
|
-
else
|
|
394
|
-
yield track_and_format_vector(vec)
|
|
395
|
-
end
|
|
396
|
-
else
|
|
397
|
-
yield vec # Return comments without modification
|
|
398
|
-
end
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
# Update tracking info (stats object) and allow for
|
|
402
|
-
# any additional formatting via format_vector
|
|
403
|
-
# method if overridden
|
|
404
|
-
def track_and_format_vector(vec)
|
|
405
|
-
unless vec.timeset
|
|
406
|
-
puts 'No timeset defined!'
|
|
407
|
-
puts 'Add one to your top level startup method or target like this:'
|
|
408
|
-
puts '$tester.set_timeset("nvmbist", 40) # Where 40 is the period in ns'
|
|
409
|
-
exit 1
|
|
410
|
-
end
|
|
411
|
-
stats = Origen.app.stats
|
|
412
|
-
stats.add_vector
|
|
413
|
-
if vector_group_size > 1 && vec.repeat > 1
|
|
414
|
-
stats.add_cycle(1)
|
|
415
|
-
stats.add_cycle((vec.repeat - 1) * vector_group_size)
|
|
416
|
-
stats.add_time_in_ns(vec.timeset.period_in_ns)
|
|
417
|
-
stats.add_time_in_ns((vec.repeat - 1) * vector_group_size * vec.timeset.period_in_ns)
|
|
418
|
-
else
|
|
419
|
-
stats.add_cycle(vec.repeat)
|
|
420
|
-
stats.add_time_in_ns(vec.repeat * vec.timeset.period_in_ns)
|
|
421
|
-
end
|
|
422
|
-
format_vector(vec)
|
|
423
|
-
end
|
|
424
|
-
|
|
425
|
-
def format_vector(_vec)
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
def pingroup_map
|
|
429
|
-
Origen.app.pingroup_map
|
|
430
|
-
end
|
|
431
|
-
|
|
432
|
-
# Cache the pin ordering for later use since all vectors should be formatted the same
|
|
433
|
-
def ordered_pins_cache(options = {})
|
|
434
|
-
@ordered_pins_cache ||= ordered_pins(options)
|
|
435
|
-
end
|
|
436
|
-
|
|
437
|
-
def ordered_pins(options = {})
|
|
438
|
-
options = {
|
|
439
|
-
include_inhibited_pins: false,
|
|
440
|
-
include_pingroups: true
|
|
441
|
-
}.merge(options)
|
|
442
|
-
|
|
443
|
-
result = nil
|
|
444
|
-
|
|
445
|
-
Origen.profile 'Working out pin pattern order' do
|
|
446
|
-
pinorder = Origen.app.pin_pattern_order.dup
|
|
447
|
-
pinexclude = Origen.app.pin_pattern_exclude.dup
|
|
448
|
-
|
|
449
|
-
if Origen.app.pin_pattern_order.last.is_a?(Hash)
|
|
450
|
-
options.merge!(pinorder.pop)
|
|
451
|
-
end
|
|
452
|
-
if Origen.app.pin_pattern_exclude.last.is_a?(Hash)
|
|
453
|
-
options.merge!(pinexclude.pop)
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
ordered_pins = []
|
|
457
|
-
|
|
458
|
-
# Create a copy of all pins and groups to be output, pins/groups will be delete from here as
|
|
459
|
-
# they are output, so that at the end of the user defined pin order what is left in here can
|
|
460
|
-
# either be discarded or output at the end
|
|
461
|
-
pins = Origen.pin_bank.pins.dup
|
|
462
|
-
pingroups = Origen.pin_bank.pin_groups.dup
|
|
463
|
-
|
|
464
|
-
if pinorder && pinorder.size > 0
|
|
465
|
-
pinorder.each do |id|
|
|
466
|
-
# If the ID refers to a pin group
|
|
467
|
-
if group = Origen.pin_bank.pin_groups[id]
|
|
468
|
-
# If the group has still to be output just do that now
|
|
469
|
-
if pingroups.include? group.id
|
|
470
|
-
ordered_pins << group
|
|
471
|
-
# Now delete the group from the list of groups still to be output and all of its pins
|
|
472
|
-
# from the list pins still to be output
|
|
473
|
-
group.each do |pin|
|
|
474
|
-
pins.delete(pin.id)
|
|
475
|
-
pin.groups.each do |name, _group|
|
|
476
|
-
pingroups.delete(name)
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
pingroups.delete(group.id)
|
|
480
|
-
# To get here the some of the pins in the group have already been output which is preventing
|
|
481
|
-
# output of the complete group at this point, in that case output any of its pins that have
|
|
482
|
-
# still to go
|
|
483
|
-
else
|
|
484
|
-
group.each do |pin|
|
|
485
|
-
if pins.include? pin.id
|
|
486
|
-
ordered_pins << pin
|
|
487
|
-
pin.groups.each do |name, _group|
|
|
488
|
-
pingroups.delete(name)
|
|
489
|
-
end
|
|
490
|
-
end
|
|
491
|
-
end
|
|
492
|
-
end
|
|
493
|
-
# this is a pin
|
|
494
|
-
else
|
|
495
|
-
pin = Origen.pin_bank.find(id)
|
|
496
|
-
fail "Undefined pin (#{id}) added to pin_pattern_order" unless pin
|
|
497
|
-
ordered_pins << pin
|
|
498
|
-
pin.groups.each do |name, _group|
|
|
499
|
-
pingroups.delete(name)
|
|
500
|
-
end
|
|
501
|
-
pin.name = id
|
|
502
|
-
pins.delete(pin.id)
|
|
503
|
-
end
|
|
504
|
-
end
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
if pinexclude && pinexclude.size > 0
|
|
508
|
-
pinexclude.each do |id|
|
|
509
|
-
if group = Origen.pin_bank.pin_groups[id]
|
|
510
|
-
# see if group is already in ordered_pins
|
|
511
|
-
fail "Pin group #{id} is defined both in pin_pattern_order and pin_pattern_exclude" unless pingroups.include? id
|
|
512
|
-
# this is a pin group, delete all pins in group
|
|
513
|
-
pingroups.delete(id)
|
|
514
|
-
group.each do |pin|
|
|
515
|
-
fail "Pin (#{pin.name}) in group (#{group.id}) is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id
|
|
516
|
-
pins.delete(pin.id)
|
|
517
|
-
end
|
|
518
|
-
else # this is a pin, delete the pin
|
|
519
|
-
pin = Origen.pin_bank.find(id)
|
|
520
|
-
fail "Undefined pin (#{id}) added to pin_pattern_exclude" unless pin
|
|
521
|
-
fail "Pin #{pin.name} is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id
|
|
522
|
-
pin.name = id
|
|
523
|
-
pins.delete(pin.id)
|
|
524
|
-
pin.groups.each do |name, _group|
|
|
525
|
-
pingroups.delete(name)
|
|
526
|
-
end
|
|
527
|
-
end
|
|
528
|
-
end
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
unless options[:only]
|
|
532
|
-
# all the rest of the pins to the end of the pattern order
|
|
533
|
-
pins.each do |_id, pin|
|
|
534
|
-
# check for port
|
|
535
|
-
if pin.belongs_to_a_pin_group?
|
|
536
|
-
# Are any of this pin's groups still waiting to be output? pingroups at this point contains
|
|
537
|
-
# those groups which have not been rendered yet
|
|
538
|
-
group = pingroups.find do |_id, group|
|
|
539
|
-
pin.groups.any? { |_pid, pgroup| group == pgroup }
|
|
540
|
-
end
|
|
541
|
-
if group
|
|
542
|
-
ordered_pins << group[1]
|
|
543
|
-
group[1].each { |pin| pins.delete(pin.id) }
|
|
544
|
-
else
|
|
545
|
-
ordered_pins << pin
|
|
546
|
-
end
|
|
547
|
-
else
|
|
548
|
-
ordered_pins << pin
|
|
549
|
-
end
|
|
550
|
-
end
|
|
551
|
-
end
|
|
552
|
-
|
|
553
|
-
result = ordered_pins.map do |pin|
|
|
554
|
-
if options[:include_inhibited_pins]
|
|
555
|
-
pin
|
|
556
|
-
else
|
|
557
|
-
inhibited_pins.include?(pin) ? nil : pin
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
result = result.compact
|
|
561
|
-
end
|
|
562
|
-
result
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
def current_pin_vals
|
|
566
|
-
ordered_pins_cache.map(&:to_vector).join(' ')
|
|
567
|
-
end
|
|
568
|
-
|
|
569
|
-
def get_pingroup(pin)
|
|
570
|
-
pingroup_map.each do |id, pins|
|
|
571
|
-
return id if pins.include? pin
|
|
572
|
-
end
|
|
573
|
-
nil
|
|
574
|
-
end
|
|
575
|
-
|
|
576
|
-
def update_pin_from_formatted_state(pin, state)
|
|
577
|
-
if state == @repeat_previous || state == '-'
|
|
578
|
-
pin.repeat_previous = true
|
|
579
|
-
elsif state == @drive_very_hi_state || state == '2'
|
|
580
|
-
pin.drive_very_hi
|
|
581
|
-
elsif state == @drive_hi_state || state == '1'
|
|
582
|
-
pin.drive_hi
|
|
583
|
-
elsif state == @drive_lo_state || state == '0'
|
|
584
|
-
pin.drive_lo
|
|
585
|
-
elsif state == @expect_hi_state || state == 'H'
|
|
586
|
-
pin.expect_hi
|
|
587
|
-
elsif state == @expect_lo_state || state == 'L'
|
|
588
|
-
pin.expect_lo
|
|
589
|
-
elsif state == @expect_mid_state || state == 'M'
|
|
590
|
-
pin.expect_mid
|
|
591
|
-
elsif state == @drive_mem_state || state == 'D'
|
|
592
|
-
pin.drive_mem
|
|
593
|
-
elsif state == @expect_mem_state || state == 'E'
|
|
594
|
-
pin.expect_mem
|
|
595
|
-
elsif state == @capture_state || state == 'C'
|
|
596
|
-
pin.capture
|
|
597
|
-
elsif state == @dont_care_state || state == 'X'
|
|
598
|
-
pin.dont_care
|
|
599
|
-
else
|
|
600
|
-
fail "Unknown pin state: #{state}"
|
|
601
|
-
end
|
|
602
|
-
end
|
|
603
|
-
|
|
604
|
-
def format_pin_state(pin)
|
|
605
|
-
if pin.repeat_previous? && @support_repeat_previous
|
|
606
|
-
@repeat_previous || '-'
|
|
607
|
-
elsif pin.driving?
|
|
608
|
-
if pin.value == 1
|
|
609
|
-
if pin.high_voltage?
|
|
610
|
-
@drive_very_hi_state || '2'
|
|
611
|
-
else
|
|
612
|
-
@drive_hi_state || '1'
|
|
613
|
-
end
|
|
614
|
-
else
|
|
615
|
-
@drive_lo_state || '0'
|
|
616
|
-
end
|
|
617
|
-
elsif pin.comparing_midband?
|
|
618
|
-
@expect_mid_state || 'M'
|
|
619
|
-
elsif pin.comparing?
|
|
620
|
-
if pin.value == 1
|
|
621
|
-
@expect_hi_state || 'H'
|
|
622
|
-
else
|
|
623
|
-
@expect_lo_state || 'L'
|
|
624
|
-
end
|
|
625
|
-
elsif pin.driving_mem?
|
|
626
|
-
@drive_mem_state || 'D'
|
|
627
|
-
elsif pin.comparing_mem?
|
|
628
|
-
@expect_mem_state || 'E'
|
|
629
|
-
elsif pin.to_be_captured?
|
|
630
|
-
@capture_state || 'C'
|
|
631
|
-
else
|
|
632
|
-
@dont_care_state || 'X'
|
|
633
|
-
end
|
|
634
|
-
end
|
|
635
|
-
end
|
|
636
|
-
end
|
|
637
|
-
end
|