origen_testers 0.41.0 → 0.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/approved/j750/decompiler/sample/sample.atp +16 -0
- data/config/application.rb +6 -0
- data/config/boot.rb +3 -0
- data/config/commands.rb +148 -3
- data/config/global_commands.rb +0 -0
- data/config/shared_commands.rb +0 -0
- data/config/users.rb +0 -0
- data/config/version.rb +1 -1
- data/lib/commands/build.rb +0 -0
- data/lib/commands/convert.rb +16 -10
- data/lib/commands/run.rb +0 -0
- data/lib/origen_testers.rb +5 -0
- data/lib/origen_testers/api.rb +4 -0
- data/lib/origen_testers/atp.rb +0 -0
- data/lib/origen_testers/atp/ast/extractor.rb +0 -0
- data/lib/origen_testers/atp/ast/node.rb +0 -0
- data/lib/origen_testers/atp/flow.rb +0 -0
- data/lib/origen_testers/atp/flow_api.rb +0 -0
- data/lib/origen_testers/atp/formatter.rb +0 -0
- data/lib/origen_testers/atp/formatters/basic.rb +0 -0
- data/lib/origen_testers/atp/formatters/datalog.rb +0 -0
- data/lib/origen_testers/atp/parser.rb +0 -0
- data/lib/origen_testers/atp/processor.rb +0 -0
- data/lib/origen_testers/atp/processors/add_ids.rb +0 -0
- data/lib/origen_testers/atp/processors/add_set_result.rb +0 -0
- data/lib/origen_testers/atp/processors/adjacent_if_combiner.rb +0 -0
- data/lib/origen_testers/atp/processors/append_to.rb +0 -0
- data/lib/origen_testers/atp/processors/apply_post_group_actions.rb +0 -0
- data/lib/origen_testers/atp/processors/condition.rb +0 -0
- data/lib/origen_testers/atp/processors/continue_implementer.rb +0 -0
- data/lib/origen_testers/atp/processors/else_remover.rb +0 -0
- data/lib/origen_testers/atp/processors/empty_branch_remover.rb +0 -0
- data/lib/origen_testers/atp/processors/extract_set_flags.rb +0 -0
- data/lib/origen_testers/atp/processors/flag_optimizer.rb +0 -0
- data/lib/origen_testers/atp/processors/flattener.rb +0 -0
- data/lib/origen_testers/atp/processors/flow_id.rb +0 -0
- data/lib/origen_testers/atp/processors/marshal.rb +0 -0
- data/lib/origen_testers/atp/processors/on_pass_fail_remover.rb +0 -0
- data/lib/origen_testers/atp/processors/one_flag_per_test.rb +0 -0
- data/lib/origen_testers/atp/processors/pre_cleaner.rb +0 -0
- data/lib/origen_testers/atp/processors/redundant_condition_remover.rb +0 -0
- data/lib/origen_testers/atp/processors/relationship.rb +0 -0
- data/lib/origen_testers/atp/processors/sub_flow_remover.rb +0 -0
- data/lib/origen_testers/atp/program.rb +0 -0
- data/lib/origen_testers/atp/runner.rb +0 -0
- data/lib/origen_testers/atp/validator.rb +0 -0
- data/lib/origen_testers/atp/validators/condition.rb +0 -0
- data/lib/origen_testers/atp/validators/duplicate_ids.rb +0 -0
- data/lib/origen_testers/atp/validators/flags.rb +0 -0
- data/lib/origen_testers/atp/validators/jobs.rb +0 -0
- data/lib/origen_testers/atp/validators/missing_ids.rb +0 -0
- data/lib/origen_testers/atp_deprecation.rb +0 -0
- data/lib/origen_testers/basic_test_setups.rb +0 -0
- data/lib/origen_testers/callback_handlers.rb +0 -0
- data/lib/origen_testers/command_based_tester.rb +0 -0
- data/lib/origen_testers/decompiler.rb +9 -0
- data/lib/origen_testers/decompiler/decompiler_api.rb +163 -0
- data/lib/origen_testers/decompiler/nodes.rb +141 -0
- data/lib/origen_testers/decompiler/pattern.rb +304 -0
- data/lib/origen_testers/decompiler/pattern/elements/base.rb +44 -0
- data/lib/origen_testers/decompiler/pattern/elements/comment_block.rb +28 -0
- data/lib/origen_testers/decompiler/pattern/elements/frontmatter.rb +42 -0
- data/lib/origen_testers/decompiler/pattern/elements/pinlist.rb +44 -0
- data/lib/origen_testers/decompiler/pattern/elements/vector.rb +59 -0
- data/lib/origen_testers/decompiler/pattern/elements/vector_body_element.rb +105 -0
- data/lib/origen_testers/decompiler/pattern/enumerable_ext.rb +173 -0
- data/lib/origen_testers/decompiler/pattern/parsers.rb +111 -0
- data/lib/origen_testers/decompiler/pattern/spec_helpers.rb +41 -0
- data/lib/origen_testers/decompiler/pattern/splitter.rb +166 -0
- data/lib/origen_testers/decompiler/pattern/vector_delimiter_base.rb +70 -0
- data/lib/origen_testers/flow.rb +0 -0
- data/lib/origen_testers/generator/identity_map.rb +0 -0
- data/lib/origen_testers/generator/placeholder.rb +0 -0
- data/lib/origen_testers/generator/test_numberer.rb +0 -0
- data/lib/origen_testers/igxl_based_tester.rb +3 -0
- data/lib/origen_testers/igxl_based_tester/base.rb +8 -1
- data/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patset.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patsets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/decompiler.rb +72 -0
- data/lib/origen_testers/igxl_based_tester/decompiler/atp.rb +98 -0
- data/lib/origen_testers/igxl_based_tester/decompiler/nodes.rb +77 -0
- data/lib/origen_testers/igxl_based_tester/files.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750.rb +1 -1
- data/lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/generator.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/custom_test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/flows.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +0 -0
- data/lib/origen_testers/labview_based_tester.rb +0 -0
- data/lib/origen_testers/memory_style.rb +0 -0
- data/lib/origen_testers/no_interface.rb +0 -0
- data/lib/origen_testers/origen_ext/application/runner.rb +0 -0
- data/lib/origen_testers/origen_ext/generator.rb +0 -0
- data/lib/origen_testers/origen_ext/generator/flow.rb +0 -0
- data/lib/origen_testers/origen_ext/generator/pattern.rb +0 -0
- data/lib/origen_testers/origen_ext/generator/resources.rb +0 -0
- data/lib/origen_testers/origen_ext/pins/timing.rb +57 -0
- data/lib/origen_testers/origen_ext/pins/timing/timeset.rb +29 -0
- data/lib/origen_testers/parser.rb +0 -0
- data/lib/origen_testers/parser/description_lookup.rb +0 -0
- data/lib/origen_testers/parser/searchable_array.rb +0 -0
- data/lib/origen_testers/parser/searchable_hash.rb +0 -0
- data/lib/origen_testers/pattern_compilers.rb +0 -0
- data/lib/origen_testers/pattern_compilers/assembler.rb +0 -0
- data/lib/origen_testers/pattern_compilers/base.rb +0 -0
- data/lib/origen_testers/pattern_compilers/igxl_based.rb +0 -0
- data/lib/origen_testers/pattern_compilers/j750.rb +0 -0
- data/lib/origen_testers/pattern_compilers/job.rb +0 -0
- data/lib/origen_testers/pattern_compilers/runner.rb +0 -0
- data/lib/origen_testers/pattern_compilers/templates/template.aiv.erb +0 -0
- data/lib/origen_testers/pattern_compilers/ultraflex.rb +0 -0
- data/lib/origen_testers/pattern_compilers/v93k.rb +0 -0
- data/lib/origen_testers/pattern_compilers/v93k/digcap.rb +13 -8
- data/lib/origen_testers/pattern_compilers/v93k/multiport.rb +0 -0
- data/lib/origen_testers/program_generators.rb +0 -0
- data/lib/origen_testers/smartest_based_tester.rb +2 -0
- data/lib/origen_testers/smartest_based_tester/base.rb +2 -2
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/limits_file.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_bin_names.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_flow_vars.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/decompiler.rb +43 -0
- data/lib/origen_testers/smartest_based_tester/decompiler/avc.rb +76 -0
- data/lib/origen_testers/smartest_based_tester/decompiler/nodes.rb +23 -0
- data/lib/origen_testers/smartest_based_tester/smt7.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/smt8.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/limits_file.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/limits.csv.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/flow.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/generator.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/limits_file.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/limits_workbook.rb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/limits.csv.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/template.flow.erb +0 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/test_suite.rb +0 -0
- data/lib/origen_testers/stil_based_tester.rb +0 -0
- data/lib/origen_testers/stil_based_tester/base.rb +6 -6
- data/lib/origen_testers/stil_based_tester/d10.rb +0 -0
- data/lib/origen_testers/stil_based_tester/stil.rb +0 -0
- data/lib/origen_testers/test/basic_interface.rb +0 -0
- data/lib/origen_testers/test/block.rb +0 -0
- data/lib/origen_testers/test/complex_timing.rb +22 -0
- data/lib/origen_testers/test/custom_test_interface.rb +0 -0
- data/lib/origen_testers/test/dummy_decompiler.rb +106 -0
- data/lib/origen_testers/test/dut.rb +12 -0
- data/lib/origen_testers/test/dut2.rb +19 -6
- data/lib/origen_testers/test/dut_adv_timing.rb +0 -0
- data/lib/origen_testers/test/empty_dut.rb +12 -0
- data/lib/origen_testers/test/interface.rb +0 -0
- data/lib/origen_testers/test/nvm.rb +0 -0
- data/lib/origen_testers/timing.rb +108 -305
- data/lib/origen_testers/timing/timeset.rb +141 -0
- data/lib/origen_testers/timing/timing_api.rb +307 -0
- data/lib/origen_testers/vector.rb +0 -0
- data/lib/origen_testers/vector_based_tester.rb +0 -0
- data/lib/origen_testers/vector_generator.rb +1 -0
- data/lib/origen_testers/vector_pipeline.rb +0 -0
- data/pattern/bitmap.rb +0 -0
- data/pattern/dc_instr.rb +0 -0
- data/pattern/decompile.rb +4 -0
- data/pattern/delay.rb +0 -0
- data/pattern/freq_counter.rb +0 -0
- data/pattern/mem_test.rb +0 -0
- data/pattern/multi_vector.rb +0 -0
- data/pattern/multi_vector_plus1.rb +0 -0
- data/pattern/nvm/j750/add_late_pins.rb +0 -0
- data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +0 -0
- data/pattern/nvm/j750/iterator_test_x_bx.rb +0 -0
- data/pattern/nvm/j750/j750_halt.rb +0 -0
- data/pattern/nvm/j750/j750_workout.rb +0 -0
- data/pattern/nvm/j750/timing.rb +4 -4
- data/pattern/nvm/v93k/v93k_workout.rb +0 -0
- data/pattern/pin_flip.rb +9 -0
- data/pattern/read_write_reg.rb +0 -0
- data/pattern/reset.rb +0 -0
- data/pattern/simple.rb +4 -0
- data/pattern/single_overlay_store.rb +0 -0
- data/pattern/subroutines.rb +0 -0
- data/pattern/tester_overlay.rb +0 -0
- data/pattern/tester_store.rb +0 -0
- data/program/_additional_erase.rb +0 -0
- data/program/_efa_resources.rb +0 -0
- data/program/_erase.rb +0 -0
- data/program/_erase_vfy.rb +0 -0
- data/program/_iv_resources.rb +0 -0
- data/program/basic_interface.rb +0 -0
- data/program/components/_deep_nested.rb +0 -0
- data/program/components/_prb2_main.rb +0 -0
- data/program/components/_small.rb +0 -0
- data/program/components/_temp.rb +0 -0
- data/program/custom_tests.rb +0 -0
- data/program/flow_control.rb +0 -0
- data/program/prb1.rb +0 -0
- data/program/prb1_resources.rb +0 -0
- data/program/prb2.rb +0 -0
- data/program/test.rb +0 -0
- data/templates/example.txt.erb +0 -0
- data/templates/j750/_vt_flow.txt.erb +0 -0
- data/templates/j750/_vt_instances.txt.erb +0 -0
- data/templates/j750/program_sheet.txt.erb +0 -0
- data/templates/manifest/v93k.yaml.erb +0 -0
- data/templates/origen_guides/decompilation/decompilerapi.md.erb +192 -0
- data/templates/origen_guides/decompilation/overview.md.erb +214 -0
- data/templates/origen_guides/decompilation/platformspecifics.md.erb +291 -0
- data/templates/origen_guides/decompilation/universalapi.md.erb +598 -0
- data/templates/origen_guides/pattern/common.md.erb +0 -0
- data/templates/origen_guides/pattern/creating.md.erb +0 -0
- data/templates/origen_guides/pattern/custom.md.erb +0 -0
- data/templates/origen_guides/pattern/documenting.md.erb +0 -0
- data/templates/origen_guides/pattern/introduction.md.erb +0 -0
- data/templates/origen_guides/pattern/j750.md.erb +0 -0
- data/templates/origen_guides/pattern/name.md.erb +0 -0
- data/templates/origen_guides/pattern/pins.md.erb +0 -0
- data/templates/origen_guides/pattern/registers.md.erb +0 -0
- data/templates/origen_guides/pattern/running.md.erb +0 -0
- data/templates/origen_guides/pattern/stil.md.erb +0 -0
- data/templates/origen_guides/pattern/timing.md.erb +205 -2
- data/templates/origen_guides/pattern/ultraflex.md.erb +0 -0
- data/templates/origen_guides/pattern/v93k.md.erb +0 -0
- data/templates/origen_guides/program/code.md.erb +0 -0
- data/templates/origen_guides/program/custom.md.erb +0 -0
- data/templates/origen_guides/program/doc.md.erb +0 -0
- data/templates/origen_guides/program/flowapi.md.erb +0 -0
- data/templates/origen_guides/program/flows.md.erb +0 -0
- data/templates/origen_guides/program/generating.md.erb +0 -0
- data/templates/origen_guides/program/interface.md.erb +0 -0
- data/templates/origen_guides/program/introduction.md.erb +0 -0
- data/templates/origen_guides/program/j750.md.erb +0 -0
- data/templates/origen_guides/program/philosophy.md.erb +0 -0
- data/templates/origen_guides/program/resources.md.erb +0 -0
- data/templates/origen_guides/program/ultraflex.md.erb +0 -0
- data/templates/origen_guides/program/v93k.md.erb +0 -0
- data/templates/origen_guides/program/v93ksmt7.md.erb +0 -0
- data/templates/origen_guides/program/v93ksmt8.md.erb +0 -0
- data/templates/web/index.md.erb +0 -0
- data/templates/web/layouts/_basic.html.erb +0 -0
- data/templates/web/layouts/_guides.html.erb +0 -0
- data/templates/web/partials/_navbar.html.erb +0 -0
- data/templates/web/partials/_placeholder.md.erb +0 -0
- data/templates/web/release_notes.md.erb +0 -0
- metadata +61 -3
@@ -0,0 +1,141 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module Timing
|
3
|
+
class InvalidModification < Origen::OrigenError
|
4
|
+
end
|
5
|
+
|
6
|
+
class Timeset
|
7
|
+
attr_accessor :name, :cycled, :called
|
8
|
+
attr_reader :period_in_ns
|
9
|
+
|
10
|
+
def initialize(attrs = {})
|
11
|
+
@cycled = false
|
12
|
+
@locked = false
|
13
|
+
@called = false
|
14
|
+
|
15
|
+
attrs.each do |name, value|
|
16
|
+
send("#{name}=", value)
|
17
|
+
end
|
18
|
+
|
19
|
+
self.period_in_ns = attrs[:period_in_ns]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns true if the timeset has a shorter period than the supplied timeset
|
23
|
+
def shorter_period_than?(timeset)
|
24
|
+
period_in_ns < timeset.period_in_ns
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns true if <code>tester.cycle</code> has been called while this
|
28
|
+
# timeset was the current timeset.
|
29
|
+
# @return [true, false] <code>true</code> if this timeset has been cycled, <code>false</code> otherwise.
|
30
|
+
def cycled?
|
31
|
+
@cycled
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns true if this timeset does not allow changes to its period_in_ns
|
35
|
+
def locked?
|
36
|
+
@locked
|
37
|
+
end
|
38
|
+
alias_method :period_in_ns_locked?, :locked?
|
39
|
+
alias_method :period_locked?, :locked?
|
40
|
+
alias_method :locked, :locked?
|
41
|
+
|
42
|
+
# Locks the current value of the timeset's period_in_ns. Attempts to further
|
43
|
+
# adjust the period_in_ns will results in an exception.
|
44
|
+
# @return [true, false] <code>true</code> if the period_in_ns has been locked, <code>false</code> otherwise.
|
45
|
+
def lock!
|
46
|
+
@locked = true
|
47
|
+
end
|
48
|
+
alias_method :lock_period!, :lock!
|
49
|
+
alias_method :lock_period_in_ns!, :lock!
|
50
|
+
|
51
|
+
# Sets the period_in_ns of this timeset and issues a callback to the <code>tester's #set_timeset</code>
|
52
|
+
# method, if this timeset is the current timeset, keeping the tester in
|
53
|
+
# sync with the changes to this timeset.
|
54
|
+
# @raise [InvalidModification] If the timeset is locked.
|
55
|
+
# @raise [InvalidModification] If period_in_ns is changed after the tester has been cycled using this timeset.
|
56
|
+
# @return [Fixnum] The updated period in ns.
|
57
|
+
def period_in_ns=(p)
|
58
|
+
self._period_in_ns_ = p
|
59
|
+
|
60
|
+
# If this is the current timeset, reset the timeset from the tester
|
61
|
+
# side to verify that everything is in sync. Otherwise, the period_in_ns
|
62
|
+
# here may not match what the tester/DUT has.
|
63
|
+
if current_timeset?
|
64
|
+
OrigenTesters::Timing.set_timeset(name, p)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return the period
|
68
|
+
p
|
69
|
+
end
|
70
|
+
|
71
|
+
# Indicates whether a period_in_ns has been defined for this timeset.
|
72
|
+
# @return [true, false] <code>true</code> if the period_in_ns has been set, <code>false</code> otherwise.
|
73
|
+
def period_in_ns?
|
74
|
+
!@period_in_ns.nil?
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns the current timeset in seconds
|
78
|
+
# @return [Float] Current period in seconds
|
79
|
+
def period_in_secs
|
80
|
+
if period_in_ns
|
81
|
+
period_in_ns * (10**-9)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
alias_method :period_in_seconds, :period_in_secs
|
85
|
+
|
86
|
+
# Indicates whether this timeset is the current timeset.
|
87
|
+
# @return [true, false] <code>true</code> if this timeset is the current timeset, <code>false</code> otherwise.
|
88
|
+
def current_timeset?
|
89
|
+
OrigenTesters::Timing.timeset == self
|
90
|
+
end
|
91
|
+
|
92
|
+
# Indicates whether this timeset is or has been set as the current timeset.
|
93
|
+
# @return [true, false] <code>true</code> if this timeset is or has beent he current timeset, <code>false</code> otherwise.
|
94
|
+
def called?
|
95
|
+
@called
|
96
|
+
end
|
97
|
+
|
98
|
+
# Alias for the {#name} attr_reader.
|
99
|
+
def id
|
100
|
+
name.to_sym
|
101
|
+
end
|
102
|
+
|
103
|
+
def dut_timeset
|
104
|
+
dut.timesets[id]
|
105
|
+
end
|
106
|
+
|
107
|
+
def method_missing(m, *args, &block)
|
108
|
+
if dut_timeset && (dut_timeset.methods.include?(m) || dut_timeset.private_methods.include?(m))
|
109
|
+
dut_timeset.send(m, *args, &block)
|
110
|
+
else
|
111
|
+
super
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# @api private
|
116
|
+
def _period_in_ns_=(p)
|
117
|
+
if locked?
|
118
|
+
Origen.app.fail(
|
119
|
+
exception_class: InvalidModification,
|
120
|
+
message: "Timeset :#{@name}'s period_in_ns is locked to #{@period_in_ns} ns!"
|
121
|
+
)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Adding this causes examples in Origen (not OrigenTesters) to fail.
|
125
|
+
# Needs further discussion and potentially an Origen examples change.
|
126
|
+
# if cycled? && p != period_in_ns
|
127
|
+
# Origen.app!.fail(
|
128
|
+
# exception_class: InvalidModification,
|
129
|
+
# message: [
|
130
|
+
# "Timeset :#{name}'s period_in_ns cannot be changed after a cycle has occurred using this timeset!",
|
131
|
+
# " period_in_ns change occurred at #{caller[0]}",
|
132
|
+
# " Attempted to change period from #{@period_in_ns} to #{p}"
|
133
|
+
# ].join("\n")
|
134
|
+
# )
|
135
|
+
# end
|
136
|
+
@period_in_ns = p
|
137
|
+
@period_in_ns
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module Timing
|
3
|
+
module TimingAPI
|
4
|
+
# @see Timing#level_period
|
5
|
+
#
|
6
|
+
# When period levelling is enabled, vectors will be expanded like this:
|
7
|
+
# $tester.set_timeset("fast", 40)
|
8
|
+
# 2.cycles # fast 1 0 0 1 0
|
9
|
+
# # fast 1 0 0 1 0
|
10
|
+
# # Without levelling enabled
|
11
|
+
# $tester.set_timeset("slow", 80)
|
12
|
+
# 2.cycles # slow 1 0 0 1 0
|
13
|
+
# # slow 1 0 0 1 0
|
14
|
+
# # With levelling enabled
|
15
|
+
# $tester.set_timeset("slow", 80)
|
16
|
+
# 2.cycles # fast 1 0 0 1 0
|
17
|
+
# # fast 1 0 0 1 0
|
18
|
+
# # fast 1 0 0 1 0
|
19
|
+
# # fast 1 0 0 1 0
|
20
|
+
#
|
21
|
+
# The overall time of the levelled/expanded vectors matches that of the unlevelled
|
22
|
+
# case. i.e. 4 cycles at fast speed (4 * 40ns = 160ns) is equivalent to 2 cycles
|
23
|
+
# at slow speed (2 * 80ns = 160ns).
|
24
|
+
#
|
25
|
+
# However, what if pin 1 in the example above was a clk pin where the 1 -> 0 transition
|
26
|
+
# was handled by the timing setup for that pin.
|
27
|
+
# In that case the levelled code is no longer functionally correct since it contains
|
28
|
+
# 4 clock pulses while the unlevelled code only has 2.
|
29
|
+
#
|
30
|
+
# Such pins can be specified via this attribute and the levelling logic will then
|
31
|
+
# automatically adjust the drive state to keep the number of pulses correct.
|
32
|
+
# It would automatically adjust to the alternative logic state where 0 means 'on'
|
33
|
+
# and 1 means 'off' if applicable.
|
34
|
+
#
|
35
|
+
# $tester.timing_toggled_pins << $dut.pin(:tclk) # This is pin 1
|
36
|
+
#
|
37
|
+
# $tester.set_timeset("fast", 40)
|
38
|
+
# 2.cycles # fast 1 0 0 1 0
|
39
|
+
# # fast 1 0 0 1 0
|
40
|
+
# # Without levelling enabled
|
41
|
+
# $tester.set_timeset("slow", 80)
|
42
|
+
# 2.cycles # slow 1 0 0 1 0
|
43
|
+
# # slow 1 0 0 1 0
|
44
|
+
# # With levelling enabled
|
45
|
+
# $tester.set_timeset("slow", 80)
|
46
|
+
# 2.cycles # fast 1 0 0 1 0
|
47
|
+
# # fast 0 0 0 1 0
|
48
|
+
# # fast 1 0 0 1 0
|
49
|
+
# # fast 0 0 0 1 0
|
50
|
+
#
|
51
|
+
# Multiple pins an be specified like this:
|
52
|
+
# $tester.timing_toggled_pins = [$dut.pin(:tclk), $dut.pin(:clk)] # Overrides any pins added elsewhere
|
53
|
+
# $tester.timing_toggled_pins << [$dut.pin(:tclk), $dut.pin(:clk)] # In addition to any pins added elsewhere
|
54
|
+
def timing_toggled_pins
|
55
|
+
@timing_toggled_pins ||= []
|
56
|
+
@timing_toggled_pins.flatten!
|
57
|
+
@timing_toggled_pins
|
58
|
+
end
|
59
|
+
|
60
|
+
# Set the timeset for the next vectors, this will remain in place until the next
|
61
|
+
# time this is called.
|
62
|
+
#
|
63
|
+
# $tester.set_timeset("bist_25mhz", 40)
|
64
|
+
#
|
65
|
+
# This method also accepts a block in which case the contained vectors will generate
|
66
|
+
# with the supplied timeset and subsequent vectors will return to the previous timeset
|
67
|
+
# automatically.
|
68
|
+
#
|
69
|
+
# $tester.set_timeset("bist_25mhz", 40) do
|
70
|
+
# $tester.cycle
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# The arguments can also be supplied as a single array, or not at all. In the latter case
|
74
|
+
# the existing timeset will simply be preserved. This is useful if you have timesets that
|
75
|
+
# can be conditionally set based on the target.
|
76
|
+
#
|
77
|
+
# # Target 1
|
78
|
+
# $soc.readout_timeset = ["readout", 120]
|
79
|
+
# # Target 2
|
80
|
+
# $soc.readout_timeset = false
|
81
|
+
#
|
82
|
+
# # This code is compatible with both targets, in the first case the timeset will switch
|
83
|
+
# # over, in the second case the existing timeset will be preserved.
|
84
|
+
# $tester.set_timeset($soc.readout_timeset) do
|
85
|
+
# $tester.cycle
|
86
|
+
# end
|
87
|
+
def set_timeset(timeset, period_in_ns = nil, &block)
|
88
|
+
OrigenTesters::Timing.set_timeset(timeset, period_in_ns, &block)
|
89
|
+
end
|
90
|
+
alias_method :with_timeset, :set_timeset
|
91
|
+
|
92
|
+
def timesets
|
93
|
+
OrigenTesters::Timing.timesets
|
94
|
+
end
|
95
|
+
|
96
|
+
def timeset?(t)
|
97
|
+
OrigenTesters::Timing.timeset?(t)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns the timeset (a Timeset object) with the shortest period that has been
|
101
|
+
# encountered so far in the course of generating the current pattern.
|
102
|
+
#
|
103
|
+
# A tester object is re-instantiated at the start of every pattern which will reset
|
104
|
+
# this variable.
|
105
|
+
def min_period_timeset
|
106
|
+
OrigenTesters::Timing.min_period_timeset
|
107
|
+
end
|
108
|
+
|
109
|
+
def before_timeset_change(options = {})
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns the current period in ns, or nil, if no timeset has been set.
|
113
|
+
def period_in_ns
|
114
|
+
OrigenTesters::Timing.period_in_ns
|
115
|
+
end
|
116
|
+
|
117
|
+
def period_in_secs
|
118
|
+
OrigenTesters::Timing.period_in_ns
|
119
|
+
end
|
120
|
+
alias_method :period_in_seconds, :period_in_secs
|
121
|
+
|
122
|
+
# Cause the pattern to wait.
|
123
|
+
# The following options are available to help you specify the time to wait:
|
124
|
+
# * :cycles - delays specified in raw cycles, the test model is responsible for translating this into a sequence of valid repeat statements
|
125
|
+
# * :time_in_ns - time specified in nano-seconds
|
126
|
+
# * :time_in_us - time specified in micro-seconds
|
127
|
+
# * :time_in_ms - time specified in milli-seconds
|
128
|
+
# * :time_in_s - time specified in seconds
|
129
|
+
# If more than one option is supplied they will get added together to give a final
|
130
|
+
# delay time expressed in cycles.
|
131
|
+
# ==== Examples
|
132
|
+
# $tester.wait(cycles: 100, time_in_ns: 200) # Wait for 100 cycles + 200ns
|
133
|
+
# This method can also be used to trigger a match loop in which case the supplied time
|
134
|
+
# becomes the time out for the match. See the J750#match method for full details of the
|
135
|
+
# available options.
|
136
|
+
# $tester.wait(match: true, state: :high, pin: $dut.pin(:done), time_in_ms: 500)
|
137
|
+
def wait(options = {})
|
138
|
+
options = {
|
139
|
+
cycles: 0,
|
140
|
+
time_in_cycles: 0,
|
141
|
+
time_in_us: 0,
|
142
|
+
time_in_ns: 0,
|
143
|
+
time_in_ms: 0,
|
144
|
+
time_in_s: 0,
|
145
|
+
match: false, # Set to true to invoke a match loop where the supplied delay
|
146
|
+
# will become the timeout duration
|
147
|
+
}.merge(options)
|
148
|
+
|
149
|
+
cycles = 0
|
150
|
+
cycles += options[:cycles] + options[:time_in_cycles]
|
151
|
+
cycles += s_to_cycles(options[:time_in_s])
|
152
|
+
cycles += ms_to_cycles(options[:time_in_ms])
|
153
|
+
cycles += us_to_cycles(options[:time_in_us])
|
154
|
+
cycles += ns_to_cycles(options[:time_in_ns])
|
155
|
+
|
156
|
+
time = cycles * current_period_in_ns # Total delay in ns
|
157
|
+
case
|
158
|
+
when time < 1000 # When less than 1us
|
159
|
+
cc "Wait for #{'a maximum of ' if options[:match]}#{time}ns"
|
160
|
+
when time < 1_000_000 # When less than 1ms
|
161
|
+
cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1000).round(1)}us" # Display delay in us
|
162
|
+
when time < 1_000_000_000 # When less than 1s
|
163
|
+
cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1_000_000).round(1)}ms"
|
164
|
+
else
|
165
|
+
cc "Wait for #{'a maximum of ' if options[:match]}%.2fs" % (time.to_f / 1_000_000_000)
|
166
|
+
end
|
167
|
+
|
168
|
+
if cycles > 0 # Allow this function to be called with 0 in which case it will just return
|
169
|
+
if options[:match]
|
170
|
+
if block_given?
|
171
|
+
match_block(cycles, options) { yield }
|
172
|
+
else
|
173
|
+
match(options[:pin], options[:state], cycles, options)
|
174
|
+
end
|
175
|
+
else
|
176
|
+
delay(cycles)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# @see Timing#wait
|
182
|
+
# @api private
|
183
|
+
# This should not be called directly, call via tester#wait
|
184
|
+
def delay(cycles, options = {})
|
185
|
+
(cycles / max_repeat_loop).times do
|
186
|
+
if block_given?
|
187
|
+
yield options.merge(repeat: max_repeat_loop)
|
188
|
+
else
|
189
|
+
cycle(options.merge(repeat: max_repeat_loop))
|
190
|
+
end
|
191
|
+
end
|
192
|
+
if block_given?
|
193
|
+
yield options.merge(repeat: (cycles % max_repeat_loop))
|
194
|
+
else
|
195
|
+
cycle(options.merge(repeat: (cycles % max_repeat_loop)))
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def max_repeat_loop
|
200
|
+
@max_repeat_loop || 65_535
|
201
|
+
end
|
202
|
+
|
203
|
+
def min_repeat_loop
|
204
|
+
@min_repeat_loop
|
205
|
+
end
|
206
|
+
|
207
|
+
# Returns any timesets that have been called during this execution.
|
208
|
+
# @return [Array] Array of OrigenTesters::Timing::Timeset objects that have been used so far.
|
209
|
+
def called_timesets
|
210
|
+
OrigenTesters::Timing.called_timesets
|
211
|
+
end
|
212
|
+
alias_method :called_timesets_by_instance, :called_timesets
|
213
|
+
|
214
|
+
# Similar to {#called_timesets}, but returns the name of the timesets instead.
|
215
|
+
# @return [Array] Array of names corresponding to the timesets that have been used so far.
|
216
|
+
def called_timesets_by_name
|
217
|
+
OrigenTesters::Timing.called_timesets_by_name
|
218
|
+
end
|
219
|
+
|
220
|
+
def current_period_in_ns
|
221
|
+
OrigenTesters::Timing.current_period_in_ns
|
222
|
+
end
|
223
|
+
alias_method :current_period, :current_period_in_ns
|
224
|
+
alias_method :period, :current_period_in_ns
|
225
|
+
|
226
|
+
def current_timeset
|
227
|
+
OrigenTesters::Timing.current_timeset
|
228
|
+
end
|
229
|
+
alias_method :timeset, :current_timeset
|
230
|
+
|
231
|
+
# Convert the supplied number of cycles to a time, based on the SoC defined cycle period
|
232
|
+
def cycles_to_time(cycles) # :nodoc:
|
233
|
+
(cycles * current_period_in_ns).to_f / 1_000_000_000
|
234
|
+
end
|
235
|
+
|
236
|
+
# This function can be used to generate a clock or some other repeating function
|
237
|
+
# that spans accross a range of vectors.
|
238
|
+
# The period of each cycle and the duration of the sequence are supplied via the following
|
239
|
+
# options:
|
240
|
+
# * :period_in_cycles
|
241
|
+
# * :period_in_ns
|
242
|
+
# * :period_in_us
|
243
|
+
# * :period_in_ms
|
244
|
+
# * :duration_in_cycles
|
245
|
+
# * :duration_in_ns
|
246
|
+
# * :duration_in_us
|
247
|
+
# * :duration_in_ms
|
248
|
+
# If multiple definitions for either option are supplied then they will be added
|
249
|
+
# together.
|
250
|
+
# ==== Example
|
251
|
+
# # Supply a clock pulse on :pinA for 100ms
|
252
|
+
# $tester.count(:period_in_cycles => 10, :duration_in_ms => 100) do
|
253
|
+
# $top.pin(:pinA).drive!(1)
|
254
|
+
# $top.pin(:pinA).drive!(0)
|
255
|
+
# end
|
256
|
+
def count(options = {})
|
257
|
+
options = { period_in_cycles: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0,
|
258
|
+
duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0
|
259
|
+
}.merge(options)
|
260
|
+
|
261
|
+
period_cycles = options[:period_in_cycles] + ms_to_cycles(options[:period_in_ms]) +
|
262
|
+
us_to_cycles(options[:period_in_us]) + ns_to_cycles(options[:period_in_ns])
|
263
|
+
|
264
|
+
duration_cycles = options[:duration_in_cycles] + ms_to_cycles(options[:duration_in_ms]) +
|
265
|
+
us_to_cycles(options[:duration_in_us]) + ns_to_cycles(options[:duration_in_ns])
|
266
|
+
|
267
|
+
total = 0
|
268
|
+
while total < duration_cycles
|
269
|
+
wait(time_in_cycles: period_cycles)
|
270
|
+
yield # Return control back to caller
|
271
|
+
total += period_cycles
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
private
|
276
|
+
|
277
|
+
def s_to_cycles(time) # :nodoc:
|
278
|
+
((time.to_f) * 1000 * 1000 * 1000 / current_period_in_ns).to_int
|
279
|
+
end
|
280
|
+
|
281
|
+
def ms_to_cycles(time) # :nodoc:
|
282
|
+
((time.to_f) * 1000 * 1000 / current_period_in_ns).to_int
|
283
|
+
end
|
284
|
+
|
285
|
+
def us_to_cycles(time) # :nodoc:
|
286
|
+
((time.to_f * 1000) / current_period_in_ns).to_int
|
287
|
+
end
|
288
|
+
|
289
|
+
def ns_to_cycles(time) # :nodoc:
|
290
|
+
(time.to_f / current_period_in_ns).to_int
|
291
|
+
end
|
292
|
+
|
293
|
+
def cycles_to_us(cycles) # :nodoc:
|
294
|
+
((cycles.to_f * current_period_in_ns) / (1000)).ceil
|
295
|
+
end
|
296
|
+
|
297
|
+
def cycles_to_ms(cycles) # :nodoc:
|
298
|
+
((cycles.to_f * current_period_in_ns) / (1000 * 1000)).ceil
|
299
|
+
end
|
300
|
+
|
301
|
+
# Cycles to tenths of a second
|
302
|
+
def cycles_to_ts(cycles) # :nodoc:
|
303
|
+
((cycles.to_f * current_period_in_ns) / (1000 * 1000 * 100)).ceil
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
File without changes
|
File without changes
|