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,37 +1,37 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class TestInstances
|
|
5
|
-
# Custom Test Instance library
|
|
6
|
-
class CustomTil
|
|
7
|
-
# Returns the test_instances object for the current flow
|
|
8
|
-
attr_reader :test_instances
|
|
9
|
-
attr_reader :definitions
|
|
10
|
-
|
|
11
|
-
def initialize(test_instances, definitions)
|
|
12
|
-
@test_instances = test_instances
|
|
13
|
-
@definitions = definitions
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def method_missing(method, *args, &block)
|
|
17
|
-
if definitions[method]
|
|
18
|
-
name = args.shift
|
|
19
|
-
ti = platform::CustomTestInstance.new name, methods: definitions[method].dup,
|
|
20
|
-
attrs: (args.first || {}),
|
|
21
|
-
type: method,
|
|
22
|
-
library: self
|
|
23
|
-
test_instances.add(nil, ti)
|
|
24
|
-
ti
|
|
25
|
-
else
|
|
26
|
-
super
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def platform
|
|
31
|
-
test_instances.platform
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestInstances
|
|
5
|
+
# Custom Test Instance library
|
|
6
|
+
class CustomTil
|
|
7
|
+
# Returns the test_instances object for the current flow
|
|
8
|
+
attr_reader :test_instances
|
|
9
|
+
attr_reader :definitions
|
|
10
|
+
|
|
11
|
+
def initialize(test_instances, definitions)
|
|
12
|
+
@test_instances = test_instances
|
|
13
|
+
@definitions = definitions
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def method_missing(method, *args, &block)
|
|
17
|
+
if definitions[method]
|
|
18
|
+
name = args.shift
|
|
19
|
+
ti = platform::CustomTestInstance.new name, methods: definitions[method].dup,
|
|
20
|
+
attrs: (args.first || {}),
|
|
21
|
+
type: method,
|
|
22
|
+
library: self
|
|
23
|
+
test_instances.add(nil, ti)
|
|
24
|
+
ti
|
|
25
|
+
else
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def platform
|
|
31
|
+
test_instances.platform
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Timeset
|
|
5
|
-
attr_accessor :master_ts, :t_mode # Timeset information
|
|
6
|
-
attr_accessor :pins
|
|
7
|
-
attr_accessor :name
|
|
8
|
-
|
|
9
|
-
# Specify timeset information by providing a pin and its associated edge timing
|
|
10
|
-
def initialize(name, pin, edge, attrs = {}) # :nodoc:
|
|
11
|
-
attrs = {
|
|
12
|
-
master_ts: '', # master timeset name
|
|
13
|
-
t_mode: '' # timing mode (possibly ATE-specific)
|
|
14
|
-
}.merge(attrs)
|
|
15
|
-
@master_ts = attrs[:master_ts]
|
|
16
|
-
@t_mode = attrs[:t_mode]
|
|
17
|
-
@pins = { pin => edge }
|
|
18
|
-
self.name = name
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Assigns a timing edge object to the given pin for this timeset
|
|
22
|
-
def add_edge(pin, edge)
|
|
23
|
-
if @pins.key?(pin)
|
|
24
|
-
Origen.log.error "Pin #{pin} already exists in timeset"
|
|
25
|
-
fail
|
|
26
|
-
else
|
|
27
|
-
@pins[pin] = edge
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def platform
|
|
32
|
-
Origen.interface.platform
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Timeset
|
|
5
|
+
attr_accessor :master_ts, :t_mode # Timeset information
|
|
6
|
+
attr_accessor :pins
|
|
7
|
+
attr_accessor :name
|
|
8
|
+
|
|
9
|
+
# Specify timeset information by providing a pin and its associated edge timing
|
|
10
|
+
def initialize(name, pin, edge, attrs = {}) # :nodoc:
|
|
11
|
+
attrs = {
|
|
12
|
+
master_ts: '', # master timeset name
|
|
13
|
+
t_mode: '' # timing mode (possibly ATE-specific)
|
|
14
|
+
}.merge(attrs)
|
|
15
|
+
@master_ts = attrs[:master_ts]
|
|
16
|
+
@t_mode = attrs[:t_mode]
|
|
17
|
+
@pins = { pin => edge }
|
|
18
|
+
self.name = name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Assigns a timing edge object to the given pin for this timeset
|
|
22
|
+
def add_edge(pin, edge)
|
|
23
|
+
if @pins.key?(pin)
|
|
24
|
+
Origen.log.error "Pin #{pin} already exists in timeset"
|
|
25
|
+
fail
|
|
26
|
+
else
|
|
27
|
+
@pins[pin] = edge
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def platform
|
|
32
|
+
Origen.interface.platform
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Timesets
|
|
5
|
-
include ::OrigenTesters::Generator
|
|
6
|
-
|
|
7
|
-
attr_accessor :ts
|
|
8
|
-
attr_accessor :ts_sheet_pins
|
|
9
|
-
attr_accessor :ts_basic
|
|
10
|
-
|
|
11
|
-
OUTPUT_PREFIX = 'TS'
|
|
12
|
-
# OUTPUT_POSTFIX = 'TS'
|
|
13
|
-
|
|
14
|
-
def initialize(options = {}) # :nodoc:
|
|
15
|
-
@ts = {}
|
|
16
|
-
@ts_basic = options[:timeset_basic]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def add(tsname, pin, esname, options = {})
|
|
20
|
-
tsname = tsname.to_sym unless tsname.is_a? Symbol
|
|
21
|
-
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
-
esname = pin.to_sym unless esname.is_a? Symbol
|
|
23
|
-
@ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
|
|
24
|
-
@ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
|
|
25
|
-
@ts[tsname]
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def finalize(options = {})
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Populate an array of pins based on the pin or pingroup
|
|
32
|
-
def get_pin_objects(grp)
|
|
33
|
-
pins = []
|
|
34
|
-
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
35
|
-
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
36
|
-
pins << Origen.top_level.pin(grp)
|
|
37
|
-
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
38
|
-
Origen.top_level.pin(grp).each do |pin|
|
|
39
|
-
pins << pin
|
|
40
|
-
end
|
|
41
|
-
else
|
|
42
|
-
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
43
|
-
end
|
|
44
|
-
pins
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Timesets
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
attr_accessor :ts
|
|
8
|
+
attr_accessor :ts_sheet_pins
|
|
9
|
+
attr_accessor :ts_basic
|
|
10
|
+
|
|
11
|
+
OUTPUT_PREFIX = 'TS'
|
|
12
|
+
# OUTPUT_POSTFIX = 'TS'
|
|
13
|
+
|
|
14
|
+
def initialize(options = {}) # :nodoc:
|
|
15
|
+
@ts = {}
|
|
16
|
+
@ts_basic = options[:timeset_basic]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(tsname, pin, esname, options = {})
|
|
20
|
+
tsname = tsname.to_sym unless tsname.is_a? Symbol
|
|
21
|
+
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
+
esname = pin.to_sym unless esname.is_a? Symbol
|
|
23
|
+
@ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
|
|
24
|
+
@ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
|
|
25
|
+
@ts[tsname]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def finalize(options = {})
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Populate an array of pins based on the pin or pingroup
|
|
32
|
+
def get_pin_objects(grp)
|
|
33
|
+
pins = []
|
|
34
|
+
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
35
|
+
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
36
|
+
pins << Origen.top_level.pin(grp)
|
|
37
|
+
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
38
|
+
Origen.top_level.pin(grp).each do |pin|
|
|
39
|
+
pins << pin
|
|
40
|
+
end
|
|
41
|
+
else
|
|
42
|
+
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
43
|
+
end
|
|
44
|
+
pins
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class TimesetsBasic
|
|
5
|
-
include ::OrigenTesters::Generator
|
|
6
|
-
|
|
7
|
-
attr_accessor :ts
|
|
8
|
-
attr_accessor :ts_sheet_pins
|
|
9
|
-
attr_accessor :ts_basic
|
|
10
|
-
|
|
11
|
-
OUTPUT_PREFIX = 'TSB'
|
|
12
|
-
# OUTPUT_POSTFIX = 'TS'
|
|
13
|
-
|
|
14
|
-
def initialize(options = {}) # :nodoc:
|
|
15
|
-
@ts = {}
|
|
16
|
-
@ts_basic = options[:timeset_basic]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def add(tsname, pin, esname, options = {})
|
|
20
|
-
tsname = tsname.to_sym unless tsname.is_a? Symbol
|
|
21
|
-
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
-
esname = pin.to_sym unless esname.is_a? Symbol
|
|
23
|
-
@ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
|
|
24
|
-
@ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
|
|
25
|
-
@ts[tsname]
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def finalize(options = {})
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Populate an array of pins based on the pin or pingroup
|
|
32
|
-
def get_pin_objects(grp)
|
|
33
|
-
pins = []
|
|
34
|
-
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
35
|
-
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
36
|
-
pins << Origen.top_level.pin(grp)
|
|
37
|
-
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
38
|
-
Origen.top_level.pin(grp).each do |pin|
|
|
39
|
-
pins << pin
|
|
40
|
-
end
|
|
41
|
-
else
|
|
42
|
-
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
43
|
-
end
|
|
44
|
-
pins
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TimesetsBasic
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
attr_accessor :ts
|
|
8
|
+
attr_accessor :ts_sheet_pins
|
|
9
|
+
attr_accessor :ts_basic
|
|
10
|
+
|
|
11
|
+
OUTPUT_PREFIX = 'TSB'
|
|
12
|
+
# OUTPUT_POSTFIX = 'TS'
|
|
13
|
+
|
|
14
|
+
def initialize(options = {}) # :nodoc:
|
|
15
|
+
@ts = {}
|
|
16
|
+
@ts_basic = options[:timeset_basic]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(tsname, pin, esname, options = {})
|
|
20
|
+
tsname = tsname.to_sym unless tsname.is_a? Symbol
|
|
21
|
+
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
+
esname = pin.to_sym unless esname.is_a? Symbol
|
|
23
|
+
@ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
|
|
24
|
+
@ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
|
|
25
|
+
@ts[tsname]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def finalize(options = {})
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Populate an array of pins based on the pin or pingroup
|
|
32
|
+
def get_pin_objects(grp)
|
|
33
|
+
pins = []
|
|
34
|
+
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
35
|
+
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
36
|
+
pins << Origen.top_level.pin(grp)
|
|
37
|
+
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
38
|
+
Origen.top_level.pin(grp).each do |pin|
|
|
39
|
+
pins << pin
|
|
40
|
+
end
|
|
41
|
+
else
|
|
42
|
+
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
43
|
+
end
|
|
44
|
+
pins
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
# Methods for handling all J750 file parsing, e.g. datalogs,
|
|
4
|
-
# test time profiles, etc.
|
|
5
|
-
module Files
|
|
6
|
-
# Reads all lines from a J750 detailed execution time file, returning the lines
|
|
7
|
-
# as an array like this:
|
|
8
|
-
#
|
|
9
|
-
# [
|
|
10
|
-
# {:name => "power_cycle", :index => 1, :group => 3, :time => 0.00461},
|
|
11
|
-
# {:name => "power_cycle", :index => 2, :group => 3, :time => 0.00481},
|
|
12
|
-
# {:name => "power_cycle", :index => 3, :group => 3, :time => 0.00438},
|
|
13
|
-
# {:name => "nvm_mass_erase", :index => nil, :group => nil, :time => 0.19863},
|
|
14
|
-
# ]
|
|
15
|
-
def read_test_times(file, options = {})
|
|
16
|
-
tests = []
|
|
17
|
-
File.readlines(file).each do |line|
|
|
18
|
-
unless line.strip.empty? || line =~ /Entire Job/
|
|
19
|
-
# http://rubular.com/r/vZOcqovTsf
|
|
20
|
-
if line =~ /(\w+) ?(\(.*?\))? \d\d\d\d (\d+\.\d+).*/
|
|
21
|
-
t = { name: Regexp.last_match[1], time: Regexp.last_match[3].to_f.round(6) }
|
|
22
|
-
# If an indexed test
|
|
23
|
-
if Regexp.last_match[2]
|
|
24
|
-
str = Regexp.last_match[2].gsub('(', '').gsub(')', '')
|
|
25
|
-
fields = str.split('/')
|
|
26
|
-
i = fields[0].to_i
|
|
27
|
-
g = fields[1].to_i
|
|
28
|
-
t[:index] = i
|
|
29
|
-
t[:group] = g
|
|
30
|
-
|
|
31
|
-
else
|
|
32
|
-
t[:index] = nil
|
|
33
|
-
t[:group] = nil
|
|
34
|
-
end
|
|
35
|
-
tests << t
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
tests
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
# Methods for handling all J750 file parsing, e.g. datalogs,
|
|
4
|
+
# test time profiles, etc.
|
|
5
|
+
module Files
|
|
6
|
+
# Reads all lines from a J750 detailed execution time file, returning the lines
|
|
7
|
+
# as an array like this:
|
|
8
|
+
#
|
|
9
|
+
# [
|
|
10
|
+
# {:name => "power_cycle", :index => 1, :group => 3, :time => 0.00461},
|
|
11
|
+
# {:name => "power_cycle", :index => 2, :group => 3, :time => 0.00481},
|
|
12
|
+
# {:name => "power_cycle", :index => 3, :group => 3, :time => 0.00438},
|
|
13
|
+
# {:name => "nvm_mass_erase", :index => nil, :group => nil, :time => 0.19863},
|
|
14
|
+
# ]
|
|
15
|
+
def read_test_times(file, options = {})
|
|
16
|
+
tests = []
|
|
17
|
+
File.readlines(file).each do |line|
|
|
18
|
+
unless line.strip.empty? || line =~ /Entire Job/
|
|
19
|
+
# http://rubular.com/r/vZOcqovTsf
|
|
20
|
+
if line =~ /(\w+) ?(\(.*?\))? \d\d\d\d (\d+\.\d+).*/
|
|
21
|
+
t = { name: Regexp.last_match[1], time: Regexp.last_match[3].to_f.round(6) }
|
|
22
|
+
# If an indexed test
|
|
23
|
+
if Regexp.last_match[2]
|
|
24
|
+
str = Regexp.last_match[2].gsub('(', '').gsub(')', '')
|
|
25
|
+
fields = str.split('/')
|
|
26
|
+
i = fields[0].to_i
|
|
27
|
+
g = fields[1].to_i
|
|
28
|
+
t[:index] = i
|
|
29
|
+
t[:group] = g
|
|
30
|
+
|
|
31
|
+
else
|
|
32
|
+
t[:index] = nil
|
|
33
|
+
t[:group] = nil
|
|
34
|
+
end
|
|
35
|
+
tests << t
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
tests
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -1,269 +1,269 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
# Tester model to generate .atp patterns for the Teradyne J750
|
|
4
|
-
#
|
|
5
|
-
# == Basic Usage
|
|
6
|
-
# $tester = Testers::J750.new
|
|
7
|
-
# $tester.cycle # Generate a vector
|
|
8
|
-
#
|
|
9
|
-
# Many more methods exist to generate J750 specific micro-code, see below for
|
|
10
|
-
# details.
|
|
11
|
-
#
|
|
12
|
-
# Also note that this class inherits from the base Tester class and so all methods
|
|
13
|
-
# described there are also available.
|
|
14
|
-
class J750 < Base
|
|
15
|
-
require 'origen_testers/igxl_based_tester/j750/generator.rb'
|
|
16
|
-
|
|
17
|
-
attr_accessor :use_hv_pin
|
|
18
|
-
attr_accessor :software_version
|
|
19
|
-
|
|
20
|
-
def self.hpt_mode
|
|
21
|
-
@@hpt_mode
|
|
22
|
-
end
|
|
23
|
-
def self.hpt_mode?
|
|
24
|
-
@@hpt_mode
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Returns a new J750 instance, normally there would only ever be one of these
|
|
28
|
-
# assigned to the global variable such as $tester by your target.
|
|
29
|
-
def initialize
|
|
30
|
-
super
|
|
31
|
-
@pipeline_depth = 34 # for extended mode is vectors, for normal mode is vector pairs (54 for J750Ex)
|
|
32
|
-
@use_hv_pin = false # allows to use high voltage for a pin for all patterns
|
|
33
|
-
@software_version = '3.50.40'
|
|
34
|
-
@name = 'j750'
|
|
35
|
-
@@hpt_mode = false
|
|
36
|
-
@opcode_mode = :extended
|
|
37
|
-
@loop_bits_max = 16 # maximum loop bit length
|
|
38
|
-
|
|
39
|
-
@flags = %w(cpuA cpuB cpuC cpuD)
|
|
40
|
-
@microcode[:enable] = 'enable'
|
|
41
|
-
@microcode[:set_flag] = 'set_cpu'
|
|
42
|
-
@microcode[:mask_vector] = 'ign ifc icc'
|
|
43
|
-
@microcode[:keepalive] = 'keep_alive'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def pattern_header(options = {})
|
|
47
|
-
super(options) do |pin_list|
|
|
48
|
-
microcode "vector ($tset, #{pin_list})"
|
|
49
|
-
microcode '{'
|
|
50
|
-
unless options[:subroutine_pat]
|
|
51
|
-
microcode 'start_label pattern_st:'
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def pattern_footer(options = {})
|
|
57
|
-
super(options)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Generates a match loop based on vector condition passed in via block
|
|
61
|
-
#
|
|
62
|
-
# This method is not really intended to be called directly, rather you should call
|
|
63
|
-
# via Tester#wait:
|
|
64
|
-
# e.g. $tester.wait(:match => true) do
|
|
65
|
-
# reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
|
|
66
|
-
# end
|
|
67
|
-
#
|
|
68
|
-
# The timeout should be provided in cycles, however when called via the wait method the
|
|
69
|
-
# time-based helpers (time_in_us, etc) will be converted to cycles for you.
|
|
70
|
-
#
|
|
71
|
-
# The following options are available to tailor the match loop behavior, defaults in
|
|
72
|
-
# parenthesis:
|
|
73
|
-
# * :check_for_fails (false) - Flushes the pipeline and handshakes with the tester (passing readcode 100) prior to the match (to allow binout of fails encountered before the match)
|
|
74
|
-
# * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
|
|
75
|
-
# * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
|
|
76
|
-
# * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop.
|
|
77
|
-
# A hash will also be accepted for this argument to supply a specific label (or no label) for each block e.g. {0 => "on_block_0_fail"}
|
|
78
|
-
# * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
|
|
79
|
-
# * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
|
|
80
|
-
# * :global_loops (false) - whether match loop loops should use global labels
|
|
81
|
-
# * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
|
|
82
|
-
# at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
|
|
83
|
-
# ==== Examples
|
|
84
|
-
# $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
|
|
85
|
-
# <vectors>
|
|
86
|
-
# end
|
|
87
|
-
def match_block(timeout, options = {}, &block)
|
|
88
|
-
options = {
|
|
89
|
-
check_for_fails: false,
|
|
90
|
-
on_timeout_goto: false,
|
|
91
|
-
on_block_match_goto: false,
|
|
92
|
-
multiple_entries: false,
|
|
93
|
-
force_fail_on_timeout: true,
|
|
94
|
-
global_loops: false,
|
|
95
|
-
manual_stop: false,
|
|
96
|
-
clr_fail_post_match: false
|
|
97
|
-
}.merge(options)
|
|
98
|
-
|
|
99
|
-
unless block_given?
|
|
100
|
-
fail 'ERROR: block not passed to match_block!'
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Create BlockArgs objects in order to receive multiple blocks
|
|
104
|
-
match_conditions = Origen::Utility::BlockArgs.new
|
|
105
|
-
fail_conditions = Origen::Utility::BlockArgs.new
|
|
106
|
-
|
|
107
|
-
# yield object to calling routine to get populated with blocks
|
|
108
|
-
if block.arity > 0
|
|
109
|
-
yield match_conditions, fail_conditions
|
|
110
|
-
else
|
|
111
|
-
# for backwards compatibility with Origen core call to match_block
|
|
112
|
-
match_conditions.add(&block)
|
|
113
|
-
fail_conditions.add(&block)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Flush the pipeline first and then pass control to the program to bin out any failures
|
|
117
|
-
# prior to entering the match loop
|
|
118
|
-
if options[:check_for_fails]
|
|
119
|
-
if options[:multiple_entries]
|
|
120
|
-
@match_entries.times do |i|
|
|
121
|
-
microcode "global subr match_done_#{i}:"
|
|
122
|
-
set_code(i + 100)
|
|
123
|
-
cycle(microcode: 'jump call_tester') unless i == @match_entries - 1
|
|
124
|
-
end
|
|
125
|
-
microcode 'call_tester:'
|
|
126
|
-
else
|
|
127
|
-
set_code(100)
|
|
128
|
-
end
|
|
129
|
-
cc 'Wait for any prior failures to propagate through the pipeline'
|
|
130
|
-
cycle(microcode: 'pipe_minus 1')
|
|
131
|
-
cc 'Now handshake with the tester to bin out and parts that have failed before they got here'
|
|
132
|
-
handshake(manual_stop: options[:manual_stop])
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Now do the main match loop
|
|
136
|
-
cc 'Start the match loop'
|
|
137
|
-
|
|
138
|
-
global_opt = (options[:global_loops]) ? 'global ' : ''
|
|
139
|
-
microcode "#{global_opt}match_outer_loop_#{@unique_counter}:"
|
|
140
|
-
cycle # (:microcode => "loopB #{outer_loop_count} ign ifc icc")
|
|
141
|
-
set_loopb_vector = last_vector
|
|
142
|
-
|
|
143
|
-
microcode "#{global_opt}match_inner_loop_#{@unique_counter}:"
|
|
144
|
-
cycle # (:microcode => "loopA #{inner_loop_count} ign ifc icc")
|
|
145
|
-
set_loopa_vector = last_vector
|
|
146
|
-
|
|
147
|
-
# count cycles in match loop block passed to help with meeting
|
|
148
|
-
# desired timeout value (have to back assign microcodes above)
|
|
149
|
-
prematch_cycle_count = cycle_count
|
|
150
|
-
match_conditions.each_with_index do |condition, i|
|
|
151
|
-
mask_fails(true)
|
|
152
|
-
condition.call # match condition
|
|
153
|
-
mask_fails(false)
|
|
154
|
-
cc ' Wait for the result to propagate through the pipeline'
|
|
155
|
-
cycle(microcode: 'pipe_minus 1 ign ifc icc')
|
|
156
|
-
inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
|
|
157
|
-
cc "Branch if block condition #{i} met"
|
|
158
|
-
cycle(microcode: "if (pass) jump block_#{i}_matched_#{@unique_counter} icc ifc")
|
|
159
|
-
cycle(microcode: 'clr_flag (fail) icc')
|
|
160
|
-
end
|
|
161
|
-
match_conditions_cycle_count = cycle_count - prematch_cycle_count
|
|
162
|
-
cc "Match loop cycle count = #{match_conditions_cycle_count}"
|
|
163
|
-
|
|
164
|
-
# reduce timeout requested by match loop cycle count
|
|
165
|
-
timeout = (timeout.to_f / match_conditions_cycle_count).ceil
|
|
166
|
-
|
|
167
|
-
# Calculate the loop counts for the 2 loops to appropriately hit the timeout requested
|
|
168
|
-
loop_value = timeout.to_f.floor
|
|
169
|
-
|
|
170
|
-
if loop_value < (2**@loop_bits_max)
|
|
171
|
-
# small value, only need to use one loop
|
|
172
|
-
outer_loop_count = 1
|
|
173
|
-
inner_loop_count = loop_value
|
|
174
|
-
elsif loop_value < (2**(2 * @loop_bits_max))
|
|
175
|
-
# 2 nested loops required
|
|
176
|
-
inner_loop_count = 2**@loop_bits_max - 1
|
|
177
|
-
outer_loop_count = (loop_value.to_f / inner_loop_count).ceil
|
|
178
|
-
else
|
|
179
|
-
abort 'ERROR: timeout value too large in tester match method!'
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# retroactively set loop counter values for timeout based on cycles in match loop condition
|
|
183
|
-
set_loopb_vector.microcode = "loopB #{outer_loop_count} ign ifc icc"
|
|
184
|
-
set_loopa_vector.microcode = "loopA #{inner_loop_count} ign ifc icc"
|
|
185
|
-
|
|
186
|
-
cc 'Loop back around if time remaining'
|
|
187
|
-
cycle(microcode: "end_loopA match_inner_loop_#{@unique_counter} icc")
|
|
188
|
-
cycle(microcode: "end_loopB match_outer_loop_#{@unique_counter} icc")
|
|
189
|
-
|
|
190
|
-
if options[:force_fail_on_timeout]
|
|
191
|
-
cc 'To get here something has gone wrong, check block again to force a pattern failure'
|
|
192
|
-
fail_conditions.each(&:call)
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
if options[:on_timeout_goto]
|
|
196
|
-
cycle(microcode: "jump #{options[:on_timeout_goto]} icc")
|
|
197
|
-
else
|
|
198
|
-
cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
|
|
199
|
-
# cycle(:microcode => 'halt')
|
|
200
|
-
end
|
|
201
|
-
match_conditions.each_with_index do |condition, i|
|
|
202
|
-
microcode "block_#{i}_matched_#{@unique_counter}:"
|
|
203
|
-
cycle(microcode: 'pop_loop icc')
|
|
204
|
-
cycle(microcode: 'clr_fail')
|
|
205
|
-
if options[:on_block_match_goto]
|
|
206
|
-
if options[:on_block_match_goto].is_a?(Hash)
|
|
207
|
-
if options[:on_block_match_goto][i]
|
|
208
|
-
custom_jump = options[:on_block_match_goto][i]
|
|
209
|
-
else
|
|
210
|
-
custom_jump = nil
|
|
211
|
-
end
|
|
212
|
-
else
|
|
213
|
-
custom_jump = options[:on_block_match_goto]
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
if custom_jump
|
|
217
|
-
cycle(microcode: "jump #{custom_jump}")
|
|
218
|
-
else
|
|
219
|
-
# Don't do a jump on the last match block as it will naturally fall through
|
|
220
|
-
# TODO: Update origen core to expose the size
|
|
221
|
-
unless match_conditions.instance_variable_get(:@block_args).size == i + 1
|
|
222
|
-
cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
microcode "match_loop_end_#{@unique_counter}:"
|
|
227
|
-
if options[:clr_fail_post_match]
|
|
228
|
-
cycle(microcode: 'clr_fail')
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
232
|
-
# handshake is called in the same pattern
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
# Handshake with the tester.
|
|
236
|
-
#
|
|
237
|
-
# Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
|
|
238
|
-
# pass in a read code to pass information to the tester.
|
|
239
|
-
#
|
|
240
|
-
# ==== Examples
|
|
241
|
-
# $tester.handshake # Pass control to the tester for a measurement
|
|
242
|
-
# $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
|
|
243
|
-
def handshake(options = {})
|
|
244
|
-
options = {
|
|
245
|
-
readcode: false,
|
|
246
|
-
manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
|
|
247
|
-
}.merge(options)
|
|
248
|
-
if options[:readcode]
|
|
249
|
-
set_code(options[:readcode])
|
|
250
|
-
end
|
|
251
|
-
if options[:manual_stop]
|
|
252
|
-
cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
|
|
253
|
-
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
|
|
254
|
-
cycle(microcode: "loop_here_#{@unique_counter}: if (flag) jump loop_here_#{@unique_counter}")
|
|
255
|
-
else
|
|
256
|
-
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
|
|
257
|
-
cycle(microcode: "loop_here_#{@unique_counter}: if (#{@flags[0]}) jump loop_here_#{@unique_counter}")
|
|
258
|
-
end
|
|
259
|
-
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
260
|
-
# handshake is called in the same pattern
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
def keep_alive(options = {})
|
|
264
|
-
$tester.cycle microcode: "#{@microcode[:keepalive]}"
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
end
|
|
268
|
-
J750 = IGXLBasedTester::J750
|
|
269
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
# Tester model to generate .atp patterns for the Teradyne J750
|
|
4
|
+
#
|
|
5
|
+
# == Basic Usage
|
|
6
|
+
# $tester = Testers::J750.new
|
|
7
|
+
# $tester.cycle # Generate a vector
|
|
8
|
+
#
|
|
9
|
+
# Many more methods exist to generate J750 specific micro-code, see below for
|
|
10
|
+
# details.
|
|
11
|
+
#
|
|
12
|
+
# Also note that this class inherits from the base Tester class and so all methods
|
|
13
|
+
# described there are also available.
|
|
14
|
+
class J750 < Base
|
|
15
|
+
require 'origen_testers/igxl_based_tester/j750/generator.rb'
|
|
16
|
+
|
|
17
|
+
attr_accessor :use_hv_pin
|
|
18
|
+
attr_accessor :software_version
|
|
19
|
+
|
|
20
|
+
def self.hpt_mode
|
|
21
|
+
@@hpt_mode
|
|
22
|
+
end
|
|
23
|
+
def self.hpt_mode?
|
|
24
|
+
@@hpt_mode
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns a new J750 instance, normally there would only ever be one of these
|
|
28
|
+
# assigned to the global variable such as $tester by your target.
|
|
29
|
+
def initialize
|
|
30
|
+
super
|
|
31
|
+
@pipeline_depth = 34 # for extended mode is vectors, for normal mode is vector pairs (54 for J750Ex)
|
|
32
|
+
@use_hv_pin = false # allows to use high voltage for a pin for all patterns
|
|
33
|
+
@software_version = '3.50.40'
|
|
34
|
+
@name = 'j750'
|
|
35
|
+
@@hpt_mode = false
|
|
36
|
+
@opcode_mode = :extended
|
|
37
|
+
@loop_bits_max = 16 # maximum loop bit length
|
|
38
|
+
|
|
39
|
+
@flags = %w(cpuA cpuB cpuC cpuD)
|
|
40
|
+
@microcode[:enable] = 'enable'
|
|
41
|
+
@microcode[:set_flag] = 'set_cpu'
|
|
42
|
+
@microcode[:mask_vector] = 'ign ifc icc'
|
|
43
|
+
@microcode[:keepalive] = 'keep_alive'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def pattern_header(options = {})
|
|
47
|
+
super(options) do |pin_list|
|
|
48
|
+
microcode "vector ($tset, #{pin_list})"
|
|
49
|
+
microcode '{'
|
|
50
|
+
unless options[:subroutine_pat]
|
|
51
|
+
microcode 'start_label pattern_st:'
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def pattern_footer(options = {})
|
|
57
|
+
super(options)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Generates a match loop based on vector condition passed in via block
|
|
61
|
+
#
|
|
62
|
+
# This method is not really intended to be called directly, rather you should call
|
|
63
|
+
# via Tester#wait:
|
|
64
|
+
# e.g. $tester.wait(:match => true) do
|
|
65
|
+
# reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# The timeout should be provided in cycles, however when called via the wait method the
|
|
69
|
+
# time-based helpers (time_in_us, etc) will be converted to cycles for you.
|
|
70
|
+
#
|
|
71
|
+
# The following options are available to tailor the match loop behavior, defaults in
|
|
72
|
+
# parenthesis:
|
|
73
|
+
# * :check_for_fails (false) - Flushes the pipeline and handshakes with the tester (passing readcode 100) prior to the match (to allow binout of fails encountered before the match)
|
|
74
|
+
# * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
|
|
75
|
+
# * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
|
|
76
|
+
# * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop.
|
|
77
|
+
# A hash will also be accepted for this argument to supply a specific label (or no label) for each block e.g. {0 => "on_block_0_fail"}
|
|
78
|
+
# * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
|
|
79
|
+
# * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
|
|
80
|
+
# * :global_loops (false) - whether match loop loops should use global labels
|
|
81
|
+
# * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
|
|
82
|
+
# at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
|
|
83
|
+
# ==== Examples
|
|
84
|
+
# $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
|
|
85
|
+
# <vectors>
|
|
86
|
+
# end
|
|
87
|
+
def match_block(timeout, options = {}, &block)
|
|
88
|
+
options = {
|
|
89
|
+
check_for_fails: false,
|
|
90
|
+
on_timeout_goto: false,
|
|
91
|
+
on_block_match_goto: false,
|
|
92
|
+
multiple_entries: false,
|
|
93
|
+
force_fail_on_timeout: true,
|
|
94
|
+
global_loops: false,
|
|
95
|
+
manual_stop: false,
|
|
96
|
+
clr_fail_post_match: false
|
|
97
|
+
}.merge(options)
|
|
98
|
+
|
|
99
|
+
unless block_given?
|
|
100
|
+
fail 'ERROR: block not passed to match_block!'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Create BlockArgs objects in order to receive multiple blocks
|
|
104
|
+
match_conditions = Origen::Utility::BlockArgs.new
|
|
105
|
+
fail_conditions = Origen::Utility::BlockArgs.new
|
|
106
|
+
|
|
107
|
+
# yield object to calling routine to get populated with blocks
|
|
108
|
+
if block.arity > 0
|
|
109
|
+
yield match_conditions, fail_conditions
|
|
110
|
+
else
|
|
111
|
+
# for backwards compatibility with Origen core call to match_block
|
|
112
|
+
match_conditions.add(&block)
|
|
113
|
+
fail_conditions.add(&block)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Flush the pipeline first and then pass control to the program to bin out any failures
|
|
117
|
+
# prior to entering the match loop
|
|
118
|
+
if options[:check_for_fails]
|
|
119
|
+
if options[:multiple_entries]
|
|
120
|
+
@match_entries.times do |i|
|
|
121
|
+
microcode "global subr match_done_#{i}:"
|
|
122
|
+
set_code(i + 100)
|
|
123
|
+
cycle(microcode: 'jump call_tester') unless i == @match_entries - 1
|
|
124
|
+
end
|
|
125
|
+
microcode 'call_tester:'
|
|
126
|
+
else
|
|
127
|
+
set_code(100)
|
|
128
|
+
end
|
|
129
|
+
cc 'Wait for any prior failures to propagate through the pipeline'
|
|
130
|
+
cycle(microcode: 'pipe_minus 1')
|
|
131
|
+
cc 'Now handshake with the tester to bin out and parts that have failed before they got here'
|
|
132
|
+
handshake(manual_stop: options[:manual_stop])
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Now do the main match loop
|
|
136
|
+
cc 'Start the match loop'
|
|
137
|
+
|
|
138
|
+
global_opt = (options[:global_loops]) ? 'global ' : ''
|
|
139
|
+
microcode "#{global_opt}match_outer_loop_#{@unique_counter}:"
|
|
140
|
+
cycle # (:microcode => "loopB #{outer_loop_count} ign ifc icc")
|
|
141
|
+
set_loopb_vector = last_vector
|
|
142
|
+
|
|
143
|
+
microcode "#{global_opt}match_inner_loop_#{@unique_counter}:"
|
|
144
|
+
cycle # (:microcode => "loopA #{inner_loop_count} ign ifc icc")
|
|
145
|
+
set_loopa_vector = last_vector
|
|
146
|
+
|
|
147
|
+
# count cycles in match loop block passed to help with meeting
|
|
148
|
+
# desired timeout value (have to back assign microcodes above)
|
|
149
|
+
prematch_cycle_count = cycle_count
|
|
150
|
+
match_conditions.each_with_index do |condition, i|
|
|
151
|
+
mask_fails(true)
|
|
152
|
+
condition.call # match condition
|
|
153
|
+
mask_fails(false)
|
|
154
|
+
cc ' Wait for the result to propagate through the pipeline'
|
|
155
|
+
cycle(microcode: 'pipe_minus 1 ign ifc icc')
|
|
156
|
+
inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
|
|
157
|
+
cc "Branch if block condition #{i} met"
|
|
158
|
+
cycle(microcode: "if (pass) jump block_#{i}_matched_#{@unique_counter} icc ifc")
|
|
159
|
+
cycle(microcode: 'clr_flag (fail) icc')
|
|
160
|
+
end
|
|
161
|
+
match_conditions_cycle_count = cycle_count - prematch_cycle_count
|
|
162
|
+
cc "Match loop cycle count = #{match_conditions_cycle_count}"
|
|
163
|
+
|
|
164
|
+
# reduce timeout requested by match loop cycle count
|
|
165
|
+
timeout = (timeout.to_f / match_conditions_cycle_count).ceil
|
|
166
|
+
|
|
167
|
+
# Calculate the loop counts for the 2 loops to appropriately hit the timeout requested
|
|
168
|
+
loop_value = timeout.to_f.floor
|
|
169
|
+
|
|
170
|
+
if loop_value < (2**@loop_bits_max)
|
|
171
|
+
# small value, only need to use one loop
|
|
172
|
+
outer_loop_count = 1
|
|
173
|
+
inner_loop_count = loop_value
|
|
174
|
+
elsif loop_value < (2**(2 * @loop_bits_max))
|
|
175
|
+
# 2 nested loops required
|
|
176
|
+
inner_loop_count = 2**@loop_bits_max - 1
|
|
177
|
+
outer_loop_count = (loop_value.to_f / inner_loop_count).ceil
|
|
178
|
+
else
|
|
179
|
+
abort 'ERROR: timeout value too large in tester match method!'
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# retroactively set loop counter values for timeout based on cycles in match loop condition
|
|
183
|
+
set_loopb_vector.microcode = "loopB #{outer_loop_count} ign ifc icc"
|
|
184
|
+
set_loopa_vector.microcode = "loopA #{inner_loop_count} ign ifc icc"
|
|
185
|
+
|
|
186
|
+
cc 'Loop back around if time remaining'
|
|
187
|
+
cycle(microcode: "end_loopA match_inner_loop_#{@unique_counter} icc")
|
|
188
|
+
cycle(microcode: "end_loopB match_outer_loop_#{@unique_counter} icc")
|
|
189
|
+
|
|
190
|
+
if options[:force_fail_on_timeout]
|
|
191
|
+
cc 'To get here something has gone wrong, check block again to force a pattern failure'
|
|
192
|
+
fail_conditions.each(&:call)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
if options[:on_timeout_goto]
|
|
196
|
+
cycle(microcode: "jump #{options[:on_timeout_goto]} icc")
|
|
197
|
+
else
|
|
198
|
+
cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
|
|
199
|
+
# cycle(:microcode => 'halt')
|
|
200
|
+
end
|
|
201
|
+
match_conditions.each_with_index do |condition, i|
|
|
202
|
+
microcode "block_#{i}_matched_#{@unique_counter}:"
|
|
203
|
+
cycle(microcode: 'pop_loop icc')
|
|
204
|
+
cycle(microcode: 'clr_fail')
|
|
205
|
+
if options[:on_block_match_goto]
|
|
206
|
+
if options[:on_block_match_goto].is_a?(Hash)
|
|
207
|
+
if options[:on_block_match_goto][i]
|
|
208
|
+
custom_jump = options[:on_block_match_goto][i]
|
|
209
|
+
else
|
|
210
|
+
custom_jump = nil
|
|
211
|
+
end
|
|
212
|
+
else
|
|
213
|
+
custom_jump = options[:on_block_match_goto]
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
if custom_jump
|
|
217
|
+
cycle(microcode: "jump #{custom_jump}")
|
|
218
|
+
else
|
|
219
|
+
# Don't do a jump on the last match block as it will naturally fall through
|
|
220
|
+
# TODO: Update origen core to expose the size
|
|
221
|
+
unless match_conditions.instance_variable_get(:@block_args).size == i + 1
|
|
222
|
+
cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
microcode "match_loop_end_#{@unique_counter}:"
|
|
227
|
+
if options[:clr_fail_post_match]
|
|
228
|
+
cycle(microcode: 'clr_fail')
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
232
|
+
# handshake is called in the same pattern
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Handshake with the tester.
|
|
236
|
+
#
|
|
237
|
+
# Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
|
|
238
|
+
# pass in a read code to pass information to the tester.
|
|
239
|
+
#
|
|
240
|
+
# ==== Examples
|
|
241
|
+
# $tester.handshake # Pass control to the tester for a measurement
|
|
242
|
+
# $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
|
|
243
|
+
def handshake(options = {})
|
|
244
|
+
options = {
|
|
245
|
+
readcode: false,
|
|
246
|
+
manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
|
|
247
|
+
}.merge(options)
|
|
248
|
+
if options[:readcode]
|
|
249
|
+
set_code(options[:readcode])
|
|
250
|
+
end
|
|
251
|
+
if options[:manual_stop]
|
|
252
|
+
cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
|
|
253
|
+
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
|
|
254
|
+
cycle(microcode: "loop_here_#{@unique_counter}: if (flag) jump loop_here_#{@unique_counter}")
|
|
255
|
+
else
|
|
256
|
+
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
|
|
257
|
+
cycle(microcode: "loop_here_#{@unique_counter}: if (#{@flags[0]}) jump loop_here_#{@unique_counter}")
|
|
258
|
+
end
|
|
259
|
+
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
260
|
+
# handshake is called in the same pattern
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def keep_alive(options = {})
|
|
264
|
+
$tester.cycle microcode: "#{@microcode[:keepalive]}"
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
J750 = IGXLBasedTester::J750
|
|
269
|
+
end
|