origen_testers 0.13.1 → 0.13.2
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/config/application.rb +151 -151
- data/config/boot.rb +13 -13
- data/config/commands.rb +85 -86
- data/config/users.rb +18 -18
- data/config/version.rb +8 -8
- data/lib/commands/build.rb +69 -69
- data/lib/commands/run.rb +48 -48
- data/lib/origen_testers.rb +47 -47
- data/lib/origen_testers/api.rb +381 -381
- data/lib/origen_testers/basic_test_setups.rb +105 -105
- data/lib/origen_testers/callback_handlers.rb +59 -59
- data/lib/origen_testers/command_based_tester.rb +45 -45
- data/lib/origen_testers/flow.rb +382 -382
- data/lib/origen_testers/generator.rb +283 -283
- data/lib/origen_testers/generator/identity_map.rb +23 -23
- data/lib/origen_testers/generator/placeholder.rb +11 -11
- data/lib/origen_testers/generator/test_numberer.rb +23 -23
- data/lib/origen_testers/igxl_based_tester.rb +12 -12
- data/lib/origen_testers/igxl_based_tester/base.rb +1100 -1099
- data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -79
- data/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +169 -169
- data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -98
- data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -60
- data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -24
- data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -39
- data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +130 -130
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +460 -460
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +276 -276
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +607 -607
- data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -83
- data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -75
- data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -44
- data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -59
- data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -39
- data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -31
- data/lib/origen_testers/igxl_based_tester/base/levelset.rb +110 -110
- data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -109
- data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -68
- data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -56
- data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -68
- data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -56
- data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -93
- data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -25
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +322 -322
- data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +66 -66
- data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +212 -212
- data/lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb +37 -37
- data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -37
- data/lib/origen_testers/igxl_based_tester/base/timesets.rb +49 -49
- data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -49
- data/lib/origen_testers/igxl_based_tester/files.rb +43 -43
- data/lib/origen_testers/igxl_based_tester/j750.rb +269 -269
- data/lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb +32 -32
- data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +746 -746
- data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -34
- data/lib/origen_testers/igxl_based_tester/j750_hpt/custom_test_instance.rb +32 -32
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +599 -599
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/parser.rb +102 -102
- data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -33
- data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -48
- data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -339
- data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -109
- data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -203
- data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -21
- data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -92
- data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -31
- data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +420 -420
- data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -24
- data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -13
- data/lib/origen_testers/igxl_based_tester/ultraflex.rb +798 -798
- data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +949 -949
- data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +36 -36
- data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +158 -158
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +315 -315
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -10
- data/lib/origen_testers/interface.rb +345 -324
- data/lib/origen_testers/memory_style.rb +77 -77
- data/lib/origen_testers/no_interface.rb +7 -7
- data/lib/origen_testers/origen_ext/application/runner.rb +25 -25
- data/lib/origen_testers/origen_ext/generator.rb +54 -54
- data/lib/origen_testers/origen_ext/generator/flow.rb +91 -77
- data/lib/origen_testers/origen_ext/generator/resources.rb +21 -21
- data/lib/origen_testers/origen_ext/pins/pin.rb +78 -78
- data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -84
- data/lib/origen_testers/parser.rb +22 -22
- data/lib/origen_testers/parser/description_lookup.rb +62 -62
- data/lib/origen_testers/parser/searchable_array.rb +30 -30
- data/lib/origen_testers/parser/searchable_hash.rb +30 -30
- data/lib/origen_testers/pattern_compilers.rb +116 -116
- data/lib/origen_testers/pattern_compilers/assembler.rb +88 -88
- data/lib/origen_testers/pattern_compilers/job.rb +96 -96
- data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -599
- data/lib/origen_testers/program_generators.rb +62 -62
- data/lib/origen_testers/smartest_based_tester.rb +8 -8
- data/lib/origen_testers/smartest_based_tester/base.rb +576 -567
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +296 -291
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +207 -194
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +32 -32
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +69 -69
- data/lib/origen_testers/smartest_based_tester/base/processors.rb +16 -16
- data/lib/origen_testers/smartest_based_tester/base/processors/adjacent_if_combiner.rb +106 -106
- data/lib/origen_testers/smartest_based_tester/base/processors/continue_implementer.rb +39 -39
- data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +21 -21
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_run_flag_table.rb +33 -33
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_set_variables.rb +22 -22
- data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +188 -188
- data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +34 -34
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +178 -164
- data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +77 -73
- data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
- data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
- data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +208 -193
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -54
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
- data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
- data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
- data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
- data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +236 -214
- data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
- data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
- data/lib/origen_testers/test/basic_interface.rb +17 -17
- data/lib/origen_testers/test/block.rb +21 -21
- data/lib/origen_testers/test/custom_test_interface.rb +111 -111
- data/lib/origen_testers/test/dut.rb +295 -295
- data/lib/origen_testers/test/dut2.rb +76 -76
- data/lib/origen_testers/test/dut3.rb +244 -244
- data/lib/origen_testers/test/interface.rb +503 -503
- data/lib/origen_testers/test/nvm.rb +94 -94
- data/lib/origen_testers/timing.rb +368 -368
- data/lib/origen_testers/vector.rb +207 -207
- data/lib/origen_testers/vector_based_tester.rb +41 -41
- data/lib/origen_testers/vector_generator.rb +655 -655
- data/lib/origen_testers/vector_pipeline.rb +302 -302
- data/pattern/bitmap.rb +7 -7
- data/pattern/dc_instr.rb +7 -7
- data/pattern/delay.rb +7 -7
- data/pattern/freq_counter.rb +6 -6
- data/pattern/mem_test.rb +8 -8
- data/pattern/multi_vector.rb +122 -122
- data/pattern/multi_vector_plus1.rb +125 -125
- data/pattern/nvm/j750/add_late_pins.rb +3 -3
- data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
- data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
- data/pattern/nvm/j750/j750_halt.rb +159 -159
- data/pattern/nvm/j750/j750_workout.rb +209 -209
- data/pattern/nvm/j750/timing.rb +73 -73
- data/pattern/read_write_reg.rb +61 -61
- data/pattern/reset.rb +4 -4
- data/pattern/subroutines.rb +69 -69
- data/pattern/tester_overlay.rb +61 -52
- data/pattern/tester_store.rb +28 -28
- data/program/_additional_erase.rb +7 -7
- data/program/_efa_resources.rb +7 -7
- data/program/_erase.rb +25 -25
- data/program/_erase_vfy.rb +5 -5
- data/program/_iv_resources.rb +10 -10
- data/program/basic_interface.rb +5 -5
- data/program/components/_prb1_main.rb +222 -222
- data/program/components/_temp.rb +6 -6
- data/program/custom_tests.rb +10 -10
- data/program/flow_control.rb +422 -422
- data/program/prb1.rb +11 -11
- data/program/prb1_resources.rb +28 -28
- data/program/prb2.rb +27 -27
- data/program/test.rb +29 -29
- data/program/uflex_resources.rb +199 -199
- data/templates/example.txt.erb +53 -53
- data/templates/j750/program_sheet.txt.erb +9 -9
- data/templates/manifest/v93k.yaml.erb +22 -22
- data/templates/web/index.md.erb +51 -51
- data/templates/web/layouts/_basic.html.erb +15 -15
- data/templates/web/partials/_navbar.html.erb +22 -22
- data/templates/web/release_notes.md.erb +5 -5
- metadata +2 -2
|
@@ -1,207 +1,207 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
# A simple class to model a vector
|
|
3
|
-
class Vector
|
|
4
|
-
attr_accessor :repeat, :microcode, :timeset, :pin_vals,
|
|
5
|
-
:number, :cycle_number, :dont_compress,
|
|
6
|
-
:comments, :inline_comment, :cycle, :number, :contains_capture
|
|
7
|
-
|
|
8
|
-
def initialize(attrs = {})
|
|
9
|
-
@inline_comment = ''
|
|
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
|
-
# Returns the value (a string) that is assigned to the given pin by the
|
|
26
|
-
# given vector
|
|
27
|
-
#
|
|
28
|
-
# vector.pin_vals # => "1 1 XX10 H X1"
|
|
29
|
-
# vector.pin_value($dut.pins(:jtag)) # => "XX10"
|
|
30
|
-
def pin_value(pin)
|
|
31
|
-
$tester.regex_for_pin(pin).match(pin_vals)
|
|
32
|
-
Regexp.last_match(1)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Replace the current pin value assigned to the given pin with either the state
|
|
36
|
-
# that it currently has, or with a supplied string value.
|
|
37
|
-
#
|
|
38
|
-
# In the case of a string being supplied as the 2nd argument, the caller is
|
|
39
|
-
# responsible for ensuring that the pin state format/codes matches that used
|
|
40
|
-
# by the current tester.
|
|
41
|
-
#
|
|
42
|
-
# vector.pin_vals # => "1 1 XX10 H X1"
|
|
43
|
-
# $dut.pins(:jtag).drive(0)
|
|
44
|
-
# vector.set_pin_value($dut.pins(:jtag))
|
|
45
|
-
# vector.pin_vals # => "1 1 0000 H X1"
|
|
46
|
-
# vector.set_pin_value($dut.pins(:jtag), "XXXX")
|
|
47
|
-
# vector.pin_vals # => "1 1 XXXX H X1"
|
|
48
|
-
def set_pin_value(pin, value = nil)
|
|
49
|
-
regex = $tester.regex_for_pin_sub(pin)
|
|
50
|
-
value ||= pin.to_vector
|
|
51
|
-
if $tester.ordered_pins_cache.first == pin
|
|
52
|
-
self.pin_vals = pin_vals.sub(regex, value + '\2')
|
|
53
|
-
elsif $tester.ordered_pins_cache.last == pin
|
|
54
|
-
self.pin_vals = pin_vals.sub(regex, '\1' + value)
|
|
55
|
-
else
|
|
56
|
-
self.pin_vals = pin_vals.sub(regex, '\1' + value + '\3')
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Converts the vector to the period specified by the given timeset (instead of the period
|
|
61
|
-
# for the timeset it was originally created with).
|
|
62
|
-
#
|
|
63
|
-
# This may convert the single vector to multiple vectors, in which case the method will
|
|
64
|
-
# yield as many vectors as required back to the caller.
|
|
65
|
-
def convert_to_timeset(tset)
|
|
66
|
-
# If no conversion required
|
|
67
|
-
if tset.period_in_ns == timeset.period_in_ns
|
|
68
|
-
yield self
|
|
69
|
-
else
|
|
70
|
-
if tset.period_in_ns > timeset.period_in_ns
|
|
71
|
-
fail "Cannot convert a vector with timeset #{timeset.name} to timeset #{tset.name}!"
|
|
72
|
-
end
|
|
73
|
-
if timeset.period_in_ns % tset.period_in_ns != 0
|
|
74
|
-
fail "The period of timeset #{timeset.name} is not a multiple of the period of timeset #{tset.name}!"
|
|
75
|
-
end
|
|
76
|
-
if contains_capture
|
|
77
|
-
vector_modification_required = true
|
|
78
|
-
elsif $tester.timing_toggled_pins.empty?
|
|
79
|
-
vector_modification_required = false
|
|
80
|
-
else
|
|
81
|
-
# If the timing toggled pins are not driving on this vector, then no
|
|
82
|
-
# modification will be required
|
|
83
|
-
vector_modification_required = $tester.timing_toggled_pins.any? do |pin|
|
|
84
|
-
value = pin_value(pin)
|
|
85
|
-
value == '1' || value == '0'
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
number_of_base_vectors = repeat || 1
|
|
89
|
-
vectors_per_period = timeset.period_in_ns / tset.period_in_ns
|
|
90
|
-
self.inline_comment += "Period levelled (#{timeset.name})"
|
|
91
|
-
self.timeset = tset
|
|
92
|
-
if vector_modification_required && vectors_per_period > 1
|
|
93
|
-
pin_values = $tester.timing_toggled_pins.map do |pin|
|
|
94
|
-
on = pin_value(pin)
|
|
95
|
-
if on == '1'
|
|
96
|
-
{ pin: pin, on: '1', off: '0' }
|
|
97
|
-
elsif on == '0'
|
|
98
|
-
{ pin: pin, on: '0', off: '1' }
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
pin_vals_with_compare = nil
|
|
102
|
-
number_of_base_vectors.times do |i|
|
|
103
|
-
# Drive the 'on' value on the first cycle, this is already setup
|
|
104
|
-
v = dup
|
|
105
|
-
v.repeat = 1
|
|
106
|
-
v.pin_vals = inhibit_compares
|
|
107
|
-
$tester.remove_store_from_vector(v) if v.contains_capture
|
|
108
|
-
yield v
|
|
109
|
-
# Then drive the pin 'off' value for the remainder
|
|
110
|
-
v = dup
|
|
111
|
-
r = vectors_per_period - 1
|
|
112
|
-
if r > 1
|
|
113
|
-
v = dup
|
|
114
|
-
v.repeat = r - 1
|
|
115
|
-
pin_values.each { |vals| v.set_pin_value(vals[:pin], vals[:off]) if vals }
|
|
116
|
-
$tester.remove_store_from_vector(v) if v.contains_capture
|
|
117
|
-
yield v
|
|
118
|
-
end
|
|
119
|
-
v = dup
|
|
120
|
-
v.repeat = 1
|
|
121
|
-
v.pin_vals = restore_compares
|
|
122
|
-
pin_values.each { |vals| v.set_pin_value(vals[:pin], vals[:off]) if vals }
|
|
123
|
-
yield v
|
|
124
|
-
end
|
|
125
|
-
else
|
|
126
|
-
self.repeat = number_of_base_vectors * vectors_per_period
|
|
127
|
-
yield self
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Set all active compare data to X.
|
|
133
|
-
# The original values will be preserved so that they can be restored
|
|
134
|
-
# vector.pin_vals # => "1 1 LHLL 10001 L 1 XX 0"
|
|
135
|
-
# vector.inhibit_compares # => "1 1 XXXX 10001 X 1 XX 0"
|
|
136
|
-
# vector.restore_compares # => "1 1 LHLL 10001 L 1 XX 0"
|
|
137
|
-
def inhibit_compares
|
|
138
|
-
@orig_pin_vals = pin_vals
|
|
139
|
-
@pin_vals = pin_vals.gsub(/H|L/, 'X')
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
# @see Vector#inhibit_compares
|
|
143
|
-
def restore_compares
|
|
144
|
-
@pin_vals = @orig_pin_vals
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
# Updates the pin values to reflect the value currently held by the given pin
|
|
148
|
-
def update_pin_val(pin)
|
|
149
|
-
vals = pin_vals.split(' ')
|
|
150
|
-
if pin.belongs_to_a_pin_group? && !pin.is_a?(Origen::Pins::PinCollection)
|
|
151
|
-
port = nil
|
|
152
|
-
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
|
|
153
|
-
if port
|
|
154
|
-
ix = Origen.tester.ordered_pins.index(port) # find index of port
|
|
155
|
-
i = port.index(pin)
|
|
156
|
-
else
|
|
157
|
-
ix = Origen.tester.ordered_pins.index(pin)
|
|
158
|
-
i = 0
|
|
159
|
-
end
|
|
160
|
-
else
|
|
161
|
-
ix = Origen.tester.ordered_pins.index(pin)
|
|
162
|
-
i = 0
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
if Origen.pin_bank.pin_groups.keys.include? pin.id
|
|
166
|
-
val = pin.map { |p| Origen.tester.format_pin_state(p) }.join('')
|
|
167
|
-
vals[ix] = val
|
|
168
|
-
else
|
|
169
|
-
val = Origen.tester.format_pin_state(pin)
|
|
170
|
-
vals[ix][i] = val
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
self.pin_vals = vals.join(' ')
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def ordered_pins
|
|
177
|
-
Origen.app.pin_map.sort_by { |id, pin| pin.order }.map { |id, pin| pin }
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def microcode=(val)
|
|
181
|
-
if val && has_microcode? && @microcode != val
|
|
182
|
-
fail "Trying to assign microcode: #{val}, but vector already has microcode: #{@microcode}"
|
|
183
|
-
else
|
|
184
|
-
@microcode = val
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
# Since repeat 0 is non-intuitive every vector implicitly has a repeat of 1
|
|
189
|
-
def repeat
|
|
190
|
-
@repeat || 1
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def has_microcode?
|
|
194
|
-
!!(@microcode && !@microcode.empty?)
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def ==(obj)
|
|
198
|
-
if obj.is_a?(Vector)
|
|
199
|
-
self.has_microcode? == obj.has_microcode? &&
|
|
200
|
-
timeset == obj.timeset &&
|
|
201
|
-
pin_vals == obj.pin_vals
|
|
202
|
-
else
|
|
203
|
-
super obj
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
# A simple class to model a vector
|
|
3
|
+
class Vector
|
|
4
|
+
attr_accessor :repeat, :microcode, :timeset, :pin_vals,
|
|
5
|
+
:number, :cycle_number, :dont_compress,
|
|
6
|
+
:comments, :inline_comment, :cycle, :number, :contains_capture
|
|
7
|
+
|
|
8
|
+
def initialize(attrs = {})
|
|
9
|
+
@inline_comment = ''
|
|
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
|
+
# Returns the value (a string) that is assigned to the given pin by the
|
|
26
|
+
# given vector
|
|
27
|
+
#
|
|
28
|
+
# vector.pin_vals # => "1 1 XX10 H X1"
|
|
29
|
+
# vector.pin_value($dut.pins(:jtag)) # => "XX10"
|
|
30
|
+
def pin_value(pin)
|
|
31
|
+
$tester.regex_for_pin(pin).match(pin_vals)
|
|
32
|
+
Regexp.last_match(1)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Replace the current pin value assigned to the given pin with either the state
|
|
36
|
+
# that it currently has, or with a supplied string value.
|
|
37
|
+
#
|
|
38
|
+
# In the case of a string being supplied as the 2nd argument, the caller is
|
|
39
|
+
# responsible for ensuring that the pin state format/codes matches that used
|
|
40
|
+
# by the current tester.
|
|
41
|
+
#
|
|
42
|
+
# vector.pin_vals # => "1 1 XX10 H X1"
|
|
43
|
+
# $dut.pins(:jtag).drive(0)
|
|
44
|
+
# vector.set_pin_value($dut.pins(:jtag))
|
|
45
|
+
# vector.pin_vals # => "1 1 0000 H X1"
|
|
46
|
+
# vector.set_pin_value($dut.pins(:jtag), "XXXX")
|
|
47
|
+
# vector.pin_vals # => "1 1 XXXX H X1"
|
|
48
|
+
def set_pin_value(pin, value = nil)
|
|
49
|
+
regex = $tester.regex_for_pin_sub(pin)
|
|
50
|
+
value ||= pin.to_vector
|
|
51
|
+
if $tester.ordered_pins_cache.first == pin
|
|
52
|
+
self.pin_vals = pin_vals.sub(regex, value + '\2')
|
|
53
|
+
elsif $tester.ordered_pins_cache.last == pin
|
|
54
|
+
self.pin_vals = pin_vals.sub(regex, '\1' + value)
|
|
55
|
+
else
|
|
56
|
+
self.pin_vals = pin_vals.sub(regex, '\1' + value + '\3')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Converts the vector to the period specified by the given timeset (instead of the period
|
|
61
|
+
# for the timeset it was originally created with).
|
|
62
|
+
#
|
|
63
|
+
# This may convert the single vector to multiple vectors, in which case the method will
|
|
64
|
+
# yield as many vectors as required back to the caller.
|
|
65
|
+
def convert_to_timeset(tset)
|
|
66
|
+
# If no conversion required
|
|
67
|
+
if tset.period_in_ns == timeset.period_in_ns
|
|
68
|
+
yield self
|
|
69
|
+
else
|
|
70
|
+
if tset.period_in_ns > timeset.period_in_ns
|
|
71
|
+
fail "Cannot convert a vector with timeset #{timeset.name} to timeset #{tset.name}!"
|
|
72
|
+
end
|
|
73
|
+
if timeset.period_in_ns % tset.period_in_ns != 0
|
|
74
|
+
fail "The period of timeset #{timeset.name} is not a multiple of the period of timeset #{tset.name}!"
|
|
75
|
+
end
|
|
76
|
+
if contains_capture
|
|
77
|
+
vector_modification_required = true
|
|
78
|
+
elsif $tester.timing_toggled_pins.empty?
|
|
79
|
+
vector_modification_required = false
|
|
80
|
+
else
|
|
81
|
+
# If the timing toggled pins are not driving on this vector, then no
|
|
82
|
+
# modification will be required
|
|
83
|
+
vector_modification_required = $tester.timing_toggled_pins.any? do |pin|
|
|
84
|
+
value = pin_value(pin)
|
|
85
|
+
value == '1' || value == '0'
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
number_of_base_vectors = repeat || 1
|
|
89
|
+
vectors_per_period = timeset.period_in_ns / tset.period_in_ns
|
|
90
|
+
self.inline_comment += "Period levelled (#{timeset.name})"
|
|
91
|
+
self.timeset = tset
|
|
92
|
+
if vector_modification_required && vectors_per_period > 1
|
|
93
|
+
pin_values = $tester.timing_toggled_pins.map do |pin|
|
|
94
|
+
on = pin_value(pin)
|
|
95
|
+
if on == '1'
|
|
96
|
+
{ pin: pin, on: '1', off: '0' }
|
|
97
|
+
elsif on == '0'
|
|
98
|
+
{ pin: pin, on: '0', off: '1' }
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
pin_vals_with_compare = nil
|
|
102
|
+
number_of_base_vectors.times do |i|
|
|
103
|
+
# Drive the 'on' value on the first cycle, this is already setup
|
|
104
|
+
v = dup
|
|
105
|
+
v.repeat = 1
|
|
106
|
+
v.pin_vals = inhibit_compares
|
|
107
|
+
$tester.remove_store_from_vector(v) if v.contains_capture
|
|
108
|
+
yield v
|
|
109
|
+
# Then drive the pin 'off' value for the remainder
|
|
110
|
+
v = dup
|
|
111
|
+
r = vectors_per_period - 1
|
|
112
|
+
if r > 1
|
|
113
|
+
v = dup
|
|
114
|
+
v.repeat = r - 1
|
|
115
|
+
pin_values.each { |vals| v.set_pin_value(vals[:pin], vals[:off]) if vals }
|
|
116
|
+
$tester.remove_store_from_vector(v) if v.contains_capture
|
|
117
|
+
yield v
|
|
118
|
+
end
|
|
119
|
+
v = dup
|
|
120
|
+
v.repeat = 1
|
|
121
|
+
v.pin_vals = restore_compares
|
|
122
|
+
pin_values.each { |vals| v.set_pin_value(vals[:pin], vals[:off]) if vals }
|
|
123
|
+
yield v
|
|
124
|
+
end
|
|
125
|
+
else
|
|
126
|
+
self.repeat = number_of_base_vectors * vectors_per_period
|
|
127
|
+
yield self
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Set all active compare data to X.
|
|
133
|
+
# The original values will be preserved so that they can be restored
|
|
134
|
+
# vector.pin_vals # => "1 1 LHLL 10001 L 1 XX 0"
|
|
135
|
+
# vector.inhibit_compares # => "1 1 XXXX 10001 X 1 XX 0"
|
|
136
|
+
# vector.restore_compares # => "1 1 LHLL 10001 L 1 XX 0"
|
|
137
|
+
def inhibit_compares
|
|
138
|
+
@orig_pin_vals = pin_vals
|
|
139
|
+
@pin_vals = pin_vals.gsub(/H|L/, 'X')
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# @see Vector#inhibit_compares
|
|
143
|
+
def restore_compares
|
|
144
|
+
@pin_vals = @orig_pin_vals
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Updates the pin values to reflect the value currently held by the given pin
|
|
148
|
+
def update_pin_val(pin)
|
|
149
|
+
vals = pin_vals.split(' ')
|
|
150
|
+
if pin.belongs_to_a_pin_group? && !pin.is_a?(Origen::Pins::PinCollection)
|
|
151
|
+
port = nil
|
|
152
|
+
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
|
|
153
|
+
if port
|
|
154
|
+
ix = Origen.tester.ordered_pins.index(port) # find index of port
|
|
155
|
+
i = port.index(pin)
|
|
156
|
+
else
|
|
157
|
+
ix = Origen.tester.ordered_pins.index(pin)
|
|
158
|
+
i = 0
|
|
159
|
+
end
|
|
160
|
+
else
|
|
161
|
+
ix = Origen.tester.ordered_pins.index(pin)
|
|
162
|
+
i = 0
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
if Origen.pin_bank.pin_groups.keys.include? pin.id
|
|
166
|
+
val = pin.map { |p| Origen.tester.format_pin_state(p) }.join('')
|
|
167
|
+
vals[ix] = val
|
|
168
|
+
else
|
|
169
|
+
val = Origen.tester.format_pin_state(pin)
|
|
170
|
+
vals[ix][i] = val
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
self.pin_vals = vals.join(' ')
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def ordered_pins
|
|
177
|
+
Origen.app.pin_map.sort_by { |id, pin| pin.order }.map { |id, pin| pin }
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def microcode=(val)
|
|
181
|
+
if val && has_microcode? && @microcode != val
|
|
182
|
+
fail "Trying to assign microcode: #{val}, but vector already has microcode: #{@microcode}"
|
|
183
|
+
else
|
|
184
|
+
@microcode = val
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Since repeat 0 is non-intuitive every vector implicitly has a repeat of 1
|
|
189
|
+
def repeat
|
|
190
|
+
@repeat || 1
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def has_microcode?
|
|
194
|
+
!!(@microcode && !@microcode.empty?)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def ==(obj)
|
|
198
|
+
if obj.is_a?(Vector)
|
|
199
|
+
self.has_microcode? == obj.has_microcode? &&
|
|
200
|
+
timeset == obj.timeset &&
|
|
201
|
+
pin_vals == obj.pin_vals
|
|
202
|
+
else
|
|
203
|
+
super obj
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
module OrigenTesters
|
|
3
|
-
# Including this module in a class gives it all the basics required
|
|
4
|
-
# to generator vector-based test patterns
|
|
5
|
-
module VectorBasedTester
|
|
6
|
-
extend ActiveSupport::Concern
|
|
7
|
-
|
|
8
|
-
require 'origen_testers/vector_generator'
|
|
9
|
-
require 'origen_testers/timing'
|
|
10
|
-
require 'origen_testers/api'
|
|
11
|
-
|
|
12
|
-
included do
|
|
13
|
-
include VectorGenerator
|
|
14
|
-
include Timing
|
|
15
|
-
include API
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
module ClassMethods # :nodoc:
|
|
19
|
-
# This overrides the new method of any class which includes this
|
|
20
|
-
# module to force the newly created instance to be registered as
|
|
21
|
-
# a tester with Origen
|
|
22
|
-
def new(*args, &block) # :nodoc:
|
|
23
|
-
if Origen.app.with_doc_tester?
|
|
24
|
-
x = OrigenTesters::Doc.allocate
|
|
25
|
-
if Origen.app.with_html_doc_tester?
|
|
26
|
-
x.html_mode = true
|
|
27
|
-
end
|
|
28
|
-
else
|
|
29
|
-
x = allocate
|
|
30
|
-
end
|
|
31
|
-
x.send(:initialize, *args, &block)
|
|
32
|
-
x.register_tester
|
|
33
|
-
x
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def register_tester # :nodoc:
|
|
38
|
-
Origen.app.tester = self
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
module OrigenTesters
|
|
3
|
+
# Including this module in a class gives it all the basics required
|
|
4
|
+
# to generator vector-based test patterns
|
|
5
|
+
module VectorBasedTester
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
require 'origen_testers/vector_generator'
|
|
9
|
+
require 'origen_testers/timing'
|
|
10
|
+
require 'origen_testers/api'
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
include VectorGenerator
|
|
14
|
+
include Timing
|
|
15
|
+
include API
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module ClassMethods # :nodoc:
|
|
19
|
+
# This overrides the new method of any class which includes this
|
|
20
|
+
# module to force the newly created instance to be registered as
|
|
21
|
+
# a tester with Origen
|
|
22
|
+
def new(*args, &block) # :nodoc:
|
|
23
|
+
if Origen.app.with_doc_tester?
|
|
24
|
+
x = OrigenTesters::Doc.allocate
|
|
25
|
+
if Origen.app.with_html_doc_tester?
|
|
26
|
+
x.html_mode = true
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
x = allocate
|
|
30
|
+
end
|
|
31
|
+
x.send(:initialize, *args, &block)
|
|
32
|
+
x.register_tester
|
|
33
|
+
x
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def register_tester # :nodoc:
|
|
38
|
+
Origen.app.tester = self
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|