diff --git a/Gemfile.lock b/Gemfile.lock index 26c544a7..a85f2e67 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,8 +31,6 @@ GEM thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) ast (2.4.2) - astrolabe (1.3.1) - parser (~> 2.2) atp (1.1.3) ast (~> 2) origen (>= 0.2.3) @@ -42,9 +40,8 @@ GEM coderay (1.1.3) colored (1.2) colorize (0.8.1) - concurrent-ruby (1.2.0) - cri (2.10.1) - colored (~> 1.2) + concurrent-ruby (1.2.2) + cri (2.15.11) dentaku (3.5.1) concurrent-ruby diff-lcs (1.5.0) @@ -58,39 +55,39 @@ GEM i18n (0.9.5) concurrent-ruby (~> 1.0) json (2.6.3) - kramdown (1.17.0) + kramdown (2.4.0) + rexml method_source (1.0.0) mini_mime (1.1.2) mini_portile2 (2.8.1) - minitest (5.17.0) + minitest (5.18.0) multi_xml (0.6.0) nanoc (3.7.5) cri (~> 2.3) - net-ldap (0.17.1) - nokogiri (1.13.10) + net-ldap (0.18.0) + nokogiri (1.14.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) - origen (0.60.7) + origen (0.60.11) activesupport (~> 4.1) bundler (> 1.7) coderay (~> 1.1) colored (~> 1.2) colorize (~> 0.8.1) concurrent-ruby - cri (~> 2.10.0) dentaku (~> 3) gems (~> 0.8) highline (~> 1.7) httparty (~> 0.13) - kramdown (~> 1.5) + kramdown (~> 2.4) nanoc (~> 3.7.0) net-ldap (~> 0.13) - nokogiri (>= 1.7.2) + nokogiri (>= 1.11.0) pry (~> 0.10) rake (~> 10) rspec (~> 3) rspec-legacy_formatters (~> 1) - rubocop (= 0.30) + rubocop (= 1.28) scrub_rb (~> 1.0) simplecov (~> 0.17) simplecov-html (~> 0.10) @@ -107,18 +104,19 @@ GEM origen_testers (>= 0.13.2) origen_swd (1.1.2) origen (>= 0.7.36) - parser (2.7.2.0) + parallel (1.23.0) + parser (3.2.2.1) ast (~> 2.4.1) polyglot (0.3.5) - powerpack (0.1.3) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) racc (1.6.2) - rainbow (2.2.2) - rake + rainbow (3.1.1) rake (10.5.0) + regexp_parser (2.8.0) require_all (1.5.0) + rexml (3.2.5) ripper-tags (0.9.1) rodf (1.2.0) builder (>= 3.0) @@ -127,24 +125,29 @@ GEM rspec-core (~> 3.12.0) rspec-expectations (~> 3.12.0) rspec-mocks (~> 3.12.0) - rspec-core (3.12.1) + rspec-core (3.12.2) rspec-support (~> 3.12.0) - rspec-expectations (3.12.2) + rspec-expectations (3.12.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-legacy_formatters (1.0.2) rspec (~> 3.0) - rspec-mocks (3.12.3) + rspec-mocks (3.12.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-support (3.12.0) - rubocop (0.30.0) - astrolabe (~> 1.3) - parser (>= 2.2.0.1, < 3.0) - powerpack (~> 0.1) - rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.4) - ruby-progressbar (1.11.0) + rubocop (1.28.0) + parallel (~> 1.10) + parser (>= 3.1.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.17.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.28.0) + parser (>= 3.2.1.0) + ruby-progressbar (1.13.0) rubyzip (1.3.0) scrub_rb (1.0.1) sexpistol (0.0.7) @@ -159,9 +162,8 @@ GEM polyglot (~> 0.3) tzinfo (1.2.11) thread_safe (~> 0.1) - webrick (1.7.0) - yard (0.9.28) - webrick (~> 1.7.0) + unicode-display_width (2.4.2) + yard (0.9.34) yard-activesupport-concern (0.0.1) yard (>= 0.8) diff --git a/approved/j750_literals/flow_control_literals_flow.txt b/approved/j750_literals/flow_control_literals_flow.txt index 7f987a44..9dd7fddc 100644 --- a/approved/j750_literals/flow_control_literals_flow.txt +++ b/approved/j750_literals/flow_control_literals_flow.txt @@ -3,41 +3,41 @@ DFF 1.1 Flow Table Gate Command Bin Number Sort Number Flag Group Device Debug Label Enable Job Part Env Opcode Parameter TName TNum Pass Fail Pass Fail Result Pass Fail State Specifier Sense Condition Name Sense Condition Name Assume Sites Comment logprint Test_that_if_failed_works_using_Literal - Test read1 read1 50000 10 None Test__Flag1_06D8931_FAILED - Test erase1 erase1 50010 12 Fail flag-true Test__Flag1_06D8931_FAILED + Test read1 read1 50000 10 None f_Test__Flag1_06D8931 + Test erase1 erase1 50010 12 Fail flag-true f_Test__Flag1_06D8931 logprint Test_the_block_form_of_if_failed - Test read2 read2 50020 10 None Test__Flag2_06D8931_FAILED - Test erase2 erase2 50030 Fail flag-true Test__Flag2_06D8931_FAILED - Test erase2 erase2 50040 Fail flag-true Test__Flag2_06D8931_FAILED + Test read2 read2 50020 10 None f_Test__Flag2_06D8931 + Test erase2 erase2 50030 Fail flag-true f_Test__Flag2_06D8931 + Test erase2 erase2 50040 Fail flag-true f_Test__Flag2_06D8931 logprint Test_that_if_passed_works - Test read1 read1 50050 10 None Test__Flag3_06D8931_PASSED - Test pgm1 pgm1 50060 Fail flag-true Test__Flag3_06D8931_PASSED + Test read1 read1 50050 10 None p_Test__Flag3_06D8931 + Test pgm1 pgm1 50060 Fail flag-true p_Test__Flag3_06D8931 logprint Test_the_block_form_of_if_passed - Test read2 read2 50070 10 None Test__Flag4_06D8931_PASSED - Test pgm1 pgm1 50080 Fail flag-true Test__Flag4_06D8931_PASSED - Test pgm1 pgm1 50090 Fail flag-true Test__Flag4_06D8931_PASSED + Test read2 read2 50070 10 None p_Test__Flag4_06D8931 + Test pgm1 pgm1 50080 Fail flag-true p_Test__Flag4_06D8931 + Test pgm1 pgm1 50090 Fail flag-true p_Test__Flag4_06D8931 logprint Test_that_if_ran_works Test pgm pgm 50100 10 Fail - defaults Test__Flag5_06D8931_RAN - flag-true Test__Flag5_06D8931_RAN - Test read0 read0 50110 Fail flag-true Test__Flag5_06D8931_RAN + defaults r_Test__Flag5_06D8931 + flag-true r_Test__Flag5_06D8931 + Test read0 read0 50110 Fail flag-true r_Test__Flag5_06D8931 logprint Test_the_block_form_of_if_ran Test pgm pgm 50120 10 Fail - defaults Test__Flag6_06D8931_RAN - flag-true Test__Flag6_06D8931_RAN - Test read0 read0 50130 Fail flag-true Test__Flag6_06D8931_RAN - Test read0 read0 50140 Fail flag-true Test__Flag6_06D8931_RAN + defaults r_Test__Flag6_06D8931 + flag-true r_Test__Flag6_06D8931 + Test read0 read0 50130 Fail flag-true r_Test__Flag6_06D8931 + Test read0 read0 50140 Fail flag-true r_Test__Flag6_06D8931 logprint Test_that_unless_ran_works Test pgm pgm 50150 10 Fail - defaults Test__Flag7_06D8931_RAN - flag-true Test__Flag7_06D8931_RAN - Test read0 read0 50160 Fail not flag-true Test__Flag7_06D8931_RAN + defaults r_Test__Flag7_06D8931 + flag-true r_Test__Flag7_06D8931 + Test read0 read0 50160 Fail not flag-true r_Test__Flag7_06D8931 logprint Test_the_block_form_of_unless_ran Test pgm pgm 50170 10 Fail - defaults Test__Flag8_06D8931_RAN - flag-true Test__Flag8_06D8931_RAN - Test read0 read0 50180 Fail not flag-true Test__Flag8_06D8931_RAN - Test read0 read0 50190 Fail not flag-true Test__Flag8_06D8931_RAN + defaults r_Test__Flag8_06D8931 + flag-true r_Test__Flag8_06D8931 + Test read0 read0 50180 Fail not flag-true r_Test__Flag8_06D8931 + Test read0 read0 50190 Fail not flag-true r_Test__Flag8_06D8931 logprint Test_that_if_enable_works Extras__123 Test extra_test extra_test 50270 Fail logprint Test_the_block_form_of_if_enable @@ -53,77 +53,81 @@ DFF 1.1 Flow Table Test long_test2 long_test2 50320 Fail LABEL_2_06D8931 nop logprint Test_that_if_any_failed_works - Test test1 test1 50330 None iFA__1_06D8931_FAILED - Test test2 test2 50340 None iFA__2_06D8931_FAILED - defaults iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED - flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED flag-true iFA__1_06D8931_FAILED - flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED flag-true iFA__2_06D8931_FAILED - Test test3 test3 50350 Fail flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED + Test test1 test1 50330 None f_iFA__1_06D8931 + Test test2 test2 50340 None f_iFA__2_06D8931 + defaults f_iFA__1_06D8931_OR_f_iFA__2_06D8931 + flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 flag-true f_iFA__1_06D8931 + flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 flag-true f_iFA__2_06D8931 + Test test3 test3 50350 Fail flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 logprint Test_the_block_form_of_if_any_failed - Test test1 test1 50360 None OOF__Passcode1_06D8931_FAILED - Test test2 test2 50370 None OOF__Passcode2_06D8931_FAILED - defaults OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED - flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED flag-true OOF__Passcode1_06D8931_FAILED - flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED flag-true OOF__Passcode2_06D8931_FAILED - Test test3 test3 50380 Fail flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED - Test test4 test4 50390 Fail flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED + Test test1 test1 50360 None f_OOF__Passcode1_06D8931 + Test test2 test2 50370 None f_OOF__Passcode2_06D8931 + defaults f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 + flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 flag-true f_OOF__Passcode1_06D8931 + flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 flag-true f_OOF__Passcode2_06D8931 + Test test3 test3 50380 Fail flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 + Test test4 test4 50390 Fail flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 logprint Test_that_if_all_failed_works - Test test1 test1 50400 None iFall__1_06D8931_FAILED - Test test2 test2 50410 None iFall__2_06D8931_FAILED - defaults iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED - flag-true iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED - flag-false iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED not flag-true iFall__2_06D8931_FAILED - flag-false iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED not flag-true iFall__1_06D8931_FAILED - Test test3 test3 50420 Fail flag-true iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED + Test test1 test1 50400 None f_iFall__1_06D8931 + Test test2 test2 50410 None f_iFall__2_06D8931 + defaults f_iFall__1_06D8931_AND_f_iFall__2_06D8931 + flag-true f_iFall__1_06D8931_AND_f_iFall__2_06D8931 + flag-false f_iFall__1_06D8931_AND_f_iFall__2_06D8931 not flag-true f_iFall__2_06D8931 + flag-false f_iFall__1_06D8931_AND_f_iFall__2_06D8931 not flag-true f_iFall__1_06D8931 + Test test3 test3 50420 Fail flag-true f_iFall__1_06D8931_AND_f_iFall__2_06D8931 logprint Test_the_block_form_of_if_all_failed - Test test1 test1 50430 None iFall__B1_06D8931_FAILED - Test test2 test2 50440 None iFall__B2_06D8931_FAILED - defaults iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - flag-false iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED not flag-true iFall__B2_06D8931_FAILED - flag-false iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED not flag-true iFall__B1_06D8931_FAILED - Test test3 test3 50450 Fail flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - Test test4 test4 50460 Fail flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED + Test test1 test1 50430 None f_iFall__B1_06D8931 + Test test2 test2 50440 None f_iFall__B2_06D8931 + defaults f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + flag-false f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 not flag-true f_iFall__B2_06D8931 + flag-false f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 not flag-true f_iFall__B1_06D8931 + Test test3 test3 50450 Fail flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + Test test4 test4 50460 Fail flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 logprint Test_that_if_any_passed_works - Test test1 test1 50470 None if__AP1_06D8931_PASSED - Test test2 test2 50480 None if__AP2_06D8931_PASSED - defaults if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED - flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED flag-true if__AP1_06D8931_PASSED - flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED flag-true if__AP2_06D8931_PASSED - Test test3 test3 50490 Fail flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED + Test test1 test1 50470 None p_if__AP1_06D8931 + Test test2 test2 50480 None p_if__AP2_06D8931 + defaults p_if__AP1_06D8931_OR_p_if__AP2_06D8931 + flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 flag-true p_if__AP1_06D8931 + flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 flag-true p_if__AP2_06D8931 + Test test3 test3 50490 Fail flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 logprint Test_the_block_form_of_if_any_passed - Test test1 test1 50500 None if__APB1_06D8931_PASSED - Test test2 test2 50510 None if__APB2_06D8931_PASSED - defaults if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED - flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED flag-true if__APB1_06D8931_PASSED - flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED flag-true if__APB2_06D8931_PASSED - Test test3 test3 50520 Fail flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED - Test test4 test4 50530 Fail flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED + Test test1 test1 50500 None p_if__APB1_06D8931 + Test test2 test2 50510 None p_if__APB2_06D8931 + defaults p_if__APB1_06D8931_OR_p_if__APB2_06D8931 + flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 flag-true p_if__APB1_06D8931 + flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 flag-true p_if__APB2_06D8931 + Test test3 test3 50520 Fail flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 + Test test4 test4 50530 Fail flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 logprint Test_that_if_all_passed_works - Test test1 test1 50540 None iFall__P1_06D8931_PASSED - Test test2 test2 50550 None iFall__P2_06D8931_PASSED - defaults iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED - flag-true iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED - flag-false iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED not flag-true iFall__P2_06D8931_PASSED - flag-false iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED not flag-true iFall__P1_06D8931_PASSED - Test test3 test3 50560 Fail flag-true iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED + Test test1 test1 50540 None p_iFall__P1_06D8931 + Test test2 test2 50550 None p_iFall__P2_06D8931 + defaults p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 + flag-true p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 + flag-false p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 not flag-true p_iFall__P2_06D8931 + flag-false p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 not flag-true p_iFall__P1_06D8931 + Test test3 test3 50560 Fail flag-true p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 logprint Test_the_block_form_of_if_all_passed - Test test1 test1 50570 None iFall__PB1_06D8931_PASSED - Test test2 test2 50580 None iFall__PB2_06D8931_PASSED - defaults iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - flag-false iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED not flag-true iFall__PB2_06D8931_PASSED - flag-false iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED not flag-true iFall__PB1_06D8931_PASSED - Test test3 test3 50590 Fail flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - Test test4 test4 50600 Fail flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED + Test test1 test1 50570 None p_iFall__PB1_06D8931 + Test test2 test2 50580 None p_iFall__PB2_06D8931 + defaults p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + flag-false p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 not flag-true p_iFall__PB2_06D8931 + flag-false p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 not flag-true p_iFall__PB1_06D8931 + Test test3 test3 50590 Fail flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + Test test4 test4 50600 Fail flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 logprint Test_that_group-level_dependencies_work - Test grp1_test1 grp1_test1 50610 5 None Group__1_06D8931_FAILED_0 - defaults Group__1_06D8931_FAILED - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_0 - Test grp1_test2 grp1_test2 50620 5 None Group__1_06D8931_FAILED_1 - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_1 - Test grp1_test3 grp1_test3 50630 5 None Group__1_06D8931_FAILED_2 - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_2 - Test grp2_test1 grp2_test1 50640 5 Fail flag-true Group__1_06D8931_FAILED - Test grp2_test2 grp2_test2 50650 5 Fail flag-true Group__1_06D8931_FAILED - Test grp2_test3 grp2_test3 50660 5 Fail flag-true Group__1_06D8931_FAILED + Test grp1_test1 grp1_test1 50610 5 None f_Group__1_06D8931_0 + defaults f_Group__1_06D8931 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_0 + Test grp1_test2 grp1_test2 50620 5 None f_Group__1_06D8931_1 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_1 + Test grp1_test3 grp1_test3 50630 5 None f_Group__1_06D8931_2 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_2 + Test grp2_test1 grp2_test1 50640 5 Fail flag-true f_Group__1_06D8931 + Test grp2_test2 grp2_test2 50650 5 Fail flag-true f_Group__1_06D8931 + Test grp2_test3 grp2_test3 50660 5 Fail flag-true f_Group__1_06D8931 + logprint Test_that_if_failed_works_using_extern_and_exclude_flow_id + Test erase1 erase1 50670 12 Fail flag-true f_Test__extern_Flag1 + logprint Test_that_if_passed_works_using_extern_and_exclude_flow_id + Test erase1 erase1 50680 12 Fail flag-true p_Test__extern_Flag2 diff --git a/approved/ultraflex_literals/flow_control_literals_flow.txt b/approved/ultraflex_literals/flow_control_literals_flow.txt index ea16f40f..10d731cc 100644 --- a/approved/ultraflex_literals/flow_control_literals_flow.txt +++ b/approved/ultraflex_literals/flow_control_literals_flow.txt @@ -3,41 +3,41 @@ DTFlowtableSheet,version=2.2:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1 Fl Gate Command Limits Datalog Display Results Bin Number Sort Number Flag Group Device Debug Label Enable Job Part Env Opcode Parameter TName TNum LoLim HiLim Scale Units Format Pass Fail Pass Fail Result Pass Fail State Specifier Sense Condition Name Sense Condition Name Assume Sites Comment logprint Test_that_if_failed_works_using_Literal - Test read1 read1 50000 10 None Test__Flag1_06D8931_FAILED - Test erase1 erase1 50010 12 Fail flag-true Test__Flag1_06D8931_FAILED + Test read1 read1 50000 10 None f_Test__Flag1_06D8931 + Test erase1 erase1 50010 12 Fail flag-true f_Test__Flag1_06D8931 logprint Test_the_block_form_of_if_failed - Test read2 read2 50020 10 None Test__Flag2_06D8931_FAILED - Test erase2 erase2 50030 Fail flag-true Test__Flag2_06D8931_FAILED - Test erase2 erase2 50040 Fail flag-true Test__Flag2_06D8931_FAILED + Test read2 read2 50020 10 None f_Test__Flag2_06D8931 + Test erase2 erase2 50030 Fail flag-true f_Test__Flag2_06D8931 + Test erase2 erase2 50040 Fail flag-true f_Test__Flag2_06D8931 logprint Test_that_if_passed_works - Test read1 read1 50050 10 None Test__Flag3_06D8931_PASSED - Test pgm1 pgm1 50060 Fail flag-true Test__Flag3_06D8931_PASSED + Test read1 read1 50050 10 None p_Test__Flag3_06D8931 + Test pgm1 pgm1 50060 Fail flag-true p_Test__Flag3_06D8931 logprint Test_the_block_form_of_if_passed - Test read2 read2 50070 10 None Test__Flag4_06D8931_PASSED - Test pgm1 pgm1 50080 Fail flag-true Test__Flag4_06D8931_PASSED - Test pgm1 pgm1 50090 Fail flag-true Test__Flag4_06D8931_PASSED + Test read2 read2 50070 10 None p_Test__Flag4_06D8931 + Test pgm1 pgm1 50080 Fail flag-true p_Test__Flag4_06D8931 + Test pgm1 pgm1 50090 Fail flag-true p_Test__Flag4_06D8931 logprint Test_that_if_ran_works Test pgm pgm 50100 10 Fail - defaults Test__Flag5_06D8931_RAN - flag-true Test__Flag5_06D8931_RAN - Test read0 read0 50110 Fail flag-true Test__Flag5_06D8931_RAN + defaults r_Test__Flag5_06D8931 + flag-true r_Test__Flag5_06D8931 + Test read0 read0 50110 Fail flag-true r_Test__Flag5_06D8931 logprint Test_the_block_form_of_if_ran Test pgm pgm 50120 10 Fail - defaults Test__Flag6_06D8931_RAN - flag-true Test__Flag6_06D8931_RAN - Test read0 read0 50130 Fail flag-true Test__Flag6_06D8931_RAN - Test read0 read0 50140 Fail flag-true Test__Flag6_06D8931_RAN + defaults r_Test__Flag6_06D8931 + flag-true r_Test__Flag6_06D8931 + Test read0 read0 50130 Fail flag-true r_Test__Flag6_06D8931 + Test read0 read0 50140 Fail flag-true r_Test__Flag6_06D8931 logprint Test_that_unless_ran_works Test pgm pgm 50150 10 Fail - defaults Test__Flag7_06D8931_RAN - flag-true Test__Flag7_06D8931_RAN - Test read0 read0 50160 Fail not flag-true Test__Flag7_06D8931_RAN + defaults r_Test__Flag7_06D8931 + flag-true r_Test__Flag7_06D8931 + Test read0 read0 50160 Fail not flag-true r_Test__Flag7_06D8931 logprint Test_the_block_form_of_unless_ran Test pgm pgm 50170 10 Fail - defaults Test__Flag8_06D8931_RAN - flag-true Test__Flag8_06D8931_RAN - Test read0 read0 50180 Fail not flag-true Test__Flag8_06D8931_RAN - Test read0 read0 50190 Fail not flag-true Test__Flag8_06D8931_RAN + defaults r_Test__Flag8_06D8931 + flag-true r_Test__Flag8_06D8931 + Test read0 read0 50180 Fail not flag-true r_Test__Flag8_06D8931 + Test read0 read0 50190 Fail not flag-true r_Test__Flag8_06D8931 logprint Test_that_if_enable_works Extras__123 Test extra_test extra_test 50270 Fail logprint Test_the_block_form_of_if_enable @@ -53,77 +53,81 @@ DTFlowtableSheet,version=2.2:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1 Fl Test long_test2 long_test2 50320 Fail LABEL_2_06D8931 nop logprint Test_that_if_any_failed_works - Test test1 test1 50330 None iFA__1_06D8931_FAILED - Test test2 test2 50340 None iFA__2_06D8931_FAILED - defaults iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED - flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED flag-true iFA__1_06D8931_FAILED - flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED flag-true iFA__2_06D8931_FAILED - Test test3 test3 50350 Fail flag-true iFA__1_06D8931_FAILED_OR_iFA__2_06D8931_FAILED + Test test1 test1 50330 None f_iFA__1_06D8931 + Test test2 test2 50340 None f_iFA__2_06D8931 + defaults f_iFA__1_06D8931_OR_f_iFA__2_06D8931 + flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 flag-true f_iFA__1_06D8931 + flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 flag-true f_iFA__2_06D8931 + Test test3 test3 50350 Fail flag-true f_iFA__1_06D8931_OR_f_iFA__2_06D8931 logprint Test_the_block_form_of_if_any_failed - Test test1 test1 50360 None OOF__Passcode1_06D8931_FAILED - Test test2 test2 50370 None OOF__Passcode2_06D8931_FAILED - defaults OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED - flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED flag-true OOF__Passcode1_06D8931_FAILED - flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED flag-true OOF__Passcode2_06D8931_FAILED - Test test3 test3 50380 Fail flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED - Test test4 test4 50390 Fail flag-true OOF__Passcode1_06D8931_FAILED_OR_OOF__Passcode2_06D8931_FAILED + Test test1 test1 50360 None f_OOF__Passcode1_06D8931 + Test test2 test2 50370 None f_OOF__Passcode2_06D8931 + defaults f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 + flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 flag-true f_OOF__Passcode1_06D8931 + flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 flag-true f_OOF__Passcode2_06D8931 + Test test3 test3 50380 Fail flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 + Test test4 test4 50390 Fail flag-true f_OOF__Passcode1_06D8931_OR_f_OOF__Passcode2_06D8931 logprint Test_that_if_all_failed_works - Test test1 test1 50400 None iFall__1_06D8931_FAILED - Test test2 test2 50410 None iFall__2_06D8931_FAILED - defaults iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED - flag-true iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED - flag-false iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED not flag-true iFall__2_06D8931_FAILED - flag-false iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED not flag-true iFall__1_06D8931_FAILED - Test test3 test3 50420 Fail flag-true iFall__1_06D8931_FAILED_AND_iFall__2_06D8931_FAILED + Test test1 test1 50400 None f_iFall__1_06D8931 + Test test2 test2 50410 None f_iFall__2_06D8931 + defaults f_iFall__1_06D8931_AND_f_iFall__2_06D8931 + flag-true f_iFall__1_06D8931_AND_f_iFall__2_06D8931 + flag-false f_iFall__1_06D8931_AND_f_iFall__2_06D8931 not flag-true f_iFall__2_06D8931 + flag-false f_iFall__1_06D8931_AND_f_iFall__2_06D8931 not flag-true f_iFall__1_06D8931 + Test test3 test3 50420 Fail flag-true f_iFall__1_06D8931_AND_f_iFall__2_06D8931 logprint Test_the_block_form_of_if_all_failed - Test test1 test1 50430 None iFall__B1_06D8931_FAILED - Test test2 test2 50440 None iFall__B2_06D8931_FAILED - defaults iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - flag-false iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED not flag-true iFall__B2_06D8931_FAILED - flag-false iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED not flag-true iFall__B1_06D8931_FAILED - Test test3 test3 50450 Fail flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED - Test test4 test4 50460 Fail flag-true iFall__B1_06D8931_FAILED_AND_iFall__B2_06D8931_FAILED + Test test1 test1 50430 None f_iFall__B1_06D8931 + Test test2 test2 50440 None f_iFall__B2_06D8931 + defaults f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + flag-false f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 not flag-true f_iFall__B2_06D8931 + flag-false f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 not flag-true f_iFall__B1_06D8931 + Test test3 test3 50450 Fail flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 + Test test4 test4 50460 Fail flag-true f_iFall__B1_06D8931_AND_f_iFall__B2_06D8931 logprint Test_that_if_any_passed_works - Test test1 test1 50470 None if__AP1_06D8931_PASSED - Test test2 test2 50480 None if__AP2_06D8931_PASSED - defaults if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED - flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED flag-true if__AP1_06D8931_PASSED - flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED flag-true if__AP2_06D8931_PASSED - Test test3 test3 50490 Fail flag-true if__AP1_06D8931_PASSED_OR_if__AP2_06D8931_PASSED + Test test1 test1 50470 None p_if__AP1_06D8931 + Test test2 test2 50480 None p_if__AP2_06D8931 + defaults p_if__AP1_06D8931_OR_p_if__AP2_06D8931 + flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 flag-true p_if__AP1_06D8931 + flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 flag-true p_if__AP2_06D8931 + Test test3 test3 50490 Fail flag-true p_if__AP1_06D8931_OR_p_if__AP2_06D8931 logprint Test_the_block_form_of_if_any_passed - Test test1 test1 50500 None if__APB1_06D8931_PASSED - Test test2 test2 50510 None if__APB2_06D8931_PASSED - defaults if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED - flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED flag-true if__APB1_06D8931_PASSED - flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED flag-true if__APB2_06D8931_PASSED - Test test3 test3 50520 Fail flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED - Test test4 test4 50530 Fail flag-true if__APB1_06D8931_PASSED_OR_if__APB2_06D8931_PASSED + Test test1 test1 50500 None p_if__APB1_06D8931 + Test test2 test2 50510 None p_if__APB2_06D8931 + defaults p_if__APB1_06D8931_OR_p_if__APB2_06D8931 + flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 flag-true p_if__APB1_06D8931 + flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 flag-true p_if__APB2_06D8931 + Test test3 test3 50520 Fail flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 + Test test4 test4 50530 Fail flag-true p_if__APB1_06D8931_OR_p_if__APB2_06D8931 logprint Test_that_if_all_passed_works - Test test1 test1 50540 None iFall__P1_06D8931_PASSED - Test test2 test2 50550 None iFall__P2_06D8931_PASSED - defaults iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED - flag-true iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED - flag-false iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED not flag-true iFall__P2_06D8931_PASSED - flag-false iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED not flag-true iFall__P1_06D8931_PASSED - Test test3 test3 50560 Fail flag-true iFall__P1_06D8931_PASSED_AND_iFall__P2_06D8931_PASSED + Test test1 test1 50540 None p_iFall__P1_06D8931 + Test test2 test2 50550 None p_iFall__P2_06D8931 + defaults p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 + flag-true p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 + flag-false p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 not flag-true p_iFall__P2_06D8931 + flag-false p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 not flag-true p_iFall__P1_06D8931 + Test test3 test3 50560 Fail flag-true p_iFall__P1_06D8931_AND_p_iFall__P2_06D8931 logprint Test_the_block_form_of_if_all_passed - Test test1 test1 50570 None iFall__PB1_06D8931_PASSED - Test test2 test2 50580 None iFall__PB2_06D8931_PASSED - defaults iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - flag-false iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED not flag-true iFall__PB2_06D8931_PASSED - flag-false iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED not flag-true iFall__PB1_06D8931_PASSED - Test test3 test3 50590 Fail flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED - Test test4 test4 50600 Fail flag-true iFall__PB1_06D8931_PASSED_AND_iFall__PB2_06D8931_PASSED + Test test1 test1 50570 None p_iFall__PB1_06D8931 + Test test2 test2 50580 None p_iFall__PB2_06D8931 + defaults p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + flag-false p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 not flag-true p_iFall__PB2_06D8931 + flag-false p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 not flag-true p_iFall__PB1_06D8931 + Test test3 test3 50590 Fail flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 + Test test4 test4 50600 Fail flag-true p_iFall__PB1_06D8931_AND_p_iFall__PB2_06D8931 logprint Test_that_group-level_dependencies_work - Test grp1_test1 grp1_test1 50610 5 None Group__1_06D8931_FAILED_0 - defaults Group__1_06D8931_FAILED - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_0 - Test grp1_test2 grp1_test2 50620 5 None Group__1_06D8931_FAILED_1 - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_1 - Test grp1_test3 grp1_test3 50630 5 None Group__1_06D8931_FAILED_2 - flag-true Group__1_06D8931_FAILED flag-true Group__1_06D8931_FAILED_2 - Test grp2_test1 grp2_test1 50640 5 Fail flag-true Group__1_06D8931_FAILED - Test grp2_test2 grp2_test2 50650 5 Fail flag-true Group__1_06D8931_FAILED - Test grp2_test3 grp2_test3 50660 5 Fail flag-true Group__1_06D8931_FAILED + Test grp1_test1 grp1_test1 50610 5 None f_Group__1_06D8931_0 + defaults f_Group__1_06D8931 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_0 + Test grp1_test2 grp1_test2 50620 5 None f_Group__1_06D8931_1 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_1 + Test grp1_test3 grp1_test3 50630 5 None f_Group__1_06D8931_2 + flag-true f_Group__1_06D8931 flag-true f_Group__1_06D8931_2 + Test grp2_test1 grp2_test1 50640 5 Fail flag-true f_Group__1_06D8931 + Test grp2_test2 grp2_test2 50650 5 Fail flag-true f_Group__1_06D8931 + Test grp2_test3 grp2_test3 50660 5 Fail flag-true f_Group__1_06D8931 + logprint Test_that_if_failed_works_using_extern_and_exclude_flow_id + Test erase1 erase1 50670 12 Fail flag-true f_Test__extern_Flag1 + logprint Test_that_if_passed_works_using_extern_and_exclude_flow_id + Test erase1 erase1 50680 12 Fail flag-true p_Test__extern_Flag2 diff --git a/approved/v93k_literals/flow_control.aiv b/approved/v93k_literals/flow_control.aiv new file mode 100644 index 00000000..7dcb462e --- /dev/null +++ b/approved/v93k_literals/flow_control.aiv @@ -0,0 +1,34 @@ +AI_DIR_FILE +tmp_dir ./tmp +tmf_dir ./ +vbc_dir ./ +avc_dir ./AVC/ +pinconfig_file ./.cfg +single_binary_pattern_dir ./BINL/ + +AI_V2B_OPTIONS -ALT -c .vbc -k -z PS800 + +PATTERNS name tmf_file v2b_options +cz_test1 .tmf +cz_test2 .tmf +erase1 .tmf +erase2 .tmf +extra_test .tmf +grp1_test1 .tmf +grp1_test2 .tmf +grp1_test3 .tmf +grp2_test1 .tmf +grp2_test2 .tmf +grp2_test3 .tmf +long_test .tmf +long_test1 .tmf +long_test2 .tmf +pgm .tmf +pgm1 .tmf +read0 .tmf +read1 .tmf +read2 .tmf +test1 .tmf +test2 .tmf +test3 .tmf +test4 .tmf diff --git a/approved/v93k_literals/referenced.list b/approved/v93k_literals/referenced.list new file mode 100644 index 00000000..3b6765ac --- /dev/null +++ b/approved/v93k_literals/referenced.list @@ -0,0 +1,25 @@ +# Main patterns +cz_test1 +cz_test2 +erase1 +erase2 +extra_test +grp1_test1 +grp1_test2 +grp1_test3 +grp2_test1 +grp2_test2 +grp2_test3 +long_test +long_test1 +long_test2 +pgm +pgm1 +read0 +read1 +read2 +test1 +test2 +test3 +test4 + diff --git a/approved/v93k_literals/testflow/mfh.testflow.group/flow_control_literals.tf b/approved/v93k_literals/testflow/mfh.testflow.group/flow_control_literals.tf new file mode 100644 index 00000000..3b0c4e85 --- /dev/null +++ b/approved/v93k_literals/testflow/mfh.testflow.group/flow_control_literals.tf @@ -0,0 +1,1308 @@ +hp93000,testflow,0.1 +language_revision = 1; + +testmethodparameters + +tm_1: + "output" = "None"; + "testName" = "Functional"; +tm_10: + "output" = "None"; + "testName" = "Functional"; +tm_11: + "output" = "None"; + "testName" = "Functional"; +tm_12: + "output" = "None"; + "testName" = "Functional"; +tm_13: + "output" = "None"; + "testName" = "Functional"; +tm_14: + "output" = "None"; + "testName" = "Functional"; +tm_15: + "output" = "None"; + "testName" = "Functional"; +tm_16: + "output" = "None"; + "testName" = "Functional"; +tm_17: + "output" = "None"; + "testName" = "Functional"; +tm_18: + "output" = "None"; + "testName" = "Functional"; +tm_19: + "output" = "None"; + "testName" = "Functional"; +tm_2: + "output" = "None"; + "testName" = "Functional"; +tm_20: + "output" = "None"; + "testName" = "Functional"; +tm_21: + "output" = "None"; + "testName" = "Functional"; +tm_22: + "output" = "None"; + "testName" = "Functional"; +tm_23: + "output" = "None"; + "testName" = "Functional"; +tm_24: + "output" = "None"; + "testName" = "Functional"; +tm_25: + "output" = "None"; + "testName" = "Functional"; +tm_26: + "output" = "None"; + "testName" = "Functional"; +tm_27: + "output" = "None"; + "testName" = "Functional"; +tm_28: + "output" = "None"; + "testName" = "Functional"; +tm_29: + "output" = "None"; + "testName" = "Functional"; +tm_3: + "output" = "None"; + "testName" = "Functional"; +tm_30: + "output" = "None"; + "testName" = "Functional"; +tm_31: + "output" = "None"; + "testName" = "Functional"; +tm_32: + "output" = "None"; + "testName" = "Functional"; +tm_33: + "output" = "None"; + "testName" = "Functional"; +tm_34: + "output" = "None"; + "testName" = "Functional"; +tm_35: + "output" = "None"; + "testName" = "Functional"; +tm_36: + "output" = "None"; + "testName" = "Functional"; +tm_37: + "output" = "None"; + "testName" = "Functional"; +tm_38: + "output" = "None"; + "testName" = "Functional"; +tm_39: + "output" = "None"; + "testName" = "Functional"; +tm_4: + "output" = "None"; + "testName" = "Functional"; +tm_40: + "output" = "None"; + "testName" = "Functional"; +tm_41: + "output" = "None"; + "testName" = "Functional"; +tm_42: + "output" = "None"; + "testName" = "Functional"; +tm_43: + "output" = "None"; + "testName" = "Functional"; +tm_44: + "output" = "None"; + "testName" = "Functional"; +tm_45: + "output" = "None"; + "testName" = "Functional"; +tm_46: + "output" = "None"; + "testName" = "Functional"; +tm_47: + "output" = "None"; + "testName" = "Functional"; +tm_48: + "output" = "None"; + "testName" = "Functional"; +tm_49: + "output" = "None"; + "testName" = "Functional"; +tm_5: + "output" = "None"; + "testName" = "Functional"; +tm_50: + "output" = "None"; + "testName" = "Functional"; +tm_51: + "output" = "None"; + "testName" = "Functional"; +tm_52: + "output" = "None"; + "testName" = "Functional"; +tm_53: + "output" = "None"; + "testName" = "Functional"; +tm_54: + "output" = "None"; + "testName" = "Functional"; +tm_55: + "output" = "None"; + "testName" = "Functional"; +tm_56: + "output" = "None"; + "testName" = "Functional"; +tm_57: + "output" = "None"; + "testName" = "Functional"; +tm_58: + "output" = "None"; + "testName" = "Functional"; +tm_59: + "output" = "None"; + "testName" = "Functional"; +tm_6: + "output" = "None"; + "testName" = "Functional"; +tm_60: + "output" = "None"; + "testName" = "Functional"; +tm_7: + "output" = "None"; + "testName" = "Functional"; +tm_8: + "output" = "None"; + "testName" = "Functional"; +tm_9: + "output" = "None"; + "testName" = "Functional"; + +end +----------------------------------------------------------------- +testmethodlimits + +tm_1: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_10: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_11: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_12: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_13: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_14: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_15: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_16: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_17: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_18: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_19: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_2: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_20: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_21: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_22: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_23: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_24: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_25: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_26: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_27: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_28: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_29: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_3: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_30: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_31: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_32: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_33: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_34: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_35: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_36: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_37: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_38: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_39: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_4: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_40: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_41: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_42: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_43: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_44: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_45: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_46: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_47: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_48: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_49: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_5: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_50: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_51: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_52: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_53: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_54: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_55: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_56: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_57: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_58: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_59: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_6: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_60: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_7: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_8: + "Functional" = "":"NA":"":"NA":"":"":""; +tm_9: + "Functional" = "":"NA":"":"NA":"":"":""; + +end +----------------------------------------------------------------- +testmethods + +tm_1: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_10: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_11: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_12: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_13: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_14: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_15: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_16: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_17: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_18: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_19: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_2: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_20: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_21: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_22: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_23: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_24: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_25: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_26: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_27: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_28: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_29: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_3: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_30: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_31: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_32: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_33: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_34: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_35: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_36: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_37: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_38: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_39: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_4: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_40: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_41: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_42: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_43: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_44: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_45: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_46: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_47: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_48: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_49: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_5: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_50: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_51: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_52: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_53: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_54: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_55: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_56: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_57: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_58: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_59: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_6: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_60: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_7: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_8: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; +tm_9: + testmethod_class = "ac_tml.AcTest.FunctionalTest"; + +end +----------------------------------------------------------------- +test_suites + +cz_test1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "cz_test1"; + override_testf = tm_22; + site_control = "parallel:"; + site_match = 2; +cz_test2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "cz_test2"; + override_testf = tm_23; + site_control = "parallel:"; + site_match = 2; +erase1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "erase1"; + override_testf = tm_2; + site_control = "parallel:"; + site_match = 2; +erase2_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "erase2"; + override_testf = tm_5; + site_control = "parallel:"; + site_match = 2; +erase2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "erase2"; + override_testf = tm_4; + site_control = "parallel:"; + site_match = 2; +extra_test_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "extra_test"; + override_testf = tm_21; + site_control = "parallel:"; + site_match = 2; +grp1_test1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp1_test1"; + override_testf = tm_55; + site_control = "parallel:"; + site_match = 2; +grp1_test2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp1_test2"; + override_testf = tm_56; + site_control = "parallel:"; + site_match = 2; +grp1_test3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp1_test3"; + override_testf = tm_57; + site_control = "parallel:"; + site_match = 2; +grp2_test1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp2_test1"; + override_testf = tm_58; + site_control = "parallel:"; + site_match = 2; +grp2_test2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp2_test2"; + override_testf = tm_59; + site_control = "parallel:"; + site_match = 2; +grp2_test3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "grp2_test3"; + override_testf = tm_60; + site_control = "parallel:"; + site_match = 2; +long_test1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "long_test1"; + override_testf = tm_25; + site_control = "parallel:"; + site_match = 2; +long_test2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "long_test2"; + override_testf = tm_26; + site_control = "parallel:"; + site_match = 2; +long_test_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "long_test"; + override_testf = tm_24; + site_control = "parallel:"; + site_match = 2; +pgm1_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm1"; + override_testf = tm_9; + site_control = "parallel:"; + site_match = 2; +pgm1_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm1"; + override_testf = tm_10; + site_control = "parallel:"; + site_match = 2; +pgm1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm1"; + override_testf = tm_7; + site_control = "parallel:"; + site_match = 2; +pgm_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm"; + override_testf = tm_13; + site_control = "parallel:"; + site_match = 2; +pgm_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm"; + override_testf = tm_16; + site_control = "parallel:"; + site_match = 2; +pgm_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm"; + override_testf = tm_18; + site_control = "parallel:"; + site_match = 2; +pgm_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "pgm"; + override_testf = tm_11; + site_control = "parallel:"; + site_match = 2; +read0_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_14; + site_control = "parallel:"; + site_match = 2; +read0_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_15; + site_control = "parallel:"; + site_match = 2; +read0_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_17; + site_control = "parallel:"; + site_match = 2; +read0_4_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_19; + site_control = "parallel:"; + site_match = 2; +read0_5_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_20; + site_control = "parallel:"; + site_match = 2; +read0_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read0"; + override_testf = tm_12; + site_control = "parallel:"; + site_match = 2; +read1_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read1"; + override_testf = tm_6; + site_control = "parallel:"; + site_match = 2; +read1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read1"; + override_testf = tm_1; + site_control = "parallel:"; + site_match = 2; +read2_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read2"; + override_testf = tm_8; + site_control = "parallel:"; + site_match = 2; +read2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "read2"; + override_testf = tm_3; + site_control = "parallel:"; + site_match = 2; +test1_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_30; + site_control = "parallel:"; + site_match = 2; +test1_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_34; + site_control = "parallel:"; + site_match = 2; +test1_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_37; + site_control = "parallel:"; + site_match = 2; +test1_4_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_41; + site_control = "parallel:"; + site_match = 2; +test1_5_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_44; + site_control = "parallel:"; + site_match = 2; +test1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_27; + site_control = "parallel:"; + site_match = 2; +test1_6_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_48; + site_control = "parallel:"; + site_match = 2; +test1_7_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test1"; + override_testf = tm_51; + site_control = "parallel:"; + site_match = 2; +test2_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_31; + site_control = "parallel:"; + site_match = 2; +test2_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_35; + site_control = "parallel:"; + site_match = 2; +test2_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_38; + site_control = "parallel:"; + site_match = 2; +test2_4_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_42; + site_control = "parallel:"; + site_match = 2; +test2_5_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_45; + site_control = "parallel:"; + site_match = 2; +test2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_28; + site_control = "parallel:"; + site_match = 2; +test2_6_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_49; + site_control = "parallel:"; + site_match = 2; +test2_7_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test2"; + override_testf = tm_52; + site_control = "parallel:"; + site_match = 2; +test3_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_32; + site_control = "parallel:"; + site_match = 2; +test3_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_36; + site_control = "parallel:"; + site_match = 2; +test3_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_39; + site_control = "parallel:"; + site_match = 2; +test3_4_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_43; + site_control = "parallel:"; + site_match = 2; +test3_5_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_46; + site_control = "parallel:"; + site_match = 2; +test3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_29; + site_control = "parallel:"; + site_match = 2; +test3_6_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_50; + site_control = "parallel:"; + site_match = 2; +test3_7_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test3"; + override_testf = tm_53; + site_control = "parallel:"; + site_match = 2; +test4_1_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test4"; + override_testf = tm_40; + site_control = "parallel:"; + site_match = 2; +test4_2_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test4"; + override_testf = tm_47; + site_control = "parallel:"; + site_match = 2; +test4_3_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test4"; + override_testf = tm_54; + site_control = "parallel:"; + site_match = 2; +test4_6A077BC: + local_flags = output_on_pass, output_on_fail, value_on_pass, value_on_fail, per_pin_on_pass, per_pin_on_fail; + override = 1; + override_seqlbl = "test4"; + override_testf = tm_33; + site_control = "parallel:"; + site_match = 2; + +end +----------------------------------------------------------------- +test_flow + + { + { + @R_TEST_FLAG5_6A077BC = -1; + @R_TEST_FLAG6_6A077BC = -1; + @R_TEST_FLAG7_6A077BC = -1; + @R_TEST_FLAG8_6A077BC = -1; + @F_IFA_1_6A077BC = -1; + @F_IFA_2_6A077BC = -1; + @F_OOF_PASSCODE1_6A077BC = -1; + @F_OOF_PASSCODE2_6A077BC = -1; + @F_IFALL_1_6A077BC = -1; + @F_IFALL_B1_6A077BC = -1; + @P_IF_AP1_6A077BC = -1; + @P_IF_AP2_6A077BC = -1; + @P_IF_APB1_6A077BC = -1; + @P_IF_APB2_6A077BC = -1; + @P_IFALL_P1_6A077BC = -1; + @P_IFALL_PB1_6A077BC = -1; + @F_GROUP_1_6A077BC = -1; + }, open,"Init Flow Control Vars", "" + print_dl("Test that if_failed works using Literal"); + run_and_branch(read1_6A077BC) + then + { + } + else + { + run_and_branch(erase1_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 12, over_on; + } + } + print_dl("Test the block form of if_failed"); + run_and_branch(read2_6A077BC) + then + { + } + else + { + run(erase2_6A077BC); + run(erase2_1_6A077BC); + } + print_dl("Test that if_passed works"); + run_and_branch(read1_1_6A077BC) + then + { + run(pgm1_6A077BC); + } + else + { + } + print_dl("Test the block form of if_passed"); + run_and_branch(read2_1_6A077BC) + then + { + run(pgm1_1_6A077BC); + run(pgm1_2_6A077BC); + } + else + { + } + print_dl("Test that if_ran works"); + run_and_branch(pgm_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 10, over_on; + } + @R_TEST_FLAG5_6A077BC = 1; + if @R_TEST_FLAG5_6A077BC == 1 then + { + run(read0_6A077BC); + } + else + { + } + print_dl("Test the block form of if_ran"); + run_and_branch(pgm_1_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 10, over_on; + } + @R_TEST_FLAG6_6A077BC = 1; + if @R_TEST_FLAG6_6A077BC == 1 then + { + run(read0_1_6A077BC); + run(read0_2_6A077BC); + } + else + { + } + print_dl("Test that unless_ran works"); + run_and_branch(pgm_2_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 10, over_on; + } + @R_TEST_FLAG7_6A077BC = 1; + if @R_TEST_FLAG7_6A077BC == 1 then + { + } + else + { + run(read0_3_6A077BC); + } + print_dl("Test the block form of unless_ran"); + run_and_branch(pgm_3_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 10, over_on; + } + @R_TEST_FLAG8_6A077BC = 1; + if @R_TEST_FLAG8_6A077BC == 1 then + { + } + else + { + run(read0_4_6A077BC); + run(read0_5_6A077BC); + } + print_dl("Test that if_enable works"); + if @EXTRAS__123 == 1 then + { + run(extra_test_6A077BC); + } + else + { + } + print_dl("Test the block form of if_enable"); + if @CZ__123 == 1 then + { + run(cz_test1_6A077BC); + run(cz_test2_6A077BC); + } + else + { + } + print_dl("Test that unless_enable works"); + if @QUICK__123 == 1 then + { + } + else + { + run(long_test_6A077BC); + } + print_dl("Test the block form of unless_enable"); + if @QUICK__123 == 1 then + { + } + else + { + run(long_test1_6A077BC); + run(long_test2_6A077BC); + } + print_dl("Test that if_any_failed works"); + run_and_branch(test1_6A077BC) + then + { + } + else + { + @F_IFA_1_6A077BC = 1; + } + run_and_branch(test2_6A077BC) + then + { + } + else + { + @F_IFA_2_6A077BC = 1; + } + if @F_IFA_1_6A077BC == 1 or @F_IFA_2_6A077BC == 1 then + { + run(test3_6A077BC); + } + else + { + } + print_dl("Test the block form of if_any_failed"); + run_and_branch(test1_1_6A077BC) + then + { + } + else + { + @F_OOF_PASSCODE1_6A077BC = 1; + } + run_and_branch(test2_1_6A077BC) + then + { + } + else + { + @F_OOF_PASSCODE2_6A077BC = 1; + } + if @F_OOF_PASSCODE1_6A077BC == 1 or @F_OOF_PASSCODE2_6A077BC == 1 then + { + run(test3_1_6A077BC); + run(test4_6A077BC); + } + else + { + } + print_dl("Test that if_all_failed works"); + run_and_branch(test1_2_6A077BC) + then + { + } + else + { + @F_IFALL_1_6A077BC = 1; + } + run_and_branch(test2_2_6A077BC) + then + { + } + else + { + if @F_IFALL_1_6A077BC == 1 then + { + run(test3_2_6A077BC); + } + else + { + } + } + print_dl("Test the block form of if_all_failed"); + run_and_branch(test1_3_6A077BC) + then + { + } + else + { + @F_IFALL_B1_6A077BC = 1; + } + run_and_branch(test2_3_6A077BC) + then + { + } + else + { + if @F_IFALL_B1_6A077BC == 1 then + { + run(test3_3_6A077BC); + run(test4_1_6A077BC); + } + else + { + } + } + print_dl("Test that if_any_passed works"); + run_and_branch(test1_4_6A077BC) + then + { + @P_IF_AP1_6A077BC = 1; + } + else + { + } + run_and_branch(test2_4_6A077BC) + then + { + @P_IF_AP2_6A077BC = 1; + } + else + { + } + if @P_IF_AP1_6A077BC == 1 or @P_IF_AP2_6A077BC == 1 then + { + run(test3_4_6A077BC); + } + else + { + } + print_dl("Test the block form of if_any_passed"); + run_and_branch(test1_5_6A077BC) + then + { + @P_IF_APB1_6A077BC = 1; + } + else + { + } + run_and_branch(test2_5_6A077BC) + then + { + @P_IF_APB2_6A077BC = 1; + } + else + { + } + if @P_IF_APB1_6A077BC == 1 or @P_IF_APB2_6A077BC == 1 then + { + run(test3_5_6A077BC); + run(test4_2_6A077BC); + } + else + { + } + print_dl("Test that if_all_passed works"); + run_and_branch(test1_6_6A077BC) + then + { + @P_IFALL_P1_6A077BC = 1; + } + else + { + } + run_and_branch(test2_6_6A077BC) + then + { + if @P_IFALL_P1_6A077BC == 1 then + { + run(test3_6_6A077BC); + } + else + { + } + } + else + { + } + print_dl("Test the block form of if_all_passed"); + run_and_branch(test1_7_6A077BC) + then + { + @P_IFALL_PB1_6A077BC = 1; + } + else + { + } + run_and_branch(test2_7_6A077BC) + then + { + if @P_IFALL_PB1_6A077BC == 1 then + { + run(test3_7_6A077BC); + run(test4_3_6A077BC); + } + else + { + } + } + else + { + } + print_dl("Test that group-level dependencies work"); + { + run_and_branch(grp1_test1_6A077BC) + then + { + } + else + { + @F_GROUP_1_6A077BC = 1; + } + run_and_branch(grp1_test2_6A077BC) + then + { + } + else + { + @F_GROUP_1_6A077BC = 1; + } + run_and_branch(grp1_test3_6A077BC) + then + { + } + else + { + @F_GROUP_1_6A077BC = 1; + } + }, open,"grp1", "" + if @F_GROUP_1_6A077BC == 1 then + { + { + run_and_branch(grp2_test1_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 5, over_on; + } + run_and_branch(grp2_test2_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 5, over_on; + } + run_and_branch(grp2_test3_6A077BC) + then + { + } + else + { + stop_bin "", "fail", , bad, noreprobe, red, 5, over_on; + } + }, open,"grp2", "" + } + else + { + } + + }, open,"Flow Control Flag/Enable Literal Testing","Flow to exercise the Flow Control API" + +end +----------------------------------------------------------------- +binning +end +----------------------------------------------------------------- +oocrule + + +end +----------------------------------------------------------------- +context + + +end +----------------------------------------------------------------- +hardware_bin_descriptions + + +end +----------------------------------------------------------------- diff --git a/approved/v93k_literals/testflow/mfh.testflow.setup/flow_control_vars.tf b/approved/v93k_literals/testflow/mfh.testflow.setup/flow_control_vars.tf new file mode 100644 index 00000000..5a517fff --- /dev/null +++ b/approved/v93k_literals/testflow/mfh.testflow.setup/flow_control_vars.tf @@ -0,0 +1,54 @@ +hp93000,testflow,0.1 +language_revision = 1; + +declarations + +@F_GROUP_1_6A077BC = 0; +@F_IFALL_1_6A077BC = 0; +@F_IFALL_B1_6A077BC = 0; +@F_IFA_1_6A077BC = 0; +@F_IFA_2_6A077BC = 0; +@F_OOF_PASSCODE1_6A077BC = 0; +@F_OOF_PASSCODE2_6A077BC = 0; +@P_IFALL_P1_6A077BC = 0; +@P_IFALL_PB1_6A077BC = 0; +@P_IF_AP1_6A077BC = 0; +@P_IF_AP2_6A077BC = 0; +@P_IF_APB1_6A077BC = 0; +@P_IF_APB2_6A077BC = 0; +@R_TEST_FLAG5_6A077BC = 0; +@R_TEST_FLAG6_6A077BC = 0; +@R_TEST_FLAG7_6A077BC = 0; +@R_TEST_FLAG8_6A077BC = 0; + +end +----------------------------------------------------------------- +flags + +user CZ__123 = 0; +user EXTRAS__123 = 0; +user QUICK__123 = 0; + +end +----------------------------------------------------------------- +testmethodparameters +end +----------------------------------------------------------------- +testmethodlimits +end +----------------------------------------------------------------- +test_flow +end +----------------------------------------------------------------- +binning +end +----------------------------------------------------------------- +oocrule +end +----------------------------------------------------------------- +context +end +----------------------------------------------------------------- +hardware_bin_descriptions +end +----------------------------------------------------------------- diff --git a/approved/v93k_literals/vectors/flow_control.pmfl b/approved/v93k_literals/vectors/flow_control.pmfl new file mode 100644 index 00000000..c8ff7b0b --- /dev/null +++ b/approved/v93k_literals/vectors/flow_control.pmfl @@ -0,0 +1,30 @@ +hp93000,pattern_master_file,0.1 + +path: +../vectors + +files: +cz_test1.binl.gz +cz_test2.binl.gz +erase1.binl.gz +erase2.binl.gz +extra_test.binl.gz +grp1_test1.binl.gz +grp1_test2.binl.gz +grp1_test3.binl.gz +grp2_test1.binl.gz +grp2_test2.binl.gz +grp2_test3.binl.gz +long_test.binl.gz +long_test1.binl.gz +long_test2.binl.gz +pgm.binl.gz +pgm1.binl.gz +read0.binl.gz +read1.binl.gz +read2.binl.gz +test1.binl.gz +test2.binl.gz +test3.binl.gz +test4.binl.gz + diff --git a/approved/v93k_smt8_literals/OrigenTesters/flows/FLOW_CONTROL_LITERALS.flow b/approved/v93k_smt8_literals/OrigenTesters/flows/FLOW_CONTROL_LITERALS.flow new file mode 100644 index 00000000..eccaac78 --- /dev/null +++ b/approved/v93k_smt8_literals/OrigenTesters/flows/FLOW_CONTROL_LITERALS.flow @@ -0,0 +1,608 @@ +flow FLOW_CONTROL_LITERALS { + in CZ__123 = -1; + in EXTRAS__123 = -1; + in QUICK__123 = -1; + + out F_IFALL_1 = -1; + out F_IFALL_B1 = -1; + out F_IFA_1 = -1; + out F_IFA_2 = -1; + out F_OOF_PASSCODE1 = -1; + out F_OOF_PASSCODE2 = -1; + out P_IFALL_P1 = -1; + out P_IFALL_PB1 = -1; + out P_IF_AP1 = -1; + out P_IF_AP2 = -1; + out P_IF_APB1 = -1; + out P_IF_APB2 = -1; + out R_TEST_FLAG5 = -1; + out R_TEST_FLAG6 = -1; + out R_TEST_FLAG7 = -1; + out R_TEST_FLAG8 = -1; + + setup { + suite cz_test1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.cz_test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite cz_test2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.cz_test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite erase1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.erase1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite erase2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.erase2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite erase2_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.erase2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite extra_test calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.extra_test); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite long_test calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.long_test); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite long_test1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.long_test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite long_test2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.long_test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm1_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm1_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite pgm_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.pgm); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0_4 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read0_5 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read0); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read1_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite read2_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.read2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_4 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_5 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_6 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test1_7 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_4 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_5 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_6 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test2_7 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_4 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_5 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_6 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test3_7 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test4 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test4); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test4_1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test4); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test4_2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test4); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite test4_3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.test4); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + flow GRP1 calls OrigenTesters.flows.flow_control_literals.GRP1 { } + flow GRP2 calls OrigenTesters.flows.flow_control_literals.GRP2 { } + } + + execute { + F_IFALL_1 = -1; + F_IFALL_B1 = -1; + F_IFA_1 = -1; + F_IFA_2 = -1; + F_OOF_PASSCODE1 = -1; + F_OOF_PASSCODE2 = -1; + P_IFALL_P1 = -1; + P_IFALL_PB1 = -1; + P_IF_AP1 = -1; + P_IF_AP2 = -1; + P_IF_APB1 = -1; + P_IF_APB2 = -1; + R_TEST_FLAG5 = -1; + R_TEST_FLAG6 = -1; + R_TEST_FLAG7 = -1; + R_TEST_FLAG8 = -1; + + println("Test that if_failed works using Literal"); + read1.execute(); + if (!read1.pass) { + erase1.execute(); + } + println("Test the block form of if_failed"); + read2.execute(); + if (!read2.pass) { + erase2.execute(); + erase2_1.execute(); + } + println("Test that if_passed works"); + read1_1.execute(); + if (read1_1.pass) { + pgm1.execute(); + } + println("Test the block form of if_passed"); + read2_1.execute(); + if (read2_1.pass) { + pgm1_1.execute(); + pgm1_2.execute(); + } + println("Test that if_ran works"); + pgm.execute(); + R_TEST_FLAG5 = 1; + if (R_TEST_FLAG5 == 1) { + read0.execute(); + } else { + } + println("Test the block form of if_ran"); + pgm_1.execute(); + R_TEST_FLAG6 = 1; + if (R_TEST_FLAG6 == 1) { + read0_1.execute(); + read0_2.execute(); + } else { + } + println("Test that unless_ran works"); + pgm_2.execute(); + R_TEST_FLAG7 = 1; + if (R_TEST_FLAG7 == 1) { + } else { + read0_3.execute(); + } + println("Test the block form of unless_ran"); + pgm_3.execute(); + R_TEST_FLAG8 = 1; + if (R_TEST_FLAG8 == 1) { + } else { + read0_4.execute(); + read0_5.execute(); + } + println("Test that if_enable works"); + if (EXTRAS__123 == 1) { + extra_test.execute(); + } else { + } + println("Test the block form of if_enable"); + if (CZ__123 == 1) { + cz_test1.execute(); + cz_test2.execute(); + } else { + } + println("Test that unless_enable works"); + if (QUICK__123 == 1) { + } else { + long_test.execute(); + } + println("Test the block form of unless_enable"); + if (QUICK__123 == 1) { + } else { + long_test1.execute(); + long_test2.execute(); + } + println("Test that if_any_failed works"); + test1.execute(); + if (!test1.pass) { + F_IFA_1 = 1; + } + test2.execute(); + if (!test2.pass) { + F_IFA_2 = 1; + } + if ((F_IFA_1 == 1) || (F_IFA_2 == 1)) { + test3.execute(); + } else { + } + println("Test the block form of if_any_failed"); + test1_1.execute(); + if (!test1_1.pass) { + F_OOF_PASSCODE1 = 1; + } + test2_1.execute(); + if (!test2_1.pass) { + F_OOF_PASSCODE2 = 1; + } + if ((F_OOF_PASSCODE1 == 1) || (F_OOF_PASSCODE2 == 1)) { + test3_1.execute(); + test4.execute(); + } else { + } + println("Test that if_all_failed works"); + test1_2.execute(); + if (!test1_2.pass) { + F_IFALL_1 = 1; + } + test2_2.execute(); + if (!test2_2.pass) { + if (F_IFALL_1 == 1) { + test3_2.execute(); + } else { + } + } + println("Test the block form of if_all_failed"); + test1_3.execute(); + if (!test1_3.pass) { + F_IFALL_B1 = 1; + } + test2_3.execute(); + if (!test2_3.pass) { + if (F_IFALL_B1 == 1) { + test3_3.execute(); + test4_1.execute(); + } else { + } + } + println("Test that if_any_passed works"); + test1_4.execute(); + if (test1_4.pass) { + P_IF_AP1 = 1; + } + test2_4.execute(); + if (test2_4.pass) { + P_IF_AP2 = 1; + } + if ((P_IF_AP1 == 1) || (P_IF_AP2 == 1)) { + test3_4.execute(); + } else { + } + println("Test the block form of if_any_passed"); + test1_5.execute(); + if (test1_5.pass) { + P_IF_APB1 = 1; + } + test2_5.execute(); + if (test2_5.pass) { + P_IF_APB2 = 1; + } + if ((P_IF_APB1 == 1) || (P_IF_APB2 == 1)) { + test3_5.execute(); + test4_2.execute(); + } else { + } + println("Test that if_all_passed works"); + test1_6.execute(); + if (test1_6.pass) { + P_IFALL_P1 = 1; + } + test2_6.execute(); + if (test2_6.pass) { + if (P_IFALL_P1 == 1) { + test3_6.execute(); + } else { + } + } + println("Test the block form of if_all_passed"); + test1_7.execute(); + if (test1_7.pass) { + P_IFALL_PB1 = 1; + } + test2_7.execute(); + if (test2_7.pass) { + if (P_IFALL_PB1 == 1) { + test3_7.execute(); + test4_3.execute(); + } else { + } + } + println("Test that group-level dependencies work"); + GRP1.execute(); + if (!GRP1.pass) { + GRP2.execute(); + } + } +} diff --git a/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP1.flow b/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP1.flow new file mode 100644 index 00000000..daa42c76 --- /dev/null +++ b/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP1.flow @@ -0,0 +1,33 @@ +flow GRP1 { + + + setup { + suite grp1_test1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp1_test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite grp1_test2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp1_test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite grp1_test3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp1_test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + } + + execute { + grp1_test1.execute(); + grp1_test2.execute(); + grp1_test3.execute(); + } +} diff --git a/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP2.flow b/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP2.flow new file mode 100644 index 00000000..16973ed4 --- /dev/null +++ b/approved/v93k_smt8_literals/OrigenTesters/flows/flow_control_literals/GRP2.flow @@ -0,0 +1,33 @@ +flow GRP2 { + + + setup { + suite grp2_test1 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp2_test1); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite grp2_test2 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp2_test2); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + suite grp2_test3 calls ac_tml.AcTest.FunctionalTest { + measurement.pattern = setupRef(OrigenTesters.patterns.grp2_test3); + measurement.specification = setupRef(OrigenTesters.specs.specs.Nominal); + output = "None"; + testName = "Functional"; + } + + } + + execute { + grp2_test1.execute(); + grp2_test2.execute(); + grp2_test3.execute(); + } +} diff --git a/approved/v93k_smt8_literals/OrigenTesters/limits/Main.FLOW_CONTROL_LITERALS_Tests.csv b/approved/v93k_smt8_literals/OrigenTesters/limits/Main.FLOW_CONTROL_LITERALS_Tests.csv new file mode 100644 index 00000000..ea6541c7 --- /dev/null +++ b/approved/v93k_smt8_literals/OrigenTesters/limits/Main.FLOW_CONTROL_LITERALS_Tests.csv @@ -0,0 +1,62 @@ +Test Suite,Test,Test Number,Test Text,Low Limit,High Limit,Unit,Soft Bin +,,,,default,default +read1,read1,50000,read1,0,0,, +erase1,erase1,50010,erase1,0,0,, +read2,read2,50020,read2,0,0,, +erase2,erase2,50030,erase2,0,0,, +erase2_1,erase2_1,50040,erase2_1,0,0,, +read1_1,read1_1,50050,read1_1,0,0,, +pgm1,pgm1,50060,pgm1,0,0,, +read2_1,read2_1,50070,read2_1,0,0,, +pgm1_1,pgm1_1,50080,pgm1_1,0,0,, +pgm1_2,pgm1_2,50090,pgm1_2,0,0,, +pgm,pgm,50100,pgm,0,0,, +read0,read0,50110,read0,0,0,, +pgm_1,pgm_1,50120,pgm_1,0,0,, +read0_1,read0_1,50130,read0_1,0,0,, +read0_2,read0_2,50140,read0_2,0,0,, +pgm_2,pgm_2,50150,pgm_2,0,0,, +read0_3,read0_3,50160,read0_3,0,0,, +pgm_3,pgm_3,50170,pgm_3,0,0,, +read0_4,read0_4,50180,read0_4,0,0,, +read0_5,read0_5,50190,read0_5,0,0,, +extra_test,extra_test,50270,extra_test,0,0,, +cz_test1,cz_test1,50280,cz_test1,0,0,, +cz_test2,cz_test2,50290,cz_test2,0,0,, +long_test,long_test,50300,long_test,0,0,, +long_test1,long_test1,50310,long_test1,0,0,, +long_test2,long_test2,50320,long_test2,0,0,, +test1,test1,50330,test1,0,0,, +test2,test2,50340,test2,0,0,, +test3,test3,50350,test3,0,0,, +test1_1,test1_1,50360,test1_1,0,0,, +test2_1,test2_1,50370,test2_1,0,0,, +test3_1,test3_1,50380,test3_1,0,0,, +test4,test4,50390,test4,0,0,, +test1_2,test1_2,50400,test1_2,0,0,, +test2_2,test2_2,50410,test2_2,0,0,, +test3_2,test3_2,50420,test3_2,0,0,, +test1_3,test1_3,50430,test1_3,0,0,, +test2_3,test2_3,50440,test2_3,0,0,, +test3_3,test3_3,50450,test3_3,0,0,, +test4_1,test4_1,50460,test4_1,0,0,, +test1_4,test1_4,50470,test1_4,0,0,, +test2_4,test2_4,50480,test2_4,0,0,, +test3_4,test3_4,50490,test3_4,0,0,, +test1_5,test1_5,50500,test1_5,0,0,, +test2_5,test2_5,50510,test2_5,0,0,, +test3_5,test3_5,50520,test3_5,0,0,, +test4_2,test4_2,50530,test4_2,0,0,, +test1_6,test1_6,50540,test1_6,0,0,, +test2_6,test2_6,50550,test2_6,0,0,, +test3_6,test3_6,50560,test3_6,0,0,, +test1_7,test1_7,50570,test1_7,0,0,, +test2_7,test2_7,50580,test2_7,0,0,, +test3_7,test3_7,50590,test3_7,0,0,, +test4_3,test4_3,50600,test4_3,0,0,, +GRP1.grp1_test1,grp1_test1,50610,grp1_test1,0,0,, +GRP1.grp1_test2,grp1_test2,50620,grp1_test2,0,0,, +GRP1.grp1_test3,grp1_test3,50630,grp1_test3,0,0,, +GRP1.GRP2.grp2_test1,grp2_test1,50640,grp2_test1,0,0,, +GRP1.GRP2.grp2_test2,grp2_test2,50650,grp2_test2,0,0,, +GRP1.GRP2.grp2_test3,grp2_test3,50660,grp2_test3,0,0,, diff --git a/approved/v93k_smt8_literals/referenced.list b/approved/v93k_smt8_literals/referenced.list new file mode 100644 index 00000000..3b6765ac --- /dev/null +++ b/approved/v93k_smt8_literals/referenced.list @@ -0,0 +1,25 @@ +# Main patterns +cz_test1 +cz_test2 +erase1 +erase2 +extra_test +grp1_test1 +grp1_test2 +grp1_test3 +grp2_test1 +grp2_test2 +grp2_test3 +long_test +long_test1 +long_test2 +pgm +pgm1 +read0 +read1 +read2 +test1 +test2 +test3 +test4 + diff --git a/config/commands.rb b/config/commands.rb index 051c8357..5e9294c6 100644 --- a/config/commands.rb +++ b/config/commands.rb @@ -200,7 +200,7 @@ puts puts "To approve any diffs in the reference.list files run the following command:" puts - platforms = %w(j750 j750_literals j750_hpt ultraflex ultraflex_literals v93k v93k_multiport v93k_enable_flow v93k_disable_flow v93k_limits_file v93k_global v93k_smt8) # put here the various platforms used in examples/program_generator.rb + platforms = %w(j750 j750_literals j750_hpt ultraflex ultraflex_literals v93k v93k_literals v93k_multiport v93k_enable_flow v93k_disable_flow v93k_limits_file v93k_global v93k_smt8 v93k_smt8_literals) # put here the various platforms used in examples/program_generator.rb reflist_command = '' platforms.each do |platform| unless reflist_command == '' diff --git a/environment/j750_literals.rb b/environment/j750_literals.rb index 9320beaf..3449d44b 100644 --- a/environment/j750_literals.rb +++ b/environment/j750_literals.rb @@ -1 +1,9 @@ OrigenTesters::J750.new(literal_flags: true, literal_enables: true) + +# Optional - provide +tester.literal_flag_options = { + type_first: true, + fail_name: 'f', + pass_name: 'p', + ran_name: 'r' +} diff --git a/environment/ultraflex_literals.rb b/environment/ultraflex_literals.rb index 672153fe..dca8542b 100644 --- a/environment/ultraflex_literals.rb +++ b/environment/ultraflex_literals.rb @@ -1 +1,9 @@ -OrigenTesters::UltraFLEX.new(literal_flags: true, literal_enables: true) +OrigenTesters::UltraFLEX.new(literal_flags: true, literal_enables: true) #, no_unique_md5: false) + +# Optional - provide +tester.literal_flag_options = { + type_first: true, + fail_name: 'f', + pass_name: 'p', + ran_name: 'r' +} diff --git a/environment/v93k_literals.rb b/environment/v93k_literals.rb new file mode 100644 index 00000000..645c6f98 --- /dev/null +++ b/environment/v93k_literals.rb @@ -0,0 +1,9 @@ +OrigenTesters::V93K.new + +# Optional - provide +tester.literal_flag_options = { + type_first: true, + fail_name: 'f', + pass_name: 'p', + ran_name: 'r' +} diff --git a/environment/v93k_smt8_literals.rb b/environment/v93k_smt8_literals.rb new file mode 100644 index 00000000..a0ccc4e7 --- /dev/null +++ b/environment/v93k_smt8_literals.rb @@ -0,0 +1,10 @@ +OrigenTesters::V93K.new smt_version: 8,#, separate_bins_file: true + zip_patterns: false + +# Optional - provide +tester.literal_flag_options = { + type_first: true, + fail_name: 'f', + pass_name: 'p', + ran_name: 'r' +} diff --git a/examples/program_generator.rb b/examples/program_generator.rb index dc545238..1ea964a0 100755 --- a/examples/program_generator.rb +++ b/examples/program_generator.rb @@ -6,12 +6,14 @@ ultraflex: ["program/prod.list", "program/uflex_resources.rb"], ultraflex_literals: ["program/flow_control_literals.rb"], v93k: ["program/charz.rb", "program/prod.list"], + v93k_literals: ["program/flow_control_literals.rb"], v93k_multiport: ["program/prb1.rb"], v93k_enable_flow: ["program/prb1.rb", "program/prb2.rb"], v93k_disable_flow: ["program/prb1.rb", "program/prb2.rb"], v93k_limits_file: ["program/test.rb"], v93k_global: ["program/prb1.rb", "program/prb2.rb"], v93k_smt8: ["program/prod.list"], + v93k_smt8_literals: ["program/flow_control_literals.rb"], }.each do |platform, files| ARGV = [*files, "-t", "dut.rb", "-e", "#{platform}.rb", "-r", "approved/#{platform}", "-o", "#{Origen.root}/output/#{platform}"] load 'origen/commands/program.rb' diff --git a/lib/commands/build.rb b/lib/commands/build.rb index 51b89e5c..2bf0c408 100644 --- a/lib/commands/build.rb +++ b/lib/commands/build.rb @@ -21,8 +21,8 @@ EOT opts.on('-e', '--environment NAME', String, 'Override the default environment, NAME can be a full path or a fragment of an environment file name') { |e| options[:environment] = e } opts.on('-t', '--target NAME', String, 'Override the default target, NAME can be a full path or a fragment of a target file name') { |t| options[:target] = t } - opts.on('-pl', '--plugin PLUGIN_NAME', String, 'Set current plugin') { |pl_n| options[:current_plugin] = pl_n } - opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } + opts.on('-pl', '--plugin PLUGIN_NAME', String, 'Set current plugin') { |pl_n| options[:current_plugin] = pl_n } + opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } opts.on('-m', '--mode MODE', Origen::Mode::MODES, 'Force the Origen operating mode:', ' ' + Origen::Mode::MODES.join(', ')) { |_m| } opts.on('-n', '--new', 'Generate a new manifest file for the current tester platform') { options[:new] = true } opts.on('-o', '--output DIR', String, 'Override the default output directory') { |o| options[:output] = o } diff --git a/lib/commands/convert.rb b/lib/commands/convert.rb index 692e014b..0bd0ce95 100644 --- a/lib/commands/convert.rb +++ b/lib/commands/convert.rb @@ -32,7 +32,7 @@ opts.on('-e', '--environment NAME', String, 'Override the default environment, NAME can be a full path or a fragment of an environment file name') { |e| options[:environment] = e } opts.on('-t', '--target NAME', String, 'Override the default target, NAME can be a full path or a fragment of a target file name') { |t| options[:target] = t } end - opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } + opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } opts.on('-m', '--mode MODE', Origen::Mode::MODES, 'Force the Origen operating mode:', ' ' + Origen::Mode::MODES.join(', ')) { |_m| } opts.separator '' opts.on('-h', '--help', 'Show this message') { puts opts; exit 0 } diff --git a/lib/commands/run.rb b/lib/commands/run.rb index 8abcf74a..e14013b4 100644 --- a/lib/commands/run.rb +++ b/lib/commands/run.rb @@ -14,7 +14,7 @@ opts.on('--fail ID,ID', Array, 'Comma-separated list of test IDs to fail') { |ids| options[:failed_test_ids] = ids } opts.on('-e', '--environment NAME', String, 'Override the default environment, NAME can be a full path or a fragment of an environment file name') { |e| options[:environment] = e } opts.on('-t', '--target NAME', String, 'Override the default target, NAME can be a full path or a fragment of a target file name') { |t| options[:target] = t } - opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } + opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true } opts.on('-m', '--mode MODE', Origen::Mode::MODES, 'Force the Origen operating mode:', ' ' + Origen::Mode::MODES.join(', ')) { |_m| } opts.separator '' opts.on('-h', '--help', 'Show this message') { puts opts; exit 0 } @@ -26,7 +26,7 @@ Origen.target.temporary = options[:target] if options[:target] # Origen.app.load_target! -program = OrigenTesters.program +program = OrigenTesters.program unless program puts 'Sorry, but there is no program model available for the current target, generate the program then retry' diff --git a/lib/origen_testers.rb b/lib/origen_testers.rb index 9c006c69..c27f5731 100755 --- a/lib/origen_testers.rb +++ b/lib/origen_testers.rb @@ -1,5 +1,5 @@ require 'origen' -require_relative '../config/application.rb' +require_relative '../config/application' require 'active_support/concern' require 'require_all' diff --git a/lib/origen_testers/api.rb b/lib/origen_testers/api.rb index c32c03dd..4ac93398 100644 --- a/lib/origen_testers/api.rb +++ b/lib/origen_testers/api.rb @@ -79,6 +79,7 @@ def step_comment_prefix def is_vector_based? return @vector_based if defined?(@vector_based) + true end @@ -252,6 +253,7 @@ def cycle(options = {}) unless timeset.period_in_ns? fail "You must supply a period_in_ns to timeset '#{timeset.name}' before you can cycle the tester!" end + timeset.cycled = true if PatSeq.thread PatSeq.thread.cycle(options) @@ -303,6 +305,7 @@ def push_running_clock(pin) def pop_running_clock(pin) fail "ERROR: No clocks running, doesn't make sense to pop one" unless any_clocks_running? + @clocks_running.delete(pin.name.to_s) end diff --git a/lib/origen_testers/atp/ast/node.rb b/lib/origen_testers/atp/ast/node.rb index 62956819..ccdd2b42 100644 --- a/lib/origen_testers/atp/ast/node.rb +++ b/lib/origen_testers/atp/ast/node.rb @@ -23,8 +23,7 @@ def _dump(depth) description: description, type: type, children: Processors::Marshal.new.process_all(children), - properties: properties - } + properties: properties } Marshal.dump(d, depth) end diff --git a/lib/origen_testers/atp/flow.rb b/lib/origen_testers/atp/flow.rb index 8d9ef500..cbd1f94c 100644 --- a/lib/origen_testers/atp/flow.rb +++ b/lib/origen_testers/atp/flow.rb @@ -483,6 +483,7 @@ def bin(number, options = {}) if number.is_a?(Hash) fail 'The bin number must be passed as the first argument' end + options[:bin_description] ||= options.delete(:description) extract_meta!(options) do apply_conditions(options) do @@ -498,6 +499,7 @@ def pass(number, options = {}) if number.is_a?(Hash) fail 'The bin number must be passed as the first argument' end + options[:type] = :pass bin(number, options) end @@ -598,6 +600,7 @@ def loop(*args, &block) unless args[0].keys.include?(:from) && args[0].keys.include?(:to) fail 'Loop must specify :from, :to' end + # assume 1 if :step not provided unless args[0].keys.include?(:step) args[0][:step] = 1 @@ -624,37 +627,43 @@ def loop(*args, &block) end RELATIONAL_OPERATORS.each do |method| - define_method method do |*args, &block| - options = args.pop if args.last.is_a?(Hash) - unless args.size == 2 - fail "Format for relational operation must match: ':(var1, var2)'" + unless method_defined?(method) + define_method method do |*args, &block| + options = args.pop if args.last.is_a?(Hash) + unless args.size == 2 + fail "Format for relational operation must match: ':(var1, var2)'" + end + + n2(method.to_sym, args[0], args[1]) end - n2(method.to_sym, args[0], args[1]) - end unless method_defined?(method) + end end # Define handlers for all of the flow control block methods, unless a custom one has already # been defined above CONDITION_KEYS.keys.each do |method| - define_method method do |*flags, &block| - if flags.last.is_a?(Hash) - options = flags.pop - else - options = {} - end - if flags.include? nil - Origen.log.error("Found Nil flag passed to the '#{method}' method, ensure the flag is passed as a String or a Symbol!") - fail - end - flags = flags.first if flags.size == 1 - # Legacy option provided by OrigenTesters that permits override of a block enable method by passing - # an :or option with a true value - if (CONDITION_KEYS[method] == :if_enabled || CONDITION_KEYS[method] || :unless_enabled) && options[:or] - block.call - else - flow_control_method(CONDITION_KEYS[method], flags, options, &block) + unless method_defined?(method) + define_method method do |*flags, &block| + if flags.last.is_a?(Hash) + options = flags.pop + else + options = {} + end + if flags.include? nil + Origen.log.error("Found Nil flag passed to the '#{method}' method, ensure the flag is passed as a String or a Symbol!") + fail + end + flags = flags.first if flags.size == 1 + + # Legacy option provided by OrigenTesters that permits override of a block enable method by passing + # an :or option with a true value + if (CONDITION_KEYS[method] == :if_enabled || CONDITION_KEYS[method] == :unless_enabled) && options[:or] + block.call + else + flow_control_method(CONDITION_KEYS[method], flags, options, &block) + end end - end unless method_defined?(method) + end end def inspect @@ -702,6 +711,7 @@ def flow_control_method(name, flag, options = {}, &block) unless options[:then] || options[:else] fail "You must supply a :then or :else option when calling #{name} like this!" end + node = n1(name, flag) if options[:then] node = append_to(node) { options[:then].call } @@ -732,6 +742,7 @@ def apply_conditions(options, node = nil) unless found fail 'The request to apply the current context has failed, this is likely a bug in OrigenTesters::ATP' end + node else conditions = extract_conditions(options) @@ -979,6 +990,7 @@ def add_global_flag_to_node(node, flags) def add_bin_description(node, number, description, options) @existing_bin_descriptions ||= { soft: {}, hard: {} } return node if @existing_bin_descriptions[options[:type]][number] + @existing_bin_descriptions[options[:type]][number] = true name, *nodes = *node if nodes[0] && nodes[0].type == :volatile diff --git a/lib/origen_testers/atp/flow_api.rb b/lib/origen_testers/atp/flow_api.rb index 93e024d6..0a40db34 100644 --- a/lib/origen_testers/atp/flow_api.rb +++ b/lib/origen_testers/atp/flow_api.rb @@ -45,6 +45,7 @@ def limit(value, options) unless options[:rule] fail 'You must supply option :rule (e.g. rule: :gt) when calling the limit helper' end + { value: value, rule: options[:rule] || :lt, diff --git a/lib/origen_testers/atp/parser.rb b/lib/origen_testers/atp/parser.rb index d069929c..40d574cf 100644 --- a/lib/origen_testers/atp/parser.rb +++ b/lib/origen_testers/atp/parser.rb @@ -12,7 +12,7 @@ def string_to_ast(string) def to_sexp(ast_array) children = ast_array.map do |item| - if item.is_a?(Array) + if item.is_a?(Array) to_sexp(item) else item @@ -20,6 +20,7 @@ def to_sexp(ast_array) end type = children.shift return type if type.is_a?(OrigenTesters::ATP::AST::Node) + type = type.to_s.gsub('-', '_').to_sym OrigenTesters::ATP::AST::Node.new(type, children) end diff --git a/lib/origen_testers/atp/processor.rb b/lib/origen_testers/atp/processor.rb index 20848434..42c43ee4 100644 --- a/lib/origen_testers/atp/processor.rb +++ b/lib/origen_testers/atp/processor.rb @@ -57,6 +57,7 @@ def volatile_flags unless @volatiles fail 'You must first call extract_volatiles(node) from your on_flow hander method' end + @volatiles[:flags] || [] end diff --git a/lib/origen_testers/atp/processors/flow_id.rb b/lib/origen_testers/atp/processors/flow_id.rb index 4535e12c..e990817d 100644 --- a/lib/origen_testers/atp/processors/flow_id.rb +++ b/lib/origen_testers/atp/processors/flow_id.rb @@ -10,7 +10,7 @@ def run(node, id) end def on_id(node) - if node.value =~ /^extern/ + if node.value =~ /^extern/ || node.value =~ /_extern/ node else node.updated(nil, ["#{node.value}_#{id}"]) @@ -21,14 +21,16 @@ def on_if_failed(node) tid, *nodes = *node if tid.is_a?(Array) tid = tid.map do |tid| - if tid =~ /^extern/ + if tid =~ /^extern/ || node.value =~ /_extern/ tid else - "#{tid}_#{id}" + tid = "#{tid}_#{id}" end end else - if tid !~ /^extern/ + if tid =~ /^extern/ || node.value =~ /_extern/ + tid + else tid = "#{tid}_#{id}" end end diff --git a/lib/origen_testers/atp/processors/on_pass_fail_remover.rb b/lib/origen_testers/atp/processors/on_pass_fail_remover.rb index 9fd288d3..ef762e60 100644 --- a/lib/origen_testers/atp/processors/on_pass_fail_remover.rb +++ b/lib/origen_testers/atp/processors/on_pass_fail_remover.rb @@ -15,6 +15,7 @@ def on_test(node) unless id fail 'Something has gone wrong, all nodes should have IDs by this point' end + id = id.value nodes = [node] if on_fail && contains_anything_interesting?(on_fail) diff --git a/lib/origen_testers/atp/processors/relationship.rb b/lib/origen_testers/atp/processors/relationship.rb index 8094dc36..a2d3d7a5 100644 --- a/lib/origen_testers/atp/processors/relationship.rb +++ b/lib/origen_testers/atp/processors/relationship.rb @@ -9,8 +9,6 @@ class Relationship < Processor # Extracts all test-result nodes from the given AST class ExtractTestResults < Processor - attr_reader :results - def on_if_failed(node) ids, *children = *node unless ids.is_a?(Array) @@ -68,7 +66,18 @@ def add_pass_flag(id, node) node = node.ensure_node_present(:on_fail) node.updated(nil, node.children.map do |n| if n.type == :on_pass - n = n.add node.updated(:set_flag, ["#{id}_PASSED", :auto_generated]) + type = 'PASSED' + if !tester.literal_flag_options.nil? + type = tester.literal_flag_options[:pass_name] ? "#{tester.literal_flag_options[:pass_name]}" : type + if tester.literal_flag_options[:type_first] + n = n.add node.updated(:set_flag, ["#{type}_#{id}", :auto_generated]) + else + n = n.add node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end + else + n = n.add node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end + elsif n.type == :on_fail delayed = n.find(:delayed) if delayed && delayed.to_a[0] @@ -86,7 +95,18 @@ def add_fail_flag(id, node) node = node.ensure_node_present(:on_fail) node.updated(nil, node.children.map do |n| if n.type == :on_fail - n = n.add node.updated(:set_flag, ["#{id}_FAILED", :auto_generated]) + type = 'FAILED' + if !tester.literal_flag_options.nil? + type = tester.literal_flag_options[:fail_name] ? "#{tester.literal_flag_options[:fail_name]}" : type + if tester.literal_flag_options[:type_first] + n = n.add node.updated(:set_flag, ["#{type}_#{id}", :auto_generated]) + else + n = n.add node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end + else + n = n.add node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end + delayed = n.find(:delayed) if delayed && delayed.to_a[0] n @@ -100,16 +120,24 @@ def add_fail_flag(id, node) end def add_ran_flags(id, node) - set_flag = node.updated(:set_flag, ["#{id}_RAN", :auto_generated]) + type = 'RAN' + if !tester.literal_flag_options.nil? + type = tester.literal_flag_options[:ran_name] ? "#{tester.literal_flag_options[:ran_name]}" : type + if tester.literal_flag_options[:type_first] + set_flag = node.updated(:set_flag, ["#{type}_#{id}", :auto_generated]) + else + set_flag = node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end + else + set_flag = node.updated(:set_flag, ["#{id}_#{type}", :auto_generated]) + end # For a group, set a flag immediately upon entry to the group to signal that # it ran to later tests, this is better than doing it immediately after the group # in case it was bypassed if node.type == :group || node.type == :sub_flow nodes = node.to_a.dup pre_nodes = [] - while [:name, :id, :path].include?(nodes.first.try(:type)) - pre_nodes << nodes.shift - end + pre_nodes << nodes.shift while [:name, :id, :path].include?(nodes.first.try(:type)) node.updated(nil, pre_nodes + [set_flag] + nodes) # For a test, set a flag immediately after the referenced test has executed @@ -212,10 +240,30 @@ def id(node) end def id_to_flag(id, type) - if id.is_a?(Array) - id.map { |i| "#{i}_#{type}" } + # default is {id}_type, but allow option to switch + if !tester.literal_flag_options.nil? + type = "#{tester.literal_flag_options[:fail_name]}" if type == 'FAILED' + type = "#{tester.literal_flag_options[:pass_name]}" if type == 'PASSED' + type = "#{tester.literal_flag_options[:ran_name]}" if type == 'RAN' + if tester.literal_flag_options[:type_first] + if id.is_a?(Array) + id.map { |i| "#{type}_#{i}" } + else + "#{type}_#{id}" + end + else + if id.is_a?(Array) + id.map { |i| "#{i}_#{type}" } + else + "#{id}_#{type}" + end + end else - "#{id}_#{type}" + if id.is_a?(Array) + id.map { |i| "#{i}_#{type}" } + else + "#{id}_#{type}" + end end end end diff --git a/lib/origen_testers/atp/runner.rb b/lib/origen_testers/atp/runner.rb index 1c5a4e3e..a7491c67 100644 --- a/lib/origen_testers/atp/runner.rb +++ b/lib/origen_testers/atp/runner.rb @@ -187,6 +187,7 @@ def on_if_job(node) unless job fail 'Flow contains JOB-based conditions and no current JOB has been given!' end + if state process_all(node) if jobs.include?(job) else diff --git a/lib/origen_testers/atp/validators/missing_ids.rb b/lib/origen_testers/atp/validators/missing_ids.rb index 234b9156..13cb9ddd 100644 --- a/lib/origen_testers/atp/validators/missing_ids.rb +++ b/lib/origen_testers/atp/validators/missing_ids.rb @@ -40,7 +40,7 @@ def on_id(node) def on_if_failed(node) ids = node.to_a[0] [ids].flatten.each do |id| - unless id =~ /^extern/ + unless id =~ /^extern/ || tester.literal_flags && id =~ /_extern/ @referenced_ids[id] ||= [] @referenced_ids[id] << node unless @present_ids[id] diff --git a/lib/origen_testers/callback_handlers.rb b/lib/origen_testers/callback_handlers.rb index 67c88e09..ab5a35a0 100644 --- a/lib/origen_testers/callback_handlers.rb +++ b/lib/origen_testers/callback_handlers.rb @@ -23,6 +23,7 @@ def before_pattern_lookup(requested_pattern) # Found a .atp or .atp.gz file so we should compile it matches = Dir.glob("#{Origen.root}/**/#{patname}") fail "Found multiple locations for #{patname}, exiting...\n\t#{matches}" if matches.size > 1 + pattern = matches.first.to_s current_compiler = select_compiler run_compiler(current_compiler, pattern) diff --git a/lib/origen_testers/charz.rb b/lib/origen_testers/charz.rb index d82f5a05..be8b4bcb 100644 --- a/lib/origen_testers/charz.rb +++ b/lib/origen_testers/charz.rb @@ -17,7 +17,8 @@ module Charz # @return [Boolean] whether or not to wrap eof charz tests in a group # @!attribute eof_charz_tests_group_name # @return [String, Symbol] group name to be used to for eof charz tests - attr_accessor :charz_stack, :charz_routines, :charz_profiles, :charz_session, :eof_charz_tests, :skip_group_eof_charz_tests, :eof_charz_tests_group_name + attr_accessor :skip_group_eof_charz_tests, :eof_charz_tests_group_name + attr_writer :charz_stack, :charz_profiles, :charz_routines, :charz_session, :eof_charz_tests def charz_stack @charz_stack ||= [] diff --git a/lib/origen_testers/charz/profile.rb b/lib/origen_testers/charz/profile.rb index 7d4aef6a..fc32b95e 100644 --- a/lib/origen_testers/charz/profile.rb +++ b/lib/origen_testers/charz/profile.rb @@ -82,14 +82,14 @@ def attrs_ok? def gate_check(gates, gate_type) case gates when Symbol, String - return + nil when Array unknown_gates = gates.reject { |gate| [String, Symbol].include? gate.class } if unknown_gates.empty? - return + nil else Origen.log.error "Profile #{id}: Unknown #{gate_type} type(s) in #{gate_type} array." - Origen.log.error "Arrays must contain Strings and/or Symbols, but #{unknown_gates.map(&:class).uniq } were found in #{gates}" + Origen.log.error "Arrays must contain Strings and/or Symbols, but #{unknown_gates.map(&:class).uniq} were found in #{gates}" fail end when Hash diff --git a/lib/origen_testers/charz/routines/search_routine.rb b/lib/origen_testers/charz/routines/search_routine.rb index cc263d66..b8ee0b74 100644 --- a/lib/origen_testers/charz/routines/search_routine.rb +++ b/lib/origen_testers/charz/routines/search_routine.rb @@ -30,6 +30,7 @@ def attrs_ok? end return if @attr_value_check == false + if [@start, @stop, @res].all? { |attr| attr.is_a? Numeric } unless @res <= (@start - @stop).abs Origen.log.error "SearchRoutine #{@id}: Search resolution (#{@res}) is larger than the search range: #{(@start - @stop).abs}" diff --git a/lib/origen_testers/command_based_tester.rb b/lib/origen_testers/command_based_tester.rb index 7a2b4114..57661ce2 100644 --- a/lib/origen_testers/command_based_tester.rb +++ b/lib/origen_testers/command_based_tester.rb @@ -1,4 +1,3 @@ - module OrigenTesters # A base class that can be used to model command-based, rather than # vector-based testers. @@ -35,11 +34,13 @@ def format_vector(vec) end # Loop the content embedded in the supplied block + # rubocop:disable Style/OptionalArguments def loop(_name = nil, number_of_loops) number_of_loops.times do yield end end alias_method :loop_vector, :loop + # rubocop:enable Style/OptionalArguments end end diff --git a/lib/origen_testers/decompiler/nodes.rb b/lib/origen_testers/decompiler/nodes.rb index bee317e6..273ab381 100644 --- a/lib/origen_testers/decompiler/nodes.rb +++ b/lib/origen_testers/decompiler/nodes.rb @@ -115,7 +115,7 @@ class Frontmatter < OrigenTesters::Decompiler::Nodes::Node alias_method :header, :pattern_header alias_method :comment_header, :pattern_header - def initialize(pattern_header: nil, comments: nil, context:) + def initialize(context:, pattern_header: nil, comments: nil) @pattern_header = pattern_header @comments = comments || [] diff --git a/lib/origen_testers/decompiler/pattern.rb b/lib/origen_testers/decompiler/pattern.rb index 47e210a8..9f7e92e0 100644 --- a/lib/origen_testers/decompiler/pattern.rb +++ b/lib/origen_testers/decompiler/pattern.rb @@ -177,6 +177,7 @@ def first_vector if @first_vector.nil? fail OrigenTesters::Decompiler::ParseError, "Could not locate the first vector in pattern #{@source}" end + @first_vector end end @@ -249,7 +250,7 @@ def pin_sizes def first_vector? first_vector rescue OrigenTesters::Decompiler::ParseError - return false + false end # Adds any pins in the decompiled pattern to the DUT which are not already present. diff --git a/lib/origen_testers/decompiler/pattern/enumerable_ext.rb b/lib/origen_testers/decompiler/pattern/enumerable_ext.rb index ae7d8933..08892b4e 100644 --- a/lib/origen_testers/decompiler/pattern/enumerable_ext.rb +++ b/lib/origen_testers/decompiler/pattern/enumerable_ext.rb @@ -164,7 +164,10 @@ def first(n = nil) end vectors else + # this loop will be executed only once + # rubocop:disable Lint/UnreachableLoop each_vector { |v| return v } + # rubocop:enable Lint/UnreachableLoop end end end diff --git a/lib/origen_testers/decompiler/pattern/splitter.rb b/lib/origen_testers/decompiler/pattern/splitter.rb index 79c4ffeb..832f0589 100644 --- a/lib/origen_testers/decompiler/pattern/splitter.rb +++ b/lib/origen_testers/decompiler/pattern/splitter.rb @@ -94,7 +94,6 @@ def split! # - Its possible (and fine) for endmatter to be non-existant, or even not allowed. # - In the latter case, the endvector symbol should the EoF symbol. # @return (Hash) - # rubocop:disable Metrics/ParameterLists def split(pinlist_start:, vectors_start:, vectors_end:, vectors_include_start_line: false, vectors_include_end_line: false, &block) def check_match(matcher, line, index, indices) if matcher.respond_to?(:call) @@ -158,7 +157,6 @@ def check_match(matcher, line, index, indices) indices end - # rubocop:enable Metrics/ParameterLists end end end diff --git a/lib/origen_testers/flow.rb b/lib/origen_testers/flow.rb index 62258315..08bac774 100644 --- a/lib/origen_testers/flow.rb +++ b/lib/origen_testers/flow.rb @@ -244,12 +244,11 @@ def flow_sig(id) def get_app(file) path = Pathname.new(file).dirname - until File.exist?(File.join(path, 'config/application.rb')) || path.root? - path = path.parent - end + path = path.parent until File.exist?(File.join(path, 'config/application.rb')) || path.root? if path.root? fail 'Something went wrong resoving the app root in OrigenTesters' end + Origen.find_app_by_root(path) end diff --git a/lib/origen_testers/generator.rb b/lib/origen_testers/generator.rb index 0561b33e..86868b8f 100755 --- a/lib/origen_testers/generator.rb +++ b/lib/origen_testers/generator.rb @@ -108,6 +108,7 @@ def filename(options = {}) }.merge(options) # Allow generators to override this and fully define the filename if they want return fully_formatted_filename if try(:fully_formatted_filename) + name = (@filename || Origen.file_handler.current_file.basename('.rb')).to_s name[0] = '' if name[0] == '_' if Origen.config.program_prefix @@ -178,6 +179,7 @@ def write_to_file(options = {}) def write_from_template(options = {}) return unless Origen.interface.write? + options = { quiet: false, skip_diff: false @@ -192,7 +194,7 @@ def write_from_template(options = {}) @append = true Origen.file_handler.preserve_state do File.open(output_file, 'a') do |out| - content = compiler.insert(ERB.new(File.read(self.class::TEMPLATE), 0, Origen.config.erb_trim_mode).result(binding)) + content = compiler.insert(ERB.new(File.read(self.class::TEMPLATE), trim_mode: Origen.config.erb_trim_mode).result(binding)) out.puts content unless content.empty? end end @@ -201,7 +203,7 @@ def write_from_template(options = {}) @append = false Origen.file_handler.preserve_state do File.open(output_file, 'w') do |out| - out.puts compiler.insert(ERB.new(File.read(self.class::TEMPLATE), 0, Origen.config.erb_trim_mode).result(binding)) + out.puts compiler.insert(ERB.new(File.read(self.class::TEMPLATE), trim_mode: Origen.config.erb_trim_mode).result(binding)) end end @@opened_files << output_file diff --git a/lib/origen_testers/generator/identity_map.rb b/lib/origen_testers/generator/identity_map.rb index efb45fde..a641911f 100644 --- a/lib/origen_testers/generator/identity_map.rb +++ b/lib/origen_testers/generator/identity_map.rb @@ -15,9 +15,12 @@ def current_version_of(obj) end end + # rubocop:disable Lint/HashCompareByIdentity + # .object_id is not the "preferred" method def map_for(obj) @store[obj.object_id] end + # rubocop:enable Lint/HashCompareByIdentity end end end diff --git a/lib/origen_testers/generator/test_numberer.rb b/lib/origen_testers/generator/test_numberer.rb index 362610a8..a806d17b 100644 --- a/lib/origen_testers/generator/test_numberer.rb +++ b/lib/origen_testers/generator/test_numberer.rb @@ -9,7 +9,6 @@ class TestNumberer # @option options [Integer] :offset (0) The o def test_number_for(test_name, options = {}) options = { - }.merge(options) end diff --git a/lib/origen_testers/igxl_based_tester.rb b/lib/origen_testers/igxl_based_tester.rb index e0ee6ac4..94215978 100644 --- a/lib/origen_testers/igxl_based_tester.rb +++ b/lib/origen_testers/igxl_based_tester.rb @@ -5,7 +5,7 @@ module IGXLBasedTester autoload :J750_HPT, 'origen_testers/igxl_based_tester/j750_hpt.rb' autoload :UltraFLEX, 'origen_testers/igxl_based_tester/ultraflex.rb' - require 'origen_testers/igxl_based_tester/base.rb' + require 'origen_testers/igxl_based_tester/base' require 'origen_testers/igxl_based_tester/decompiler' end # Convenience/Legacy names without the IGXLBasedTester namespace diff --git a/lib/origen_testers/igxl_based_tester/base.rb b/lib/origen_testers/igxl_based_tester/base.rb index d2fe0fce..401ba39b 100755 --- a/lib/origen_testers/igxl_based_tester/base.rb +++ b/lib/origen_testers/igxl_based_tester/base.rb @@ -25,8 +25,9 @@ class Base alias_method :min_repeat_count=, :min_repeat_loop= # Control literal flag definitions - attr_accessor :literal_flags # whether flags should be exactly as indicated - attr_accessor :literal_enables # whether enables should be exactly as indicated + attr_accessor :literal_flags # whether flags should be exactly as indicated + attr_accessor :literal_flag_options # any custom options for flag names + attr_accessor :literal_enables # whether enables should be exactly as indicated # NOTE: DO NOT USE THIS CLASS DIRECTLY ONLY USED AS PARENT FOR # DESIRED TESTER CLASS @@ -161,9 +162,7 @@ def import_chanmap(chanmapname, fullchanmappath) def get_tester_channel(chanmapname, pinname, sitenum) if sitenum <= @max_site @testerchannel = @channelmap[chanmapname][sitenum][pinname].channel - return @testerchannel - else - return nil + @testerchannel end end @@ -173,10 +172,8 @@ def merged_channels(chanmapname, pinname, sitenum) if sitenum <= @max_site if @channelmap[chanmapname][sitenum][pinname].type.include?('Merged') @merged_channels = @channelmap[chanmapname][sitenum][pinname].type.split('Merged')[1] - return 'x' + @merged_channels + 'x' + @merged_channels end - else - return nil end end @@ -200,12 +197,13 @@ def is_vhdvs_plus(testconfigname, slot) if @testerconfig[testconfigname][slot][:instrument].to_s == 'VHDVS' @productnum = @testerconfig[testconfigname][slot][:idprom].split(' ')[0] # binding.pry - if (@productnum.include?('805-052-')) && (@productnum.split('-')[2].to_i >= 05) + if (@productnum.include?('805-052-')) && (@productnum.split('-')[2].to_i >= 0o5) return '+' end end nil # if nothing matched end + # Check if a specific VHDVS (UVS256) channel assignment is _HC variety (high-current) # If the specific VHDVS channel is _HC variety, returns a "_HC" string, otherwise nil. def is_vhdvs_hc(chanmapname, pinname, sitenum) @@ -263,6 +261,7 @@ def parser(prog_dir = Origen.config.test_program_output_directory) unless prog_dir fail 'You must supply the directory containing the test program sheets, or define it via Origen.config.test_program_output_directory' end + @parser ||= IGXLBasedTester::Parser.new @parsed_dir ||= false if @parsed_dir != prog_dir @@ -293,8 +292,7 @@ def parser(prog_dir = Origen.config.test_program_output_directory) # $tester.store(:offset => -2) # Just realized I need to capture that earlier vector def store(*pins) options = pins.last.is_a?(Hash) ? pins.pop : {} - options = { offset: 0 - }.merge(options) + options = { offset: 0 }.merge(options) update_vector microcode: 'stv', offset: options[:offset] last_vector(options[:offset]).contains_capture = true unless @inhibit_vectors end @@ -401,8 +399,7 @@ def end_subroutine(cond = false, options = {}) # $tester.freq_count($top.pin(:d_out)) # Freq measure on pin "d_out" # $tester.freq_count($top.pin(:d_out):readcode => 10) def freq_count(pin, options = {}) - options = { readcode: false - }.merge(options) + options = { readcode: false }.merge(options) set_code(options[:readcode]) if options[:readcode] cycle(microcode: "#{@microcode[:set_flag]} (cpuA)") @@ -437,7 +434,7 @@ def memory_test(options = {}) capture_vector_mem1: false, # capture vector to memory type 1, here for J750 will be stv_m1 capture_vector_mem2: false, # capture vector to memory type 2, here for J750 will be stv_c pin: false, # pin on which to drive or expect data, pass pin object here! - pin_data: false, # pin data (:none, :drive, :expect) + pin_data: false # pin data (:none, :drive, :expect) }.merge(options) mto_opcode = '' @@ -681,7 +678,7 @@ def pattern_header(options = {}) group: false, # If true the end pattern is intended to run within a pattern group high_voltage: false, # Supply a pin name here to declare it as an HV instrument (not yet defined) freq_counter: false, # Supply a pin name here to declare it as a frequency counter - memory_test: false, # If true, define 2-bit MTO DGEN as instrument + memory_test: false # If true, define 2-bit MTO DGEN as instrument }.merge(options) if level_period? @@ -844,8 +841,8 @@ def ignore_fails(*pins) end def enable_flag(options = {}) - options = { flagnum: 4, # default flag to use - }.merge(options) + # default flag to use + options = { flagnum: 4 }.merge(options) if options[:flagnum] > @flags.length abort "ERROR! Invalid flag value passed to 'enable_flag' method!\n" @@ -855,8 +852,8 @@ def enable_flag(options = {}) end def set_flag(options = {}) - options = { flagnum: 4, # default flag to use - }.merge(options) + # default flag to use + options = { flagnum: 4 }.merge(options) if options[:flagnum] > @flags.length abort "ERROR! Invalid flag value passed to 'set_flag' method!\n" diff --git a/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb b/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb index 33bf5064..02ec2b6c 100644 --- a/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb @@ -106,7 +106,7 @@ def initialize(name, options = {}) end # Set the defaults self.class::TEST_INSTANCE_DEFAULTS.each do |k, v| - send("#{k}=", v) if self.respond_to?("#{k}=", v) + send("#{k}=", v) if respond_to?("#{k}=", v) end # Finally set any initial values that have been supplied options[:attrs].each do |k, v| diff --git a/lib/origen_testers/igxl_based_tester/base/edgesets.rb b/lib/origen_testers/igxl_based_tester/base/edgesets.rb index 3914ad80..56f18d9a 100755 --- a/lib/origen_testers/igxl_based_tester/base/edgesets.rb +++ b/lib/origen_testers/igxl_based_tester/base/edgesets.rb @@ -20,7 +20,7 @@ def add(esname, pin, edge, options = {}) esname = esname.to_sym unless esname.is_a? Symbol pin = pin.to_sym unless pin.is_a? Symbol @es.key?(esname) ? @es[esname].add_edge(pin, edge) : @es[esname] = platform::Edgeset.new(esname, pin, edge, options) - @es_sheet_pins = options[:es_sheet_pins] unless @es_sheet_pins + @es_sheet_pins ||= options[:es_sheet_pins] @es end diff --git a/lib/origen_testers/igxl_based_tester/base/flow_line.rb b/lib/origen_testers/igxl_based_tester/base/flow_line.rb index 87d41b7e..2b7aff4f 100644 --- a/lib/origen_testers/igxl_based_tester/base/flow_line.rb +++ b/lib/origen_testers/igxl_based_tester/base/flow_line.rb @@ -2,7 +2,9 @@ module OrigenTesters module IGXLBasedTester class Base class FlowLine - attr_accessor :type, :id, :cz_setup # cz_setup is a virtual attrib since it is not part of the regular flow line + attr_accessor :type, :cz_setup # cz_setup is a virtual attrib since it is not part of the regular flow line + attr_writer :id + # cz_setup combine with instance name when characterize opcode is used # Map any aliases to the official names here, multiple aliases for a given attribute @@ -24,30 +26,23 @@ class FlowLine # Aliases can also be used to set defaults on multiple attributes like this, # use :value to refer to the value passed in to the given alias flag_false: { device_condition: 'flag-false', - device_name: :value - }, + device_name: :value }, flag_true: { device_condition: 'flag-true', - device_name: :value - }, + device_name: :value }, flag_false_any: { group_specifier: 'any-active', group_condition: 'flag-false', - group_name: :value - }, + group_name: :value }, flag_false_all: { group_specifier: 'all-active', group_condition: 'flag-false', - group_name: :value - }, + group_name: :value }, flag_true_any: { group_specifier: 'any-active', group_condition: 'flag-true', - group_name: :value - }, + group_name: :value }, flag_true_all: { group_specifier: 'all-active', group_condition: 'flag-true', - group_name: :value - }, + group_name: :value }, flag_clear: { device_condition: 'flag-clear', - device_name: :value - } + device_name: :value } } # Assign attribute defaults here, generally this should match whatever defaults @@ -155,11 +150,11 @@ def initialize(type, attrs = {}) @type = type # Set the defaults DEFAULTS[@type.to_sym].each do |k, v| - send("#{k}=", v) if self.respond_to?("#{k}=") + send("#{k}=", v) if respond_to?("#{k}=") end # Then the values that have been supplied attrs.each do |k, v| - send("#{k}=", v) if self.respond_to?("#{k}=") + send("#{k}=", v) if respond_to?("#{k}=") end # override test numbers if diff-friendly output desired if Origen.tester.diff_friendly_output? diff --git a/lib/origen_testers/igxl_based_tester/base/generator.rb b/lib/origen_testers/igxl_based_tester/base/generator.rb index b675a4eb..82c77b5f 100755 --- a/lib/origen_testers/igxl_based_tester/base/generator.rb +++ b/lib/origen_testers/igxl_based_tester/base/generator.rb @@ -337,6 +337,7 @@ def sheet_generators # :nodoc: [edgeset_sheets, timeset_sheets].each do |sheets| sheets.each do |name, sheet| next if sheet.class.name =~ /Edgesets$/ && sheet.ts_basic + g << sheet end end @@ -362,6 +363,7 @@ def flow_generators def pinmaps(filename = pinmaps_filename) f = filename.to_sym return pinmap_sheets[f] if pinmap_sheets[f] + p = platform::Pinmap.new p.filename = f pinmap_sheets[f] = p @@ -377,6 +379,7 @@ def pinmaps(filename = pinmaps_filename) def test_instances(filename = test_instances_filename) f = filename.to_sym return test_instance_sheets[f] if test_instance_sheets[f] + t = platform::TestInstances.new t.filename = f test_instance_sheets[f] = t @@ -391,6 +394,7 @@ def test_instances(filename = test_instances_filename) def patsets(filename = patsets_filename) f = filename.to_sym return patset_sheets[f] if patset_sheets[f] + p = platform::Patsets.new p.filename = f patset_sheets[f] = p @@ -407,6 +411,7 @@ def patsets(filename = patsets_filename) def patsubrs(filename = patsubrs_filename) f = filename.to_sym return patsubr_sheets[f] if patsubr_sheets[f] + p = platform::Patsubrs.new p.filename = f patsubr_sheets[f] = p @@ -426,6 +431,7 @@ def flow(filename = nil) # DH here need to reset the flow!! f = filename.to_sym return flow_sheets[f] if flow_sheets[f] # will return flow if already existing + p = platform::Flow.new p.inhibit_output if Origen.interface.resources_mode? p.filename = f @@ -442,6 +448,7 @@ def flow(filename = nil) def patgroups(filename = patgroups_filename) f = filename.to_sym return patgroup_sheets[f] if patgroup_sheets[f] + p = platform::Patgroups.new p.filename = f patgroup_sheets[f] = p @@ -470,6 +477,7 @@ def edgesets(filename = edgesets_filename, options = {}) f = filename.to_sym return edgeset_sheets[f] if edgeset_sheets[f] + e = platform::Edgesets.new(options) e.filename = f edgeset_sheets[f] = e @@ -489,6 +497,7 @@ def timesets(filename = timesets_filename, options = {}) f = filename.to_sym return timeset_sheets[f] if timeset_sheets[f] + case options[:timeset_basic] when true t = platform::TimesetsBasic.new(options) @@ -518,12 +527,11 @@ def levels def levelsets(filename = levelsets_filename) f = filename.to_sym return levelset_sheets[f] if levelset_sheets[f] + t = platform::Levelset.new t.filename = f levelset_sheets[f] = t end - alias_method :time_sets, :timesets - alias_method :timing_sets, :timesets # Returns the current AC specset sheet (as defined by the current value of # ac_specsets_filename). @@ -534,6 +542,7 @@ def levelsets(filename = levelsets_filename) def ac_specsets(filename = ac_specsets_filename) f = filename.to_sym return ac_specset_sheets[f] if ac_specset_sheets[f] + s = platform::ACSpecsets.new s.filename = f ac_specset_sheets[f] = s @@ -548,6 +557,7 @@ def ac_specsets(filename = ac_specsets_filename) def dc_specsets(filename = dc_specsets_filename) f = filename.to_sym return dc_specset_sheets[f] if dc_specset_sheets[f] + s = platform::DCSpecsets.new s.filename = f dc_specset_sheets[f] = s @@ -562,6 +572,7 @@ def dc_specsets(filename = dc_specsets_filename) def global_specs(filename = global_specs_filename) f = filename.to_sym return global_spec_sheets[f] if global_spec_sheets[f] + s = platform::GlobalSpecs.new s.filename = f global_spec_sheets[f] = s @@ -576,6 +587,7 @@ def global_specs(filename = global_specs_filename) def program_jobs(filename = jobs_filename) f = filename.to_sym return job_sheets[f] if job_sheets[f] + j = platform::Jobs.new j.filename = f job_sheets[f] = j @@ -590,6 +602,7 @@ def program_jobs(filename = jobs_filename) def references(filename = references_filename) f = filename.to_sym return reference_sheets[f] if reference_sheets[f] + r = platform::References.new r.filename = f reference_sheets[f] = r diff --git a/lib/origen_testers/igxl_based_tester/base/job.rb b/lib/origen_testers/igxl_based_tester/base/job.rb index 293c8708..839feab2 100755 --- a/lib/origen_testers/igxl_based_tester/base/job.rb +++ b/lib/origen_testers/igxl_based_tester/base/job.rb @@ -24,24 +24,24 @@ class Job def initialize(jname, options = {}) # :nodoc: @name = jname - options[:pinmap] ? @pinmap = [options[:pinmap]] : @pinmap = [] - options[:instances] ? @instances = [options[:instances]] : @instances = [] - options[:flows] ? @flows = [options[:flows]] : @flows = [] + options[:pinmap] ? @pinmap = [options[:pinmap]] : @pinmap = [] + options[:instances] ? @instances = [options[:instances]] : @instances = [] + options[:flows] ? @flows = [options[:flows]] : @flows = [] options[:ac_specs] ? @ac_specs = [options[:ac_specs]] : @ac_specs = [] options[:dc_specs] ? @dc_specs = [options[:dc_specs]] : @dc_specs = [] - options[:patsets] ? @patsets = [options[:patsets]] : @patsets = [] + options[:patsets] ? @patsets = [options[:patsets]] : @patsets = [] options[:patgroups] ? @patgroups = [options[:patgroups]] : @patgroups = [] options[:bintables] ? @bintables = [options[:bintables]] : @bintables = [] - options[:cz] ? @cz = [options[:cz]] : @cz = [] - options[:test_procs] ? @test_procs = [options[:test_procs]] : @test_procs = [] + options[:cz] ? @cz = [options[:cz]] : @cz = [] + options[:test_procs] ? @test_procs = [options[:test_procs]] : @test_procs = [] options[:mix_sig_timing] ? @mix_sig_timing = [options[:mix_sig_timing]] : @mix_sig_timing = [] - options[:wave_defs] ? @wave_defs = [options[:wave_defs]] : @wave_defs = [] - options[:psets] ? @psets = [options[:psets]] : @psets = [] - options[:signals] ? @signals = [options[:signals]] : @signals = [] - options[:port_map] ? @port_map = [options[:port_map]] : @port_map = [] - options[:fract_bus] ? @fract_bus = [options[:fract_bus]] : @fract_bus = [] + options[:wave_defs] ? @wave_defs = [options[:wave_defs]] : @wave_defs = [] + options[:psets] ? @psets = [options[:psets]] : @psets = [] + options[:signals] ? @signals = [options[:signals]] : @signals = [] + options[:port_map] ? @port_map = [options[:port_map]] : @port_map = [] + options[:fract_bus] ? @fract_bus = [options[:fract_bus]] : @fract_bus = [] options[:concurrent_seq] ? @concurrent_seq = [options[:concurrent_seq]] : @concurrent_seq = [] - options[:comment] ? @comment = options[:instances] : @comment = nil + options[:comment] ? @comment = options[:instances] : @comment = nil end # Assigns job information for the given object diff --git a/lib/origen_testers/igxl_based_tester/base/levelset.rb b/lib/origen_testers/igxl_based_tester/base/levelset.rb index 001a866b..3b3d5770 100755 --- a/lib/origen_testers/igxl_based_tester/base/levelset.rb +++ b/lib/origen_testers/igxl_based_tester/base/levelset.rb @@ -18,8 +18,6 @@ def initialize(options = {}) # :nodoc: @pins = {} end - # rubocop:disable Metrics/ParameterLists - # Adds a pin level to the given levelset def add(lsname, pin, level, options = {}) options = { @@ -31,7 +29,7 @@ def add(lsname, pin, level, options = {}) add_level(pin, level) @name = lsname @spec_sheet = options[:spec_sheet] - @ls_sheet_pins = options[:ls_sheet_pins] unless @ls_sheet_pins + @ls_sheet_pins ||= options[:ls_sheet_pins] end # Assigns a level object to the given pin for this levelset diff --git a/lib/origen_testers/igxl_based_tester/base/patgroup.rb b/lib/origen_testers/igxl_based_tester/base/patgroup.rb index 81958c75..a42b3f1d 100644 --- a/lib/origen_testers/igxl_based_tester/base/patgroup.rb +++ b/lib/origen_testers/igxl_based_tester/base/patgroup.rb @@ -79,11 +79,13 @@ def name @name end + # rubocop:disable Lint/Void def name=(n) @name = n lines.each { |l| l.group_name = n } n end + # rubocop:enable Lint/Void # Returns all lines in the pattern set def lines diff --git a/lib/origen_testers/igxl_based_tester/base/patset.rb b/lib/origen_testers/igxl_based_tester/base/patset.rb index f784ab2b..63961079 100644 --- a/lib/origen_testers/igxl_based_tester/base/patset.rb +++ b/lib/origen_testers/igxl_based_tester/base/patset.rb @@ -34,11 +34,13 @@ def name @name end + # rubocop:disable Lint/Void def name=(n) @name = n lines.each { |l| l.pattern_set = n } n end + # rubocop:enable Lint/Void # Returns all lines in the pattern set def lines diff --git a/lib/origen_testers/igxl_based_tester/base/patsubr.rb b/lib/origen_testers/igxl_based_tester/base/patsubr.rb index 57a62213..90b764c1 100644 --- a/lib/origen_testers/igxl_based_tester/base/patsubr.rb +++ b/lib/origen_testers/igxl_based_tester/base/patsubr.rb @@ -34,11 +34,13 @@ def name @name end + # rubocop:disable Lint/Void def name=(n) @name = n lines.each { |l| l.pattern_set = n } n end + # rubocop:enable Lint/Void # Returns all lines in the pattern set def lines diff --git a/lib/origen_testers/igxl_based_tester/base/test_instance.rb b/lib/origen_testers/igxl_based_tester/base/test_instance.rb index 3bdc4652..4896c4c7 100755 --- a/lib/origen_testers/igxl_based_tester/base/test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/base/test_instance.rb @@ -52,19 +52,19 @@ def initialize(name, type, attrs = {}) # Build the type specific accessors (aliases) self.class::TEST_INSTANCE_ALIASES[@type.to_sym].each do |_alias, val| define_singleton_method("#{_alias}=") do |v| - send("#{val}=", v) if self.respond_to?("#{val}=", v) + send("#{val}=", v) if respond_to?("#{val}=", v) end define_singleton_method("#{_alias}") do - send(val) if self.respond_to?(val) + send(val) if respond_to?(val) end end # Set the defaults self.class::TEST_INSTANCE_DEFAULTS[@type.to_sym].each do |k, v| - send("#{k}=", v) if self.respond_to?("#{k}=", v) + send("#{k}=", v) if respond_to?("#{k}=", v) end # Then the values that have been supplied attrs.each do |k, v| - send("#{k}=", v) if self.respond_to?("#{k}=", v) + send("#{k}=", v) if respond_to?("#{k}=", v) end end @@ -201,6 +201,7 @@ def set_lo_limit(lim) # instance.set_irange(:a => 0.2) # Same as above def set_irange(r = nil, options = {}) r, options = nil, r if r.is_a?(Hash) + # rubocop:disable Lint/EmptyConditionalBody unless r if r = options.delete(:na) || options.delete(:nA) r = r / 1_000_000_000 @@ -213,6 +214,7 @@ def set_irange(r = nil, options = {}) fail "Can't determine requested irange!" end end + # rubocop:enable Lint/EmptyConditionalBody if @type == :board_pmu if r == :smart @@ -225,7 +227,7 @@ def set_irange(r = nil, options = {}) when r > 0.00002 then 2 when r > 0.000002 then 1 else 0 - end + end end elsif @type == :powersupply @@ -242,21 +244,22 @@ def set_irange(r = nil, options = {}) when r > 0.00005 then 2 # between 50ua - 500u when r > 0.000005 then 3 # between 5u - 50u else 8 - end + end end else # :pin_pmu if r == :smart self.irange = 5 elsif r == :auto - fail 'Auto range not available in FIMV mode!' if self.fimv? + fail 'Auto range not available in FIMV mode!' if fimv? + self.irange = 6 else if fimv? self.irange = case when r > 0.0002 then 2 else 4 - end + end else self.irange = case when r > 0.0002 then 2 @@ -264,7 +267,7 @@ def set_irange(r = nil, options = {}) when r > 0.000002 then 0 when r > 0.0000002 then 1 else 3 - end + end end end end @@ -293,17 +296,19 @@ def set_vrange(r = nil, options = {}) elsif r == :auto self.vrange = 5 elsif !r + # rubocop:disable Lint/EmptyConditionalBody if r = options.delete(:v) || options.delete(:V) else fail "Can't determine requested vrange!" end + # rubocop:enable Lint/EmptyConditionalBody end self.vrange = case when r > 10 then 3 when r > 5 then 2 when r > 2 then 1 else 0 - end + end self end diff --git a/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb b/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb index 779cd3b7..01cb4dfb 100644 --- a/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +++ b/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb @@ -2,7 +2,8 @@ module OrigenTesters module IGXLBasedTester class Base class TestInstanceGroup - attr_accessor :name, :version, :append_version + attr_accessor :version, :append_version + attr_writer :name include Enumerable @@ -48,7 +49,7 @@ def ==(other_instance_group) self.class == other_instance_group.class && unversioned_name.to_s == other_instance_group.unversioned_name.to_s && size == other_instance_group.size && - self.all? do |ins| + all? do |ins| other_instance_group.any? { |other_ins| ins == other_ins } end end diff --git a/lib/origen_testers/igxl_based_tester/base/timesets.rb b/lib/origen_testers/igxl_based_tester/base/timesets.rb index 4ae3f2f7..74c54614 100755 --- a/lib/origen_testers/igxl_based_tester/base/timesets.rb +++ b/lib/origen_testers/igxl_based_tester/base/timesets.rb @@ -21,7 +21,7 @@ def add(tsname, pin, esname, options = {}) pin = pin.to_sym unless pin.is_a? Symbol esname = pin.to_sym unless esname.is_a? Symbol @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options) - @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins + @ts_sheet_pins ||= options[:ts_sheet_pins] @ts[tsname] end diff --git a/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb b/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb index f6678d7d..67f13260 100755 --- a/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +++ b/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb @@ -21,7 +21,7 @@ def add(tsname, pin, esname, options = {}) pin = pin.to_sym unless pin.is_a? Symbol esname = pin.to_sym unless esname.is_a? Symbol @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options) - @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins + @ts_sheet_pins ||= options[:ts_sheet_pins] @ts[tsname] end diff --git a/lib/origen_testers/igxl_based_tester/decompiler/atp.rb b/lib/origen_testers/igxl_based_tester/decompiler/atp.rb index b440e656..a7e9ca83 100644 --- a/lib/origen_testers/igxl_based_tester/decompiler/atp.rb +++ b/lib/origen_testers/igxl_based_tester/decompiler/atp.rb @@ -41,38 +41,32 @@ def parse_frontmatter(raw_frontmatter:, context:) pattern_header: header, variable_assignments: variable_assignments, imports: imports, - comments: comments - ) + comments: comments) end def parse_pinlist(raw_pinlist:, context:) raw_pinlist = raw_pinlist.join('') OrigenTesters::Decompiler::Nodes::Pinlist.new(context: self, - pins: raw_pinlist[raw_pinlist.index('$') + 1..raw_pinlist.index(')') - 1].split(/,\s*/)[1..-1] - ) + pins: raw_pinlist[raw_pinlist.index('$') + 1..raw_pinlist.index(')') - 1].split(/,\s*/)[1..-1]) end def parse_vector(raw_vector:, context:, meta:) if raw_vector =~ Regexp.new('^\s*//') nodes_namespace::CommentBlock.new(context: self, - comments: raw_vector.split("\n") - ) + comments: raw_vector.split("\n")) elsif raw_vector =~ Regexp.new('^\s*start_label') nodes_namespace::StartLabel.new(context: self, - start_label: raw_vector[raw_vector.index('start_label') + 11..-1].strip[0..-2] - ) + start_label: raw_vector[raw_vector.index('start_label') + 11..-1].strip[0..-2]) elsif raw_vector =~ Regexp.new('^\s*global') contents = raw_vector.strip['global'.size + 1..-2].strip.split(/\s+/) nodes_namespace::GlobalLabel.new(context: self, label_type: contents[0], - label_name: contents[1] - ) + label_name: contents[1]) elsif raw_vector =~ Regexp.new(':(?!(.*>))') nodes_namespace::Label.new(context: self, # Strip any whitespace from the vector and grab contents up to # the ':' symbol. - label_name: raw_vector.strip[0..-2] - ) + label_name: raw_vector.strip[0..-2]) else opcode_plus_args = raw_vector[0..(raw_vector.index('>') - 1)].rstrip.split(/\s+/) @@ -82,14 +76,12 @@ def parse_vector(raw_vector:, context:, meta:) pin_states: timeset_plus_pins[1..-1], opcode: (opcode_plus_args[0] && opcode_plus_args[0].empty?) ? nil : opcode_plus_args[0], opcode_arguments: opcode_plus_args[1..-1], - comment: begin - if raw_vector =~ Regexp.new('//') - raw_vector[raw_vector.index('//') + 2..-1].strip - else - '' - end - end - ) + comment: + if raw_vector =~ Regexp.new('//') + raw_vector[raw_vector.index('//') + 2..-1].strip + else + '' + end) end end end diff --git a/lib/origen_testers/igxl_based_tester/j750.rb b/lib/origen_testers/igxl_based_tester/j750.rb index 8ce696f1..57238d78 100644 --- a/lib/origen_testers/igxl_based_tester/j750.rb +++ b/lib/origen_testers/igxl_based_tester/j750.rb @@ -12,7 +12,7 @@ module IGXLBasedTester # Also note that this class inherits from the base Tester class and so all methods # described there are also available. class J750 < Base - require 'origen_testers/igxl_based_tester/j750/generator.rb' + require 'origen_testers/igxl_based_tester/j750/generator' attr_accessor :use_hv_pin attr_accessor :software_version @@ -20,6 +20,7 @@ class J750 < Base def self.hpt_mode @@hpt_mode end + def self.hpt_mode? @@hpt_mode end @@ -245,7 +246,7 @@ def match_block(timeout, options = {}, &block) def handshake(options = {}) options = { readcode: false, - manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared + manual_stop: false # set a 2nd CPU flag in case 1st flag is automatically cleared }.merge(options) if options[:readcode] set_code(options[:readcode]) diff --git a/lib/origen_testers/igxl_based_tester/j750/flow_line.rb b/lib/origen_testers/igxl_based_tester/j750/flow_line.rb index ffb581f2..466db8ab 100644 --- a/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +++ b/lib/origen_testers/igxl_based_tester/j750/flow_line.rb @@ -8,8 +8,7 @@ class FlowLine < Base::FlowLine sort_pass sort_fail result flag_pass flag_fail state group_specifier group_sense group_condition group_name device_sense device_condition device_name - debug_assume debug_sites comment - ) + debug_assume debug_sites comment) # Generate the instance method definitions based on the above define diff --git a/lib/origen_testers/igxl_based_tester/j750/test_instance.rb b/lib/origen_testers/igxl_based_tester/j750/test_instance.rb index 692e4e66..b470d10e 100644 --- a/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/j750/test_instance.rb @@ -634,10 +634,10 @@ class TestInstance < Base::TestInstance # instance.set_wait_flags(:a) # instance.set_wait_flags(:a, :c) def set_wait_flags(*flags) - a = (flags.include?(:a) || flags.include?(:a)) ? '1' : 'X' - b = (flags.include?(:b) || flags.include?(:b)) ? '1' : 'X' - c = (flags.include?(:c) || flags.include?(:c)) ? '1' : 'X' - d = (flags.include?(:d) || flags.include?(:d)) ? '1' : 'X' + a = flags.include?(:a) ? '1' : 'X' + b = flags.include?(:b) ? '1' : 'X' + c = flags.include?(:c) ? '1' : 'X' + d = flags.include?(:d) ? '1' : 'X' self.wait_flags = d + c + b + a self end @@ -658,9 +658,9 @@ def set_pre_charge(val) # intended to be used in documentation def to_meta return @meta if @meta + m = { 'Test' => name, - 'Type' => type - } + 'Type' => type } if type == :functional m['Pattern'] = pattern elsif type == :board_pmu || type == :pin_pmu diff --git a/lib/origen_testers/igxl_based_tester/j750_hpt.rb b/lib/origen_testers/igxl_based_tester/j750_hpt.rb index 9e43c059..b2ce30f5 100644 --- a/lib/origen_testers/igxl_based_tester/j750_hpt.rb +++ b/lib/origen_testers/igxl_based_tester/j750_hpt.rb @@ -12,7 +12,7 @@ module IGXLBasedTester # *Also note that this class inherits from the base Tester class and so all methods # described there are also available* class J750_HPT < J750 - require 'origen_testers/igxl_based_tester/j750_hpt/generator.rb' + require 'origen_testers/igxl_based_tester/j750_hpt/generator' def initialize(options = {}) super(options) diff --git a/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb b/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb index d43e5e95..a0678333 100644 --- a/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb @@ -586,10 +586,10 @@ class TestInstance < Base::TestInstance # instance.set_wait_flags(:a) # instance.set_wait_flags(:a, :c) def set_wait_flags(*flags) - a = (flags.include?(:a) || flags.include?(:a)) ? '1' : 'X' - b = (flags.include?(:b) || flags.include?(:b)) ? '1' : 'X' - c = (flags.include?(:c) || flags.include?(:c)) ? '1' : 'X' - d = (flags.include?(:d) || flags.include?(:d)) ? '1' : 'X' + a = flags.include?(:a) ? '1' : 'X' + b = flags.include?(:b) ? '1' : 'X' + c = flags.include?(:c) ? '1' : 'X' + d = flags.include?(:d) ? '1' : 'X' self.wait_flags = d + c + b + a self end diff --git a/lib/origen_testers/igxl_based_tester/parser.rb b/lib/origen_testers/igxl_based_tester/parser.rb index 9c373e1b..ac2c5f67 100644 --- a/lib/origen_testers/igxl_based_tester/parser.rb +++ b/lib/origen_testers/igxl_based_tester/parser.rb @@ -1,18 +1,18 @@ module OrigenTesters class IGXLBasedTester class Parser - autoload :Flows, 'origen_testers/igxl_based_tester/parser/flows' - autoload :Flow, 'origen_testers/igxl_based_tester/parser/flow' - autoload :FlowLine, 'origen_testers/igxl_based_tester/parser/flow_line' - autoload :TestInstances, 'origen_testers/igxl_based_tester/parser/test_instances' - autoload :TestInstance, 'origen_testers/igxl_based_tester/parser/test_instance' - autoload :PatternSets, 'origen_testers/igxl_based_tester/parser/pattern_sets' - autoload :PatternSet, 'origen_testers/igxl_based_tester/parser/pattern_set' - autoload :DCSpecs, 'origen_testers/igxl_based_tester/parser/dc_specs' - autoload :DCSpec, 'origen_testers/igxl_based_tester/parser/dc_spec' - autoload :ACSpecs, 'origen_testers/igxl_based_tester/parser/ac_specs' - autoload :ACSpec, 'origen_testers/igxl_based_tester/parser/ac_spec' - autoload :Descriptions, 'origen_testers/igxl_based_tester/parser/descriptions' + autoload :Flows, 'origen_testers/igxl_based_tester/parser/flows' + autoload :Flow, 'origen_testers/igxl_based_tester/parser/flow' + autoload :FlowLine, 'origen_testers/igxl_based_tester/parser/flow_line' + autoload :TestInstances, 'origen_testers/igxl_based_tester/parser/test_instances' + autoload :TestInstance, 'origen_testers/igxl_based_tester/parser/test_instance' + autoload :PatternSets, 'origen_testers/igxl_based_tester/parser/pattern_sets' + autoload :PatternSet, 'origen_testers/igxl_based_tester/parser/pattern_set' + autoload :DCSpecs, 'origen_testers/igxl_based_tester/parser/dc_specs' + autoload :DCSpec, 'origen_testers/igxl_based_tester/parser/dc_spec' + autoload :ACSpecs, 'origen_testers/igxl_based_tester/parser/ac_specs' + autoload :ACSpec, 'origen_testers/igxl_based_tester/parser/ac_spec' + autoload :Descriptions, 'origen_testers/igxl_based_tester/parser/descriptions' def reset @flows = nil diff --git a/lib/origen_testers/igxl_based_tester/parser/descriptions.rb b/lib/origen_testers/igxl_based_tester/parser/descriptions.rb index f3a6dcf7..44161ab9 100644 --- a/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +++ b/lib/origen_testers/igxl_based_tester/parser/descriptions.rb @@ -6,13 +6,15 @@ class Parser class Descriptions require 'fileutils' - attr_accessor :source_directories, :template_directories, :parser + attr_accessor :parser + attr_writer :source_directories, :template_directories SCRATCH_DIR = "#{Origen.root}/.j750_scratch" # All descriptions are stored in this lookup table def lookup return @lookup if @lookup + # Use the one from the interface if present, program generation will # automatically push descriptions in here if Origen.interface_present? @@ -26,7 +28,9 @@ def initialize(options = {}) @parser = options[:parser] FileUtils.rm_rf(SCRATCH_DIR) if File.exist?(SCRATCH_DIR) parse_program + # rubocop:disable Lint/Void true + # rubocop:enable Lint/Void end # Returns the description for the given flow @@ -151,8 +155,8 @@ def generate_program markup_source_file_comments # Compile the flow file, with Ruby comments now preserved and marked up desc = Origen.app.runner.generate(program: true, patterns: ungenerated_dir, output: generated_dir, - check_for_changes: false, collect_stats: false, quiet: true, - collect_descriptions: true) + check_for_changes: false, collect_stats: false, quiet: true, + collect_descriptions: true) Origen.log.info '' end @program_generated = true @@ -172,7 +176,7 @@ def compile_program markup_template_comments # Compile the flow file, with Ruby comments now preserved and marked up Origen.app.runner.generate(compile: true, patterns: uncompiled_dir, output: compiled_dir, - check_for_changes: false, collect_stats: false, quiet: true) + check_for_changes: false, collect_stats: false, quiet: true) Origen.log.info '' end @program_compiled = true @@ -251,8 +255,7 @@ def generated_dir # templates to def flow_or_instance_file?(file, options = {}) options = { flow: true, - instance: true - }.merge(options) + instance: true }.merge(options) if options[:flow] && options[:instance] match = 'Flow|Instances' elsif options[:flow] @@ -263,19 +266,18 @@ def flow_or_instance_file?(file, options = {}) # Not sure the best way to determine the file type of a partial, just # return true for now to play it safe return true if file.basename.to_s =~ /^_/ + File.readlines(file).each do |line| - begin - unless line =~ /^%/ || line =~ /^\s*/ - return !!(line =~ /#{match}/) - end - rescue Exception => e - if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/ - return false - else - puts e.message - puts e.backtrace - exit 1 - end + unless line =~ /^%/ || line =~ /^\s*/ + return !!(line =~ /#{match}/) + end + rescue Exception => e + if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/ + return false + else + puts e.message + puts e.backtrace + exit 1 end end end diff --git a/lib/origen_testers/igxl_based_tester/parser/test_instance.rb b/lib/origen_testers/igxl_based_tester/parser/test_instance.rb index abf7c506..111210c3 100644 --- a/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/parser/test_instance.rb @@ -392,10 +392,12 @@ def components # Returns an array of all pattern names referenced in this test instance def patterns - if self.respond_to?(:pattern) + if respond_to?(:pattern) + # rubocop:disable Style/MultilineBlockChain pattern.split(',').map do |pat| extract_pattern_from_patset(pat) end.flatten.map { |pat| pat.gsub(/.*[\\\/]/, '').gsub(/\..*/, '') } + # rubocop:enable Style/MultilineBlockChain end end diff --git a/lib/origen_testers/igxl_based_tester/ultraflex.rb b/lib/origen_testers/igxl_based_tester/ultraflex.rb index 46696f93..eb777d17 100755 --- a/lib/origen_testers/igxl_based_tester/ultraflex.rb +++ b/lib/origen_testers/igxl_based_tester/ultraflex.rb @@ -2,7 +2,7 @@ module OrigenTesters module IGXLBasedTester class UltraFLEX < Base - autoload :Generator, 'origen_testers/igxl_based_tester/ultraflex/generator.rb' + autoload :Generator, 'origen_testers/igxl_based_tester/ultraflex/generator.rb' # Read or update the digital instrument # Ex: tester.digital_instrument = 'hsdmq' @@ -65,8 +65,7 @@ def initialize(options = {}) # $tester.freq_count($top.pin(:d_out)) # Freq measure on pin "d_out" # $tester.freq_count($top.pin(:d_out):readcode => 10) def freq_count(pin, options = {}) - options = { readcode: false - }.merge(options) + options = { readcode: false }.merge(options) set_code(options[:readcode]) if options[:readcode] cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})") # set cpuA @@ -191,8 +190,7 @@ def call_match # def set_code(*code) options = code.last.is_a?(Hash) ? code.pop : {} - options = { counter: 'c15' - }.merge(options) + options = { counter: 'c15' }.merge(options) cc " Using counter #{options[:counter]} as set_code replacement - value set to #{code[0]} + 1" unless @set_msb_issued set_msb(1) @@ -203,8 +201,7 @@ def set_code(*code) def set_code_no_msb(*code) options = code.last.is_a?(Hash) ? code.pop : {} - options = { counter: 'c15' - }.merge(options) + options = { counter: 'c15' }.merge(options) unless @set_msb_issued cycle # set_msb doesn't issue a cycle end @@ -372,8 +369,7 @@ def pattern_header(options = {}) super(options.merge(digital_inst: @digital_instrument, memory_test: false, high_voltage: false, - svm_only: false - )) do |pin_list| + svm_only: false)) do |pin_list| # if subroutine pattern has only single-module subroutines then skip module start # (will be taken care of elsewhere) unless options[:subroutine_pat] && @onemodsubs_found && !@nonmodsubs_found @@ -419,6 +415,7 @@ def start_subroutine(name, options = {}) # must be done BEFORE any subroutines that need their own module definition! fail "ERROR: Cannot implement any common module subroutines (#{name}) after implementing any single-module subroutines in the same pattern!" end + @nonmodsubs_found = true end super(name, options) @@ -632,7 +629,7 @@ def match_block(timeout, options = {}, &block) def handshake(options = {}) options = { readcode: false, - manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared + manual_stop: false # set a 2nd CPU flag in case 1st flag is automatically cleared }.merge(options) if options[:readcode] set_code(options[:readcode]) @@ -685,10 +682,10 @@ def keep_alive(options = {}) # $tester.store(:offset => -2) # Just realized I need to capture that earlier vector def store(*pins) return if @inhibit_vectors + options = pins.last.is_a?(Hash) ? pins.pop : {} options = { offset: 0, - opcode: 'stv' - }.merge(options) + opcode: 'stv' }.merge(options) pins = pins.flatten.compact if pins.empty? fail 'For the UltraFLEX you must supply the pins to store/capture' @@ -750,6 +747,7 @@ def set_msb(integer) # $tester.cycle # This is the vector that will be captured def store_next_cycle(*pins) return if @inhibit_vectors + options = pins.last.is_a?(Hash) ? pins.pop : {} options = { opcode: 'stv' diff --git a/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb b/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb index a590cbba..0fee8ff1 100755 --- a/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +++ b/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb @@ -18,7 +18,7 @@ def ppmu forcei_50mA__lte_20mA: (-1.V..6.V), forcei_Non50mA__half_scale: (-1..6.V), forcei_Non50mA__full_scale: (-1.V..5.5.V) } - measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA] + measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA] measv = { measi_50mA__gt_20mA: (-0.1.V..4.5.V), measi_50mA__lte_20mA: (-1.V..6.V), measi_20mA__0p5mA_to_20mA: (-1.V..5.5.V), @@ -40,7 +40,7 @@ def ppmu forcei_50mA__n35mA_to_n20mA: (0.5.V..5.1.V), forcei_50mA__n50mA_to_n35mA: (1.1.V..4.5.V), forcei_Non50mA: (-1.V..6.V) } - measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA] + measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA] measv = { measi_50mA: (-1.V..6.V), measi_200uA: (-1.V..6.V), measi_20uA: (-1.V..6.V), @@ -72,17 +72,21 @@ def ppmu vclamp = (-1.3.V..3.9.V) ppmu.new(forcei, forcev, measi, measv, vclamp) else - puts "please enter an instrument type: e.g. $tester.ate_hardware(\"HSD-M\").ppmu" - puts "Instrument type available: \"HSD-M\", \"HSD-U\", \"HSD-4G\", and \"HSS-6G\" " + puts 'please enter an instrument type: e.g. $tester.ate_hardware("HSD-M").ppmu' + puts 'Instrument type available: "HSD-M", "HSD-U", "HSD-4G", and "HSS-6G" ' puts 'HSD-U is also known as Ultrapin1600. HSS-6G is also known as SB6G.' end end def supply + # :filter member overrides Struct#filter and it may be unexpected + # rubocop:disable Lint/StructNewOverride supply = Struct.new(:forcev, :irange, :source_overload_i, :source_overload_t, :source_fold_i, :source_fold_t, :sink_overload_i, :sink_overload_t, :sink_fold_i, :sink_fold_t, :meter_irange, :meter_vrange, :tdelay, :accuracy, :filter, :bandwidth) + # rubocop:enable Lint/StructNewOverride + if @instrument == 'VSM' forcev = (0.V..4.V) irange = [1.A, 11.A, 21.A, 51.A, 81.A] @@ -213,8 +217,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_30A: (2.A..4.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_30A: [30.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_30A: [30.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -7.mV, pos: 7.mV } @@ -238,8 +242,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_60A: (4.A..8.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_60A: [60.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_60A: [60.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -7.mV, pos: 7.mV } @@ -263,8 +267,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_90A: (6.A..12.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_90A: [90.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_90A: [90.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -7.mV, pos: 7.mV } @@ -308,8 +312,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_30A: (2.A..4.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_30A: [30.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_30A: [30.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -2.mV, pos: 2.mV } @@ -333,8 +337,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_60A: (4.A..8.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_60A: [60.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_60A: [60.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -2.mV, pos: 2.mV } @@ -358,8 +362,8 @@ def supply sink_fold_i = { irange_15A: (1.A..2.A), irange_90A: (6.A..12.A) } sink_fold_t = (102.4.uS..5.S) - meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], - irange_90A: [90.A] } # This is verified to be correct on tester. + meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A], + irange_90A: [90.A] } # This is verified to be correct on tester. meter_vrange = [4.V, 8.V] tdelay = 0 # default tdelay accuracy = { neg: -2.mV, pos: 2.mV } @@ -379,7 +383,7 @@ def supply sink_overload_t = 'n/a' sink_fold_i = (5.mA..200.mA) sink_fold_t = (0.S..167.77.mS) - meter_irange = [10.uA, 100.uA, 1.mA, 10.mA, 100.mA, 1.A] + meter_irange = [10.uA, 100.uA, 1.mA, 10.mA, 100.mA, 1.A] meter_vrange = 7.V tdelay = 0 # default tdelay accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' } @@ -402,7 +406,7 @@ def supply sink_overload_t = 'n/a' sink_fold_i = (10.mA..400.mA) sink_fold_t = (0.S..167.77.mS) - meter_irange = [20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 2.A] + meter_irange = [20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 2.A] meter_vrange = 7.V tdelay = 0 # default tdelay accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' } @@ -425,7 +429,7 @@ def supply sink_overload_t = 'n/a' sink_fold_i = (20.mA..800.mA) sink_fold_t = (0.S..167.77.mS) - meter_irange = [40.uA, 400.uA, 4.mA, 40.mA, 400.mA, 4.A] + meter_irange = [40.uA, 400.uA, 4.mA, 40.mA, 400.mA, 4.A] meter_vrange = 7.V tdelay = 0 # default tdelay accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' } @@ -930,14 +934,14 @@ def supply source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i, sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth) else - puts "please enter an instrument type: e.g. $tester.ate_hardware(\"VSM\").supply" - puts "Instrument type available: \"VSM\", \"VSMx2\", \"VSMx4\"," - puts "\"HexVS\", \"HexVSx2\", \"HexVSx4\", \"HexVSx6\"," - puts "\"HexVS+\", \"HexVS+x2\", \"HexVS+x4\", \"HexVS+x6\", \"HDVS1\"," - puts "\"HDVS1x2\", \"HDVS1x4\", \"VHDVS\", \"VHDVS_HC\", \"VHDVSx2\"," - puts "\"VHDVS_HCx2\", \"VHDVS_HCx4\", and \"VHDVS_HCx8\"." - puts "\"VHDVS+\", \"VHDVS_HC+\", \"VHDVS+x2\"," - puts "\"VHDVS_HC+x2\", \"VHDVS_HC+x4\", and \"VHDVS_HC+x8\"." + puts 'please enter an instrument type: e.g. $tester.ate_hardware("VSM").supply' + puts 'Instrument type available: "VSM", "VSMx2", "VSMx4",' + puts '"HexVS", "HexVSx2", "HexVSx4", "HexVSx6",' + puts '"HexVS+", "HexVS+x2", "HexVS+x4", "HexVS+x6", "HDVS1",' + puts '"HDVS1x2", "HDVS1x4", "VHDVS", "VHDVS_HC", "VHDVSx2",' + puts '"VHDVS_HCx2", "VHDVS_HCx4", and "VHDVS_HCx8".' + puts '"VHDVS+", "VHDVS_HC+", "VHDVS+x2",' + puts '"VHDVS_HC+x2", "VHDVS_HC+x4", and "VHDVS_HC+x8".' puts 'HDVS1 is also known as HDVS. VHDVS is also known as UVS256.' puts 'x2 is Merged2, x4 is Merged4, x6 is Merged6. _HC is High-Current.' puts '+ is High-Accuracy.' diff --git a/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb b/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb index 7c082d2d..2eda05de 100644 --- a/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +++ b/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb @@ -8,8 +8,7 @@ class FlowLine < Base::FlowLine bin_pass bin_fail sort_pass sort_fail result flag_pass flag_fail state group_specifier group_sense group_condition group_name device_sense device_condition device_name - debug_assume debug_sites comment - ) + debug_assume debug_sites comment) # Generate the instance method definitions based on the above define diff --git a/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb b/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb index 73c7f207..2a372788 100755 --- a/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +++ b/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb @@ -244,7 +244,7 @@ class TestInstance < Base::TestInstance wait_flag1: -2, # waitoff wait_flag2: -2, # waitoff wait_flag3: -2, # waitoff - wait_flag4: -2, # waitoff + wait_flag4: -2 # waitoff } } @@ -258,10 +258,10 @@ class TestInstance < Base::TestInstance # assumes clr flag means to set it off (waitoff = -2) # does not yet support waitlo = 0 def set_wait_flags(*flags) - a = (flags.include?(:a) || flags.include?(:a)) ? '-1' : '-2' - b = (flags.include?(:b) || flags.include?(:b)) ? '-1' : '-2' - c = (flags.include?(:c) || flags.include?(:c)) ? '-1' : '-2' - d = (flags.include?(:d) || flags.include?(:d)) ? '-1' : '-2' + a = flags.include?(:a) ? '-1' : '-2' + b = flags.include?(:b) ? '-1' : '-2' + c = flags.include?(:c) ? '-1' : '-2' + d = flags.include?(:d) ? '-1' : '-2' self.wait_flag1 = a self.wait_flag2 = b self.wait_flag3 = c @@ -279,9 +279,9 @@ def set_pre_charge(val) # intended to be used in documentation def to_meta return @meta if @meta + m = { 'Test' => name, - 'Type' => type - } + 'Type' => type } if type == :functional m['Pattern'] = pattern elsif type == :board_pmu || type == :pin_pmu diff --git a/lib/origen_testers/interface.rb b/lib/origen_testers/interface.rb index 92fcd593..ad3dfb19 100755 --- a/lib/origen_testers/interface.rb +++ b/lib/origen_testers/interface.rb @@ -119,6 +119,7 @@ def add_flow_enable # tester-level by the target. def add_flow_enable=(value) return unless flow.respond_to?(:add_flow_enable=) + if value if value == :enable || value == :enabled flow.add_flow_enable = :enabled @@ -151,17 +152,16 @@ def close(options = {}) # Compile a template file def compile(file, options = {}) return unless write? + # Any options passed in from an interface will be passed to the compiler and to # the templates being compiled options[:initial_options] = options Origen.file_handler.preserve_state do - begin - file = Origen.file_handler.clean_path_to_template(file) - Origen.generator.compile_file_or_directory(file, options) - rescue - file = Origen.file_handler.clean_path_to(file) - Origen.generator.compile_file_or_directory(file, options) - end + file = Origen.file_handler.clean_path_to_template(file) + Origen.generator.compile_file_or_directory(file, options) + rescue + file = Origen.file_handler.clean_path_to(file) + Origen.generator.compile_file_or_directory(file, options) end end @@ -186,12 +186,14 @@ def add_description!(options) end def write_files(options = {}) + # rubocop:disable Style/CombinableLoops sheet_generators.each do |generator| generator.finalize(options) end sheet_generators.each do |generator| generator.write_to_file(options) if generator.to_be_written? end + # rubocop:enable Style/CombinableLoops clean_referenced_patterns flow.save_program end diff --git a/lib/origen_testers/labview_based_tester.rb b/lib/origen_testers/labview_based_tester.rb index 49bcf750..ecaa8f53 100644 --- a/lib/origen_testers/labview_based_tester.rb +++ b/lib/origen_testers/labview_based_tester.rb @@ -1,7 +1,7 @@ module OrigenTesters module LabVIEWBasedTester - autoload :Pxie6570, 'origen_testers/labview_based_tester/pxie6570.rb' + autoload :Pxie6570, 'origen_testers/labview_based_tester/pxie6570.rb' end # Shorter name without LabVIEWBasedTester namespace - autoload :Pxie6570, 'origen_testers/labview_based_tester/pxie6570.rb' + autoload :Pxie6570, 'origen_testers/labview_based_tester/pxie6570.rb' end diff --git a/lib/origen_testers/labview_based_tester/pxie6570.rb b/lib/origen_testers/labview_based_tester/pxie6570.rb index e77a7d48..1fe74483 100755 --- a/lib/origen_testers/labview_based_tester/pxie6570.rb +++ b/lib/origen_testers/labview_based_tester/pxie6570.rb @@ -101,6 +101,7 @@ def store(*pins) pins = pins.flatten.compact fail 'For the PXIE6570 you must supply the pins to store/capture' if pins.empty? + add_capture_start pins, options pins.each do |pin| @@ -191,6 +192,7 @@ def store_next_cycle(*pins) repeat_count = options[:repeat].nil? ? 1 : options[:repeat] fail 'For the PXIE6570 you must supply the pins to store/capture' if pins.empty? + add_capture_start pins, options @capture_history[:count] += repeat_count diff --git a/lib/origen_testers/origen_ext/pins/pin.rb b/lib/origen_testers/origen_ext/pins/pin.rb index 38ab11c3..467048d0 100755 --- a/lib/origen_testers/origen_ext/pins/pin.rb +++ b/lib/origen_testers/origen_ext/pins/pin.rb @@ -13,7 +13,7 @@ def channel(options = {}) site: 0 # Default is to use site 0. }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end channelinfo = Struct.new(:channel, :chanmapname, :site) @@ -31,10 +31,10 @@ def instrument_type(options = {}) }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end unless $tester.testerconfig[options[:testerconfigname]] - fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type" + fail 'You must first import the tester configuration (e.g. $tester.testerconfig = "UflexConfigA") before calling pin.instrument_type' end instrumentinfo = Struct.new(:instrument, :chanmapname, :site, :testerconfigname) @@ -52,11 +52,12 @@ def ate_hardware(options = {}) }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end unless $tester.testerconfig[options[:testerconfigname]] - fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type" + fail 'You must first import the tester configuration (e.g. $tester.testerconfig = "UflexConfigA") before calling pin.instrument_type' end + if Origen.top_level.power_pin_groups.keys.include?(name) # Power Pin Groups do not need :ppmu, but need :supply instrumentinfo = Struct.new(:channel, :instrument, :chanmapname, :site, :testerconfigname, :supply) @channel = $tester.get_tester_channel(options[:chanmapname], name, options[:site]) diff --git a/lib/origen_testers/origen_ext/pins/pin_collection.rb b/lib/origen_testers/origen_ext/pins/pin_collection.rb index 6897ec85..f8fcc69e 100755 --- a/lib/origen_testers/origen_ext/pins/pin_collection.rb +++ b/lib/origen_testers/origen_ext/pins/pin_collection.rb @@ -13,7 +13,7 @@ def channel(options = {}) site: 0 # Default is to use site 0. }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end channelinfo = Struct.new(:channel, :chanmapname, :site) @@ -31,10 +31,10 @@ def instrument_type(options = {}) }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end unless $tester.testerconfig[options[:testerconfigname]] - fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type" + fail 'You must first import the tester configuration (e.g. $tester.testerconfig = "UflexConfigA") before calling pin.instrument_type' end instrumentinfo = Struct.new(:instrument, :chanmapname, :site, :testerconfigname) @@ -52,10 +52,10 @@ def ate_hardware(options = {}) }.merge(options) unless $tester.channelmap[options[:chanmapname]] - fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel" + fail 'You must first import the tester channel map (e.g. $tester.channelmap = "probe_x32") before calling pin.channel' end unless $tester.testerconfig[options[:testerconfigname]] - fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type" + fail 'You must first import the tester configuration (e.g. $tester.testerconfig = "UflexConfigA") before calling pin.instrument_type' end if Origen.top_level.power_pin_groups.keys.include?(name) # Power Pin Groups do not need :ppmu, but need :supply @@ -65,7 +65,10 @@ def ate_hardware(options = {}) @supply = $tester.ate_hardware(@instrument).supply instrumentinfo.new(@channel, @instrument, options[:chanmapname], options[:site], options[:testerconfigname], @supply) else # Collecting information of individual members and put in arrays + # :members member overrides Struct#members and it may be unexpected + # rubocop:disable Lint/StructNewOverride instrumentinfo = Struct.new(:members, :channel, :instrument, :chanmapname, :site, :testerconfigname, :ppmu) + # rubocop:enable Lint/StructNewOverride @members = [] @channel = [] @instrument = [] diff --git a/lib/origen_testers/parser.rb b/lib/origen_testers/parser.rb index 07ec5500..2c6bc022 100644 --- a/lib/origen_testers/parser.rb +++ b/lib/origen_testers/parser.rb @@ -2,7 +2,7 @@ module OrigenTesters module Parser autoload :SearchableArray, 'origen_testers/parser/searchable_array' autoload :SearchableHash, 'origen_testers/parser/searchable_hash' - autoload :DescriptionLookup, 'origen_testers/parser/description_lookup' + autoload :DescriptionLookup, 'origen_testers/parser/description_lookup' def parse(*args, &block) parser.parse(*args, &block) diff --git a/lib/origen_testers/parser/searchable_array.rb b/lib/origen_testers/parser/searchable_array.rb index 50c60aee..d749c8c5 100644 --- a/lib/origen_testers/parser/searchable_array.rb +++ b/lib/origen_testers/parser/searchable_array.rb @@ -10,13 +10,13 @@ def where(conditions) if exact val.any? { |v| item.send(attr).to_s == v.to_s } else - val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ } + val.any? { |v| item.send(attr).to_s =~ /#{v}/ } end else if exact item.send(attr).to_s == val.to_s else - item.send(attr).to_s =~ /#{val.to_s}/ + item.send(attr).to_s =~ /#{val}/ end end end diff --git a/lib/origen_testers/parser/searchable_hash.rb b/lib/origen_testers/parser/searchable_hash.rb index 9829721e..543ea8d7 100644 --- a/lib/origen_testers/parser/searchable_hash.rb +++ b/lib/origen_testers/parser/searchable_hash.rb @@ -10,13 +10,13 @@ def where(conditions) if exact val.any? { |v| item.send(attr).to_s == v.to_s } else - val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ } + val.any? { |v| item.send(attr).to_s =~ /#{v}/ } end else if exact item.send(attr).to_s == val.to_s else - item.send(attr).to_s =~ /#{val.to_s}/ + item.send(attr).to_s =~ /#{val}/ end end end diff --git a/lib/origen_testers/pattern_compilers.rb b/lib/origen_testers/pattern_compilers.rb index 37034dc5..840bc9bc 100644 --- a/lib/origen_testers/pattern_compilers.rb +++ b/lib/origen_testers/pattern_compilers.rb @@ -104,6 +104,7 @@ def pattern_compiler_instances(p = platform) if p.nil? fail "No tester platform defined, supply one of the following as an argument: #{PLATFORMS.keys.sort.join(', ')}" end + p = p.to_sym @pattern_compilers[p].keys end diff --git a/lib/origen_testers/pattern_compilers/assembler.rb b/lib/origen_testers/pattern_compilers/assembler.rb index 67e2e8b6..9af7a4fa 100644 --- a/lib/origen_testers/pattern_compilers/assembler.rb +++ b/lib/origen_testers/pattern_compilers/assembler.rb @@ -36,12 +36,14 @@ def parse_list(path, files) line.strip! # Skip a blank line next if line.match(/^\s+$/) + # Check if the pattern or list exists line_path = Pathname.new("#{dir}/#{line}") unless line_path.file? # puts "Skipping #{line_path.to_s} at line ##{line_number} in file #{path.to_s} because it is not a file" next end + # Process the file process_file(line_path, files) end @@ -58,7 +60,7 @@ def process_file(file, files) files << file unless files.include?(file) when 'list' parse_list(file, files) - end + end end # Processes a diretcory looking for files in '.' or recursively diff --git a/lib/origen_testers/pattern_compilers/base.rb b/lib/origen_testers/pattern_compilers/base.rb index fffe95d1..dd65da64 100644 --- a/lib/origen_testers/pattern_compilers/base.rb +++ b/lib/origen_testers/pattern_compilers/base.rb @@ -9,7 +9,7 @@ class BasePatternCompiler attr_accessor :id # Compiler commands array - attr_accessor :jobs + attr_writer :jobs def initialize(id, options = {}) unless Origen.site_config.origen_testers @@ -24,7 +24,7 @@ def initialize(id, options = {}) path: nil, # required: will be passed in or parsed from a .list file reference_directory: nil, # optional: will be set to @path or Origen.app.config.pattern_output_directory target: nil, # optional: allows user to temporarily set target and run compilation - recursive: false, # optional: controls whether to look for patterns in a directory recursively + recursive: false # optional: controls whether to look for patterns in a directory recursively } @job_options = { @@ -32,7 +32,7 @@ def initialize(id, options = {}) location: :local, # optional: controls whether the commands go to the LSF or run locally clean: false, # optional: controls whether compiler log files are deleted after compilation output_directory: nil, # optional: - verbose: false, # optional: controls whether the compiler output gets put to STDOUT + verbose: false # optional: controls whether the compiler output gets put to STDOUT } @compiler_options = {} @compiler_options_with_args = {} @@ -143,6 +143,7 @@ def inspect_options(verbose = nil) req = 'true ' else next if v.nil? || v == false + req = 'false' end desc << "| #{k}".ljust(22) + "| #{v}".ljust(argument_padding) + "| #{req} |" @@ -255,7 +256,7 @@ def create_output_directory end def empty_msg - puts "No compiler jobs created, check the compiler options\n" if self.empty? + puts "No compiler jobs created, check the compiler options\n" if empty? end def convert_to_pathname(opt) diff --git a/lib/origen_testers/pattern_compilers/igxl_based.rb b/lib/origen_testers/pattern_compilers/igxl_based.rb index f6315e8e..ecf5b59c 100644 --- a/lib/origen_testers/pattern_compilers/igxl_based.rb +++ b/lib/origen_testers/pattern_compilers/igxl_based.rb @@ -10,7 +10,7 @@ def initialize(id, options = {}) @user_options = {}.merge(@user_options) @job_options = { - pinmap_workbook: dut.pinmap, # required: will default to $dut.pinmap + pinmap_workbook: dut.pinmap # required: will default to $dut.pinmap }.merge(@job_options) # These are compiler options that are common to both the UltraFLEX and J750 compilers @@ -22,7 +22,7 @@ def initialize(id, options = {}) import_all_undefineds: false, # automatically import all undefined symbols. the key is mis-spelled but correct! suppress_log: false, # disables output to main log file template: false, # generate setup template - timestamp: false, # enable log timestamp + timestamp: false # enable log timestamp }.merge(@compiler_options) # These are compiler options that are common to both the UltraFLEX and J750 compilers @@ -34,7 +34,7 @@ def initialize(id, options = {}) output: nil, # Name of output file pinmap_sheet: nil, # Name of workbook containing pinmap # pinmap_workbook: nil, # Name of sheet in workbook which contains pinmap (moved to @job_options) - setup: nil, # path to setup file + setup: nil # path to setup file }.merge(@compiler_options_with_args) end @@ -68,6 +68,7 @@ def run(list = nil, options = {}) end @jobs.each do |job| fail "Error: compiler #{job.id} not ready for pattern #{job.name}" unless job.ready? + if job.location == :lsf Origen.app.lsf.submit(ATPC_SETUP + '; ' + job.cmd) else @@ -87,6 +88,7 @@ def run(list = nil, options = {}) else list = convert_to_pathname(list) fail "Error: pattern list #{list} does not exist, exiting..." unless list.file? + File.open(list, 'r') do |file| while (line = file.gets) current_job_options = @job_options.merge(@compiler_options_with_args) @@ -132,8 +134,10 @@ def run(list = nil, options = {}) # Handles singles files (.atp, .atp.gz, or .list) and directories (recursively or flat) def find_jobs(path = @path) fail 'Pattern path is set to nil, pass in a valid file (.atp or .atp.gz) or a valid directory' if path.nil? + @path = Pathname.new(path) fail 'Pattern path does not exist, pass in a valid file (.atp or .atp.gz) or a valid directory' unless @path.exist? + @path = @path.expand_path # Set the reference directory for pattern sub-dir mirroring set_reference_directory @@ -228,6 +232,7 @@ def to_list(options = {}) # Output the compiler jobs in the queue to the console def inspect_jobs(index = nil) return empty_msg if empty? + desc = [] puts "\n" @jobs.each_with_index do |j, i| @@ -290,6 +295,7 @@ def inspect_jobs(index = nil) end puts desc.flatten.join("\n") end + # For future checks on incorrect or incompatible arguments to compiler options def options_ok? end diff --git a/lib/origen_testers/pattern_compilers/j750.rb b/lib/origen_testers/pattern_compilers/j750.rb index 06dd757f..a3b2a2f8 100644 --- a/lib/origen_testers/pattern_compilers/j750.rb +++ b/lib/origen_testers/pattern_compilers/j750.rb @@ -40,7 +40,7 @@ def initialize(id, options = {}) @job_options = { tester: :j750, - compiler: self.class.compiler, # required + compiler: self.class.compiler # required }.merge(@job_options) # These are compiler options that are specific to J750 compiler (builds on options from IGXL-Based) @@ -50,7 +50,7 @@ def initialize(id, options = {}) extended: false, # Compiles the pattern for extended mode. scan_parallel: false, # Expands scan vectors into parallel SVM/LVM vectors. svm_only: false, # Compile all vectors in the file for SVM. - svm_subr_only: false, # Only SVM subroutines in file being used. + svm_subr_only: false # Only SVM subroutines in file being used. }.merge(@compiler_options) # These are compiler options that are specific to J750 compiler (builds on options from IGXL-Based) @@ -58,7 +58,7 @@ def initialize(id, options = {}) i: nil, # Includes paths to be passed to C++ preprocessor. lvm_size: nil, # Number of LVM vectors to allow in a single pattern. max_errors: nil, # Number of errors that will cause compilation of the pattern file to be aborted. - min_period: nil, # Minimum period, in seconds, that will be used during a pattern burst. + min_period: nil # Minimum period, in seconds, that will be used during a pattern burst. }.merge(@compiler_options_with_args) update_common_options(options) # Update common options with default (see BasePatternCompiler) @@ -69,6 +69,7 @@ def initialize(id, options = {}) # Executes the compiler for each job in the queue def run(list = nil, options = {}) fail "Error: the tester #{Origen.tester} is not an J750 tester,exiting..." unless is_j750? + msg = "Error: application #{Origen.app.name} is running on Windows, " msg += 'to run the pattern compiler you must be on a Linux machine' fail msg if Origen.running_on_windows? diff --git a/lib/origen_testers/pattern_compilers/ultraflex.rb b/lib/origen_testers/pattern_compilers/ultraflex.rb index 4d1bd280..b8d9dc3d 100644 --- a/lib/origen_testers/pattern_compilers/ultraflex.rb +++ b/lib/origen_testers/pattern_compilers/ultraflex.rb @@ -40,7 +40,7 @@ def initialize(id, options = {}) @job_options = { tester: :ultraflex, - compiler: self.class.compiler, # required + compiler: self.class.compiler # required }.merge(@job_options) # These are compiler options that are specific to UltraFLEX (builds on options from IGXL-Based) @@ -49,7 +49,7 @@ def initialize(id, options = {}) lock: false, # prevents pattern from being reverse compiled or opened in PatternTool multiinst: false, # indicates more than one instrument is connected to a single pin nocompress: false, # do not compress pattern data blocks - stdin: false, # Compile data from standard input. Do not use -cpp or specify any pattern file(s) when using this option. + stdin: false # Compile data from standard input. Do not use -cpp or specify any pattern file(s) when using this option. }.merge(@compiler_options) # These are compiler options that are specific to UltraFLEX (builds on options from IGXL-Based) @@ -70,7 +70,7 @@ def initialize(id, options = {}) allow_mixed_1x2x: nil, # Turns on/off the support of mixed 1x/2x pin groups. Default value is "no". allow_differential: nil, # Turns on/off support for differential pins. Default value is "yes". allow_scan_in_srm: nil, # Allow/disallow scan vectors in SRM pattern modules. Default value is "no". - vm_block_size: nil, # Specifies uncompressed size in bytes of a pattern data block + vm_block_size: nil # Specifies uncompressed size in bytes of a pattern data block }.merge(@compiler_options_with_args) update_common_options(options) # Update common options with default (see BasePatternCompiler) @@ -81,6 +81,7 @@ def initialize(id, options = {}) # Executes the compiler for each job in the queue def run(list = nil, options = {}) fail "Error: the tester #{Origen.tester} is not an Ultrflex tester,exiting..." unless is_ultraflex? + msg = "Error: application #{Origen.app.name} is running on Windows, " msg += 'to run the pattern compiler you must be on a Linux machine' fail msg if Origen.running_on_windows? diff --git a/lib/origen_testers/pattern_compilers/v93k.rb b/lib/origen_testers/pattern_compilers/v93k.rb index 0346bb0c..db2736f9 100644 --- a/lib/origen_testers/pattern_compilers/v93k.rb +++ b/lib/origen_testers/pattern_compilers/v93k.rb @@ -54,20 +54,19 @@ def initialize(id, options = {}) avc_dir: nil, binl_dir: nil, multiport: nil, # Optional hash for multiport settings: port_bursts, port_in_focus, prefix, postfix - digcap: nil, # Optional hash for digcap settings: pins, vps, nrf, char + digcap: nil # Optional hash for digcap settings: pins, vps, nrf, char }.merge(@user_options) @job_options = { tester: :v93k, - compiler: self.class.compiler, # required + compiler: self.class.compiler # required }.merge(@job_options) @compiler_options = { - }.merge(@compiler_options) @compiler_options_with_args = { - aiv2b_opts: nil + aiv2b_opts: nil }.merge(@compiler_options_with_args) @avc_files = [] @@ -149,6 +148,7 @@ def run(aiv = nil, options = {}) # Assumes .aiv file and all workspace collateral has been built up aiv = convert_to_pathname(aiv) fail 'File does not exist! Please specify existing aiv file.' unless aiv.file? + current_job_options = @job_options.merge(@compiler_options_with_args) current_job_options = current_job_options.merge(extract_job_options_from_aiv(aiv)) current_job_options = current_job_options.merge(options) @@ -163,6 +163,7 @@ def run(aiv = nil, options = {}) # Output the compiler jobs in the queue to the console def inspect_jobs(index = nil) return empty_msg if empty? + desc = [] puts "\n" @jobs.each_with_index do |j, i| @@ -195,8 +196,10 @@ def find_jobs(p = @path) # First-level verification: file/directory was given and exists msg = 'Pass in a valid file (.avc, .avc.gz, .list) or a valid directory' fail "Pattern path is set to nil! #{msg}" if p.nil? + path = Pathname.new(p) fail "Pattern path does not exist! #{msg}" unless path.exist? + path = path.expand_path # Set the reference directory for pattern sub-dir mirroring @@ -257,7 +260,9 @@ def find_jobs(p = @path) # Move AVC files into job space (through pre-processor) @files.each do |file| + # rubocop:disable Style/SymbolProc contents = File.open(file, 'rb') { |f| f.read } + # rubocop:enable Style/SymbolProc new_contents = preprocess_avc(contents) new_avc_file = Pathname.new("#{job_avc_dir}/#{Pathname.new(file).basename}").cleanpath File.open(new_avc_file, 'w') { |f| f.write(new_contents.force_encoding('UTF-8')) } @@ -315,6 +320,7 @@ def avc_digcap_vpf(contents) factor = 1 contents.each_line do |line| next if line.match(/^\s*\#/) + if line.match(/^\s*SQPG\s+LBGN\s+(\d+)\s*;/) factor = Regexp.last_match(1).to_i end @@ -325,42 +331,36 @@ def avc_digcap_vpf(contents) end def avc_dir - @avc_dir ||= begin - if @user_options[:avc_dir] - clean_path(@user_options[:avc_dir].to_s) - else - Pathname.new('./AVC') # default value - end - end + @avc_dir ||= if @user_options[:avc_dir] + clean_path(@user_options[:avc_dir].to_s) + else + Pathname.new('./AVC') # default value + end end def binl_dir - @binl_dir ||= begin - if @user_options[:binl_dir] - clean_path(@user_options[:binl_dir].to_s) - else - Pathname.new('./BINL') # default value - end - end + @binl_dir ||= if @user_options[:binl_dir] + clean_path(@user_options[:binl_dir].to_s) + else + Pathname.new('./BINL') # default value + end end def tmp_dir - @tmp_dir ||= begin - if @user_options[:tmp_dir] - clean_path(@user_options[:tmp_dir].to_s) - else - Pathname.new('./tmp') # default value - end - end + @tmp_dir ||= if @user_options[:tmp_dir] + clean_path(@user_options[:tmp_dir].to_s) + else + Pathname.new('./tmp') # default value + end end # Given path string, return Pathname object with cleaned up path def clean_path(path_str) path = Pathname.new(path_str).cleanpath if path.absolute? - return path + path else - return Pathname.new("./#{path}") + Pathname.new("./#{path}") end end @@ -408,7 +408,9 @@ def render_aiv_patterns_entry(pattern) def extract_job_options_from_aiv(file) options = {} + # rubocop:disable Style/SymbolProc contents = File.open(file, 'rb') { |f| f.read } + # rubocop:enable Style/SymbolProc count = 0 counting = false contents.each_line do |line| diff --git a/lib/origen_testers/smartest_based_tester/base.rb b/lib/origen_testers/smartest_based_tester/base.rb index e4b543fc..a4e19de7 100644 --- a/lib/origen_testers/smartest_based_tester/base.rb +++ b/lib/origen_testers/smartest_based_tester/base.rb @@ -29,6 +29,7 @@ class Base # Control literal flag definitions attr_accessor :literal_flags # whether flags should be exactly as indicated + attr_accessor :literal_flag_options # any custom options for flag names attr_accessor :literal_enables # whether enables should be exactly as indicated # permit option to generate multiport type patterns @@ -172,7 +173,10 @@ def package_namespace def limitfile_test_modes=(val) @limitfile_test_modes = Array(val).map(&:to_s) end + # TODO: limitsfile_test_modes is getting redifined here, is this the intention? + # rubocop:disable Lint/DuplicateMethods alias_method :limitsfile_test_modes, :limitfile_test_modes= + # rubocop:enable Lint/DuplicateMethods # return the multiport burst name # provide the name you want to obtain multiport for @@ -247,9 +251,11 @@ def cycle(options = {}) super(options) end + # rubocop:disable Lint/EmptyConditionalBody unless options_overlay.nil? # stage = :body if ovly_style == :subroutine # always set stage back to body in case subr overlay was selected end + # rubocop:enable Lint/EmptyConditionalBody end # Warn user of unsupported overlay style @@ -329,12 +335,12 @@ def subroutine_overlay(sub_name, options = {}) # other platforms, such as the J750, is required. def store(*pins) options = pins.last.is_a?(Hash) ? pins.pop : {} - options = { offset: 0 - }.merge(options) + options = { offset: 0 }.merge(options) pins = pins.flatten.compact if pins.empty? fail 'For the V93K you must supply the pins to store/capture' end + pins.each do |pin| pin.restore_state do pin.capture @@ -362,6 +368,7 @@ def store_next_cycle(*pins) if pins.empty? fail 'For the V93K you must supply the pins to store/capture' end + pins.each { |pin| pin.save; pin.capture } # Register this clean up function to be run after the next vector # is generated, cool or what! @@ -699,7 +706,7 @@ def pattern_header(options = {}) # An internal method called by Origen to generate the pattern footer def pattern_footer(options = {}) options = { - end_in_ka: false + end_in_ka: false }.merge(options) if options[:end_in_ka] Origen.log.warning '93K keep alive not yet implemented!' diff --git a/lib/origen_testers/smartest_based_tester/base/flow.rb b/lib/origen_testers/smartest_based_tester/base/flow.rb index 37652062..2f813efe 100755 --- a/lib/origen_testers/smartest_based_tester/base/flow.rb +++ b/lib/origen_testers/smartest_based_tester/base/flow.rb @@ -14,11 +14,12 @@ class Flow < ATP::Formatter le: '<=' } - attr_accessor :test_suites, :test_methods, :lines, :stack, :var_filename + attr_accessor :test_suites, :test_methods, :lines, :stack # Returns an array containing all runtime variables which get set by the flow attr_reader :set_runtime_variables + attr_writer :var_filename, :flow_name, :flow_bypass, :flow_description, :subdirectory - attr_accessor :add_flow_enable, :flow_name, :flow_bypass, :flow_description, :subdirectory + attr_accessor :add_flow_enable def self.generate_flag_name(flag) case flag[0] @@ -42,19 +43,17 @@ def set_var_filename(new_var_filename) end def subdirectory - @subdirectory ||= begin - if smt8? - parents = [] - f = parent - while f - parents.unshift(File.basename(f.filename, '.*').to_s.downcase) - f = f.parent - end - File.join tester.package_namespace, 'flows', *parents - else - 'testflow/mfh.testflow.group' - end - end + @subdirectory ||= if smt8? + parents = [] + f = parent + while f + parents.unshift(File.basename(f.filename, '.*').to_s.downcase) + f = f.parent + end + File.join tester.package_namespace, 'flows', *parents + else + 'testflow/mfh.testflow.group' + end end def filename @@ -148,9 +147,8 @@ def ast @ast ||= begin unique_id = smt8? ? nil : sig atp.ast(unique_id: unique_id, optimization: :smt, - implement_continue: !tester.force_pass_on_continue, - optimize_flags_when_continue: !tester.force_pass_on_continue - ) + implement_continue: !tester.force_pass_on_continue, + optimize_flags_when_continue: !tester.force_pass_on_continue) end end @@ -183,6 +181,7 @@ def sub_flow_from(sub_flow_ast) def finalize(options = {}) if smt8? return unless top_level? || options[:called_by_top_level] + super @finalized = true # All flows have now been executed and the top-level contains the final AST. @@ -198,6 +197,7 @@ def finalize(options = {}) unless sub_flow fail "Something went wrong, couldn't find the sub-flow object for path #{path}" end + # on_fail and on_pass nodes are removed because they will be rendered by the sub-flow's parent sub_flow.instance_variable_set(:@ast, sub_flow_ast.remove(:on_fail, :on_pass).updated(:flow)) sub_flow.instance_variable_set(:@finalized, true) # To stop the AST being regenerated @@ -475,6 +475,7 @@ def on_loop(node, options = {}) if smt8? fail 'Flow loop control not yet supported for SMT8!' end + start = node.to_a[0] stop = node.to_a[1] step = node.to_a[2] @@ -483,6 +484,7 @@ def on_loop(node, options = {}) else var = generate_flag_name(node.to_a[3]) end + test_num_inc = node.to_a[4] unless smt8? var = "@#{var}" @@ -507,6 +509,7 @@ def on_loop(node, options = {}) def generate_expr_string(node, options = {}) return node unless node.respond_to?(:type) + case node.type when :eq, :ne, :gt, :ge, :lt, :le result = "#{generate_expr_term(node.to_a[0])} " # operand 1 @@ -520,6 +523,7 @@ def generate_expr_string(node, options = {}) def generate_expr_term(val) return val if val.is_a?(Fixnum) || val.is_a?(Integer) || val.is_a?(Float) + case val[0] when '$' if smt8? diff --git a/lib/origen_testers/smartest_based_tester/base/generator.rb b/lib/origen_testers/smartest_based_tester/base/generator.rb index 5d01bb7c..bff6feb9 100755 --- a/lib/origen_testers/smartest_based_tester/base/generator.rb +++ b/lib/origen_testers/smartest_based_tester/base/generator.rb @@ -83,9 +83,11 @@ def pattern_master_filename # Returns the current flow object (Origen.interface.flow) def flow(id = Origen.file_handler.current_file.basename('.rb').to_s) return @current_flow if @current_flow + id = id.to_s.sub(/_resources?/, '') filename = id.split('.').last return flow_sheets[id] if flow_sheets[id] # will return flow if already existing + p = platform::Flow.new p.inhibit_output if Origen.interface.resources_mode? p.filename = filename diff --git a/lib/origen_testers/smartest_based_tester/base/limits_file.rb b/lib/origen_testers/smartest_based_tester/base/limits_file.rb index 0a49e8eb..9ea2fdfa 100644 --- a/lib/origen_testers/smartest_based_tester/base/limits_file.rb +++ b/lib/origen_testers/smartest_based_tester/base/limits_file.rb @@ -35,8 +35,10 @@ def header if test_modes.empty? l += ',default,default' else + # rubocop:disable Style/CombinableLoops test_modes.each { |mode| l += ",#{mode}" } test_modes.each { |mode| l += ",#{mode}" } + # rubocop:enable Style/CombinableLoops end lines << l @@ -276,6 +278,7 @@ def line(options) # "High Limit" l << f((options[:limits][nil] || {})[:usl]) else + # rubocop:disable Style/CombinableLoops test_modes.each do |mode| # "Low Limit" l << f((options[:limits][mode] || options[:limits][nil] || {})[:lsl] || 'na') @@ -284,6 +287,7 @@ def line(options) # "High Limit" l << f((options[:limits][mode] || options[:limits][nil] || {})[:usl] || 'na') end + # rubocop:enable Style/CombinableLoops end # "Unit" l << f((options[:limits][nil] || {})[:units]) diff --git a/lib/origen_testers/smartest_based_tester/base/pattern_master.rb b/lib/origen_testers/smartest_based_tester/base/pattern_master.rb index 9f5385e7..8e847116 100644 --- a/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +++ b/lib/origen_testers/smartest_based_tester/base/pattern_master.rb @@ -5,8 +5,9 @@ class Base class PatternMaster include OrigenTesters::Generator - attr_reader :flow, :paths - attr_accessor :filename, :id, :subdirectory + attr_reader :flow + attr_accessor :id + attr_writer :filename, :subdirectory def initialize(flow = nil) @flow = flow diff --git a/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb b/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb index e12343c3..7690ac97 100644 --- a/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +++ b/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb @@ -94,7 +94,9 @@ class DcTml < BaseTml output_dc: { class_name: 'OutputDC', pinlist: [:string, ''], + # rubocop:disable Lint/PercentStringArray mode: [:string, 'PROGRAMLOAD', %w(PROGRAMLOAD, PPMU SPMU PPMUTERM SPMUTERM)], + # rubocop:enable Lint/PercentStringArray measure_level: [:string, 'BOTH', %(BOTH LOW HIGH)], force_current_low: [:current, 0], force_current_high: [:current, 0], diff --git a/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb b/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb index f1f2130e..136e2749 100644 --- a/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +++ b/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb @@ -5,7 +5,7 @@ class TestMethods class Limits attr_reader :test_method attr_accessor :lo_limit, :hi_limit - attr_accessor :unit + attr_reader :unit attr_accessor :tnum attr_accessor :render alias_method :lo, :lo_limit diff --git a/lib/origen_testers/smartest_based_tester/base/variables_file.rb b/lib/origen_testers/smartest_based_tester/base/variables_file.rb index 3cbe9a64..bcd2bc1e 100644 --- a/lib/origen_testers/smartest_based_tester/base/variables_file.rb +++ b/lib/origen_testers/smartest_based_tester/base/variables_file.rb @@ -6,7 +6,8 @@ class VariablesFile include OrigenTesters::Generator attr_reader :variables - attr_accessor :filename, :id, :subdirectory + attr_accessor :filename, :id + attr_writer :subdirectory def initialize(options = {}) end diff --git a/lib/origen_testers/smartest_based_tester/decompiler.rb b/lib/origen_testers/smartest_based_tester/decompiler.rb index c6ea86dc..bdeb581b 100644 --- a/lib/origen_testers/smartest_based_tester/decompiler.rb +++ b/lib/origen_testers/smartest_based_tester/decompiler.rb @@ -27,6 +27,7 @@ class Pattern < OrigenTesters::Decompiler::Pattern if current_indices[:pinlist_start] && line !~ /^\s/ next true end + false end, diff --git a/lib/origen_testers/smartest_based_tester/decompiler/avc.rb b/lib/origen_testers/smartest_based_tester/decompiler/avc.rb index bf2745d3..dc58c997 100644 --- a/lib/origen_testers/smartest_based_tester/decompiler/avc.rb +++ b/lib/origen_testers/smartest_based_tester/decompiler/avc.rb @@ -24,8 +24,7 @@ def parse_frontmatter(raw_frontmatter:, context:) end OrigenTesters::Decompiler::Nodes::Frontmatter.new(context: context, pattern_header: header, - comments: [] - ) + comments: []) end def parse_pinlist(raw_pinlist:, context:) @@ -35,16 +34,14 @@ def parse_pinlist(raw_pinlist:, context:) # up the names. # E.g.: FORMAT TCLK TDI TDO TMS; OrigenTesters::Decompiler::Nodes::Pinlist.new(context: context, - pins: raw_pinlist[raw_pinlist.index('FORMAT')..raw_pinlist.index(';') - 1].split(/\s+/)[1..-1].map(&:strip) - ) + pins: raw_pinlist[raw_pinlist.index('FORMAT')..raw_pinlist.index(';') - 1].split(/\s+/)[1..-1].map(&:strip)) end def parse_vector(raw_vector:, context:, meta:) if raw_vector =~ Regexp.new('^\s*#') # Comment OrigenTesters::Decompiler::Nodes::CommentBlock.new(context: context, - comments: raw_vector.split("\n") - ) + comments: raw_vector.split("\n")) elsif raw_vector =~ Regexp.new('^R\d+\s') # Vector elements = raw_vector.split(/\s+/, 2 + context.pinlist.size) @@ -56,8 +53,7 @@ def parse_vector(raw_vector:, context:, meta:) repeat: elements[0].gsub('R', '').to_i, timeset: elements[1], pin_states: (elements[2..-2] || []) << elements[-1][0], - comment: elements[-1][1] - ) + comment: elements[-1][1]) else # Anything that doesn't start with Rxyz where xyz is some integer # will be considered a sequencer instruction @@ -66,8 +62,7 @@ def parse_vector(raw_vector:, context:, meta:) nodes_namespace::SequencerInstruction.new(context: context, instruction: inst_plus_args[0], - arguments: inst_plus_args[1..-1] - ) + arguments: inst_plus_args[1..-1]) end end end diff --git a/lib/origen_testers/smartest_based_tester/decompiler/nodes.rb b/lib/origen_testers/smartest_based_tester/decompiler/nodes.rb index f688667f..eff4f837 100644 --- a/lib/origen_testers/smartest_based_tester/decompiler/nodes.rb +++ b/lib/origen_testers/smartest_based_tester/decompiler/nodes.rb @@ -5,7 +5,7 @@ module Avc class SequencerInstruction < OrigenTesters::Decompiler::Nodes::Node PLATFORM_NODES = [:instruction, :arguments] - def initialize(instruction:, arguments: [], context:) + def initialize(instruction:, context:, arguments: []) @execute = false @instruction = instruction diff --git a/lib/origen_testers/smartest_based_tester/smt8.rb b/lib/origen_testers/smartest_based_tester/smt8.rb index 7e747103..e78ed35d 100644 --- a/lib/origen_testers/smartest_based_tester/smt8.rb +++ b/lib/origen_testers/smartest_based_tester/smt8.rb @@ -40,7 +40,7 @@ def pattern_header(options = {}) # An internal method called by Origen to generate the pattern footer def pattern_footer(options = {}) options = { - end_in_ka: false + end_in_ka: false }.merge(options) if options[:end_in_ka] Origen.log.warning '93K keep alive not yet implemented!' @@ -128,9 +128,9 @@ def track_and_format_comment(comment) elsif comment =~ /^SQPG LBGN (\d+);/ @program_lines << " " elsif comment =~ /^SQPG LEND;/ - @program_lines << " " + @program_lines << ' ' elsif comment =~ /^SQPG RETC (\d) (\d);/ - @program_lines << " " + @program_lines << ' ' @program_lines << " " @program_lines << " " @program_lines << ' ' @@ -150,7 +150,7 @@ def format_vector(vec) # Close out current gen_vec group write_gen_vec if has_repeat - @program_lines << " " + @program_lines << ' ' @program_lines << " " @program_lines << ' ' @gen_vec -= 1 diff --git a/lib/origen_testers/smartest_based_tester/v93k.rb b/lib/origen_testers/smartest_based_tester/v93k.rb index 39a2ff76..d39935c1 100644 --- a/lib/origen_testers/smartest_based_tester/v93k.rb +++ b/lib/origen_testers/smartest_based_tester/v93k.rb @@ -1,7 +1,7 @@ module OrigenTesters module SmartestBasedTester class V93K < Base - require 'origen_testers/smartest_based_tester/v93k/generator.rb' + require 'origen_testers/smartest_based_tester/v93k/generator' end end V93K = SmartestBasedTester::V93K diff --git a/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb b/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb index 94c047dd..5b1ad1b7 100755 --- a/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +++ b/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb @@ -38,8 +38,7 @@ class TestSuite < Base::TestSuite hardware_dsp_disable site_control site_match - force_serial - ) + force_serial) ALIASES = { tim_equ_set: :timing_equation, diff --git a/lib/origen_testers/smartest_based_tester/v93k_smt8.rb b/lib/origen_testers/smartest_based_tester/v93k_smt8.rb index 0d703f45..b1e33b1a 100644 --- a/lib/origen_testers/smartest_based_tester/v93k_smt8.rb +++ b/lib/origen_testers/smartest_based_tester/v93k_smt8.rb @@ -1,7 +1,7 @@ module OrigenTesters module SmartestBasedTester class V93K_SMT8 < Base - require 'origen_testers/smartest_based_tester/v93k_smt8/generator.rb' + require 'origen_testers/smartest_based_tester/v93k_smt8/generator' end end V93K_SMT8 = SmartestBasedTester::V93K_SMT8 diff --git a/lib/origen_testers/stil_based_tester/base.rb b/lib/origen_testers/stil_based_tester/base.rb index 8c9a1273..d1065455 100644 --- a/lib/origen_testers/stil_based_tester/base.rb +++ b/lib/origen_testers/stil_based_tester/base.rb @@ -126,6 +126,8 @@ def set_timeset(t, period_in_ns = nil) wave = pin.drive_wave if tester.timeset.dut_timeset (wave ? wave.evaluated_events : []).each do |t, v| line << "'#{t}ns' " + # TODO: https://github.com/Origen-SDK/origen_testers/issues/196 + # rubocop:disable Lint/DuplicateElsifCondition if v == 0 line << 'D' elsif v == 0 @@ -133,6 +135,7 @@ def set_timeset(t, period_in_ns = nil) else line << 'D/U' end + # rubocop:enable Lint/DuplicateElsifCondition line << '; ' end line << '}}' @@ -147,6 +150,8 @@ def set_timeset(t, period_in_ns = nil) line << "'0ns' X; " end line << "'#{t}ns' " + # TODO: https://github.com/Origen-SDK/origen_testers/issues/196 + # rubocop:disable Lint/DuplicateElsifCondition if v == 0 line << 'L' elsif v == 0 @@ -154,6 +159,7 @@ def set_timeset(t, period_in_ns = nil) else line << 'L/H/X' end + # rubocop:enable Lint/DuplicateElsifCondition line << '; ' end line << '}}' @@ -207,12 +213,12 @@ def set_timeset(t, period_in_ns = nil) # other platforms, such as the J750, is required. def store(*pins) options = pins.last.is_a?(Hash) ? pins.pop : {} - options = { offset: 0 - }.merge(options) + options = { offset: 0 }.merge(options) pins = pins.flatten.compact if pins.empty? fail 'For the STIL generation you must supply the pins to store/capture' end + pins.each do |pin| pin.restore_state do pin.capture @@ -238,6 +244,7 @@ def store_next_cycle(*pins) if pins.empty? fail 'For STIL generation you must supply the pins to store/capture' end + pins.each { |pin| pin.save; pin.capture } # Register this clean up function to be run after the next vector # is generated, cool or what! diff --git a/lib/origen_testers/test/custom_test_interface.rb b/lib/origen_testers/test/custom_test_interface.rb index 3825598c..0a7219ee 100644 --- a/lib/origen_testers/test/custom_test_interface.rb +++ b/lib/origen_testers/test/custom_test_interface.rb @@ -69,12 +69,12 @@ def add_custom_tml # An optional finalize function can be supplied to do any final test instance configuration, this # function will be called immediately before the test method is finally rendered. The test method # object itself will be passed in as an argument. - finalize: lambda do |tm| + finalize: lambda do |tm| tm.my_arg3 = 'arg3_set_from_finalize' end, # Example of a custom method. # In all cases the test method object will be passed in as the first argument. - set_my_arg4: lambda do |tm, val| + set_my_arg4: lambda do |tm, val| tm.my_arg4 = val end } @@ -108,12 +108,12 @@ def add_custom_til # An optional finalize function can be supplied to do any final test instance configuration, this # function will be called immediately before the test instance is finally rendered. The test instance # object itself will be passed in as an argument. - finalize: lambda do |ti| + finalize: lambda do |ti| ti.my_arg3 = 'arg3_set_from_finalize' end, # Example of a custom method. # In all cases the test method object will be passed in as the first argument. - set_my_arg4: lambda do |ti, val| + set_my_arg4: lambda do |ti, val| ti.my_arg4 = val end } diff --git a/lib/origen_testers/test/dut.rb b/lib/origen_testers/test/dut.rb index 3917c1a6..440fe430 100755 --- a/lib/origen_testers/test/dut.rb +++ b/lib/origen_testers/test/dut.rb @@ -107,10 +107,11 @@ def read_register(reg, options = {}) end def execute(options = {}) - options = { define: false, # whether to define subr or call it - name: 'executefunc1', - onemodsub: false # whether to expects subr to be in single module - }.merge(options) + options = { + define: false, # whether to define subr or call it + name: 'executefunc1', + onemodsub: false # whether to expects subr to be in single module + }.merge(options) if options[:define] # define subroutine @@ -128,13 +129,14 @@ def execute(options = {}) # Match loop functionality def match(options = {}) - options = { type: :match_pin, # whether to match DONE bit in register or match pin - # :match_done - # :match_2pins - delay_in_us: 5, # match loop delay - define: false, # whether to define subr or call it - subr_name: false, # default use match type as subr name - }.merge(options) + options = { + type: :match_pin, # whether to match DONE bit in register or match pin + # :match_done + # :match_2pins + delay_in_us: 5, # match loop delay + define: false, # whether to define subr or call it + subr_name: false # default use match type as subr name + }.merge(options) subr_name = options[:subr_name] ? options[:subr_name] : options[:type].to_s @@ -226,7 +228,7 @@ def match(options = {}) def handshake(options = {}) options = { - define: false, # whether to define subr or call it + define: false # whether to define subr or call it }.merge(options) if options[:define] @@ -261,12 +263,13 @@ def keepalive(options = {}) alias_method :keep_alive, :keepalive def digsrc_overlay(options = {}) - options = { define: false, # whether to define subr or call it - subr_name: false, # default use match type as subr name - digsrc_pins: @digsrc_pins, # defaults to what's defined in $dut - overlay_reg: nil, # defaults to testme32 register - overlay_cycle_num: 32, # Only needed if overlay_reg is NOT nil, this specificies how many clk cycles to overlay. - }.merge(options) + options = { + define: false, # whether to define subr or call it + subr_name: false, # default use match type as subr name + digsrc_pins: @digsrc_pins, # defaults to what's defined in $dut + overlay_reg: nil, # defaults to testme32 register + overlay_cycle_num: 32 # Only needed if overlay_reg is NOT nil, this specificies how many clk cycles to overlay. + }.merge(options) if options[:define] $tester.start_subroutine(options[:subr_name]) # Start subroutine digsrc_pins = $tester.assign_digsrc_pins(options[:digsrc_pins]) diff --git a/lib/origen_testers/test/interface.rb b/lib/origen_testers/test/interface.rb index ef851d43..8dcfc4b1 100644 --- a/lib/origen_testers/test/interface.rb +++ b/lib/origen_testers/test/interface.rb @@ -467,7 +467,7 @@ def timeset(sheet_name, options = {}) def ac_specset(sheet_name, expression, options = {}) options = { specset: :default, - nom: { typ: nil } + nom: { typ: nil } }.merge(options) ss = ac_specsets(sheet_name) @@ -477,7 +477,7 @@ def ac_specset(sheet_name, expression, options = {}) # Collects AC Spec object(s) from the given expression and adds them to the given Specset def collect_ac_specs(ssname, edge, options = {}) options = { - nom: { typ: nil } + nom: { typ: nil } }.merge(options) # Create a Specsets object from the UFlex program generator API @@ -498,8 +498,9 @@ def add_ac_specs(ss, expression, options = {}) }.merge(options) return unless expression.is_a? String + # collect all variable names within the expression - vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym) + vars = expression.scan(/[a-zA-Z]\w+/).map(&:to_sym) vars.each do |var| next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/ # The substitutions below are used for backward compatibility @@ -601,7 +602,8 @@ def add_dc_specs(ss, expression, options = {}) }.merge(options) return unless expression.is_a? String - vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym) + + vars = expression.scan(/[a-zA-Z]\w+/).map(&:to_sym) vars.each do |var| next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i @@ -644,7 +646,7 @@ def job_def(jname, options = {}) def reference(reference, options = {}) options = { - comment: nil + comment: nil }.merge(options) references('Refs').add(reference, options) diff --git a/lib/origen_testers/test/nvm.rb b/lib/origen_testers/test/nvm.rb index 0d233c0b..33a481cd 100644 --- a/lib/origen_testers/test/nvm.rb +++ b/lib/origen_testers/test/nvm.rb @@ -48,7 +48,7 @@ def add_proth_reg class NVMSub < NVM def redefine_data_reg - add_reg :data, 0x40, 16, d: { pos: 0, bits: 16 } + add_reg :data, 0x40, 16, d: { pos: 0, bits: 16 } end # Tests that the block format for defining registers works @@ -57,7 +57,7 @@ def add_reg_with_block_format # This is dreg add_reg :dreg, 0x1000, size: 16 do # This is dreg bit 15 - bit 15, :bit15, reset: 1 + bit 15, :bit15, reset: 1 # **Bit 14** - This does something cool # # 0 | Coolness is disabled @@ -86,7 +86,7 @@ def add_reg_with_block_format bit 15, :bit15, reset: 1, description: 'This is dreg3 bit 15' bit 14, :bit14, description: "**Bit 14** - This does something cool\n\n0 | Coolness is disabled\n1 | Coolness is enabled" bits 13..8, :upper, description: 'This is dreg3 bit upper' - bit 7..0, :lower, writable: false, reset: 0x55, description: "This is dreg3 bit lower\nThis is dreg3 bit lower line 2" + bit 7..0, :lower, writable: false, reset: 0x55, description: "This is dreg3 bit lower\nThis is dreg3 bit lower line 2" end end end diff --git a/lib/origen_testers/timing/timeset.rb b/lib/origen_testers/timing/timeset.rb index 2b98a178..a2d22a41 100644 --- a/lib/origen_testers/timing/timeset.rb +++ b/lib/origen_testers/timing/timeset.rb @@ -65,7 +65,9 @@ def period_in_ns=(p) end # Return the period + # rubocop:disable Lint/Void p + # rubocop:enable Lint/Void end # Indicates whether a period_in_ns has been defined for this timeset. @@ -134,7 +136,9 @@ def _period_in_ns_=(p) # ) # end @period_in_ns = p + # rubocop:disable Lint/Void @period_in_ns + # rubocop:enable Lint/Void end end end diff --git a/lib/origen_testers/timing/timing_api.rb b/lib/origen_testers/timing/timing_api.rb index 8349e92f..89ded944 100644 --- a/lib/origen_testers/timing/timing_api.rb +++ b/lib/origen_testers/timing/timing_api.rb @@ -142,7 +142,7 @@ def wait(options = {}) time_in_ns: 0, time_in_ms: 0, time_in_s: 0, - match: false, # Set to true to invoke a match loop where the supplied delay + match: false # Set to true to invoke a match loop where the supplied delay # will become the timeout duration }.merge(options) @@ -255,8 +255,7 @@ def cycles_to_time(cycles) # :nodoc: # end def count(options = {}) options = { period_in_cycles: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0, - duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0 - }.merge(options) + duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0 }.merge(options) period_cycles = options[:period_in_cycles] + ms_to_cycles(options[:period_in_ms]) + us_to_cycles(options[:period_in_us]) + ns_to_cycles(options[:period_in_ns]) diff --git a/lib/origen_testers/vector.rb b/lib/origen_testers/vector.rb index 87782e0a..4049edd4 100644 --- a/lib/origen_testers/vector.rb +++ b/lib/origen_testers/vector.rb @@ -1,9 +1,11 @@ module OrigenTesters # A simple class to model a vector class Vector - attr_accessor :repeat, :microcode, :timeset, :pin_vals, + attr_accessor :timeset, :pin_vals, :number, :cycle_number, :dont_compress, - :comments, :inline_comment, :cycle, :number, :contains_capture + :inline_comment, :cycle, :contains_capture + attr_writer :comments, :repeat + attr_reader :microcode def initialize(attrs = {}) @inline_comment = '' @@ -73,6 +75,7 @@ def convert_to_timeset(tset) if timeset.period_in_ns % tset.period_in_ns != 0 fail "The period of timeset #{timeset.name} is not a multiple of the period of timeset #{tset.name}!" end + if contains_capture vector_modification_required = true elsif $tester.timing_toggled_pins.empty? @@ -196,7 +199,7 @@ def has_microcode? def ==(obj) if obj.is_a?(Vector) - self.has_microcode? == obj.has_microcode? && + has_microcode? == obj.has_microcode? && timeset == obj.timeset && pin_vals == obj.pin_vals else diff --git a/lib/origen_testers/vector_generator.rb b/lib/origen_testers/vector_generator.rb index a7476ff3..ba63a7f3 100644 --- a/lib/origen_testers/vector_generator.rb +++ b/lib/origen_testers/vector_generator.rb @@ -22,6 +22,7 @@ def vector_group_size=(number) if number > 1 && number.odd? fail 'Only even numbers can be supplied for the vector_group_size!' end + # Each pattern should run with its own tester instance, but just in case @pipeline = nil @vector_group_size = number @@ -128,7 +129,7 @@ def render(template, options = {}) # Make the file name available to the template Origen.generator.compiler.options[:file] = template options.each { |k, v| Origen.generator.compiler.options[k] = v } - code = Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result) + code = Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), trim_mode: Origen.config.erb_trim_mode, eoutvar: eoutvar).result) code.strip! push_microcode code end @@ -166,7 +167,7 @@ def render_header end def _render(method) # :nodoc: - if self.respond_to?(method) + if respond_to?(method) template = send(method) # Record the current file, this can be used to resolve any relative path # references in the file about to be compiled @@ -177,7 +178,7 @@ def _render(method) # :nodoc: eoutvar = Pathname.new(template).basename('.*').basename('.*').to_s.gsub('-', '_') # Make the file name available to the template Origen.generator.compiler.options[:file] = template - push_microcode Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result) + push_microcode Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), trim_mode: Origen.config.erb_trim_mode, eoutvar: eoutvar).result) end end @@ -296,6 +297,7 @@ def format(vector_array, section) end else next if vec.respond_to?(:repeat) && vec.repeat == 0 # skip vectors with repeat of 0! + pipeline << vec end pipeline.flush do |vector| @@ -465,6 +467,7 @@ def ordered_pins(options = {}) else pin = Origen.pin_bank.find(id) fail "Undefined pin (#{id}) added to pin_pattern_order" unless pin + ordered_pins << pin pin.groups.each do |name, _group| pingroups.delete(name) @@ -480,16 +483,19 @@ def ordered_pins(options = {}) if group = Origen.pin_bank.pin_groups[id] # see if group is already in ordered_pins fail "Pin group #{id} is defined both in pin_pattern_order and pin_pattern_exclude" unless pingroups.include? id + # this is a pin group, delete all pins in group pingroups.delete(id) group.each do |pin| fail "Pin (#{pin.name}) in group (#{group.id}) is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id + pins.delete(pin.id) end else # this is a pin, delete the pin pin = Origen.pin_bank.find(id) fail "Undefined pin (#{id}) added to pin_pattern_exclude" unless pin fail "Pin #{pin.name} is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id + pin.name = id pins.delete(pin.id) pin.groups.each do |name, _group| diff --git a/program/flow_control_literals.rb b/program/flow_control_literals.rb index 0958bd0a..4145be9f 100644 --- a/program/flow_control_literals.rb +++ b/program/flow_control_literals.rb @@ -136,4 +136,13 @@ func :grp2_test3, bin: 5, number: 50660 end + # Only J750 and Ultraflex are support external flags. V93k are not supported + if Origen.environment.name =~ /(ultraflex|j750)/ + log "Test that if_failed works using extern and exclude flow id" + func :erase1, if_failed: :Test__extern_Flag1, bin: 12, number: 50670 + + log "Test that if_passed works using extern and exclude flow id" + func :erase1, if_passed: :Test__extern_Flag2, bin: 12, number: 50680 + end + end