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,98 +1,98 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class DCSpecsets
|
|
5
|
-
include ::OrigenTesters::Generator
|
|
6
|
-
|
|
7
|
-
attr_accessor :dc_specs
|
|
8
|
-
attr_accessor :dc_specsets
|
|
9
|
-
|
|
10
|
-
OUTPUT_PREFIX = 'SpecsDC'
|
|
11
|
-
# OUTPUT_POSTFIX = 'SpecsDC'
|
|
12
|
-
|
|
13
|
-
def initialize # :nodoc:
|
|
14
|
-
## Hash Autovivification
|
|
15
|
-
l = ->(h, k) { h[k] = Hash.new(&l) }
|
|
16
|
-
|
|
17
|
-
@dc_specs = []
|
|
18
|
-
@dc_specsets = Hash.new(&l)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Assigns a DC spec value object to the given variable for this specset
|
|
22
|
-
# The attrs hash is expected to defined as follows:
|
|
23
|
-
# attrs = {
|
|
24
|
-
# specset: :specset_name, # if not defined, specset = :default
|
|
25
|
-
# # Spec selectors that contain both the scope and value of the spec
|
|
26
|
-
# nom: { typ: 1.8 }, # typ is an example of the UFlex scope, nom is the spec selector
|
|
27
|
-
# min: { min: 1.7 }, # Users can defined any number of selectors in this fashion
|
|
28
|
-
# max: { max: 1.9 }
|
|
29
|
-
# }
|
|
30
|
-
def add(spec, attrs = {})
|
|
31
|
-
attrs = {
|
|
32
|
-
specset: :default
|
|
33
|
-
}.merge(attrs)
|
|
34
|
-
|
|
35
|
-
specset = attrs.delete(:specset)
|
|
36
|
-
|
|
37
|
-
@dc_specs << spec unless @dc_specs.include?(spec)
|
|
38
|
-
|
|
39
|
-
attrs.each do |selector, value|
|
|
40
|
-
@dc_specsets[specset][spec][selector] = value
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Prepare the spec information for file output
|
|
45
|
-
def format_uflex_dc_spec(data, options = {})
|
|
46
|
-
options = {
|
|
47
|
-
spec: nil
|
|
48
|
-
}.update(options)
|
|
49
|
-
|
|
50
|
-
case options[:spec]
|
|
51
|
-
when /(voh|vol|vt|vcl|vch|vdd)/i
|
|
52
|
-
spec_type = 'volt'
|
|
53
|
-
when /(ioh|iol)/i
|
|
54
|
-
spec_type = 'curr'
|
|
55
|
-
else
|
|
56
|
-
spec_type = nil
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
case data
|
|
60
|
-
when NilClass
|
|
61
|
-
data_new = 0
|
|
62
|
-
when Fixnum, Float
|
|
63
|
-
case
|
|
64
|
-
when data == 0
|
|
65
|
-
data_new = data.to_s
|
|
66
|
-
when data.abs < 1e-6
|
|
67
|
-
data_new = (data * 1_000_000_000).round(4).to_s + '*nV' if spec_type == 'volt'
|
|
68
|
-
data_new = (data * 1_000_000_000).round(4).to_s + '*nA' if spec_type == 'curr'
|
|
69
|
-
data_new = data.to_s if spec_type.nil?
|
|
70
|
-
when data.abs < 1e-3
|
|
71
|
-
data_new = (data * 1_000_000).round(4).to_s + '*uV' if spec_type == 'volt'
|
|
72
|
-
data_new = (data * 1_000_000).round(4).to_s + '*uA' if spec_type == 'curr'
|
|
73
|
-
data_new = data.to_s if spec_type.nil?
|
|
74
|
-
when data.abs < 1
|
|
75
|
-
data_new = data.to_s + '*V' if spec_type == 'volt'
|
|
76
|
-
data_new = (data * 1_000).round(4).to_s + '*mA' if spec_type == 'curr'
|
|
77
|
-
data_new = data.to_s if spec_type.nil?
|
|
78
|
-
else
|
|
79
|
-
data_new = data.to_s + '*V' if spec_type == 'volt'
|
|
80
|
-
data_new = data.to_s + '*A' if spec_type == 'curr'
|
|
81
|
-
data_new = data.to_s if spec_type.nil?
|
|
82
|
-
end
|
|
83
|
-
data_new = data_new.gsub(/^/, '=')
|
|
84
|
-
when String
|
|
85
|
-
data_new = data.gsub(/^/, '=').gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
86
|
-
# Remove underscores from unit designations
|
|
87
|
-
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)(\W)/i, '\1\2\3')
|
|
88
|
-
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)$/i, '\1\2')
|
|
89
|
-
else
|
|
90
|
-
Origen.log.error "Unknown class type (#{data.class}) for spec value: #{data}"
|
|
91
|
-
fail
|
|
92
|
-
end
|
|
93
|
-
data_new
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class DCSpecsets
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
attr_accessor :dc_specs
|
|
8
|
+
attr_accessor :dc_specsets
|
|
9
|
+
|
|
10
|
+
OUTPUT_PREFIX = 'SpecsDC'
|
|
11
|
+
# OUTPUT_POSTFIX = 'SpecsDC'
|
|
12
|
+
|
|
13
|
+
def initialize # :nodoc:
|
|
14
|
+
## Hash Autovivification
|
|
15
|
+
l = ->(h, k) { h[k] = Hash.new(&l) }
|
|
16
|
+
|
|
17
|
+
@dc_specs = []
|
|
18
|
+
@dc_specsets = Hash.new(&l)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Assigns a DC spec value object to the given variable for this specset
|
|
22
|
+
# The attrs hash is expected to defined as follows:
|
|
23
|
+
# attrs = {
|
|
24
|
+
# specset: :specset_name, # if not defined, specset = :default
|
|
25
|
+
# # Spec selectors that contain both the scope and value of the spec
|
|
26
|
+
# nom: { typ: 1.8 }, # typ is an example of the UFlex scope, nom is the spec selector
|
|
27
|
+
# min: { min: 1.7 }, # Users can defined any number of selectors in this fashion
|
|
28
|
+
# max: { max: 1.9 }
|
|
29
|
+
# }
|
|
30
|
+
def add(spec, attrs = {})
|
|
31
|
+
attrs = {
|
|
32
|
+
specset: :default
|
|
33
|
+
}.merge(attrs)
|
|
34
|
+
|
|
35
|
+
specset = attrs.delete(:specset)
|
|
36
|
+
|
|
37
|
+
@dc_specs << spec unless @dc_specs.include?(spec)
|
|
38
|
+
|
|
39
|
+
attrs.each do |selector, value|
|
|
40
|
+
@dc_specsets[specset][spec][selector] = value
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Prepare the spec information for file output
|
|
45
|
+
def format_uflex_dc_spec(data, options = {})
|
|
46
|
+
options = {
|
|
47
|
+
spec: nil
|
|
48
|
+
}.update(options)
|
|
49
|
+
|
|
50
|
+
case options[:spec]
|
|
51
|
+
when /(voh|vol|vt|vcl|vch|vdd)/i
|
|
52
|
+
spec_type = 'volt'
|
|
53
|
+
when /(ioh|iol)/i
|
|
54
|
+
spec_type = 'curr'
|
|
55
|
+
else
|
|
56
|
+
spec_type = nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
case data
|
|
60
|
+
when NilClass
|
|
61
|
+
data_new = 0
|
|
62
|
+
when Fixnum, Float
|
|
63
|
+
case
|
|
64
|
+
when data == 0
|
|
65
|
+
data_new = data.to_s
|
|
66
|
+
when data.abs < 1e-6
|
|
67
|
+
data_new = (data * 1_000_000_000).round(4).to_s + '*nV' if spec_type == 'volt'
|
|
68
|
+
data_new = (data * 1_000_000_000).round(4).to_s + '*nA' if spec_type == 'curr'
|
|
69
|
+
data_new = data.to_s if spec_type.nil?
|
|
70
|
+
when data.abs < 1e-3
|
|
71
|
+
data_new = (data * 1_000_000).round(4).to_s + '*uV' if spec_type == 'volt'
|
|
72
|
+
data_new = (data * 1_000_000).round(4).to_s + '*uA' if spec_type == 'curr'
|
|
73
|
+
data_new = data.to_s if spec_type.nil?
|
|
74
|
+
when data.abs < 1
|
|
75
|
+
data_new = data.to_s + '*V' if spec_type == 'volt'
|
|
76
|
+
data_new = (data * 1_000).round(4).to_s + '*mA' if spec_type == 'curr'
|
|
77
|
+
data_new = data.to_s if spec_type.nil?
|
|
78
|
+
else
|
|
79
|
+
data_new = data.to_s + '*V' if spec_type == 'volt'
|
|
80
|
+
data_new = data.to_s + '*A' if spec_type == 'curr'
|
|
81
|
+
data_new = data.to_s if spec_type.nil?
|
|
82
|
+
end
|
|
83
|
+
data_new = data_new.gsub(/^/, '=')
|
|
84
|
+
when String
|
|
85
|
+
data_new = data.gsub(/^/, '=').gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
86
|
+
# Remove underscores from unit designations
|
|
87
|
+
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)(\W)/i, '\1\2\3')
|
|
88
|
+
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)$/i, '\1\2')
|
|
89
|
+
else
|
|
90
|
+
Origen.log.error "Unknown class type (#{data.class}) for spec value: #{data}"
|
|
91
|
+
fail
|
|
92
|
+
end
|
|
93
|
+
data_new
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Edge
|
|
5
|
-
attr_accessor :d_src, :d_fmt, :d0_edge, :d1_edge, :d2_edge, :d3_edge # Input pin timing information
|
|
6
|
-
attr_accessor :c_mode, :c1_edge, :c2_edge # Output pin timing information
|
|
7
|
-
attr_accessor :t_res, :clk_per
|
|
8
|
-
|
|
9
|
-
def initialize(options = {}) # :nodoc:
|
|
10
|
-
options = {
|
|
11
|
-
d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
|
|
12
|
-
d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
|
|
13
|
-
d0_edge: '', # time at which the input drive is turned on
|
|
14
|
-
d1_edge: '', # time of the initial data drive edge
|
|
15
|
-
d2_edge: '', # time of the return format data drive edge
|
|
16
|
-
d3_edge: '', # time at which the input drive is turned off
|
|
17
|
-
c_mode: 'Edge', # output compare mode
|
|
18
|
-
c1_edge: '', # time of the initial output compare edge
|
|
19
|
-
c2_edge: '', # time of the final output compare edge (window compare)
|
|
20
|
-
t_res: 'Machine', # timing resolution (possibly ATE-specific)
|
|
21
|
-
clk_per: '' # clock period equation - for use with MCG
|
|
22
|
-
}.merge(options)
|
|
23
|
-
@d_src = options[:d_src]
|
|
24
|
-
@d_fmt = options[:d_fmt]
|
|
25
|
-
@d0_edge = options[:d0_edge]
|
|
26
|
-
@d1_edge = options[:d1_edge]
|
|
27
|
-
@d2_edge = options[:d2_edge]
|
|
28
|
-
@d3_edge = options[:d3_edge]
|
|
29
|
-
@c_mode = options[:c_mode]
|
|
30
|
-
@c1_edge = options[:c1_edge]
|
|
31
|
-
@c2_edge = options[:c2_edge]
|
|
32
|
-
@t_res = options[:t_res]
|
|
33
|
-
@clk_per = options[:clk_per]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def ==(edge)
|
|
37
|
-
if edge.is_a? Edge
|
|
38
|
-
d_src == edge.d_src &&
|
|
39
|
-
d_fmt == edge.d_fmt &&
|
|
40
|
-
d0_edge == edge.d0_edge &&
|
|
41
|
-
d1_edge == edge.d1_edge &&
|
|
42
|
-
d2_edge == edge.d2_edge &&
|
|
43
|
-
d3_edge == edge.d3_edge &&
|
|
44
|
-
c_mode == edge.c_mode &&
|
|
45
|
-
c1_edge == edge.c1_edge &&
|
|
46
|
-
c2_edge == edge.c2_edge &&
|
|
47
|
-
t_res == edge.t_res &&
|
|
48
|
-
clk_per == edge.clk_per
|
|
49
|
-
else
|
|
50
|
-
super
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def platform
|
|
55
|
-
Origen.interface.platform
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Edge
|
|
5
|
+
attr_accessor :d_src, :d_fmt, :d0_edge, :d1_edge, :d2_edge, :d3_edge # Input pin timing information
|
|
6
|
+
attr_accessor :c_mode, :c1_edge, :c2_edge # Output pin timing information
|
|
7
|
+
attr_accessor :t_res, :clk_per
|
|
8
|
+
|
|
9
|
+
def initialize(options = {}) # :nodoc:
|
|
10
|
+
options = {
|
|
11
|
+
d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
|
|
12
|
+
d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
|
|
13
|
+
d0_edge: '', # time at which the input drive is turned on
|
|
14
|
+
d1_edge: '', # time of the initial data drive edge
|
|
15
|
+
d2_edge: '', # time of the return format data drive edge
|
|
16
|
+
d3_edge: '', # time at which the input drive is turned off
|
|
17
|
+
c_mode: 'Edge', # output compare mode
|
|
18
|
+
c1_edge: '', # time of the initial output compare edge
|
|
19
|
+
c2_edge: '', # time of the final output compare edge (window compare)
|
|
20
|
+
t_res: 'Machine', # timing resolution (possibly ATE-specific)
|
|
21
|
+
clk_per: '' # clock period equation - for use with MCG
|
|
22
|
+
}.merge(options)
|
|
23
|
+
@d_src = options[:d_src]
|
|
24
|
+
@d_fmt = options[:d_fmt]
|
|
25
|
+
@d0_edge = options[:d0_edge]
|
|
26
|
+
@d1_edge = options[:d1_edge]
|
|
27
|
+
@d2_edge = options[:d2_edge]
|
|
28
|
+
@d3_edge = options[:d3_edge]
|
|
29
|
+
@c_mode = options[:c_mode]
|
|
30
|
+
@c1_edge = options[:c1_edge]
|
|
31
|
+
@c2_edge = options[:c2_edge]
|
|
32
|
+
@t_res = options[:t_res]
|
|
33
|
+
@clk_per = options[:clk_per]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def ==(edge)
|
|
37
|
+
if edge.is_a? Edge
|
|
38
|
+
d_src == edge.d_src &&
|
|
39
|
+
d_fmt == edge.d_fmt &&
|
|
40
|
+
d0_edge == edge.d0_edge &&
|
|
41
|
+
d1_edge == edge.d1_edge &&
|
|
42
|
+
d2_edge == edge.d2_edge &&
|
|
43
|
+
d3_edge == edge.d3_edge &&
|
|
44
|
+
c_mode == edge.c_mode &&
|
|
45
|
+
c1_edge == edge.c1_edge &&
|
|
46
|
+
c2_edge == edge.c2_edge &&
|
|
47
|
+
t_res == edge.t_res &&
|
|
48
|
+
clk_per == edge.clk_per
|
|
49
|
+
else
|
|
50
|
+
super
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def platform
|
|
55
|
+
Origen.interface.platform
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Edges
|
|
5
|
-
include ::OrigenTesters::Generator
|
|
6
|
-
|
|
7
|
-
attr_accessor :edges
|
|
8
|
-
|
|
9
|
-
def initialize(options = {}) # :nodoc:
|
|
10
|
-
@edges = Hash.new do |h, k|
|
|
11
|
-
h[k] = {}
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Defines a new Edge object for the category and pin name
|
|
16
|
-
def add(grp, pin, options = {})
|
|
17
|
-
grp = grp.to_sym unless grp.is_a? Symbol
|
|
18
|
-
pin = pin.to_sym unless pin.is_a? Symbol
|
|
19
|
-
edges[grp][pin] = platform::Edge.new(options)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Edges
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
attr_accessor :edges
|
|
8
|
+
|
|
9
|
+
def initialize(options = {}) # :nodoc:
|
|
10
|
+
@edges = Hash.new do |h, k|
|
|
11
|
+
h[k] = {}
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Defines a new Edge object for the category and pin name
|
|
16
|
+
def add(grp, pin, options = {})
|
|
17
|
+
grp = grp.to_sym unless grp.is_a? Symbol
|
|
18
|
+
pin = pin.to_sym unless pin.is_a? Symbol
|
|
19
|
+
edges[grp][pin] = platform::Edge.new(options)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Edgeset
|
|
5
|
-
attr_accessor :period, :t_mode # Edgeset information
|
|
6
|
-
attr_accessor :pins
|
|
7
|
-
attr_accessor :spec_sheet
|
|
8
|
-
attr_accessor :name
|
|
9
|
-
|
|
10
|
-
def initialize(name, pin, edge, attrs = {}) # :nodoc:
|
|
11
|
-
attrs = {
|
|
12
|
-
period: '', # tester cycle duration
|
|
13
|
-
t_mode: '', # timing mode (possibly ATE-specific)
|
|
14
|
-
spec_sheet: 'default' # defines which specset sheet to put variables in (e.g. func, scan) when generating specset files
|
|
15
|
-
}.merge(attrs)
|
|
16
|
-
@period = attrs[:period]
|
|
17
|
-
@t_mode = attrs[:t_mode]
|
|
18
|
-
@spec_sheet = attrs[:spec_sheet]
|
|
19
|
-
@pins = { pin => edge }
|
|
20
|
-
self.name = name
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Assigns a timing edge object to the given pin for this edgeset
|
|
24
|
-
def add_edge(pin, edge)
|
|
25
|
-
if @pins.key?(pin)
|
|
26
|
-
Origen.log.error "Pin #{pin} already exists in edgeset"
|
|
27
|
-
fail
|
|
28
|
-
else
|
|
29
|
-
@pins[pin] = edge
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def platform
|
|
34
|
-
Origen.interface.platform
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Edgeset
|
|
5
|
+
attr_accessor :period, :t_mode # Edgeset information
|
|
6
|
+
attr_accessor :pins
|
|
7
|
+
attr_accessor :spec_sheet
|
|
8
|
+
attr_accessor :name
|
|
9
|
+
|
|
10
|
+
def initialize(name, pin, edge, attrs = {}) # :nodoc:
|
|
11
|
+
attrs = {
|
|
12
|
+
period: '', # tester cycle duration
|
|
13
|
+
t_mode: '', # timing mode (possibly ATE-specific)
|
|
14
|
+
spec_sheet: 'default' # defines which specset sheet to put variables in (e.g. func, scan) when generating specset files
|
|
15
|
+
}.merge(attrs)
|
|
16
|
+
@period = attrs[:period]
|
|
17
|
+
@t_mode = attrs[:t_mode]
|
|
18
|
+
@spec_sheet = attrs[:spec_sheet]
|
|
19
|
+
@pins = { pin => edge }
|
|
20
|
+
self.name = name
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Assigns a timing edge object to the given pin for this edgeset
|
|
24
|
+
def add_edge(pin, edge)
|
|
25
|
+
if @pins.key?(pin)
|
|
26
|
+
Origen.log.error "Pin #{pin} already exists in edgeset"
|
|
27
|
+
fail
|
|
28
|
+
else
|
|
29
|
+
@pins[pin] = edge
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def platform
|
|
34
|
+
Origen.interface.platform
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module IGXLBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
class Edgesets
|
|
5
|
-
include ::OrigenTesters::Generator
|
|
6
|
-
|
|
7
|
-
attr_accessor :es
|
|
8
|
-
attr_accessor :es_sheet_pins
|
|
9
|
-
attr_accessor :ts_basic
|
|
10
|
-
|
|
11
|
-
OUTPUT_PREFIX = 'ES'
|
|
12
|
-
# OUTPUT_POSTFIX = 'ES'
|
|
13
|
-
|
|
14
|
-
def initialize(options = {}) # :nodoc:
|
|
15
|
-
@es = {}
|
|
16
|
-
@ts_basic = options[:timeset_basic]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def add(esname, pin, edge, options = {})
|
|
20
|
-
esname = esname.to_sym unless esname.is_a? Symbol
|
|
21
|
-
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
-
@es.key?(esname) ? @es[esname].add_edge(pin, edge) : @es[esname] = platform::Edgeset.new(esname, pin, edge, options)
|
|
23
|
-
@es_sheet_pins = options[:es_sheet_pins] unless @es_sheet_pins
|
|
24
|
-
@es
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def finalize(options = {})
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Populate an array of pins based on the pin or pingroup
|
|
31
|
-
def get_pin_objects(grp)
|
|
32
|
-
pins = []
|
|
33
|
-
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
34
|
-
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
35
|
-
pins << Origen.top_level.pin(grp)
|
|
36
|
-
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
37
|
-
Origen.top_level.pin(grp).each do |pin|
|
|
38
|
-
pins << pin
|
|
39
|
-
end
|
|
40
|
-
else
|
|
41
|
-
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
42
|
-
end
|
|
43
|
-
pins
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Equality check to compare full contents of edge object
|
|
47
|
-
def edges_eql?(edge1, edge2)
|
|
48
|
-
edge1 == edge2
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Globally modify text within the edge object
|
|
52
|
-
def gsub_edges!(edge, old_val, new_val)
|
|
53
|
-
edge.d_src = edge.d_src.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
54
|
-
edge.d_fmt = edge.d_fmt.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
55
|
-
edge.d0_edge = edge.d0_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
56
|
-
edge.d1_edge = edge.d1_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
57
|
-
edge.d2_edge = edge.d2_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
58
|
-
edge.d3_edge = edge.d3_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
59
|
-
edge.c_mode = edge.c_mode.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
60
|
-
edge.c1_edge = edge.c1_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
61
|
-
edge.c2_edge = edge.c2_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
62
|
-
edge.t_res = edge.t_res.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
63
|
-
edge.clk_per = edge.clk_per.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Prepare the edge information for ES/TS file output
|
|
67
|
-
def format_uflex_edge(data, line_cnt, options = {})
|
|
68
|
-
options = {
|
|
69
|
-
no_disable: false
|
|
70
|
-
}.merge(options)
|
|
71
|
-
|
|
72
|
-
if data !~ /^\s*$/
|
|
73
|
-
data = data.gsub(/^/, '=')
|
|
74
|
-
end
|
|
75
|
-
data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
76
|
-
|
|
77
|
-
case data
|
|
78
|
-
when /_d0_edge|_d_on/
|
|
79
|
-
data = data.gsub(/_d0_edge|_d_on/, "F#{line_cnt}")
|
|
80
|
-
when /_d1_edge|_d_data/
|
|
81
|
-
data = data.gsub(/_d1_edge|_d_data/, "G#{line_cnt}")
|
|
82
|
-
when /_d2_edge|_dret/
|
|
83
|
-
data = data.gsub(/_d2_edge|_dret/, "H#{line_cnt}")
|
|
84
|
-
when /_d3_edge|_d_off/
|
|
85
|
-
data = data.gsub(/_d3_edge|_d_off/, "I#{line_cnt}")
|
|
86
|
-
when /_c1_edge|_c_open/
|
|
87
|
-
data = data.gsub(/_c1_edge|_c_open/, "K#{line_cnt}")
|
|
88
|
-
when /_c2_edge|_c_close/
|
|
89
|
-
data = data.gsub(/_c2_edge|_c_close/, "L#{line_cnt}")
|
|
90
|
-
when /^\s*$/
|
|
91
|
-
options[:no_disable] ? data = '' : data = 'disable'
|
|
92
|
-
else
|
|
93
|
-
data
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# Prepare the edge information for TSB file output
|
|
98
|
-
def format_uflex_edge_tsb(data, line_cnt, options = {})
|
|
99
|
-
options = {
|
|
100
|
-
no_disable: false
|
|
101
|
-
}.merge(options)
|
|
102
|
-
|
|
103
|
-
if data !~ /^\s*$/
|
|
104
|
-
data = data.gsub(/^/, '=')
|
|
105
|
-
end
|
|
106
|
-
data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
107
|
-
|
|
108
|
-
case data
|
|
109
|
-
when /_d0_edge|_d_on/
|
|
110
|
-
data = data.gsub(/_d0_edge|_d_on/, "I#{line_cnt}")
|
|
111
|
-
when /_d1_edge|_d_data/
|
|
112
|
-
data = data.gsub(/_d1_edge|_d_data/, "J#{line_cnt}")
|
|
113
|
-
when /_d2_edge|_dret/
|
|
114
|
-
data = data.gsub(/_d2_edge|_dret/, "K#{line_cnt}")
|
|
115
|
-
when /_d3_edge|_d_off/
|
|
116
|
-
data = data.gsub(/_d3_edge|_d_off/, "L#{line_cnt}")
|
|
117
|
-
when /_c1_edge|_c_open/
|
|
118
|
-
data = data.gsub(/_c1_edge|_c_open/, "N#{line_cnt}")
|
|
119
|
-
when /_c2_edge|_c_close/
|
|
120
|
-
data = data.gsub(/_c2_edge|_c_close/, "O#{line_cnt}")
|
|
121
|
-
when /^\s*$/
|
|
122
|
-
options[:no_disable] ? data = '' : data = 'disable'
|
|
123
|
-
else
|
|
124
|
-
data
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Edgesets
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
attr_accessor :es
|
|
8
|
+
attr_accessor :es_sheet_pins
|
|
9
|
+
attr_accessor :ts_basic
|
|
10
|
+
|
|
11
|
+
OUTPUT_PREFIX = 'ES'
|
|
12
|
+
# OUTPUT_POSTFIX = 'ES'
|
|
13
|
+
|
|
14
|
+
def initialize(options = {}) # :nodoc:
|
|
15
|
+
@es = {}
|
|
16
|
+
@ts_basic = options[:timeset_basic]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(esname, pin, edge, options = {})
|
|
20
|
+
esname = esname.to_sym unless esname.is_a? Symbol
|
|
21
|
+
pin = pin.to_sym unless pin.is_a? Symbol
|
|
22
|
+
@es.key?(esname) ? @es[esname].add_edge(pin, edge) : @es[esname] = platform::Edgeset.new(esname, pin, edge, options)
|
|
23
|
+
@es_sheet_pins = options[:es_sheet_pins] unless @es_sheet_pins
|
|
24
|
+
@es
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def finalize(options = {})
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Populate an array of pins based on the pin or pingroup
|
|
31
|
+
def get_pin_objects(grp)
|
|
32
|
+
pins = []
|
|
33
|
+
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
|
34
|
+
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
|
35
|
+
pins << Origen.top_level.pin(grp)
|
|
36
|
+
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
|
37
|
+
Origen.top_level.pin(grp).each do |pin|
|
|
38
|
+
pins << pin
|
|
39
|
+
end
|
|
40
|
+
else
|
|
41
|
+
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
|
42
|
+
end
|
|
43
|
+
pins
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Equality check to compare full contents of edge object
|
|
47
|
+
def edges_eql?(edge1, edge2)
|
|
48
|
+
edge1 == edge2
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Globally modify text within the edge object
|
|
52
|
+
def gsub_edges!(edge, old_val, new_val)
|
|
53
|
+
edge.d_src = edge.d_src.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
54
|
+
edge.d_fmt = edge.d_fmt.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
55
|
+
edge.d0_edge = edge.d0_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
56
|
+
edge.d1_edge = edge.d1_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
57
|
+
edge.d2_edge = edge.d2_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
58
|
+
edge.d3_edge = edge.d3_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
59
|
+
edge.c_mode = edge.c_mode.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
60
|
+
edge.c1_edge = edge.c1_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
61
|
+
edge.c2_edge = edge.c2_edge.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
62
|
+
edge.t_res = edge.t_res.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
63
|
+
edge.clk_per = edge.clk_per.gsub(/#{Regexp.escape(old_val)}/, new_val)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Prepare the edge information for ES/TS file output
|
|
67
|
+
def format_uflex_edge(data, line_cnt, options = {})
|
|
68
|
+
options = {
|
|
69
|
+
no_disable: false
|
|
70
|
+
}.merge(options)
|
|
71
|
+
|
|
72
|
+
if data !~ /^\s*$/
|
|
73
|
+
data = data.gsub(/^/, '=')
|
|
74
|
+
end
|
|
75
|
+
data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
76
|
+
|
|
77
|
+
case data
|
|
78
|
+
when /_d0_edge|_d_on/
|
|
79
|
+
data = data.gsub(/_d0_edge|_d_on/, "F#{line_cnt}")
|
|
80
|
+
when /_d1_edge|_d_data/
|
|
81
|
+
data = data.gsub(/_d1_edge|_d_data/, "G#{line_cnt}")
|
|
82
|
+
when /_d2_edge|_dret/
|
|
83
|
+
data = data.gsub(/_d2_edge|_dret/, "H#{line_cnt}")
|
|
84
|
+
when /_d3_edge|_d_off/
|
|
85
|
+
data = data.gsub(/_d3_edge|_d_off/, "I#{line_cnt}")
|
|
86
|
+
when /_c1_edge|_c_open/
|
|
87
|
+
data = data.gsub(/_c1_edge|_c_open/, "K#{line_cnt}")
|
|
88
|
+
when /_c2_edge|_c_close/
|
|
89
|
+
data = data.gsub(/_c2_edge|_c_close/, "L#{line_cnt}")
|
|
90
|
+
when /^\s*$/
|
|
91
|
+
options[:no_disable] ? data = '' : data = 'disable'
|
|
92
|
+
else
|
|
93
|
+
data
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Prepare the edge information for TSB file output
|
|
98
|
+
def format_uflex_edge_tsb(data, line_cnt, options = {})
|
|
99
|
+
options = {
|
|
100
|
+
no_disable: false
|
|
101
|
+
}.merge(options)
|
|
102
|
+
|
|
103
|
+
if data !~ /^\s*$/
|
|
104
|
+
data = data.gsub(/^/, '=')
|
|
105
|
+
end
|
|
106
|
+
data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
|
107
|
+
|
|
108
|
+
case data
|
|
109
|
+
when /_d0_edge|_d_on/
|
|
110
|
+
data = data.gsub(/_d0_edge|_d_on/, "I#{line_cnt}")
|
|
111
|
+
when /_d1_edge|_d_data/
|
|
112
|
+
data = data.gsub(/_d1_edge|_d_data/, "J#{line_cnt}")
|
|
113
|
+
when /_d2_edge|_dret/
|
|
114
|
+
data = data.gsub(/_d2_edge|_dret/, "K#{line_cnt}")
|
|
115
|
+
when /_d3_edge|_d_off/
|
|
116
|
+
data = data.gsub(/_d3_edge|_d_off/, "L#{line_cnt}")
|
|
117
|
+
when /_c1_edge|_c_open/
|
|
118
|
+
data = data.gsub(/_c1_edge|_c_open/, "N#{line_cnt}")
|
|
119
|
+
when /_c2_edge|_c_close/
|
|
120
|
+
data = data.gsub(/_c2_edge|_c_close/, "O#{line_cnt}")
|
|
121
|
+
when /^\s*$/
|
|
122
|
+
options[:no_disable] ? data = '' : data = 'disable'
|
|
123
|
+
else
|
|
124
|
+
data
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|