diff options
| author | Jan Sucan <sucanjan@fit.cvut.cz> | 2019-06-04 14:34:27 +0200 |
|---|---|---|
| committer | Jan Sucan <sucanjan@fit.cvut.cz> | 2019-06-04 14:34:27 +0200 |
| commit | dc8703206e3f0f69605c56d0e1127f7e17f3476a (patch) | |
| tree | 166823a741dc420c10d54250cb53d1e3a6b74faf /testing/DMAppFpgaProg/fpga_data | |
Initial commit
Diffstat (limited to 'testing/DMAppFpgaProg/fpga_data')
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.dat | bin | 0 -> 360 bytes | |||
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.stp | 1401 | ||||
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.dat | bin | 0 -> 239535 bytes | |||
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.stp | 1791 | ||||
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.dat | bin | 0 -> 239682 bytes | |||
| -rw-r--r-- | testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.stp | 2098 |
6 files changed, 5290 insertions, 0 deletions
diff --git a/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.dat b/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.dat Binary files differnew file mode 100644 index 0000000..cebbd27 --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.dat diff --git a/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.stp b/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.stp new file mode 100644 index 0000000..9fa2147 --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.stp @@ -0,0 +1,1401 @@ +NOTE "CREATOR" "Designer Version: 11.8.0.26"; +NOTE "CAPTURE" "11.8.0.26"; +NOTE "DEVICE" "AGLN250V2"; +NOTE "PACKAGE" "AGLN250V2-vq100"; +NOTE "DATE" "2018/07/27"; +NOTE "TIME" "21:59:31"; +NOTE "STAPL_VERSION" "JESD71"; +NOTE "VENDOR" "Microsemi Corporation"; +NOTE "IDCODE" "03A541CF"; +NOTE "IDMASK" "07FFFFFF"; +NOTE "DESIGN" "TutorKit1FlashRom2_v100_Top"; +NOTE "DESIGN_DIRECTORY" "D:\_ZDROJE\Libero\Tutorial\TUTOR--KIT-1--FLASHROM-2--V1-00\designer\impl1\"; +NOTE "CHECKSUM" "0000"; +NOTE "SECURITY" "Disable"; +NOTE "ALG_VERSION" "20"; +NOTE "MAP_VERSION" "1"; +NOTE "TOOL_VERSION" "1"; +NOTE "MAX_FREQ" "20000000"; +NOTE "SILSIG" "00000000"; +NOTE "ACT_FROM_SPECIFICATION" "Region_0 (0, 15) (0, 0);Region_1 (1, 15) (1, 0);Region_2 (2 + , 15) (2, 0);Region_3 (3, 15) (3, 0);Region_4 (4, 15) (4, 0);Region_5 (5, 15) (5 + , 0);Region_6 (6, 15) (6, 0);Region_7 (7, 15) (7, 0);"; +NOTE "SPEED_GRAD" "STD"; +NOTE "TEMP_GRAD" "COM"; +NOTE "PLAYER_VERSION_VARIABLE" "PLAYERVERSIONVARIABLE"; +NOTE "PLAYER_VERSION_SW_VARIABLE" "PLAYERVERSIONSWVARIABLE"; + +ACTION ERASE_FROM = + VERIFY_IDCODE, + FW_INITIALIZE, + DO_ERASE_FROM, + DO_EXIT; +ACTION PROGRAM_FROM = + VERIFY_IDCODE, + FW_INITIALIZE, + DO_ERASE_FROM, + DO_PROGRAM_FROM, + DO_VERIFY_FROM, + DO_EXIT; +ACTION VERIFY_FROM = + VERIFY_IDCODE, + FR_INITIALIZE, + DO_VERIFY_FROM, + DO_EXIT; +ACTION PROGRAM = + VERIFY_IDCODE, + W_INITIALIZE, + DO_ERASE, + DO_PROGRAM_FROM, + DO_VERIFY_FROM, + DO_EXIT; +ACTION ERASE = + VERIFY_IDCODE, + W_INITIALIZE, + DO_ERASE_ONLY, + DO_EXIT; +ACTION ERASE_ALL = + VERIFY_IDCODE, + INITIALIZE, + DO_ERASE_ALL, + DO_EXIT; +ACTION VERIFY = + VERIFY_IDCODE, + R_INITIALIZE, + DO_VERIFY_FROM, + DO_EXIT; +ACTION READ_IDCODE = + DO_READ_IDCODE; +ACTION VERIFY_DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_VERIFY_DEVICE_INFO, + DO_EXIT; +ACTION DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_DEVICE_INFO, + DO_QUERY_SECURITY, + DO_EXIT; + + + +DATA CONSTBLOCK; + INTEGER IEEE1532=0; + INTEGER STAPL=1; + INTEGER DIRECTC=2; + INTEGER PDB=3; + INTEGER SVF=4; + INTEGER FP=0; + INTEGER FPLITE=1; + INTEGER FP3=2; + INTEGER SCULPTW=3; + INTEGER BPW=4; + INTEGER DIRECTCP=5; + INTEGER STP=6; + INTEGER FP4=7; + INTEGER FP5=8; + INTEGER FP33=0; + INTEGER FP34=1; + INTEGER FP40=2; + INTEGER FP41=3; + INTEGER FP42=4; + INTEGER FP50=5; + INTEGER FP51=6; + INTEGER FP60=7; + INTEGER FP61=8; + INTEGER FP62=9; + INTEGER FP84=11; + INTEGER FP85=12; + INTEGER FP86=13; + INTEGER FP90=14; + INTEGER FP91=15; + INTEGER FP100=16; + INTEGER FP_11=19; + INTEGER FP_11_1=20; + INTEGER FP_11_2=21; + INTEGER FP_11_3=22; + INTEGER FP_11_4=23; + INTEGER FP_11_5=24; + INTEGER FP_11_6=25; + INTEGER FP_11_7=26; + INTEGER FP_11_8=27; + INTEGER UNKNOWN=127; + INTEGER UNSPECIFIED=0; + INTEGER QN132=1; + INTEGER VQ100=2; + INTEGER TQ144=3; + INTEGER PQ208=4; + INTEGER FG144=5; + INTEGER FG256=6; + INTEGER FG484=7; + INTEGER FG676=8; + INTEGER FG896=9; + INTEGER QN108=10; + INTEGER QN180=11; + INTEGER TQ100=12; + INTEGER CQ208=13; + INTEGER FG1152=14; + INTEGER BG456=15; + INTEGER UNDEFINED=63; + INTEGER GRADE_UNSPEC=0; + INTEGER GRADE_1=1; + INTEGER GRADE_2=2; + INTEGER GRADE_3=3; + INTEGER GRADE_F=4; + INTEGER GRADE_STD=5; + INTEGER GRADE_4=6; + INTEGER GRADE_UNDEF=7; +ENDDATA; + +DATA PARAMETERS; + INTEGER FREQ =4; +ENDDATA; + +DATA GV; + INTEGER ULOPT1_BITLOCATION =11; + INTEGER ULOPT0_BITLOCATION =10; + INTEGER ULUWE_BITLOCATION =9; + INTEGER ULARE_BITLOCATION =8; + INTEGER ULUPC_BITLOCATION =7; + INTEGER ULUFE_BITLOCATION =6; + INTEGER ULUFP_BITLOCATION =5; + INTEGER ULUFJ_BITLOCATION =4; + INTEGER ULFLR_BITLOCATION =3; + INTEGER ULULR_BITLOCATION =2; + INTEGER ULAWE_BITLOCATION =1; + INTEGER ULARD_BITLOCATION =0; + BOOLEAN BUFF128[128]; + BOOLEAN BUFF32[32]; + INTEGER I; + INTEGER J; + INTEGER TEMP; + INTEGER SDNUMBER; + INTEGER ROWNUMBER; + INTEGER DATAINDEX =0; + INTEGER FROMROWNUMBER =1; + INTEGER AESBLOCK; + BOOLEAN ID[32]; + BOOLEAN PASS = 1; + BOOLEAN FADDR[3]; + INTEGER STATUS =0; + BOOLEAN SILSIG[32] = $00000000; + BOOLEAN ISC_CONFIG_RESULT[18]; + BOOLEAN VERIFYEOL[2]; + BOOLEAN COMBERASESELECT[23]; + BOOLEAN SECKEY_OK = 1; + BOOLEAN SECREG[44]; + BOOLEAN ULUWE = 0; + BOOLEAN ULARE = 0; + BOOLEAN ULUPC = 0; + BOOLEAN ULUFE = 0; + BOOLEAN ULUFP = 0; + BOOLEAN ULUFJ = 0; + BOOLEAN ULFLR = 0; + BOOLEAN ULULR = 0; + BOOLEAN ULAWE = 0; + BOOLEAN ULARD = 0; + BOOLEAN ULOPT[2]; + BOOLEAN SUROWCHECKSUM[16]; + INTEGER SUROWCYCLECOUNT =0; + INTEGER ACT_UROW_CYCLE_COUNT =0; + BOOLEAN ACT_UROW_DESIGN_NAME[70] = $0ad72fed3e9965e331; + BOOLEAN SUROWDESIGNNAME[70]; + BOOLEAN SUROWPROGMETHOD[3]; + BOOLEAN ACT_UROW_ALGO_VERSION[7] = $14; + BOOLEAN SUROWALGOVERSION[7]; + BOOLEAN SUROW_PKG_TYPE[6]; + BOOLEAN ACT_UROW_SW_VERSION[7]; + BOOLEAN SUROW_SW_VERSION[7]; + INTEGER PLAYERVERSIONVARIABLE =0; + INTEGER PLAYERVERSIONSWVARIABLE =0; + INTEGER SCULPTORMAJORBASE =5; + INTEGER SCULPTORMINORBASE =16; + BOOLEAN ACT_UROW_PROGRAM_SW[4]; + BOOLEAN SUROWPROGRAMSW[4]; + BOOLEAN SUROW_SPEED_GRADE[3]; + BOOLEAN SUROW_SRAM_DISTURB[1]; + BOOLEAN ISERASEONLY = 0; + BOOLEAN ISRESTOREDESIGN = 0; + BOOLEAN FLAGDISPLAYCYC = 1; + BOOLEAN ISPRGARRAY = 0; + BOOLEAN BSRPATTERN[708] = $9249249249249249249249249249249249249249249249249 + 249249249249249249249249249249249249249249249249249249249249249249249249 + 24924924924924924924924924924924924924924924924924924924; + BOOLEAN SAMPLEMASK[708] = $0000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000; + BOOLEAN BSR[708]; + BOOLEAN SAMPLE_DEVICE[708]; + BOOLEAN ARRAYRONLY = 1; + BOOLEAN CHKARRAY = 0; + BOOLEAN FROMRONLY = 1; + BOOLEAN CHKFROM = 0; + BOOLEAN CHKNVM = 0; + BOOLEAN CHKSEC = 1; + BOOLEAN PERMLOCK = 0; + INTEGER HEX[16] = 70,69,68,67,66,65,57,56,55,54,53,52,51,50,49,48; + INTEGER NUMBEROFFROMROWS =8; + BOOLEAN INITIALIZE_DATA[5] = $00; + INTEGER SDTILE; + INTEGER NUMBEROFSDTILES =4; + INTEGER NUMBEROFMAPROWS =2300; + INTEGER IDREV; + INTEGER IDFAB; + INTEGER BM7DEVICE =0; + INTEGER BM1DEVICE =0; + BOOLEAN M1BUFF[128] = $acdd6548ccb488863e291eb18fe95077; + BOOLEAN M7BUFF[128] = $e137623a2eeee91126015f3f73664945; + BOOLEAN IDCODEVALUE[32] = $03a541cf; + BOOLEAN IDMASK[32] = $07ffffff; + INTEGER SECKEYCHK =0; + INTEGER DESIGNPKGTYPE =2; + BOOLEAN ACT_UROW_PROG_METHOD[3] = $1; + INTEGER LABEL_SEPARATOR =0; + INTEGER ROWITERATION =100; + INTEGER PAGEITERATION =100; + INTEGER PERCENT_UPDATE; + INTEGER DIFFERENCE; + INTEGER UNIQUEEXITCODE =0; +ENDDATA; + +DATA BITSTREAM; + BOOLEAN UROW[128]; + BOOLEAN UROW_MASK[128] = $fffffffffffffffffffffffffe01ffc0; + INTEGER CHECKSUM =0; +ENDDATA; + +DATA FROM_V; + BOOLEAN Region_0[128]; + BOOLEAN Region_1[128]; + BOOLEAN Region_2[128]; + BOOLEAN Region_3[128]; + BOOLEAN Region_4[128]; + BOOLEAN Region_5[128]; + BOOLEAN Region_6[128]; + BOOLEAN Region_7[128]; + BOOLEAN FROMADDRESSMASK[8] = $ff; + BOOLEAN FROMSTREAM[1024] = @020000_ubtyqNFxl7Vvh@_ulV@zFuXJyn9NvcVEqJNThpUxS + @Te5jqJZwgjsrOdDjtcRTxzt0EOXDCn5puZHMoAlCcRsPF3RiaTMQLhjt2tSrrkysBV@5KXA + we8jKJTAgfIrLPLhk_A8ZKIJIPbiyICbfcRYpEzqd06817aG5QuXGCH5j8ZDon710; +ENDDATA; + + +PROCEDURE DO_EXIT USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $81; + WAIT IDLE, 250 USEC; + IRSCAN 8, $81, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==0) ) THEN GOTO Label_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $07; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 200 USEC; + Label_0: + IRSCAN 8, $ff; + WAIT IDLE, 200 USEC; + WAIT RESET, 3 CYCLES; + EXIT STATUS; +ENDPROC; + +PROCEDURE DO_READ_SECURITY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a4; + WAIT IDLE, 3 CYCLES; + DRSCAN 44, $00000000000, CAPTURE SECREG[]; + ULUWE = SECREG[ULUWE_BITLOCATION]; + ULARE = SECREG[ULARE_BITLOCATION]; + ULUPC = SECREG[ULUPC_BITLOCATION]; + ULUFE = SECREG[ULUFE_BITLOCATION]; + ULUFP = SECREG[ULUFP_BITLOCATION]; + ULUFJ = SECREG[ULUFJ_BITLOCATION]; + ULFLR = SECREG[ULFLR_BITLOCATION]; + ULULR = SECREG[ULULR_BITLOCATION]; + ULAWE = SECREG[ULAWE_BITLOCATION]; + ULARD = SECREG[ULARD_BITLOCATION]; + ULOPT[1] = SECREG[ULOPT1_BITLOCATION]; + ULOPT[0] = SECREG[ULOPT0_BITLOCATION]; +ENDPROC; + +PROCEDURE DO_OUTPUT_SECURITY USES GV; + PRINT "Security Settings :"; + IF ( ! (ULUFP==1) ) THEN GOTO Label_1; + PRINT "FlashROM Write/Erase protected by pass key."; + Label_1: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_2; + PRINT "FlashROM Read protected by pass key."; + Label_2: + IF ( ! (ULAWE==1) ) THEN GOTO Label_3; + PRINT "Array Write/Erase protected by pass key."; + Label_3: + IF ( ! (ULARD==1) ) THEN GOTO Label_4; + PRINT "Array Verify protected by pass key."; + Label_4: + IF ( ! (ULUFE==1) ) THEN GOTO Label_5; + PRINT "Encrypted FlashROM Programming Enabled."; + Label_5: + IF ( ! (ULARE==1) ) THEN GOTO Label_6; + PRINT "Encrypted FPGA Array Programming Enabled."; + Label_6: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DO_QUERY_SECURITY USES DO_READ_SECURITY,DO_OUTPUT_SECURITY; + CALL DO_READ_SECURITY; + CALL DO_OUTPUT_SECURITY; +ENDPROC; + +PROCEDURE READ_UROW USES BITSTREAM,GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE UROW[]; + SUROWALGOVERSION[6..0] = $00; + IF ( ! ( (UROW[5]==0)&&(UROW[0]==1)) ) THEN GOTO Label_7; + SUROWALGOVERSION[5..4] = UROW[24..23]; + Label_7: + IF ( ! ( (UROW[5]==1)&&(UROW[0]==0)) ) THEN GOTO Label_8; + SUROWALGOVERSION[5..4] = UROW[24..23]; + SUROWALGOVERSION[6] = 1; + Label_8: + SUROWCHECKSUM[15..0] = UROW[127..112]; + SUROWCYCLECOUNT = INT(UROW[111..102]); + SUROWDESIGNNAME[69..0] = UROW[101..32]; + SUROWPROGMETHOD[2..0] = UROW[31..29]; + SUROWALGOVERSION[3..0] = UROW[28..25]; + SUROW_PKG_TYPE[5..0] = UROW[22..17]; + SUROW_SW_VERSION[6..0] = UROW[16..10]; + SUROWPROGRAMSW[3..0] = UROW[9..6]; + SUROW_SRAM_DISTURB[0] = UROW[4]; + SUROW_SPEED_GRADE[2..0] = UROW[3..1]; + ACT_UROW_CYCLE_COUNT = SUROWCYCLECOUNT; +ENDPROC; + +PROCEDURE FIX_INT_ARRAYS USES GV; + IF ( ! (HEX[0]!=48) ) THEN GOTO Label_9; + FOR I = 0 TO 7; + TEMP = HEX[I]; + HEX[I] = HEX[(15-I)]; + HEX[(15-I)] = TEMP; + NEXT I; + Label_9: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISP_CHKSUM_DESIGN USES GV,FIX_INT_ARRAYS; + CALL FIX_INT_ARRAYS; + IF ( ! (INT(SUROWCHECKSUM[15..0])==65535) ) THEN GOTO Label_10; + PRINT "CHECKSUM: "; + Label_10: + IF ( ! (INT(SUROWCHECKSUM[15..0])!=65535) ) THEN GOTO Label_11; + PRINT "CHECKSUM: ",CHR$(HEX[INT(SUROWCHECKSUM[15..12])]),CHR$(HEX[INT(SUROWCHECKSUM[11..8])]) + ,CHR$(HEX[INT(SUROWCHECKSUM[7..4])]),CHR$(HEX[INT(SUROWCHECKSUM[3..0])]); + Label_11: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])==2147483647)&&(INT(SUROWDESIGNNAME[31..61])==2147483647))&&(INT(SUROWDESIGNNAME[62..69])==255)) ) THEN GOTO Label_12; + PRINT "Design Name: "; + Label_12: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])!=2147483647)||(INT(SUROWDESIGNNAME[31..61])!=2147483647))||(INT(SUROWDESIGNNAME[62..69])!=255)) ) THEN GOTO Label_13; + PRINT "Design Name: ",CHR$(INT(SUROWDESIGNNAME[63..69])),CHR$(INT(SUROWDESIGNNAME[56..62])) + ,CHR$(INT(SUROWDESIGNNAME[49..55])),CHR$(INT(SUROWDESIGNNAME[42..48])),CHR$(INT(SUROWDESIGNNAME[35..41])) + ,CHR$(INT(SUROWDESIGNNAME[28..34])),CHR$(INT(SUROWDESIGNNAME[21..27])),CHR$(INT(SUROWDESIGNNAME[14..20])) + ,CHR$(INT(SUROWDESIGNNAME[7..13])),CHR$(INT(SUROWDESIGNNAME[0..6])); + Label_13: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISPLAY_UROW USES BITSTREAM,CONSTBLOCK,GV,DISP_CHKSUM_DESIGN; + EXPORT "USER_ROW", UROW[127..0]; + PRINT "User information: "; + CALL DISP_CHKSUM_DESIGN; + IF ( ! (FLAGDISPLAYCYC==1) ) THEN GOTO Label_14; + PRINT "CYCLE COUNT: ",SUROWCYCLECOUNT; + Label_14: + INTEGER TMPINT =INT(SUROWPROGMETHOD[]); + INTEGER TMPINT2 =0; + INTEGER TMPINT3 =0; + INTEGER TMPINT4 =0; + INTEGER TMPINT5 =0; + IF ( ! (TMPINT==IEEE1532) ) THEN GOTO Label_15; + PRINT "Programming Method: IEEE1532"; + Label_15: + IF ( ! (TMPINT==STAPL) ) THEN GOTO Label_16; + PRINT "Programming Method: STAPL"; + Label_16: + IF ( ! (TMPINT==DIRECTC) ) THEN GOTO Label_17; + PRINT "Programming Method: DirectC"; + Label_17: + IF ( ! (TMPINT==PDB) ) THEN GOTO Label_18; + PRINT "Programming Method: PDB"; + Label_18: + IF ( ! (TMPINT==SVF) ) THEN GOTO Label_19; + PRINT "Programming Method: SVF"; + Label_19: + PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]); + TMPINT = INT(SUROW_SPEED_GRADE[]); + IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_20; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_20: + IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_21; + PRINT "Device Speed Grade: -1"; + Label_21: + IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_22; + PRINT "Device Speed Grade: -2"; + Label_22: + IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_23; + PRINT "Device Speed Grade: -3"; + Label_23: + IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_24; + PRINT "Device Speed Grade: -F"; + Label_24: + IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_25; + PRINT "Device Speed Grade: STD"; + Label_25: + IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_26; + PRINT "Device Speed Grade: -4"; + Label_26: + IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_27; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_27: + TMPINT = INT(SUROWPROGRAMSW[]); + IF ( ! (TMPINT==FP) ) THEN GOTO Label_28; + PRINT "Programmer: FlashPro"; + Label_28: + IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_29; + PRINT "Programmer: FlashPro Lite"; + Label_29: + IF ( ! (TMPINT==FP3) ) THEN GOTO Label_30; + PRINT "Programmer: FlashPro3"; + Label_30: + IF ( ! (TMPINT==FP4) ) THEN GOTO Label_31; + PRINT "Programmer: FlashPro4"; + Label_31: + IF ( ! (TMPINT==FP5) ) THEN GOTO Label_32; + PRINT "Programmer: FlashPro5"; + Label_32: + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_33; + PRINT "Programmer: Sculptor WIN"; + Label_33: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_34; + PRINT "Programmer: BP Programmer"; + Label_34: + IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_35; + PRINT "Programmer: DirectC"; + Label_35: + IF ( ! (TMPINT==STP) ) THEN GOTO Label_36; + PRINT "Programmer: Actel JAM Player"; + Label_36: + IF ( ! ( ( ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3))||(TMPINT==FP4))||(TMPINT==FP5)) ) THEN GOTO Label_52; + TMPINT2 = INT(SUROW_SW_VERSION[]); + IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_37; + PRINT "Software: FlashPro v3.3"; + Label_37: + IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_38; + PRINT "Software: FlashPro v3.4"; + Label_38: + IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_39; + PRINT "Software: FlashPro v4.0"; + Label_39: + IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_40; + PRINT "Software: FlashPro v4.1"; + Label_40: + IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_41; + PRINT "Software: FlashPro v4.2"; + Label_41: + IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_42; + PRINT "Software: FlashPro v5.0"; + Label_42: + IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_43; + PRINT "Software: FlashPro v5.1"; + Label_43: + IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_44; + PRINT "Software: FlashPro v6.0"; + Label_44: + IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_45; + PRINT "Software: FlashPro v6.1"; + Label_45: + IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_46; + PRINT "Software: FlashPro v6.2"; + Label_46: + IF ( ! (TMPINT2==FP84) ) THEN GOTO Label_47; + PRINT "Software: FlashPro v8.4"; + Label_47: + IF ( ! (TMPINT2==FP85) ) THEN GOTO Label_48; + PRINT "Software: FlashPro v8.5"; + Label_48: + IF ( ! (TMPINT2==FP86) ) THEN GOTO Label_49; + PRINT "Software: FlashPro v8.6"; + Label_49: + IF ( ! (TMPINT2==FP90) ) THEN GOTO Label_50; + PRINT "Software: FlashPro v9.0"; + Label_50: + IF ( ! (TMPINT2==FP91) ) THEN GOTO NOT_FP91; + PRINT "Software: FlashPro v9.1"; + NOT_FP91: + IF ( ! (TMPINT2==FP100) ) THEN GOTO NOT_FP100; + PRINT "Software: FlashPro v10.0"; + NOT_FP100: + IF ( ! (TMPINT2==FP_11) ) THEN GOTO NOT_FP_11; + PRINT "Software: FlashPro v11.0"; + NOT_FP_11: + IF ( ! (TMPINT2==FP_11_1) ) THEN GOTO NOT_FP_11_1; + PRINT "Software: FlashPro v11.1"; + NOT_FP_11_1: + IF ( ! (TMPINT2==FP_11_2) ) THEN GOTO NOT_FP_11_2; + PRINT "Software: FlashPro v11.2"; + NOT_FP_11_2: + IF ( ! (TMPINT2==FP_11_3) ) THEN GOTO NOT_FP_11_3; + PRINT "Software: FlashPro v11.3"; + NOT_FP_11_3: + IF ( ! (TMPINT2==FP_11_4) ) THEN GOTO NOT_FP_11_4; + PRINT "Software: FlashPro v11.4"; + NOT_FP_11_4: + IF ( ! (TMPINT2==FP_11_5) ) THEN GOTO NOT_FP_11_5; + PRINT "Software: FlashPro v11.5"; + NOT_FP_11_5: + IF ( ! (TMPINT2==FP_11_6) ) THEN GOTO NOT_FP_11_6; + PRINT "Software: FlashPro v11.6"; + NOT_FP_11_6: + IF ( ! (TMPINT2==FP_11_7) ) THEN GOTO NOT_FP_11_7; + PRINT "Software: FlashPro v11.7"; + NOT_FP_11_7: + IF ( ! (TMPINT2==FP_11_8) ) THEN GOTO NOT_FP_11_8; + PRINT "Software: FlashPro v11.8"; + NOT_FP_11_8: + IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_51; + PRINT "Software: FlashPro vX.X"; + Label_51: + LABEL_SEPARATOR = 0; + Label_52: + IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_56; + TMPINT3 = (INT(SUROW_SW_VERSION[6..5])+SCULPTORMAJORBASE); + TMPINT4 = (INT(SUROW_SW_VERSION[4..1])+SCULPTORMINORBASE); + TMPINT5 = 0; + IF ( ! (SUROW_SW_VERSION[0]==1) ) THEN GOTO Label_53; + TMPINT5 = 1; + Label_53: + INTEGER CURRPGM =INT(ACT_UROW_PROGRAM_SW[3..0]); + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_54; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4; + PRINT "NOTE: The Sculptor Windows version number below should be converted to HEX."; + NOT_FP3_FP4: + PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_54: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_55; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4_BPW; + PRINT "NOTE: The BP Windows version number below should be converted to HEX."; + NOT_FP3_FP4_BPW: + PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_55: + LABEL_SEPARATOR = 0; + Label_56: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DISPLAY_FROM USES FROM_V; + EXPORT "Region_0", Region_0[]; + EXPORT "Region_1", Region_1[]; + EXPORT "Region_2", Region_2[]; + EXPORT "Region_3", Region_3[]; + EXPORT "Region_4", Region_4[]; + EXPORT "Region_5", Region_5[]; + EXPORT "Region_6", Region_6[]; + EXPORT "Region_7", Region_7[]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA0 USES GV,FROM_V; + INTEGER DUMMY0 =0; + Region_0[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA1 USES GV,FROM_V; + INTEGER DUMMY1 =0; + Region_1[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA2 USES GV,FROM_V; + INTEGER DUMMY2 =0; + Region_2[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA3 USES GV,FROM_V; + INTEGER DUMMY3 =0; + Region_3[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA4 USES GV,FROM_V; + INTEGER DUMMY4 =0; + Region_4[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA5 USES GV,FROM_V; + INTEGER DUMMY5 =0; + Region_5[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA6 USES GV,FROM_V; + INTEGER DUMMY6 =0; + Region_6[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA7 USES GV,FROM_V; + INTEGER DUMMY7 =0; + Region_7[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE READ_FROM USES FROM_V,GV,DISPLAY_FROM,MAP_FROM_DATA0,MAP_FROM_DATA1,MAP_FROM_DATA2 + ,MAP_FROM_DATA3,MAP_FROM_DATA4,MAP_FROM_DATA5,MAP_FROM_DATA6,MAP_FROM_DATA7; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + PRINT "FlashROM Information: "; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO Label_65; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $93; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 138 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; + IF ( ! ((FROMROWNUMBER-1)==0) ) THEN GOTO Label_57; + CALL MAP_FROM_DATA0; + Label_57: + IF ( ! ((FROMROWNUMBER-1)==1) ) THEN GOTO Label_58; + CALL MAP_FROM_DATA1; + Label_58: + IF ( ! ((FROMROWNUMBER-1)==2) ) THEN GOTO Label_59; + CALL MAP_FROM_DATA2; + Label_59: + IF ( ! ((FROMROWNUMBER-1)==3) ) THEN GOTO Label_60; + CALL MAP_FROM_DATA3; + Label_60: + IF ( ! ((FROMROWNUMBER-1)==4) ) THEN GOTO Label_61; + CALL MAP_FROM_DATA4; + Label_61: + IF ( ! ((FROMROWNUMBER-1)==5) ) THEN GOTO Label_62; + CALL MAP_FROM_DATA5; + Label_62: + IF ( ! ((FROMROWNUMBER-1)==6) ) THEN GOTO Label_63; + CALL MAP_FROM_DATA6; + Label_63: + IF ( ! ((FROMROWNUMBER-1)==7) ) THEN GOTO Label_64; + CALL MAP_FROM_DATA7; + Label_64: + LABEL_SEPARATOR = 0; + Label_65: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; + CALL DISPLAY_FROM; +ENDPROC; + +PROCEDURE READ_F_ROW USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $f9; + DRSCAN 3, FADDR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $bf; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; +ENDPROC; + +PROCEDURE DO_DEVICE_INFO USES GV,DO_READ_SECURITY,READ_UROW,DISPLAY_UROW,READ_FROM + ,READ_F_ROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0e; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE BUFF32[]; + EXPORT "SILSIG", BUFF32[]; + IRSCAN 8, $84, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==1) ) THEN GOTO CORE_NOT_ENABLED; + PRINT "FPGA Array is programmed and enabled."; + CORE_NOT_ENABLED: + IF ( ! (BUFF128[2]==0) ) THEN GOTO CORE_ENABLED; + PRINT "FPGA Array is not enabled."; + CORE_ENABLED: + CALL READ_UROW; + CALL DISPLAY_UROW; + CALL DO_READ_SECURITY; + IF ( ! (ULUFJ==0) ) THEN GOTO Label_66; + CALL READ_FROM; + Label_66: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_67; + PRINT "FlashROM Information: "; + PRINT "Cannot be displayed due to pass key match failure"; + Label_67: + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + PRINT "========================================="; +ENDPROC; + +PROCEDURE INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $dd; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; +ENDPROC; + +PROCEDURE DO_VERIFY_DEVICE_INFO USES GV,BITSTREAM,DO_EXIT,DO_READ_SECURITY,READ_UROW + ,DISP_CHKSUM_DESIGN; + CALL READ_UROW; + CALL DISP_CHKSUM_DESIGN; + CALL DO_READ_SECURITY; + BUFF32[31..0] = BOOL(CHECKSUM); + UROW[127..112] = BUFF32[15..0]; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],$ffff003fffffffffffffffff00000000 + ,PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_CMP_OK; + STATUS = -43; + PRINT "Failed to verify design information."; + UNIQUEEXITCODE = 32772; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_CMP_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_IDCODE_ONLY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[]; + EXPORT "IDCODE", ID[]; +ENDPROC; + +PROCEDURE VERIFY_RLOCK USES GV; + IRSCAN 8, $84,COMPARE $04,$04,PASS; +ENDPROC; + +PROCEDURE DO_VERIFY_PGM_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_PGM_PASS; + STATUS = 10; + PRINT "Failed to enable FPGA Array."; + UNIQUEEXITCODE = 32891; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_DISABLE_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==1) ) THEN GOTO RLOCK_PGM_FAIL; + STATUS = 10; + PRINT "Failed to disable FPGA Array."; + UNIQUEEXITCODE = 32918; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_FAIL: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_VERIFY_PASS; + STATUS = 11; + PRINT "FPGA Array is not enabled."; + UNIQUEEXITCODE = 32892; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_VERIFY_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_ID_DMK USES GV,DO_EXIT,INIT_AES; + CALL INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M7BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M7VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32775; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M7VERDONE: + IF ( ! ( (BUFF128[126]==0)||(BM7DEVICE==0)) ) THEN GOTO MXIDOK; + IF ( ! ( (BUFF128[126]==1)&&(BM7DEVICE==0)) ) THEN GOTO LDETECTM1; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M7 device."; + UNIQUEEXITCODE = 32776; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + LDETECTM1: + IF ( ! (BUFF128[126]==0) ) THEN GOTO Label_70; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M1BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M1VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32777; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M1VERDONE: + BOOLEAN BTMPBUFFBIT126 = BUFF128[126]; + IF ( ! ( (BTMPBUFFBIT126==1)&&(BM1DEVICE==0)) ) THEN GOTO REGDEV; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M1 device."; + UNIQUEEXITCODE = 32778; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + REGDEV: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM7DEVICE==1)) ) THEN GOTO Label_68; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M7 Device."; + UNIQUEEXITCODE = 32781; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_68: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_69; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M1 Device."; + UNIQUEEXITCODE = 32782; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_69: + LABEL_SEPARATOR = 0; + Label_70: + LABEL_SEPARATOR = 0; + MXIDOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_IDCODE USES GV,PARAMETERS,DO_EXIT; + FREQUENCY (FREQ*1000000); + WAIT RESET, 5 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + DRSCAN 32, $00000000; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[],COMPARE IDCODEVALUE[],IDMASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO IDOK; + STATUS = 6; + PRINT "Failed to verify IDCODE"; + UNIQUEEXITCODE = 32797; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + IDOK: + IDREV = INT(ID[31..28]); + IDFAB = INT(ID[24..24]); +ENDPROC; + +PROCEDURE IS_SECOK USES GV,DO_EXIT; + IF ( ! (SECKEY_OK==0) ) THEN GOTO SECOK; + STATUS = -35; + PRINT "Failed to match pass key."; + UNIQUEEXITCODE = 32799; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SECOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_FROM_W USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULUFP==1) ) THEN GOTO FROMWP; + STATUS = -27; + PRINT "FlashROM Write/Erase is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32810; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMWP: + IF ( ! (ULUFJ==1) ) THEN GOTO WFROMRP; + STATUS = -29; + PRINT "FlashROM Read is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32811; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + WFROMRP: + IF ( ! (ULUFE==1) ) THEN GOTO WFROMEP; + STATUS = -34; + PRINT "FlashROM Encryption is enforced. Plain text programming is prohibited."; + UNIQUEEXITCODE = 32812; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + WFROMEP: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_FROM_R USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULUFE==1) ) THEN GOTO FROMEP; + STATUS = -34; + PRINT "FlashROM Encryption is enforced. Plain text verification is prohibited."; + UNIQUEEXITCODE = 32815; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMEP: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE BP_VER USES GV; + BOOLEAN PLAYER_VERSION_BOOLEAN[32]; + PLAYER_VERSION_BOOLEAN[31..0] = BOOL(PLAYERVERSIONVARIABLE); + INTEGER PLAYER_MAJOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[23..16])-SCULPTORMAJORBASE); + INTEGER PLAYER_MINOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[15..8])-SCULPTORMINORBASE); + ACT_UROW_SW_VERSION[6..5] = BOOL(PLAYER_MAJOR_VERSION); + ACT_UROW_SW_VERSION[4..1] = BOOL(PLAYER_MINOR_VERSION); + ACT_UROW_SW_VERSION[0] = PLAYER_VERSION_BOOLEAN[0]; + ACT_UROW_PROGRAM_SW[3..0] = BOOL(PLAYERVERSIONSWVARIABLE); +ENDPROC; + +PROCEDURE POLL_PROGRAM USES GV; + INTEGER ILOOP_0; + FOR ILOOP_0 = 16381 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 100 USEC; + DRSCAN 5, $00,COMPARE $00,$0b,PASS; + IF PASS THEN ILOOP_0 = 0; + NEXT ILOOP_0; +ENDPROC; + +PROCEDURE DO_INITIALIZE USES GV,DO_EXIT,READ_F_ROW,VERIFY_ID_DMK,DO_CHECK_FROM_W + ,DO_CHECK_FROM_R,BP_VER; + BSR[707..0] = BSRPATTERN[707..0]; + BOOLEAN SHIFT_DATA[708]; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + DRSCAN 708, SHIFT_DATA[], CAPTURE SAMPLE_DEVICE[]; + FOR I = 0 TO 707; + IF ( ! (SAMPLEMASK[I]==1) ) THEN GOTO Label_71; + BSR[I] = SAMPLE_DEVICE[I]; + Label_71: + LABEL_SEPARATOR = 0; + NEXT I; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $80; + DRSCAN 18, $00000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1875 USEC; + DRSCAN 18, $00000, CAPTURE ISC_CONFIG_RESULT[],COMPARE $30000,$30000,PASS; + IF ( ! (PASS==0) ) THEN GOTO CRCOK; + STATUS = 5; + PRINT "Failed to enter programming mode."; + EXPORT "ISC_Config_Result", ISC_CONFIG_RESULT[]; + UNIQUEEXITCODE = 32850; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + CRCOK: + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + CALL VERIFY_ID_DMK; + IF ( ! (CHKFROM==1) ) THEN GOTO SKIPCHKFROM; + IF ( ! (FROMRONLY==0) ) THEN GOTO Label_72; + CALL DO_CHECK_FROM_W; + Label_72: + IF ( ! (FROMRONLY==1) ) THEN GOTO Label_73; + CALL DO_CHECK_FROM_R; + Label_73: + LABEL_SEPARATOR = 0; + SKIPCHKFROM: + IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_74; + CALL BP_VER; + Label_74: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CHKNVM = 0; + CHKSEC = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NW_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NW_INITIALIZE USES DO_INITIALIZE,NW_INITIALIZE_COMMON; + CALL NW_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NR_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NR_INITIALIZE USES DO_INITIALIZE,NR_INITIALIZE_COMMON; + CALL NR_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE FW_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 0; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE FR_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 1; + CHKFROM = 1; + CHKSEC = 0; + CHKARRAY = 0; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE W_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 0; + CHKFROM = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE R_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 1; + CHKFROM = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE POLL_ERASE USES GV; + PASS = 0; + INTEGER ILOOP_1; + FOR ILOOP_1 = 262141 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 1000 USEC; + DRSCAN 5, $00,COMPARE $00,$03,PASS; + IF PASS THEN ILOOP_1 = 0; + NEXT ILOOP_1; +ENDPROC; + +PROCEDURE UFROM_DISTURB USES GV; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, $ffffffffffffffffffffffffffffffff; + WAIT IDLE, 5 CYCLES; + WAIT IDLE, 10000 USEC; + NEXT FROMROWNUMBER; +ENDPROC; + +PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM; + IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_75; + UROW[] = $ffffffffffffffffffffffffffffffff; + Label_75: + IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO; + BUFF32[31..0] = BOOL(CHECKSUM); + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_76; + UROW[127..112] = BUFF32[15..0]; + Label_76: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_77; + UROW[127..112] = SUROWCHECKSUM[15..0]; + Label_77: + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_78; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + Label_78: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_79; + UROW[101..32] = SUROWDESIGNNAME[69..0]; + Label_79: + LABEL_SEPARATOR = 0; + SKIP_DESIGN_INFO: + BUFF32[31..0] = BOOL(ACT_UROW_CYCLE_COUNT); + UROW[111..102] = BUFF32[9..0]; + UROW[31..29] = ACT_UROW_PROG_METHOD[2..0]; + UROW[28..25] = ACT_UROW_ALGO_VERSION[3..0]; + UROW[16..10] = ACT_UROW_SW_VERSION[6..0]; + UROW[9..6] = ACT_UROW_PROGRAM_SW[3..0]; + UROW[4] = SUROW_SRAM_DISTURB[0]; + IF ( ! (ACT_UROW_ALGO_VERSION[6]==1) ) THEN GOTO Label_80; + UROW[5] = 1; + UROW[0] = 0; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_80: + IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_81; + UROW[5] = 0; + UROW[0] = 1; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_81: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a7; + DRSCAN 128, UROW[]; + WAIT IDLE, 15 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO PROGRAM_OK3; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32853; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + PROGRAM_OK3: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],UROW_MASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_OK; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32854; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE FAIL_ERASE USES GV,DO_EXIT; + STATUS = 8; + PRINT "Failed Erase Operation"; + UNIQUEEXITCODE = 32855; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; +ENDPROC; + +PROCEDURE EXE_ERASE USES BITSTREAM,GV,READ_UROW,POLL_ERASE,UFROM_DISTURB,PROGRAM_UROW + ,FAIL_ERASE; + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO SKIPRUROW; + CALL READ_UROW; + EXPORT "ACTEL_SLOG_UROW", UROW[]; + SKIPRUROW: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $85; + DRSCAN 23, COMBERASESELECT[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_ERASE; + IF ( ! (PASS==0) ) THEN GOTO ERASEOK; + CALL FAIL_ERASE; + ERASEOK: + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO Label_82; + IF ( ! (ISERASEONLY==1) ) THEN GOTO NOT_ERASE_ONLY; + CALL UFROM_DISTURB; + NOT_ERASE_ONLY: + CALL PROGRAM_UROW; + Label_82: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE USES BITSTREAM,FROM_V,GV,EXE_ERASE; + PRINT "Erase ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[22..15] = FROMADDRESSMASK[7..0]; + CALL EXE_ERASE; + PRINT "Completed erase"; + IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY_ERASE; + BUFF32[31..0] = BOOL(CHECKSUM); + EXPORT "CHECKSUM", BUFF32[15..0]; + NOT_PGM_ARRAY_ERASE: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE_ONLY USES GV,DO_ERASE; + ISERASEONLY = 1; + CALL DO_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_FROM USES FROM_V,GV,EXE_ERASE; + PRINT "Erase FlashROM ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[22..15] = FROMADDRESSMASK[7..0]; + ISERASEONLY = 1; + ISRESTOREDESIGN = 1; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ALL USES GV,UFROM_DISTURB,EXE_ERASE; + IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_83; + PRINT "Erase FPGA Array and FlashROM ..."; + Label_83: + IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_84; + PRINT "Erase FPGA Array, FlashROM and Security Settings ..."; + Label_84: + COMBERASESELECT[22..0] = $7fc00f; + ISERASEONLY = 1; + CALL EXE_ERASE; + CALL UFROM_DISTURB; +ENDPROC; + +PROCEDURE DO_VERIFY_FROM USES FROM_V,GV,DO_EXIT; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + DATAINDEX = 0; + PRINT "Verify FlashROM ..."; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO SKIPFROMVRYROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9c; + DRSCAN 128, FROMSTREAM[(DATAINDEX+127)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 138 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE $00000000000000000000000000000003 + ,$00000000000000000000000000000003,PASS; + IF ( ! (PASS==0) ) THEN GOTO FROMVERIFYOK; + STATUS = 11; + PRINT "Failed to verify FlashROM at row ",(FROMROWNUMBER-1); + UNIQUEEXITCODE = 32864; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMVERIFYOK: + DATAINDEX = (DATAINDEX+128); + SKIPFROMVRYROW: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; + PRINT " Verify FlashROM -- pass"; +ENDPROC; + +PROCEDURE DO_PROGRAM_FROM USES FROM_V,GV,DO_EXIT,POLL_PROGRAM; + PRINT "Program FlashROM ..."; + DATAINDEX = 0; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO SKIPFROMPRGROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, FROMSTREAM[(DATAINDEX+127)..DATAINDEX]; + WAIT IDLE, 5 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO FROMPROGRAM_OK1; + STATUS = 10; + PRINT "Failed to program FlashROM"; + UNIQUEEXITCODE = 32866; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMPROGRAM_OK1: + DATAINDEX = (DATAINDEX+128); + SKIPFROMPRGROW: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; +ENDPROC; + +PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY; + WAIT RESET, 5 CYCLES; + CALL READ_IDCODE_ONLY; + EXIT 0; +ENDPROC; + + +CRC 865C; diff --git a/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.dat b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.dat Binary files differnew file mode 100644 index 0000000..9533d10 --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.dat diff --git a/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.stp b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.stp new file mode 100644 index 0000000..1440649 --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.stp @@ -0,0 +1,1791 @@ +NOTE "CREATOR" "Designer Version: 11.8.0.26"; +NOTE "CAPTURE" "11.8.0.26"; +NOTE "DEVICE" "AGLN250V2"; +NOTE "PACKAGE" "AGLN250V2-vq100"; +NOTE "DATE" "2018/05/28"; +NOTE "TIME" "12:15:23"; +NOTE "STAPL_VERSION" "JESD71"; +NOTE "VENDOR" "Microsemi Corporation"; +NOTE "IDCODE" "03A541CF"; +NOTE "IDMASK" "07FFFFFF"; +NOTE "DESIGN" "TutorKit1FlashRom1_v100_Top"; +NOTE "DESIGN_DIRECTORY" "D:\_ZDROJE\Libero\Tutorial\TUTOR--KIT-1--FLASHROM-1--V1-00\designer\impl1\"; +NOTE "CHECKSUM" "7FC2"; +NOTE "SECURITY" "Disable"; +NOTE "ALG_VERSION" "20"; +NOTE "MAP_VERSION" "1"; +NOTE "TOOL_VERSION" "1"; +NOTE "MAX_FREQ" "20000000"; +NOTE "SILSIG" "F1101004"; +NOTE "SPEED_GRAD" "STD"; +NOTE "TEMP_GRAD" "COM"; +NOTE "PLAYER_VERSION_VARIABLE" "PLAYERVERSIONVARIABLE"; +NOTE "PLAYER_VERSION_SW_VARIABLE" "PLAYERVERSIONSWVARIABLE"; + +ACTION DISABLE_FPGA_ARRAY = + VERIFY_IDCODE, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_EXIT; +ACTION PROGRAM = + VERIFY_IDCODE, + SET_PRG_ARRAY, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_PROGRAM_SILSIG, + DO_EXIT; +ACTION DISABLE_FPGA_ARRAY_PROGRAM = + VERIFY_IDCODE, + SET_PRG_ARRAY, + W_INITIALIZE, + DO_DISABLE_RLOCK, + DO_VERIFY_DISABLE_RLOCK, + DO_ERASE, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_PROGRAM_SILSIG, + DO_EXIT; +ACTION PROGRAM_ARRAY = + VERIFY_IDCODE, + SET_PRG_ARRAY, + AW_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ARRAY, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_EXIT; +ACTION ERASE_ARRAY = + VERIFY_IDCODE, + AW_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ARRAY_ONLY, + DO_EXIT; +ACTION ERASE = + VERIFY_IDCODE, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ONLY, + DO_EXIT; +ACTION ERASE_ALL = + VERIFY_IDCODE, + INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ALL, + DO_EXIT; +ACTION VERIFY = + VERIFY_IDCODE, + R_INITIALIZE, + DO_VERIFY_EOL, + DO_VERIFY_RLOCK, + DO_EXIT; +ACTION VERIFY_ARRAY = + VERIFY_IDCODE, + AR_INITIALIZE, + DO_VERIFY_EOL, + DO_VERIFY_RLOCK, + DO_EXIT; +ACTION READ_IDCODE = + DO_READ_IDCODE; +ACTION VERIFY_DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_VERIFY_DEVICE_INFO, + DO_EXIT; +ACTION DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_DEVICE_INFO, + DO_QUERY_SECURITY, + DO_EXIT; + + + +DATA CONSTBLOCK; + INTEGER IEEE1532=0; + INTEGER STAPL=1; + INTEGER DIRECTC=2; + INTEGER PDB=3; + INTEGER SVF=4; + INTEGER FP=0; + INTEGER FPLITE=1; + INTEGER FP3=2; + INTEGER SCULPTW=3; + INTEGER BPW=4; + INTEGER DIRECTCP=5; + INTEGER STP=6; + INTEGER FP4=7; + INTEGER FP5=8; + INTEGER FP33=0; + INTEGER FP34=1; + INTEGER FP40=2; + INTEGER FP41=3; + INTEGER FP42=4; + INTEGER FP50=5; + INTEGER FP51=6; + INTEGER FP60=7; + INTEGER FP61=8; + INTEGER FP62=9; + INTEGER FP84=11; + INTEGER FP85=12; + INTEGER FP86=13; + INTEGER FP90=14; + INTEGER FP91=15; + INTEGER FP100=16; + INTEGER FP_11=19; + INTEGER FP_11_1=20; + INTEGER FP_11_2=21; + INTEGER FP_11_3=22; + INTEGER FP_11_4=23; + INTEGER FP_11_5=24; + INTEGER FP_11_6=25; + INTEGER FP_11_7=26; + INTEGER FP_11_8=27; + INTEGER UNKNOWN=127; + INTEGER UNSPECIFIED=0; + INTEGER QN132=1; + INTEGER VQ100=2; + INTEGER TQ144=3; + INTEGER PQ208=4; + INTEGER FG144=5; + INTEGER FG256=6; + INTEGER FG484=7; + INTEGER FG676=8; + INTEGER FG896=9; + INTEGER QN108=10; + INTEGER QN180=11; + INTEGER TQ100=12; + INTEGER CQ208=13; + INTEGER FG1152=14; + INTEGER BG456=15; + INTEGER UNDEFINED=63; + INTEGER GRADE_UNSPEC=0; + INTEGER GRADE_1=1; + INTEGER GRADE_2=2; + INTEGER GRADE_3=3; + INTEGER GRADE_F=4; + INTEGER GRADE_STD=5; + INTEGER GRADE_4=6; + INTEGER GRADE_UNDEF=7; +ENDDATA; + +DATA PARAMETERS; + INTEGER FREQ =4; +ENDDATA; + +DATA GV; + INTEGER ULOPT1_BITLOCATION =11; + INTEGER ULOPT0_BITLOCATION =10; + INTEGER ULUWE_BITLOCATION =9; + INTEGER ULARE_BITLOCATION =8; + INTEGER ULUPC_BITLOCATION =7; + INTEGER ULUFE_BITLOCATION =6; + INTEGER ULUFP_BITLOCATION =5; + INTEGER ULUFJ_BITLOCATION =4; + INTEGER ULFLR_BITLOCATION =3; + INTEGER ULULR_BITLOCATION =2; + INTEGER ULAWE_BITLOCATION =1; + INTEGER ULARD_BITLOCATION =0; + BOOLEAN BUFF128[128]; + BOOLEAN BUFF32[32]; + INTEGER I; + INTEGER J; + INTEGER TEMP; + INTEGER SDNUMBER; + INTEGER ROWNUMBER; + INTEGER DATAINDEX =0; + INTEGER FROMROWNUMBER =1; + INTEGER AESBLOCK; + BOOLEAN ID[32]; + BOOLEAN PASS = 1; + BOOLEAN FADDR[3]; + INTEGER STATUS =0; + BOOLEAN SILSIG[32] = $f1101004; + BOOLEAN ISC_CONFIG_RESULT[18]; + BOOLEAN VERIFYEOL[2]; + BOOLEAN COMBERASESELECT[23]; + BOOLEAN SECKEY_OK = 1; + BOOLEAN SECREG[44]; + BOOLEAN ULUWE = 0; + BOOLEAN ULARE = 0; + BOOLEAN ULUPC = 0; + BOOLEAN ULUFE = 0; + BOOLEAN ULUFP = 0; + BOOLEAN ULUFJ = 0; + BOOLEAN ULFLR = 0; + BOOLEAN ULULR = 0; + BOOLEAN ULAWE = 0; + BOOLEAN ULARD = 0; + BOOLEAN ULOPT[2]; + BOOLEAN SUROWCHECKSUM[16]; + INTEGER SUROWCYCLECOUNT =0; + INTEGER ACT_UROW_CYCLE_COUNT =0; + BOOLEAN ACT_UROW_DESIGN_NAME[70] = $0ad72fed3e9965e331; + BOOLEAN SUROWDESIGNNAME[70]; + BOOLEAN SUROWPROGMETHOD[3]; + BOOLEAN ACT_UROW_ALGO_VERSION[7] = $14; + BOOLEAN SUROWALGOVERSION[7]; + BOOLEAN SUROW_PKG_TYPE[6]; + BOOLEAN ACT_UROW_SW_VERSION[7]; + BOOLEAN SUROW_SW_VERSION[7]; + INTEGER PLAYERVERSIONVARIABLE =0; + INTEGER PLAYERVERSIONSWVARIABLE =0; + INTEGER SCULPTORMAJORBASE =5; + INTEGER SCULPTORMINORBASE =16; + BOOLEAN ACT_UROW_PROGRAM_SW[4]; + BOOLEAN SUROWPROGRAMSW[4]; + BOOLEAN SUROW_SPEED_GRADE[3]; + BOOLEAN SUROW_SRAM_DISTURB[1]; + BOOLEAN ISERASEONLY = 0; + BOOLEAN ISRESTOREDESIGN = 0; + BOOLEAN FLAGDISPLAYCYC = 1; + BOOLEAN ISPRGARRAY = 0; + BOOLEAN BSRPATTERN[708] = $9249249249249249249249249249249249249249249249249 + 249249249249249249249249249249249249249249249249249249249249249249249249 + 24924924924924924924924924924924924924924924924924924924; + BOOLEAN SAMPLEMASK[708] = $0000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000; + BOOLEAN BSR[708]; + BOOLEAN SAMPLE_DEVICE[708]; + BOOLEAN RLOCK[832] = $7fffffcffffffbfffffeffffffbfffffefffffffffffffffffff3f + ffffcffffff3fffffcffffff3fffffcffffff3fffffdffffff3fffffcffffff3fffffcff + ffff3fffffcffffff3fffffdffffffffffffffffffffffffffffffffffffffffffffffff + ffffffffff; + BOOLEAN ARRAYRONLY = 1; + BOOLEAN CHKARRAY = 0; + BOOLEAN FROMRONLY = 1; + BOOLEAN CHKFROM = 0; + BOOLEAN CHKNVM = 0; + BOOLEAN CHKSEC = 1; + BOOLEAN PERMLOCK = 0; + INTEGER HEX[16] = 70,69,68,67,66,65,57,56,55,54,53,52,51,50,49,48; + INTEGER NUMBEROFFROMROWS =8; + BOOLEAN INITIALIZE_DATA[5] = $00; + INTEGER SDTILE; + INTEGER NUMBEROFSDTILES =4; + INTEGER NUMBEROFMAPROWS =2300; + INTEGER IDREV; + INTEGER IDFAB; + INTEGER BM7DEVICE =0; + INTEGER BM1DEVICE =0; + BOOLEAN M1BUFF[128] = $acdd6548ccb488863e291eb18fe95077; + BOOLEAN M7BUFF[128] = $e137623a2eeee91126015f3f73664945; + BOOLEAN IDCODEVALUE[32] = $03a541cf; + BOOLEAN IDMASK[32] = $07ffffff; + INTEGER SECKEYCHK =0; + INTEGER DESIGNPKGTYPE =2; + BOOLEAN ACT_UROW_PROG_METHOD[3] = $1; + INTEGER LABEL_SEPARATOR =0; + INTEGER ROWITERATION =100; + INTEGER PAGEITERATION =100; + INTEGER PERCENT_UPDATE; + INTEGER DIFFERENCE; + INTEGER UNIQUEEXITCODE =0; +ENDDATA; + +DATA BITSTREAM; + BOOLEAN UROW[128]; + BOOLEAN UROW_MASK[128] = $fffffffffffffffffffffffffe01ffc0; + BOOLEAN DATASTREAM[1913600] = @WPw00000110040W0W000020G000400108002200000Wwc + qssso0000p@@lF999IjjjQp0000_@x@@IYaatcjj50000y_@@7HIIIORRRR36uXaa49jjTDq + WD2000y@@EH0vssMj90008@@z@69HIo000049IIICIII2Va00008III0HII2i134999H899f + 67Waaa4aaaKD020Za491aa8900gX7GIIIA0000800m0G0aaaa9mWauWku00000IIIIg1Vqss + sosssc3999A1000jjjQpjjPRMIYay0000tcjjbMjjj8III20000ORRR3RRRhWaaa3ZWQW3sO + RRssba897000mskJAGIIIYC000Wbaa8vIIaaJRpsEJYaaD9IIo4999sijjz8999B999fKHWj + jj19999aaaaGIII2QRRpIIIY4IIoQm6caaausssgZaa4PIIIdW0PRRRsIIIa600So88EH0II + IYxa1r72IF6WaaaySHGDW50IIIr07AK6KV8O0OGDuWIQ1r02AY4K3QeTDHDu22000r05w4Ae + ssscJIIIUy0ejjj2aaa84000G00e6GGhK1ijjjYaaa2d7K3w0JIIIkyWQW2qsssWjjjvIIIY + O@@l@jjDR7RRssaa89X@x@Vsk6KW99992@@@_nssiDjjT@80n@@VD84LIII4@@@zjjjPpQRh + JW04@@@_GRRrMRRpsijLRxlDRRtMjjTtijjNrss6pssssssscsssMHRRRMQRRrYjjPRijLRp + sMD01sORRh1ymssscvssMjRRRsCRRrsljL3GWz000040030OK3uK@Z130Br9SX000WQ0D2De + fjmf1WCZJMB22jOho2q_FGp@1Q_FGp@1Q_FGp@1Q_FG3l8999HIII2baa41999oIIIaeaa89 + 89HIMIYa49f6G10999HGIIc1W089992IIIaaaa81IIg6W7T2ce6W6H3UAGZ@3qu@0D_FG3Nh + 4q0GIIIa200YKW04000W899BpyWS3LOKH3QFyWQ00fJ0AsHyW10I02000800W10sfJ0Aaaaa + O0000GIIYS0000A99I20000ca89H0e6W2400008999N12g1mWqEFe6WEw4OYI6Fmaaa45000 + WIIIz7GWIIII0000W899xHWaQ0eeJWB21m0Waaae000g2W020000IIIa100q7m1jIGGY09SO + m1r0CId0KaB91f1K0WIIoq080HIIID0Gq9G4r0CId0EC0m@30yV0Dr5DmQ1ezVWJ@7uq@12_ + Vy8a7Qm@1qyVm9@7K7GA999ZZx2baaazmTHD0T4yew1dyVm9@7yur1DWMmZ@7yu@1F_@00@7 + Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F6lijjD3000Wsssi50000QRp + s6000WiDRR70r0W0WjjDR000r0GmDX4ejjjf6WHw482ssssGIIIaRRRp899H2jjDRXa49fss + ijJIaa4sM3G1Yjjjh1G1YjjjQaaag18aE1emssscJIIIGRRRs999Hgjjz4m1CJIIaussgjII + g602iGIIY4RRxMW5g1eZE1ce6020000uaaa42000GIIIa2009HU0eaa49200@CUmvX70999f + FI5g1GZE1iG2@@l@Xa499@@_@JIaa4@x@@DHII2l@@@79999r0aW799fQ0809999u@@VFaaa + r0GId0DuZaayZ02KRRR@uW1tFG0sssM5000WQRRrA00K3W23FG0sssss28msssID0cq9G3r0 + Gm00@F0m@1RzVmZ@7yu@1ezVmZ@76s@1ezVmZ@7So@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7 + yu@1RzVmZ@7yu@1ezVm9@76s@1ezVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7yu@1Rz + VmZ@7yu@1F_Vm9@76s@1qyVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7y + u@1F_Vm9@76s@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7yu@1F_V + m9@7yu@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm + @1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm@1qyVm + Z@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VmZ@7Qm@1qyVmZ@7yu@ + 1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9 + @7yu@1F_VmZ@7yu@1F_@00@7yu@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1 + F_VmZ@7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@ + 7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F + _@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7 + Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVm9@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Gp@1F_ + VmZ@7yu@1F_VOO@7Qm@1qyVm9LR0008un@3Uy@WJ_Fun@3qmZq0C8un@3Uy@W7@Fun@70u@0 + Q_Fun@3Uy@W7@Fun@33x@G3_Fun@3Ev@W7@Fun@3Ev@W7NFGZj2Uy@W7@Fun@70u@0q_FOh@ + 3Uy@W7@Fun@708P2000XXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@F0m@30yVmM@7y + u@1F_V0Q@7yexXXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@FQu@30yVmM@7yu@1F_V + 0Q@7yu@XXzV0Q@7yu@1di9808WW7@Fun@3Ev@W7@FG3F889A5yu@1F_VmZ@7y8@W00060mB0 + 1001ezVmM@F0GUrJOGWJYLSH21F_VmZ@F0WL01002EHR80001ez@00c4bm71q4S44q5SYL51 + KHG3bP0008uHY989P5yeKH0KGd0781999un@7KwbG34x8i52qGlW73cbaeKGgPa6W1H38LS2 + I1408866BAP42E0001F_3G00wW77XORRRmZveijHYaaahcss8IGI2r0G0QIIjE180IIiTmZE + XtsEHII2DBRRdE18GQRZ4999NjijH1FA540u4f9921FAcw@7I4aayT2SWz@t4999y_z@F2UK + A200jT2e020WjW7nI004G6Cu1G008Un@RBGrQ0KW000GF2b5D0Hj9ONSf4qNG11Ez420WWsC + Q8QW42Uy@W7ZCMM8YyQjlwO2500Gq0YrFp71DaKq05q9W3FDe0W0WWtNNR_WIYKHeVEpAcP6 + G0004DGI4002oeecu4cvMwmIV8YFROG001Gm9bH0008sYa2CeW0qk8u4f2QOYW7T2P89PSS7 + 8199hJ020991H2IogKk3aWae4XtH8B99L2II6995nmuM8LGtmAQ548KpPC4yeW9LeGmZ59B9 + 9e9Z7a098HIGI8DW2a0a0b601WaWWgVCXQ0IOeF2g1mWE1Ee604Q0WWQ0AW4aaKD04e9919Q + 05099A5e13nzS0W4WaYIAOYc5G0G044G1r0eHI26K3G3DCaHmZGKou11FM3308RMss0020eP + BRR1G20eJ02W40GgzjjBun9APiWW7lHQRZ4199th59G99qcij5IWaaQ6qsEH0II4yuJWjjJK + caG7yu1ORRa089vgWjDY4aaGmZI999H0G00YacaK0400IIJIw4W0oGI21F_au@7IaaayUz@F + H2IIuFz@d9199u@@VVaia1F2550eM9jj00200rcss1010eJ02030GPBRRP5nj70u@GuvCU_O + 70Wm0doDun@ZJG7W000b1vG44UTpBP1LTmv06SoRP8000Y68XOB_QQlCMz3gg6G8qWd06004 + DG3X685W000W000n2SmxU6SL831DOLi5I41HMNqWMq064fW11dyqMbS4e1NLdaGm9CX002eJ + 05Q58101001FwKd08mI2IAeE8ghpWW7F2998Pd0481B9GI2Ica4aaE180aaaLmZK5hqRNmOH + u4FjyD4PoQKZ0Ii9U6X6iKWJ@5RnJoIII4aaeq9m1ab4b8991HMIoAG3ZG0IIM3G2YIII2qW + W8MD8Q05KI204VbQssssS0000QRRBhn3e000quu7r0e1108xE1CWzjj1030WE180400eMssc + W7PGIjjTZZcK3W68RRb2Uq0IGIIQJRR19C9HibjLZaZKmZ4are1M9993Ua09999gjjj3US7b + KaaWsmsiI2IYKRHps9X9IgjWQ0A8uH3m0000caa4v00GPZ4e1000GIIYa10WW7dH00SYqaa1 + W00CIOIo1W00q901W00W8D99v@@@daaa4x@@VVIIIaw@@zV99HI_@t@la499x@W7f1_@B92I + oUV@@d839fy7_@t901Uy@7amaabrO20jjjPB0000tsEhH22UC7B00jIRR1050Wgbjj50400t + csM1030WQJR3UqiWjGBu4qY9ZggTEuMW3A1VBG00016emS_F4d0I33OGGtN4y8nX6yGmZqA0 + 088un@3UCq888BQW3EtxWOBqgWW30300C0GPhRTmK2F4qWK0A0024CjtmCu6cjY6uj10C0a0 + 0Gmm@N9tE1dyVD0W0800eJ05QRQ110091FMLd068IIKYba4KmZLr9m4KWai2UCk0DkzQ46Y6 + ekWJKEsYgaba4q901qa4b2I5B8999H3aW4aaae1K8WpiAsGYW7jWT00GmZp030ssbjT0Q10Q + sss60200GBVRJ1m0eJ022UaX67J9uHEW4ia8t0scHI0Y4QPRs2v9IIi5ORZK4ye38tss2Uy7 + R0RRA1191jaiPb4Y4vs0cjJIOaKR8ss8fOI204yeJG0WJmcaC0W0WHQJIE0a009D89Q0G02U + i1@IIIa_@@3Uy7@L_@aCWaO@Q_xN2GYq@rk@B1BIo@4_@X489P0aru31Fw3WM00roqs40900 + OxUp6W900kf8R3WI00rcgj5060ej0d_VlfP2Qu@e5BfJW241004wumhgb0420WW7@AWc4wAT + Y88UwAEB2Uy@10wuRn22UiiWxTOrljAay04000z5a0G10We1oAOOo_4GXu4EuP14Y6W9G001 + p60HmmKDe05H3uL0DlTu23Htyr15J4@hNr0ma020Wl0o8E1hQ5uXWJcQv692Uqf218GQIYY4 + aaWE18WiaeKGTNXiaaK989Pd05OIoIYiae49898IIIMaWa4YJGA4001B1q0G00W3DI8g3mMs + fZ3lCiAdQ2e9hrHC8Ua42UysE1a8G3T8889L3m4H0KGd078D99XIGIYWqaaW7hAu_BWW0aar + 014WW00000G2IGeP720IG2K30A4009g1O22IG0r0419810010G4iW00W10G2UG00W1001D82 + 0W0r0O220GYQ0cW054GD0GaFP2Wsssi500aF91S0000PRR7MfDY0Wi9RR30G0Wcljj5GO00q + _ssCG100PPR7Mv5waaa2hC74IIkARRZ8489efWj540a4r2sMToHIXLIWJIIIGRRRs999Hgjj + jEm1XLcZGRx4989q0ajT44aao2vs6IWJYSZPR69f9XLU04000Waaa8500AeaWW79WaaaOObr + 000EnRIY0G204XP9f0I00a4aa80900KQIY4_@@y9FmdaaK_a4maaa4y@@lVIIoMAte60DyJx + @3I0IYyFvlFP89Iy9__tab89y1x@F2wZW2odCXx780RRRh200WmApX60GhqsM0Q00WARRx08 + 10WjCjL1600eccsmAVATnqEJtW60C8V05_7Gi9TC8aAgY07jvc8Ol95Q7uWIEd2W01Gh0B80 + 00W400GOOS5eG2H3mGx4L5DWOX6eW00000200G2002hSh60E0e00Gq064qGL@ET0W00W55I8 + QjdsPeXmA7650GmL77iTq180003xdA3001W000W0000m000W20mIXLDco1W90004000G000W + 40Gh15asG6hBk4110WuHgo00GGE3AG0008Q0icHJXk4CuKKjQB0Xe10R0W80C0046sMj0TGO + bOX008eOW3MsGXOBeQP030800SeX1BNeGaAS5rn1H4PLGGE4ohOXLg52IIoE18G2MIWWWaC9 + eB9T2G0G99hmAZgJ04O919HGoIAiI38B9P5M9LXmhsq8aDMG1B0GmHOA01008MMtYaSiyEG8 + ioQ98AD5MvIr0K1IJIIa4a4T2GW0aaiE180aa4Kq064dGK20003QuYW7XW100GmZu08008uH + 50Q10q901S0083Uq2gjjj1FcZos692IIkAPRZ8199e1jjDuH24jjTYXaa8uHdibijv4ca4q0 + tMmZ4mIms6I0IYS3OR69e91F2b20u4f992020G4caa6401caa0800GHNII8uHdyB_@3I2IYy + lyVmZ4uhz@d9899up_@W7b2090GmZ7eyjj3G40Gd04m40WoqrsILXYjeoM7KLsfZD8I00eoW + lEFJhAE7966fY6uhk4A0180m00BG100u12im0004QW2JDG5W02WVBq8m9c0401q9W2FQ8HGG + Y5lOM8004oCjXe1SwsU2o7PZu4WgQlA2Uqf0EN0400ml560H00eRHiWC00ijd2loEr0080B0 + 0e5a6YjOhm9M8I@e_J02m000fGGGa184QmJ0300wjGXe1O8qWg2QOXOoKBQ0d0800qn11V2q + mQSn5SoIXlImu8DCbm31DOr61F4SYHFCWGd07aeI302002Uq9aabaA819XIGIs9G1ca4bC19 + 15K7L89A9HQ2I2b4aiJ024aaaG919fJW20I204yuMFjirELVKF0IVpuG406i1FLdpuGq0I4e + nJt2emw8F4LOJHGKHmZI989HfJ03aWaaq9014aai2qu7IGGIr0C1aa4bE1KWWa04999B2II2 + np@LuM5C0m11Fk40e0WE1GmRR1e40WMjjj18408rMss5yuJGRRai89vgijDY0aaWM0ssW79m + Mss9GKIYW7To6mscJQGIG30Rs9D8HgXaPRaW69v2WjDImW6A8uHc000de99H0000YyXaK001 + 01FI0010AMQI21F_as@7IYaayI_@FHmIIujn@FuH2ir@V8f899uHd0q00esysc0Q200RARs1 + b40WjVPR1a20es6jj0m00TEuO6TPamYNJakRLbPV00100G0007tJLObGzCL6800W_qw02000 + G200YXvde1seJW5Y6Ge8lAPy62YqdX10o2G00Gq0aDu32ZDKGivR5DG31DKrJ4J4yeLLQ8Hq + 0S5ZvTHUD5100m5LwgWW3wJHXI8884nT_vgcW6cwC33UeHirIV8S2n0C00iSJPX6KMG3F499 + Q30mrf194SoJ17rGp67idh2vJcKmZE5KN9p6Omk164yeD4iaag1m2C999T2SW99B80IYIaaa + W819P5yeKGIoIw4e1JIIG4WaiABpWWWmQ2Hgs8ua8MNgJ020B00CEo39iCq00J0I00O90Bm0 + 004FoKxp8Hm9LrNS31FALd0DGGI2AG36I3e0GIKIH3S1898fE1SW4aaKD0GWqaaCQW4qaa4q + MW2acai2qmWIVIOyYCg1ub0QYO1B32US6GajjQP00g1G1xB0006msijD0I10osbjD0200QMs + sM0A00GBVRp0Y0eJ022Uq6BZaa8BssibHIM3W2ifHIa44sWijH2eaahKss82HI2QHRR1v89H + j5jLd4YKmZ4PQaa41nssw040XDWLRd049XMGjjJQaaKxXss8HHIoL1RRKmZv0YIIYq00GD04 + m40000899220WQ0C020S2sa41e008IQII1W008f19fJ032Uy6l399IG_@h1W0Gy@@_daa8By + @xd7IYaaylu@7I1aay6_@FH2IIuF_@d9O99udyVVaaa1FU38gjDRA0004msg1W08mssiC002 + Uq0B00jOQR1W500gfjj30400s4sM5030WQRR3UqgduGu7cp_6eXzqtQhfkgsXYx14BU432JE + gWXX0G80GmMHtRQS1En4108WE1KuLK9ALuePE80WG0GxKEL3W7hAvmA054DGFzbu0G00WQ0E + uc3Bge8f91AO1622Q8Xn1K822bQ1WWE18uqj30100KCBJRG8Hl06C2ZMJm8nK2F4qmHTASGd + 0B4dmMfBEHOBODFJOX5GHs0C4Q0ClQw1280WoOeAxX7YCkX10eBIbb08004ng27EDHr18b_W + 1T2WGh0F4LeJ2400w4WYW7jf6WCababA19HhJW3099AHIIYAEE3Ymp9W4ba8919Z6W0e99PI + IIIeWaa8A99H6IIImZI5R1P334IK7Cr9W1W000QYHXMUzwbi92hyfeftBuHkO99AHGI2gJW2 + 2q88Waaar0e0489eE08eJW3aWbaq9m1qaa4YJ8gEES8Q332UC78ajjr0SWT000OIRRr0G04R + RRM8a0f1K0O00wE18010Ghsss2a10a1FcprY6K3m1C1IIa0ORps29HIm0hos683IIcAQRZ80 + 99ebijjJ02iejTXaaa8uHRKM99HQejLR2a499mMjD4Ih3GWDCIIaaG6WjjJ0camJmssLEJIA + QLRR8j89ICbjPWGa4yeEa4000809HI20e6W308IIYaK0020SYia41W108IJIIh3m0X000WMw + I2UK799@@_pHIaaC@x@x8f602yp19HI2wLz@39JIIUB_@d8899q@_@paaa4mR@lFIGoW7l10 + rscD5000aORss202Ua0sE0002fjPR34H10gLJRB0C000DfjT4Y00mcqsg2A00KRQRmZMD0m@ + rIswq05SH32nmyKnDD0M00AQ0ioVOwvbI0G000W02WuhagJ08I6WWn9I8eXfg8GYW7hgPx9Y + 68iAAi240GIx0C4yuHxAw0W0001000H3imw8N18008Jh6_Gqh19r8e1TI5WYu4QunulUPW10 + 120HTaLq0DqUIS1FsJeRL4W6U1FQRD0A4OxNT2amR6J4TZNh0SGmZEXqaaK9P9PyY40999JI + JIId04G0Io8uneg1mWe1802IIMd094yOLT2enCxh555qX6WMq03Dbz21FY6SIIoE1W8uHew4 + 0ZW7bgJ0D2US6GajzQP0040mswjD0060IhMsN0028WQBRRC0008RRRpO000eijDR900f1G0J + 000Gtss1FUZbHIIa5RRqs891I2jPORW4H91cjifHai44ejjj1aaa8psscnIIY4ORxq08W2RR + hE89fW7jXfzLY4a4Qsms0I2IIORPJ5yO1so89HI2OpsscHII28RRR7899fWjjj1aaa8nssc1 + IIImZv81f1e6020990020GYq4400108IQI2T2O0K000WcaaT2GWcaa4X000WOII2UC7abWy_ + t@3HoIIu@p@7998Bu@xFFa4a8X@@J3W0I_@@_Waa8H@@xVHIYaG@l@@2fW7l140KhMsK0020 + YQBRR0048WjDjq0020WscMj4000eqsijO0000QpssDGQ05eA0004RRRmZi_p2QH3yGpLRTB0 + 3zKTmVSTqVsN7Bu4G0WWe10B8e3w4GXHcRQJW76SZhmxge@882SYce1q8mfEYk9gkWG8L16Q + docqCEeeW623WW67HBuHjALQXE1IOV4AYWG6G0G0HUL68G0Wj9iOohGEaHptFm0200GOOo5i + W1JHeG8LODRlN1tlK77t4d0Mn2qq2geqOYJLdPG69D4EnE200G2Q8ceR6gJ0F2DWWW7l9EE4 + O999HIGGg605Y0eWuue8ekRA8WXoo8e6W6w4G129991rfGmZ05GZ3T2emUBKbAm9XJ0JvkDq + _nMH3uH11GjqW1fiSGJ35ydW11deKkLU4y8Q1QiKD04e999O2028D985Dm81Fw90m_MjD010 + 0ORrt60180e5RRB0080GjjiDT2eHmZsK3G1IRRZ8899ebDj5abW4nsMMDIIMr0SGd0K4y8Ds + qssK2II2QPJp2998Iilbw7PeJWAg1WWW7j10bWKD06GGI0200Wa99900G0Gaac4w48ZW7ln@ + GMYaaVV@@89oIYVzx@a099Xt@x@Wa4aaE1im799PmZr0800Gjijzz3AWDjjDq02ijfjq9G61 + F_p@OAiJM4rLxNb0vayhW7thqg19yq013DyGq1MqVmFTqzGd044DGLnC7vqH6jUq71ErJq0H + 4y8Pl1TGhuEbem51FAS0QS5rUVT1_mN7xTFmFFOzma1X5SJ854SKq074S@@phgIBoTr4nIr0 + 0JKkUKT0FZXMHm9G5rW1W200w4OaW7lf6W28119HIIIYWaW49998IGIInBg0aaaWWwMg609W + 0995Kt6nm4R88AE0WP02022Dmh6pkAuH0bWae4DW50919x4u2Waaar041199XW7l1101mf4q + 4yO7Ysss2UK5GWzjQP022Uq0W10jORV100X06yuCuaaa2Ua3jiCIaaiO3Uq1oq89o22R3Ui4 + WQRR1FA3RRPQ8911Yjjj2Uy6D2001Fg18A19J3001Fg0220WW7HXdaaKmZD0a@@FuHDyEab0 + 1vtFuH3yv@a09PXt@xzGmZp8gjjDuHE044rYjD58uH30408WDjjCunlASiiDnBR00hxYYWSI + oe0dbQfoY01LQxIFwiHfLD7AxnUgCeZ0dIAQW22Uai8l2fan@2U4oS1AO102Y4mWW7bAu28Y + W0a8DiDe1f2DmYu4aAh5Gkm1Y22m9QW32ZuXE1KuS7yA88X19c9rW3sOSXWJ_hvQ1h18am9c + 8msY50006yeM2Io2g1GXW7ReJW48aaa4y8HA8191III6Xt6H3eGmZc_w1CHW3D600W0RdCuH + GJ3u0G2KIH3OX4W4We1mWWaaKD04WWWaCQWFgEO120205pS1181WW66ganB2Ua30WzjQR02g + 1e00100ebjjh1GXW7RfaH22USZQ0C8un3ijjGgaa4h6062U4aI6L8uHJg1GYW7dHY00GmZQ0 + WIGg6042UiWQ0M8uHGAPi1@aaaPDgGmZJuV8BHIolVD05ut@@7989PD0B4y8BWQRR3Ua300G + jtFa0W000ifjjr0SGmZzE00fZcH6100WSMe9_A9U5JZOO_AQ0q60usX749uHa2S2aI5cvckD + 2Uy@0qci606G0044URwnZ0TKXG7Q0QH38qdECq9W3vc6Nm9Ss90D1dGJh4n4yuD1r5HmZMq9 + 014aai2UKd22w8ekBYX1dr0E8Ag72Uy@mM2hpBLUB8ZG3q8IIOYP8Zw8A8u4AwhWXOBKvRH2 + g1e289991Q0Y4a4iQ080a44KmZHqWg1r0KGK7EK3W51Fw1W0WWqwle6W32WSYQ0i8uHa0400 + K@e6ostsC080q902URR3W00G6yeFr0OGmZ4K3W2ORRaO99vgfjDY4aaWsosMGoIIKRQRr919 + 5yODr0G0aa4wQ0e0jjTYWa4QMssEIIIIPJRR3989HkbjTmZyK3G31FgW00u41992T2S01089 + GII01FgZV@@@Q0S8uH5u@@GYbaatt@@PD04e@@DnII2lx@@ZW7lf6W62UaWQ0Km00KhqsMWE + 1C0W200scssW7DT0W@333xW7@F0De2wEge2HBun@3Uim0DG3200Gq016FIRXyMJ11p4DGIXL + gUCcG7SIlrJ3Hm9b5yuDr0qHSSKKAt2Waia2UCbQ0w8unDQysYOOICun@B8WcOst8u4uccXX + uIl9sYI099A5e15H3u2909f89pG2IIGmZQ4dmIfdRHmZnK3m8Ws_si501q9G1W008ross5yO + Gr0CHd08GRRX489fcbjjJaba41FYJD0Pq901CjjTaWaakA91aaaSrts65y8Ir0mGd078199j + J058D994y8Dr0CYF9B9Iyl@T2SWFIGoW75g60A0100gbjjh602yjj5000WocssoeX@F00cBW + lL0Q46yu@T6eI0JC4VLDt0aX080WE1Mu9W72Q8hz9O8unZFDWXu4s93e92UClOYi8ms@x4GZ + JywOflM2GJii2u8wJ13e9sWxPeD3s6CWXWJUA71E2QuflBi8u4c80014yOPKIoIw48198991 + r94aa4aQ0emIIIYWa4bW7r8_tP100004008SYoY68Z9PGBOBb3Uah0D62899PaaeGGIoAuHi + U1mYW7VYljD0G00wW79m00GhossWE1C8ungqqs6H2IIGRORB8H9fW7j2jjTYWa4Q6ssE1FgG + D064yeK2II42Uy020GIqaa0010GHIII8uHfmIIoxx@@CuH2m@@c889Xtx@@n7164y8J40WQL + ss20200iJ02800iPQRB0400LmZ@F0m@1F_@00n6uqQ1DKMmZ0FLt4n9WMaNt6SIwVd7H8Y8L + Yt354KGq095Qm213lLeRh5GJiL2KJk7841X4rduKG1q4le61FwGu4C4S2Djv4JmZEXbaaCeE + H09P95X7GO999LGGI6Dm24aaW2UigOCR8mMY2RnpqPv8qWDZKPlW772889PD0C4Ng5f1mGq0 + mGQ2IAuHbrt0008Wjj602G0jjPP10e_H7w48YW7vnc699IGeDRBBa89Bn2UiXE1c8uHRaM99 + HGejLBBaKzZIq9m41Fs3110WQ0E01899Q20WW7JeJWA2UK7P9@@_zHIg1W0xJII44_@hVqXE + 1Q8uHTGGjjT@W28WjjPQ00K@O4T2qGmZ@F0m@1Rz@00McDK61F_VD0X6yuc88002UiiAE0DU + 4T18004fou1qy@00caXe1ZGeGm9@7TZD1FwKd0PKAt31F2Kd0P4y8Kn@UOm9@7SocnMuq806 + 05aaCG3_2UKJ10Gsajj10000p_ss00100QVRR2W100ibjP3C00WiiLR3400WMsE1A0zjjD32 + 00G_ss1FQ3ss69MIIir0S0jj5IWaaO6ss6HKIImmss6YIIYSPRR6P99T2W0jjjJWaa41FQJD + 05mqsMG2II2RORR8199Yjijh1W0BRRRT2e0JRRR8899oXjjP4aa4yeD20WIqaa00000G2III + D040II204004f991W000ED99XG000acaiJ02aWaaq901Waa42Ui6_@Fa099vz@@FYiaam@_@ + FIMIImV_@U819Hop@xV88HIoxl@@4aq0AWP999uz@VViaa1FQZ00eMfjj0W000ross0G000R + TRRe14OJRR1800WwQRR24000CjjP74000Mscj5200WAxW7@SEOzgQKO0100JfJmgt6q3c4t@ + smfW94SYCH3a1G00WE188Q0a60OYw1A8U_7Q58fB6zPo_Qg7eXRcd8mfTY6OYE1Eu0QBAL0e + @@T8un@7zBd0q_w_13w40Y3F8O2Bo6BqY10I9S432sIj15e8Cic3dGZ0q_FC35Eh0Zu4UgL6 + Lc7mW6JSIG00Gg1HKJJ2L7WJpCZ4MP31dqps0Eq901bACHmZr091BHII2YWaWWQ0A018PP@@ + 44yu22II2w4G1GIIM1F_V88t5eH61daSR374yOOH3iHi5xqaH1r0q0489fOBm8Q0S4aaWK3W + 4H3WGaaJ4yOdr0C1200mQ0OeJW82UicQ0CuQH3g1OYE1e8unTg1022II2T2OHQ044yODr0aW + qaaaQ0WeJ0B2UqcQ0I0199HD07O@@Ve606w4e1Vaaa1FQJD060100i6WBw4GYW7zS0W@3sw@ + OcNjxKq2S2jesHBun@3kVpWJ_F4_@3ev@u4SDua@3izbW7v9UnP2gxc22qej0B2USeB0CO7H + 30100q9G4RhJNm9@7sW6FDKGm9y5NAQH3S4WaaaQ0Ae8W22quYW7Rj6W72UafQ0o8unlg1mW + W7hg6W92UigQ0o8uHcg1uZW7@V0W@3sw@W7@Fun@3Gx@W7@FCi@3Du@W7@Fua@3U4fu5Z92F + qYXnwWJ_FuaD3UyrQ0G8uH6aWaa4yOM1So0W00WW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@ + mm_FqW@3ev@W7@Fun@3Uy@WJ_Fun@3UKl0Du8e1q2Uy@W7@Fun@70u@0Q_Fun@3Uy@W7@Fun + @33x@G3_FWc@3Uy@W7@Fun@3Ev@W7@Fun@rssE4yuP4RRR3Uy@W7@V0W@Z9Bzs24Cun@3Uy@ + W7@Fun@3sw@cP_lWWG02004Gp@1F_VmZ@7yOf1dyV0DZ3G008uno81995yu8f1K089Afe1k0 + a4aKmZBH0G0O0WBg1GZW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@W7@Vvl23Gx@W7@Fua@3U + y@W7@Fua@tZ1fW719302Yje48999nM0JD0H0I22AQWBg1eWW77ApHGQUCbW7Ffan32UCiI6F + 8un@3Uy@10_V0W@3sw@W7@Fun@3Gx@WJ_FCi@3Gx@W7@Fun@3Uy@OOqCua@3EPpOBGBGZr2Q + 0jW7vHVR00W0WsW7Bpcs29IGICRBRZ89B92UqAfjGI4a4Rros8HoIYLRVRKmZSHGI08unoab + 4@xt@99unlG0WjL3G3Cj502UCP020030y@00zSQ11P0W0W00WOOu280GG0DI11008unc3De1 + 20001CnHWJy4DW4T2uGX0F4yu@r0SnY254W6s51OGm6LaWgh1DKMq054Ws@X68QnDJ4yu@1F + k820WWW7bxOd42Ua7GIGIr0a0989fQ08GGIMId098199XIGIIGTS9199eJW68D994dGKnMWM + eEv5XL2FcyLq0C4yu@1F_VmZNm1008unKqs60044ej6W4C0108xVRp0a00ezjDR1200Wstij + 1800eRFunA8sss6yu7QPPag1m2qYss0oGIaP2RpO1AH2CaDRXe59fMqijJ62UqdQ0CGJJZ49 + 88sQ0C0cmscH0IIm3PRs989Hg5jPRaW49fUajDGYW7tnq00GD0J800E1KIY0W0041B9f0I00 + qCaa800004IGImZw01v@l603yzzaK3G2uN@@XPB9H_D@tdya49_iV@BoIa4_xz@Nf7yuD02Y + Qh1G1WW0Rr0aWW600rcss4G800GRQpkW500i9DRh0400rq1FULpMVC0m@5InMYZPKAG3XD8K + q0LaC018200Y6OYWjejPW9YkmfSzQeRW6wLmW0dGAQ03w4uWe1c8unpH000a608p5GH8LkLK + 75HjVwT19CfrMX8_OX79KgWKN5cnvkk4QG8H3KqCpV0200eZWB2QmguSb0500G44PrRm130i + JX0Ca_x41FExy4M4En51dm420800001TQHmI7F4yu9MIIIWaaa8A99f7E2KIIIM3G14aWaYZ + B1GIoInnH0aai4999AGII2w48118891rjYbaa40999YIIIaWaa4D0109993g32B9992Waaw4 + e08991IGIoa4aa4KN3n9qIy27e000exXD2N8Z88AX0W0GM0A4Em1DWOmg55KDIMP4KHR1HKH + 01xQCIq0qykG3ZqtGm9654228000_k@Ye1s9zX92Uy7GIGGb0KG6658191f6028198L302IG + IGg1W0WaaaT2GWWaaiE1K0aaamS05K@8609193Ua90101J13Ja2T4qG4tZOGmZPWWijDuHDq + _0000XjLRV080WWMjjz00003rsssOm60GsRscXO70GxDRs2i500jsPR3m20GtRmZhGM899un + 4msM8HIIcLRR349990jjjXWaa49sss2HIIY1q0cj1YKaaP0ssOHKI2C0QRXGA9fY0ijJCXa4 + 1FoXqA9922jj1FIXcB99I0jjQ3Xa898sejLH2aa0hssE8III0m0ssC2GI2M0QpE009Ij0CRZ + 4W89r1ij12ma408unLGJ004yO2QI20g1e0m0001FIGp34GIIoeJ02Gda80000H8JIA0000Db + 8920G00nOb4yO7s7II2Ui122@@1Fc0GIMU@@VZ8997yt@lZaaaMy@@l4IIIamt__7o5aaiRv + @Fv6IIyD@@N4I99ykv@lWfaa4y878essg1u0t0008Wjj3UC110IjQRR00005gjjj1W004sss + 610004QRRbIGB00QJos2fD00e9QRNmC00_8jjLXM0WoaqsoSY@F0GQ5XqHy744ho1@gqGOOY + yAG3RlSHe0F4yO3XzZIq0k4yu2H3OHaNC1108uZXUULKZOC3P0WjIyvWT2O8sFk2QOh8Yo8c + idIBOYABJ80Df2zmYu4evQ0D2U41G0001DSmVK541n95kUId04GG00u2W3oOqa3xEffW8Y6u + W8l0B7FD244jWJSQ00pYKfcE6M9WJuG104y9m1F4OmQ5C411QfRAKU8ZO0008uaXAQ1Xq0e8 + _tgW2044XW51dyHzALqMG4jPaW0G0WEFf8uHE8O99r3d28099xXRXQ0O8EE6Wbab889H9un3 + YNaX8yM9eEI4baa809HfJW3Y6mW89D88edW001qz07HG8JZ9ebLW6a0020100ySn1h0O0G20 + WzcuAOuuY6OjOBW8f23YjG41918r0GXbaa4D99AT2S0B9HfE1CWcaaGW6F5sQ1H34HmZ74d0 + PQRRRP000Wv@@tdaa4fssMjP0000@@z@V9HIoRpss20000s01Dmsss60000W@@l12IGD060_ + t@tXaaKD09KBO1Q0008000mt000c400mM00090008T0006100m000049IIIiQ3I08999099f + YQEGaaa4XaaaQ0E09999899fQ001WH0GzABW4000a00GI07y6b23AQGH4AyhX2tBQGD0XW00 + 0i605Q8uWu4IWjjjD7IIIK2000QRRrcRRpsia49v1000kDRRBiQRPHaaa40000msss6ossss + G98D030RRRN3W2OBRRVVy0D000a100uI0003008E12O2008900O302aaaauIIIYJRRhERRRs + D99Ioaa89ssgjzscjjd499fIaabOsss6rsssGIII2B999ejjDBjjjQ999HIbaiaP1r0O0IMI + IHRRRr0GW4000N000SB00WP100C100Gk000o600Wr01DKGYl44SG2GIIIgFG1aaaaxieGD06 + 0800u302g1u00108r0mGG34qem1f1OGtA6isd38999IfmWT08GIIIMK99K3G2V0KG837W004 + 8D06g1GXI8Ce604EtiWE1EGjjjDdaaas6E0QRRh09992100ZhGWGRRP2999I200w9W0WjjfY + aaak0x0ncss0IIIa400a6G1osM8HII2040W0000WGGIIC1000288N7W0W899Y40008aa81jj + LRORhska499s@_@VRrssngjjDHIIIe@@@7RRRROss_C999Hm@@dFsscjnjjL880H@@VD04WR + PRRT02y@@@msss6iljjHIII4@z@UPJIa4JJkt014zJJai99Hoy9Py12Gq99H2jjLRjjDRpsM + jj@sijTRrssTpssULRRRCRRRRRRRRwRRR5jjjPXjj5BsscjvsMzDRRss8Rrs6RpssQptsETD + 05e5RRpsSRhscjDRRibQRXDHIIzHQRt6999ZDjjTcaaawcqsyRIIY8JQpU00GGtas9GBH5or + 00nU1a4LWcHS2z4DG4T2eG_YJ41XN57SGi5eL3mG79iGW6TTnW31QuK@SCqSr2T2SmpSzCS0 + E30SLc1DyfX2nZiMW6Ir2o4bNaL6RF4GJln9OH44ID403TlFpXAc04008Q02o60Xe1awRUAg + IKX0DujlYcwO8XCCm2410GWJD63H3HGKMiVwGaaayYC2gv4YE1i8GmR8899LGm6T2G0aaaiE + 1IG6III0dG5eHMH0HHW6HzC35DpeLq05KOH21erNGti4e1Ur0OmE04Kpv3T2KW4WaiE180aa + 44999B2GI21SY4989feEw8GZq08800W00A2H3800010W0040WGS35K3GJ; + INTEGER CHECKSUM =32706; +ENDDATA; + + +PROCEDURE DO_EXIT USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $81; + WAIT IDLE, 250 USEC; + IRSCAN 8, $81, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==0) ) THEN GOTO Label_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $07; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 200 USEC; + Label_0: + IRSCAN 8, $ff; + WAIT IDLE, 200 USEC; + WAIT RESET, 3 CYCLES; + EXIT STATUS; +ENDPROC; + +PROCEDURE DO_READ_SECURITY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a4; + WAIT IDLE, 3 CYCLES; + DRSCAN 44, $00000000000, CAPTURE SECREG[]; + ULUWE = SECREG[ULUWE_BITLOCATION]; + ULARE = SECREG[ULARE_BITLOCATION]; + ULUPC = SECREG[ULUPC_BITLOCATION]; + ULUFE = SECREG[ULUFE_BITLOCATION]; + ULUFP = SECREG[ULUFP_BITLOCATION]; + ULUFJ = SECREG[ULUFJ_BITLOCATION]; + ULFLR = SECREG[ULFLR_BITLOCATION]; + ULULR = SECREG[ULULR_BITLOCATION]; + ULAWE = SECREG[ULAWE_BITLOCATION]; + ULARD = SECREG[ULARD_BITLOCATION]; + ULOPT[1] = SECREG[ULOPT1_BITLOCATION]; + ULOPT[0] = SECREG[ULOPT0_BITLOCATION]; +ENDPROC; + +PROCEDURE DO_OUTPUT_SECURITY USES GV; + PRINT "Security Settings :"; + IF ( ! (ULUFP==1) ) THEN GOTO Label_1; + PRINT "FlashROM Write/Erase protected by pass key."; + Label_1: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_2; + PRINT "FlashROM Read protected by pass key."; + Label_2: + IF ( ! (ULAWE==1) ) THEN GOTO Label_3; + PRINT "Array Write/Erase protected by pass key."; + Label_3: + IF ( ! (ULARD==1) ) THEN GOTO Label_4; + PRINT "Array Verify protected by pass key."; + Label_4: + IF ( ! (ULUFE==1) ) THEN GOTO Label_5; + PRINT "Encrypted FlashROM Programming Enabled."; + Label_5: + IF ( ! (ULARE==1) ) THEN GOTO Label_6; + PRINT "Encrypted FPGA Array Programming Enabled."; + Label_6: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DO_QUERY_SECURITY USES DO_READ_SECURITY,DO_OUTPUT_SECURITY; + CALL DO_READ_SECURITY; + CALL DO_OUTPUT_SECURITY; +ENDPROC; + +PROCEDURE READ_UROW USES BITSTREAM,GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE UROW[]; + SUROWALGOVERSION[6..0] = $00; + IF ( ! ( (UROW[5]==0)&&(UROW[0]==1)) ) THEN GOTO Label_7; + SUROWALGOVERSION[5..4] = UROW[24..23]; + Label_7: + IF ( ! ( (UROW[5]==1)&&(UROW[0]==0)) ) THEN GOTO Label_8; + SUROWALGOVERSION[5..4] = UROW[24..23]; + SUROWALGOVERSION[6] = 1; + Label_8: + SUROWCHECKSUM[15..0] = UROW[127..112]; + SUROWCYCLECOUNT = INT(UROW[111..102]); + SUROWDESIGNNAME[69..0] = UROW[101..32]; + SUROWPROGMETHOD[2..0] = UROW[31..29]; + SUROWALGOVERSION[3..0] = UROW[28..25]; + SUROW_PKG_TYPE[5..0] = UROW[22..17]; + SUROW_SW_VERSION[6..0] = UROW[16..10]; + SUROWPROGRAMSW[3..0] = UROW[9..6]; + SUROW_SRAM_DISTURB[0] = UROW[4]; + SUROW_SPEED_GRADE[2..0] = UROW[3..1]; + ACT_UROW_CYCLE_COUNT = SUROWCYCLECOUNT; +ENDPROC; + +PROCEDURE FIX_INT_ARRAYS USES GV; + IF ( ! (HEX[0]!=48) ) THEN GOTO Label_9; + FOR I = 0 TO 7; + TEMP = HEX[I]; + HEX[I] = HEX[(15-I)]; + HEX[(15-I)] = TEMP; + NEXT I; + Label_9: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISP_CHKSUM_DESIGN USES GV,FIX_INT_ARRAYS; + CALL FIX_INT_ARRAYS; + IF ( ! (INT(SUROWCHECKSUM[15..0])==65535) ) THEN GOTO Label_10; + PRINT "CHECKSUM: "; + Label_10: + IF ( ! (INT(SUROWCHECKSUM[15..0])!=65535) ) THEN GOTO Label_11; + PRINT "CHECKSUM: ",CHR$(HEX[INT(SUROWCHECKSUM[15..12])]),CHR$(HEX[INT(SUROWCHECKSUM[11..8])]) + ,CHR$(HEX[INT(SUROWCHECKSUM[7..4])]),CHR$(HEX[INT(SUROWCHECKSUM[3..0])]); + Label_11: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])==2147483647)&&(INT(SUROWDESIGNNAME[31..61])==2147483647))&&(INT(SUROWDESIGNNAME[62..69])==255)) ) THEN GOTO Label_12; + PRINT "Design Name: "; + Label_12: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])!=2147483647)||(INT(SUROWDESIGNNAME[31..61])!=2147483647))||(INT(SUROWDESIGNNAME[62..69])!=255)) ) THEN GOTO Label_13; + PRINT "Design Name: ",CHR$(INT(SUROWDESIGNNAME[63..69])),CHR$(INT(SUROWDESIGNNAME[56..62])) + ,CHR$(INT(SUROWDESIGNNAME[49..55])),CHR$(INT(SUROWDESIGNNAME[42..48])),CHR$(INT(SUROWDESIGNNAME[35..41])) + ,CHR$(INT(SUROWDESIGNNAME[28..34])),CHR$(INT(SUROWDESIGNNAME[21..27])),CHR$(INT(SUROWDESIGNNAME[14..20])) + ,CHR$(INT(SUROWDESIGNNAME[7..13])),CHR$(INT(SUROWDESIGNNAME[0..6])); + Label_13: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISPLAY_UROW USES BITSTREAM,CONSTBLOCK,GV,DISP_CHKSUM_DESIGN; + EXPORT "USER_ROW", UROW[127..0]; + PRINT "User information: "; + CALL DISP_CHKSUM_DESIGN; + IF ( ! (FLAGDISPLAYCYC==1) ) THEN GOTO Label_14; + PRINT "CYCLE COUNT: ",SUROWCYCLECOUNT; + Label_14: + INTEGER TMPINT =INT(SUROWPROGMETHOD[]); + INTEGER TMPINT2 =0; + INTEGER TMPINT3 =0; + INTEGER TMPINT4 =0; + INTEGER TMPINT5 =0; + IF ( ! (TMPINT==IEEE1532) ) THEN GOTO Label_15; + PRINT "Programming Method: IEEE1532"; + Label_15: + IF ( ! (TMPINT==STAPL) ) THEN GOTO Label_16; + PRINT "Programming Method: STAPL"; + Label_16: + IF ( ! (TMPINT==DIRECTC) ) THEN GOTO Label_17; + PRINT "Programming Method: DirectC"; + Label_17: + IF ( ! (TMPINT==PDB) ) THEN GOTO Label_18; + PRINT "Programming Method: PDB"; + Label_18: + IF ( ! (TMPINT==SVF) ) THEN GOTO Label_19; + PRINT "Programming Method: SVF"; + Label_19: + PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]); + TMPINT = INT(SUROW_SPEED_GRADE[]); + IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_20; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_20: + IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_21; + PRINT "Device Speed Grade: -1"; + Label_21: + IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_22; + PRINT "Device Speed Grade: -2"; + Label_22: + IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_23; + PRINT "Device Speed Grade: -3"; + Label_23: + IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_24; + PRINT "Device Speed Grade: -F"; + Label_24: + IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_25; + PRINT "Device Speed Grade: STD"; + Label_25: + IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_26; + PRINT "Device Speed Grade: -4"; + Label_26: + IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_27; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_27: + TMPINT = INT(SUROWPROGRAMSW[]); + IF ( ! (TMPINT==FP) ) THEN GOTO Label_28; + PRINT "Programmer: FlashPro"; + Label_28: + IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_29; + PRINT "Programmer: FlashPro Lite"; + Label_29: + IF ( ! (TMPINT==FP3) ) THEN GOTO Label_30; + PRINT "Programmer: FlashPro3"; + Label_30: + IF ( ! (TMPINT==FP4) ) THEN GOTO Label_31; + PRINT "Programmer: FlashPro4"; + Label_31: + IF ( ! (TMPINT==FP5) ) THEN GOTO Label_32; + PRINT "Programmer: FlashPro5"; + Label_32: + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_33; + PRINT "Programmer: Sculptor WIN"; + Label_33: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_34; + PRINT "Programmer: BP Programmer"; + Label_34: + IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_35; + PRINT "Programmer: DirectC"; + Label_35: + IF ( ! (TMPINT==STP) ) THEN GOTO Label_36; + PRINT "Programmer: Actel JAM Player"; + Label_36: + IF ( ! ( ( ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3))||(TMPINT==FP4))||(TMPINT==FP5)) ) THEN GOTO Label_52; + TMPINT2 = INT(SUROW_SW_VERSION[]); + IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_37; + PRINT "Software: FlashPro v3.3"; + Label_37: + IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_38; + PRINT "Software: FlashPro v3.4"; + Label_38: + IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_39; + PRINT "Software: FlashPro v4.0"; + Label_39: + IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_40; + PRINT "Software: FlashPro v4.1"; + Label_40: + IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_41; + PRINT "Software: FlashPro v4.2"; + Label_41: + IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_42; + PRINT "Software: FlashPro v5.0"; + Label_42: + IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_43; + PRINT "Software: FlashPro v5.1"; + Label_43: + IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_44; + PRINT "Software: FlashPro v6.0"; + Label_44: + IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_45; + PRINT "Software: FlashPro v6.1"; + Label_45: + IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_46; + PRINT "Software: FlashPro v6.2"; + Label_46: + IF ( ! (TMPINT2==FP84) ) THEN GOTO Label_47; + PRINT "Software: FlashPro v8.4"; + Label_47: + IF ( ! (TMPINT2==FP85) ) THEN GOTO Label_48; + PRINT "Software: FlashPro v8.5"; + Label_48: + IF ( ! (TMPINT2==FP86) ) THEN GOTO Label_49; + PRINT "Software: FlashPro v8.6"; + Label_49: + IF ( ! (TMPINT2==FP90) ) THEN GOTO Label_50; + PRINT "Software: FlashPro v9.0"; + Label_50: + IF ( ! (TMPINT2==FP91) ) THEN GOTO NOT_FP91; + PRINT "Software: FlashPro v9.1"; + NOT_FP91: + IF ( ! (TMPINT2==FP100) ) THEN GOTO NOT_FP100; + PRINT "Software: FlashPro v10.0"; + NOT_FP100: + IF ( ! (TMPINT2==FP_11) ) THEN GOTO NOT_FP_11; + PRINT "Software: FlashPro v11.0"; + NOT_FP_11: + IF ( ! (TMPINT2==FP_11_1) ) THEN GOTO NOT_FP_11_1; + PRINT "Software: FlashPro v11.1"; + NOT_FP_11_1: + IF ( ! (TMPINT2==FP_11_2) ) THEN GOTO NOT_FP_11_2; + PRINT "Software: FlashPro v11.2"; + NOT_FP_11_2: + IF ( ! (TMPINT2==FP_11_3) ) THEN GOTO NOT_FP_11_3; + PRINT "Software: FlashPro v11.3"; + NOT_FP_11_3: + IF ( ! (TMPINT2==FP_11_4) ) THEN GOTO NOT_FP_11_4; + PRINT "Software: FlashPro v11.4"; + NOT_FP_11_4: + IF ( ! (TMPINT2==FP_11_5) ) THEN GOTO NOT_FP_11_5; + PRINT "Software: FlashPro v11.5"; + NOT_FP_11_5: + IF ( ! (TMPINT2==FP_11_6) ) THEN GOTO NOT_FP_11_6; + PRINT "Software: FlashPro v11.6"; + NOT_FP_11_6: + IF ( ! (TMPINT2==FP_11_7) ) THEN GOTO NOT_FP_11_7; + PRINT "Software: FlashPro v11.7"; + NOT_FP_11_7: + IF ( ! (TMPINT2==FP_11_8) ) THEN GOTO NOT_FP_11_8; + PRINT "Software: FlashPro v11.8"; + NOT_FP_11_8: + IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_51; + PRINT "Software: FlashPro vX.X"; + Label_51: + LABEL_SEPARATOR = 0; + Label_52: + IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_56; + TMPINT3 = (INT(SUROW_SW_VERSION[6..5])+SCULPTORMAJORBASE); + TMPINT4 = (INT(SUROW_SW_VERSION[4..1])+SCULPTORMINORBASE); + TMPINT5 = 0; + IF ( ! (SUROW_SW_VERSION[0]==1) ) THEN GOTO Label_53; + TMPINT5 = 1; + Label_53: + INTEGER CURRPGM =INT(ACT_UROW_PROGRAM_SW[3..0]); + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_54; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4; + PRINT "NOTE: The Sculptor Windows version number below should be converted to HEX."; + NOT_FP3_FP4: + PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_54: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_55; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4_BPW; + PRINT "NOTE: The BP Windows version number below should be converted to HEX."; + NOT_FP3_FP4_BPW: + PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_55: + LABEL_SEPARATOR = 0; + Label_56: + PRINT "========================================="; +ENDPROC; + +PROCEDURE READ_F_ROW USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $f9; + DRSCAN 3, FADDR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $bf; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; +ENDPROC; + +PROCEDURE DO_DEVICE_INFO USES GV,READ_UROW,DISPLAY_UROW,READ_F_ROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0e; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE BUFF32[]; + EXPORT "SILSIG", BUFF32[]; + IRSCAN 8, $84, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==1) ) THEN GOTO CORE_NOT_ENABLED; + PRINT "FPGA Array is programmed and enabled."; + CORE_NOT_ENABLED: + IF ( ! (BUFF128[2]==0) ) THEN GOTO CORE_ENABLED; + PRINT "FPGA Array is not enabled."; + CORE_ENABLED: + CALL READ_UROW; + CALL DISPLAY_UROW; + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + PRINT "========================================="; +ENDPROC; + +PROCEDURE INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $dd; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; +ENDPROC; + +PROCEDURE DO_VERIFY_DEVICE_INFO USES GV,BITSTREAM,DO_EXIT,DO_READ_SECURITY,READ_UROW + ,DISP_CHKSUM_DESIGN; + CALL READ_UROW; + CALL DISP_CHKSUM_DESIGN; + CALL DO_READ_SECURITY; + BUFF32[31..0] = BOOL(CHECKSUM); + UROW[127..112] = BUFF32[15..0]; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],$ffff003fffffffffffffffff00000000 + ,PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_CMP_OK; + STATUS = -43; + PRINT "Failed to verify design information."; + UNIQUEEXITCODE = 32772; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_CMP_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_IDCODE_ONLY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[]; + EXPORT "IDCODE", ID[]; +ENDPROC; + +PROCEDURE VERIFY_RLOCK USES GV; + IRSCAN 8, $84,COMPARE $04,$04,PASS; +ENDPROC; + +PROCEDURE DO_VERIFY_PGM_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_PGM_PASS; + STATUS = 10; + PRINT "Failed to enable FPGA Array."; + UNIQUEEXITCODE = 32891; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_DISABLE_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==1) ) THEN GOTO RLOCK_PGM_FAIL; + STATUS = 10; + PRINT "Failed to disable FPGA Array."; + UNIQUEEXITCODE = 32918; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_FAIL: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_VERIFY_PASS; + STATUS = 11; + PRINT "FPGA Array is not enabled."; + UNIQUEEXITCODE = 32892; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_VERIFY_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_ID_DMK USES GV,DO_EXIT,INIT_AES; + CALL INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M7BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M7VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32775; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M7VERDONE: + IF ( ! ( (BUFF128[126]==0)||(BM7DEVICE==0)) ) THEN GOTO MXIDOK; + IF ( ! ( (BUFF128[126]==1)&&(BM7DEVICE==0)) ) THEN GOTO LDETECTM1; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M7 device."; + UNIQUEEXITCODE = 32776; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + LDETECTM1: + IF ( ! (BUFF128[126]==0) ) THEN GOTO Label_59; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M1BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M1VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32777; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M1VERDONE: + BOOLEAN BTMPBUFFBIT126 = BUFF128[126]; + IF ( ! ( (BTMPBUFFBIT126==1)&&(BM1DEVICE==0)) ) THEN GOTO REGDEV; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M1 device."; + UNIQUEEXITCODE = 32778; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + REGDEV: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM7DEVICE==1)) ) THEN GOTO Label_57; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M7 Device."; + UNIQUEEXITCODE = 32781; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_57: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_58; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M1 Device."; + UNIQUEEXITCODE = 32782; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_58: + LABEL_SEPARATOR = 0; + Label_59: + LABEL_SEPARATOR = 0; + MXIDOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_IDCODE USES GV,PARAMETERS,DO_EXIT; + FREQUENCY (FREQ*1000000); + WAIT RESET, 5 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + DRSCAN 32, $00000000; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[],COMPARE IDCODEVALUE[],IDMASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO IDOK; + STATUS = 6; + PRINT "Failed to verify IDCODE"; + UNIQUEEXITCODE = 32797; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + IDOK: + IDREV = INT(ID[31..28]); + IDFAB = INT(ID[24..24]); +ENDPROC; + +PROCEDURE IS_SECOK USES GV,DO_EXIT; + IF ( ! (SECKEY_OK==0) ) THEN GOTO SECOK; + STATUS = -35; + PRINT "Failed to match pass key."; + UNIQUEEXITCODE = 32799; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SECOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_R USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPR; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text verification is prohibited."; + UNIQUEEXITCODE = 32800; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYEPR: + IF ( ! (ULARD==1) ) THEN GOTO SKIPRCHK1; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32804; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SKIPRCHK1: + IF ( ! (ULARD==0) ) THEN GOTO Label_60; + CHKSEC = 0; + Label_60: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_W USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULAWE==1) ) THEN GOTO ARRAYWP; + STATUS = -28; + PRINT "FPGA Array Write/Erase is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32805; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYWP: + IF ( ! (ULARD==1) ) THEN GOTO ARRAYRPW; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32806; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYRPW: + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPW; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text programming is prohibited."; + CALL DO_EXIT; + ARRAYEPW: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE BP_VER USES GV; + BOOLEAN PLAYER_VERSION_BOOLEAN[32]; + PLAYER_VERSION_BOOLEAN[31..0] = BOOL(PLAYERVERSIONVARIABLE); + INTEGER PLAYER_MAJOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[23..16])-SCULPTORMAJORBASE); + INTEGER PLAYER_MINOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[15..8])-SCULPTORMINORBASE); + ACT_UROW_SW_VERSION[6..5] = BOOL(PLAYER_MAJOR_VERSION); + ACT_UROW_SW_VERSION[4..1] = BOOL(PLAYER_MINOR_VERSION); + ACT_UROW_SW_VERSION[0] = PLAYER_VERSION_BOOLEAN[0]; + ACT_UROW_PROGRAM_SW[3..0] = BOOL(PLAYERVERSIONSWVARIABLE); +ENDPROC; + +PROCEDURE POLL_PROGRAM USES GV; + INTEGER ILOOP_0; + FOR ILOOP_0 = 16381 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 100 USEC; + DRSCAN 5, $00,COMPARE $00,$0b,PASS; + IF PASS THEN ILOOP_0 = 0; + NEXT ILOOP_0; +ENDPROC; + +PROCEDURE SET_PRG_ARRAY USES GV; + ISPRGARRAY = 1; +ENDPROC; + +PROCEDURE DO_INITIALIZE USES GV,DO_EXIT,READ_F_ROW,VERIFY_ID_DMK,DO_CHECK_R,DO_CHECK_W + ,BP_VER; + BSR[707..0] = BSRPATTERN[707..0]; + BOOLEAN SHIFT_DATA[708]; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + DRSCAN 708, SHIFT_DATA[], CAPTURE SAMPLE_DEVICE[]; + FOR I = 0 TO 707; + IF ( ! (SAMPLEMASK[I]==1) ) THEN GOTO Label_61; + BSR[I] = SAMPLE_DEVICE[I]; + Label_61: + LABEL_SEPARATOR = 0; + NEXT I; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $80; + DRSCAN 18, $00000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1875 USEC; + DRSCAN 18, $00000, CAPTURE ISC_CONFIG_RESULT[],COMPARE $30000,$30000,PASS; + IF ( ! (PASS==0) ) THEN GOTO CRCOK; + STATUS = 5; + PRINT "Failed to enter programming mode."; + EXPORT "ISC_Config_Result", ISC_CONFIG_RESULT[]; + UNIQUEEXITCODE = 32850; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + CRCOK: + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + CALL VERIFY_ID_DMK; + IF ( ! (CHKARRAY==1) ) THEN GOTO SKIPCHKARRAY; + IF ( ! (ARRAYRONLY==0) ) THEN GOTO Label_62; + CALL DO_CHECK_W; + Label_62: + IF ( ! (ARRAYRONLY==1) ) THEN GOTO Label_63; + CALL DO_CHECK_R; + Label_63: + LABEL_SEPARATOR = 0; + SKIPCHKARRAY: + IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_64; + CALL BP_VER; + Label_64: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CHKNVM = 0; + CHKSEC = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NW_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NW_INITIALIZE USES DO_INITIALIZE,NW_INITIALIZE_COMMON; + CALL NW_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NR_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NR_INITIALIZE USES DO_INITIALIZE,NR_INITIALIZE_COMMON; + CALL NR_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AW_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AR_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE W_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE R_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE POLL_ERASE USES GV; + PASS = 0; + INTEGER ILOOP_1; + FOR ILOOP_1 = 262141 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 1000 USEC; + DRSCAN 5, $00,COMPARE $00,$03,PASS; + IF PASS THEN ILOOP_1 = 0; + NEXT ILOOP_1; +ENDPROC; + +PROCEDURE UFROM_DISTURB USES GV; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, $ffffffffffffffffffffffffffffffff; + WAIT IDLE, 5 CYCLES; + WAIT IDLE, 10000 USEC; + NEXT FROMROWNUMBER; +ENDPROC; + +PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM; + IF ( ! (ISERASEONLY==0) ) THEN GOTO SKIP_CYC_INCREMENT; + IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY; + IF ( ! ( ( ( (INT(UROW[31..0])==-1)&&(INT(UROW[63..32])==-1))&&(INT(UROW[95..64])==-1))&&(INT(UROW[127..96])==-1)) ) THEN GOTO NOT_CORRUPTED_CYCLE_COUNT; + ACT_UROW_CYCLE_COUNT = 0; + NOT_CORRUPTED_CYCLE_COUNT: + IF ( ! (ACT_UROW_CYCLE_COUNT<1000) ) THEN GOTO MAX_CYCLE_COUNT; + ACT_UROW_CYCLE_COUNT = (ACT_UROW_CYCLE_COUNT+1); + MAX_CYCLE_COUNT: + LABEL_SEPARATOR = 0; + NOT_PGM_ARRAY: + LABEL_SEPARATOR = 0; + SKIP_CYC_INCREMENT: + IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_65; + UROW[] = $ffffffffffffffffffffffffffffffff; + Label_65: + IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO; + BUFF32[31..0] = BOOL(CHECKSUM); + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_66; + UROW[127..112] = BUFF32[15..0]; + Label_66: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_67; + UROW[127..112] = SUROWCHECKSUM[15..0]; + Label_67: + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_68; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + Label_68: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_69; + UROW[101..32] = SUROWDESIGNNAME[69..0]; + Label_69: + LABEL_SEPARATOR = 0; + SKIP_DESIGN_INFO: + BUFF32[31..0] = BOOL(ACT_UROW_CYCLE_COUNT); + UROW[111..102] = BUFF32[9..0]; + UROW[31..29] = ACT_UROW_PROG_METHOD[2..0]; + UROW[28..25] = ACT_UROW_ALGO_VERSION[3..0]; + UROW[16..10] = ACT_UROW_SW_VERSION[6..0]; + UROW[9..6] = ACT_UROW_PROGRAM_SW[3..0]; + UROW[4] = SUROW_SRAM_DISTURB[0]; + IF ( ! (ACT_UROW_ALGO_VERSION[6]==1) ) THEN GOTO Label_70; + UROW[5] = 1; + UROW[0] = 0; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_70: + IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_71; + UROW[5] = 0; + UROW[0] = 1; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_71: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a7; + DRSCAN 128, UROW[]; + WAIT IDLE, 15 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO PROGRAM_OK3; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32853; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + PROGRAM_OK3: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],UROW_MASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_OK; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32854; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE FAIL_ERASE USES GV,DO_EXIT; + STATUS = 8; + PRINT "Failed Erase Operation"; + UNIQUEEXITCODE = 32855; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; +ENDPROC; + +PROCEDURE EXE_ERASE USES BITSTREAM,GV,READ_UROW,POLL_ERASE,PROGRAM_UROW,FAIL_ERASE; + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO SKIPRUROW; + CALL READ_UROW; + EXPORT "ACTEL_SLOG_UROW", UROW[]; + SKIPRUROW: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $85; + DRSCAN 23, COMBERASESELECT[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_ERASE; + IF ( ! (PASS==0) ) THEN GOTO ERASEOK; + CALL FAIL_ERASE; + ERASEOK: + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO Label_72; + CALL PROGRAM_UROW; + Label_72: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE USES BITSTREAM,GV,EXE_ERASE; + PRINT "Erase ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[0] = 1; + COMBERASESELECT[1] = 1; + CALL EXE_ERASE; + PRINT "Completed erase"; + IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY_ERASE; + BUFF32[31..0] = BOOL(CHECKSUM); + EXPORT "CHECKSUM", BUFF32[15..0]; + NOT_PGM_ARRAY_ERASE: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY USES GV,EXE_ERASE; + PRINT "Erase FPGA Array ..."; + COMBERASESELECT[22..0] = $004001; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ONLY USES GV,DO_ERASE; + ISERASEONLY = 1; + CALL DO_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY_ONLY USES GV,DO_ERASE_ARRAY; + ISERASEONLY = 1; + CALL DO_ERASE_ARRAY; +ENDPROC; + +PROCEDURE DO_ERASE_ALL USES GV,UFROM_DISTURB,EXE_ERASE; + IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_73; + PRINT "Erase FPGA Array and FlashROM ..."; + Label_73: + IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_74; + PRINT "Erase FPGA Array, FlashROM and Security Settings ..."; + Label_74: + COMBERASESELECT[22..0] = $7fc00f; + ISERASEONLY = 1; + CALL EXE_ERASE; + CALL UFROM_DISTURB; +ENDPROC; + +PROCEDURE LOAD_ROW_DATA USES BITSTREAM,GV; + FOR SDTILE = 1 TO NUMBEROFSDTILES; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, DATASTREAM[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT SDTILE; +ENDPROC; + +PROCEDURE EXE_PROGRAM USES GV,DO_EXIT,POLL_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $83; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_75; + STATUS = 10; + PRINT "Failed to program FPGA array at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32856; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_75: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE EXE_VERIFY USES GV,DO_EXIT,POLL_PROGRAM; + IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_76; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32857; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_76: + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + VERIFY_EOL_0: + IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1250 USEC; + DRSCAN 2, $0,COMPARE $0,$3,PASS; + VERIFY_BOL_0: + IF ( ! (PASS==0) ) THEN GOTO Label_77; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32858; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_77: + IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_78; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32859; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_78: + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + VERIFY_EOL_1: + IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1250 USEC; + DRSCAN 2, $0,COMPARE $0,$3,PASS; + VERIFY_BOL_1: + IF ( ! (PASS==0) ) THEN GOTO Label_79; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32860; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_79: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_PROGRAM USES GV,LOAD_ROW_DATA,EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Programming FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_0; + FOR IREPEAT_0 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_80; + PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + DIFFERENCE = (PERCENT_UPDATE%10); + IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_PGM_A; + PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE)); + ROUND_DOWN_PGM_A: + IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_PGM_A; + PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE); + ROUND_UP_PGM_A: + EXPORT "PERCENT_DONE", PERCENT_UPDATE; + Label_80: + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_0; +ENDPROC; + +PROCEDURE DO_VERIFY USES GV,LOAD_ROW_DATA,EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Verifying FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_1; + FOR IREPEAT_1 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_81; + PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + DIFFERENCE = (PERCENT_UPDATE%10); + IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_VER_ARRAY; + PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE)); + ROUND_DOWN_VER_ARRAY: + IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_VER_ARRAY; + PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE); + ROUND_UP_VER_ARRAY: + EXPORT "PERCENT_DONE", PERCENT_UPDATE; + Label_81: + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_1; + PRINT " Verifying FPGA Array -- pass"; +ENDPROC; + +PROCEDURE DO_VERIFY_BOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 0; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_VERIFY_EOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 1; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_PROGRAM_RLOCK USES GV,DO_EXIT,POLL_PROGRAM; + DATAINDEX = 0; + INTEGER IREPEAT_2; + FOR IREPEAT_2 = NUMBEROFSDTILES - 1 TO 0 STEP -1; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, RLOCK[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT IREPEAT_2; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8c; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_82; + STATUS = 10; + PRINT "Failed to enable FPGA Array."; + UNIQUEEXITCODE = 32862; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_82: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_DISABLE_RLOCK USES GV,DO_EXIT,POLL_PROGRAM; + DATAINDEX = 0; + INTEGER IREPEAT_3; + FOR IREPEAT_3 = NUMBEROFSDTILES - 1 TO 0 STEP -1; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, $0000000; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT IREPEAT_3; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8c; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO FABRIC_ENABLED; + STATUS = 10; + PRINT "Failed to disable FPGA Array."; + UNIQUEEXITCODE = 32917; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FABRIC_ENABLED: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISABLE_RLOCK_AND_VERIFY USES DO_VERIFY_DISABLE_RLOCK,DO_DISABLE_RLOCK; + CALL DO_DISABLE_RLOCK; + CALL DO_VERIFY_DISABLE_RLOCK; +ENDPROC; + +PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY; + WAIT RESET, 5 CYCLES; + CALL READ_IDCODE_ONLY; + EXIT 0; +ENDPROC; + +PROCEDURE DO_PROGRAM_SILSIG USES GV,DO_EXIT,DO_READ_SECURITY,POLL_PROGRAM; + CALL DO_READ_SECURITY; + SECREG[43..12] = SILSIG[31..0]; + SECREG[ULOPT1_BITLOCATION] = ULOPT[1]; + SECREG[ULOPT0_BITLOCATION] = ULOPT[0]; + SECREG[ULUWE_BITLOCATION] = ULUWE; + SECREG[ULARE_BITLOCATION] = ULARE; + SECREG[ULUPC_BITLOCATION] = ULUPC; + SECREG[ULUFE_BITLOCATION] = ULUFE; + SECREG[ULUFP_BITLOCATION] = ULUFP; + SECREG[ULUFJ_BITLOCATION] = ULUFJ; + SECREG[ULFLR_BITLOCATION] = ULFLR; + SECREG[ULULR_BITLOCATION] = ULULR; + SECREG[ULAWE_BITLOCATION] = ULAWE; + SECREG[ULARD_BITLOCATION] = ULARD; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a3; + DRSCAN 44, SECREG[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO SILSIGPRG_OK; + STATUS = 14; + PRINT "Failed to program Silicon Signature"; + UNIQUEEXITCODE = 32867; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SILSIGPRG_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + + +CRC 2066; diff --git a/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.dat b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.dat Binary files differnew file mode 100644 index 0000000..3574c8a --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.dat diff --git a/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.stp b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.stp new file mode 100644 index 0000000..5770793 --- /dev/null +++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.stp @@ -0,0 +1,2098 @@ +NOTE "CREATOR" "Designer Version: 11.8.0.26"; +NOTE "CAPTURE" "11.8.0.26"; +NOTE "DEVICE" "AGLN250V2"; +NOTE "PACKAGE" "AGLN250V2-vq100"; +NOTE "DATE" "2018/05/28"; +NOTE "TIME" "12:18:41"; +NOTE "STAPL_VERSION" "JESD71"; +NOTE "VENDOR" "Microsemi Corporation"; +NOTE "IDCODE" "03A541CF"; +NOTE "IDMASK" "07FFFFFF"; +NOTE "DESIGN" "TutorKit1FlashRom1_v100_Top"; +NOTE "DESIGN_DIRECTORY" "D:\_ZDROJE\Libero\Tutorial\TUTOR--KIT-1--FLASHROM-1--V1-00\designer\impl1\"; +NOTE "CHECKSUM" "7FC2"; +NOTE "SECURITY" "Disable"; +NOTE "ALG_VERSION" "20"; +NOTE "MAP_VERSION" "1"; +NOTE "TOOL_VERSION" "1"; +NOTE "MAX_FREQ" "20000000"; +NOTE "SILSIG" "F1101004"; +NOTE "ACT_FROM_SPECIFICATION" "Region_0 (0, 15) (0, 0);Region_1 (1, 15) (1, 0);Region_2 (2 + , 15) (2, 0);Region_3 (3, 15) (3, 0);Region_4 (4, 15) (4, 0);Region_5 (5, 15) (5 + , 0);Region_6 (6, 15) (6, 0);Region_7 (7, 15) (7, 0);"; +NOTE "SPEED_GRAD" "STD"; +NOTE "TEMP_GRAD" "COM"; +NOTE "PLAYER_VERSION_VARIABLE" "PLAYERVERSIONVARIABLE"; +NOTE "PLAYER_VERSION_SW_VARIABLE" "PLAYERVERSIONSWVARIABLE"; + +ACTION DISABLE_FPGA_ARRAY = + VERIFY_IDCODE, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_EXIT; +ACTION ERASE_FROM = + VERIFY_IDCODE, + FW_INITIALIZE, + DO_ERASE_FROM, + DO_EXIT; +ACTION PROGRAM_FROM = + VERIFY_IDCODE, + FW_INITIALIZE, + DO_ERASE_FROM, + DO_PROGRAM_FROM, + DO_VERIFY_FROM, + DO_EXIT; +ACTION VERIFY_FROM = + VERIFY_IDCODE, + FR_INITIALIZE, + DO_VERIFY_FROM, + DO_EXIT; +ACTION PROGRAM = + VERIFY_IDCODE, + SET_PRG_ARRAY, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_PROGRAM_FROM, + DO_VERIFY_FROM, + DO_PROGRAM_SILSIG, + DO_EXIT; +ACTION DISABLE_FPGA_ARRAY_PROGRAM = + VERIFY_IDCODE, + SET_PRG_ARRAY, + W_INITIALIZE, + DO_DISABLE_RLOCK, + DO_VERIFY_DISABLE_RLOCK, + DO_ERASE, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_PROGRAM_FROM, + DO_VERIFY_FROM, + DO_PROGRAM_SILSIG, + DO_EXIT; +ACTION PROGRAM_ARRAY = + VERIFY_IDCODE, + SET_PRG_ARRAY, + AW_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ARRAY, + DO_PROGRAM, + DO_VERIFY_BOL, + DO_PROGRAM_RLOCK, + DO_VERIFY_PGM_RLOCK, + DO_EXIT; +ACTION ERASE_ARRAY = + VERIFY_IDCODE, + AW_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ARRAY_ONLY, + DO_EXIT; +ACTION ERASE = + VERIFY_IDCODE, + W_INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ONLY, + DO_EXIT; +ACTION ERASE_ALL = + VERIFY_IDCODE, + INITIALIZE, + DISABLE_RLOCK_AND_VERIFY, + DO_ERASE_ALL, + DO_EXIT; +ACTION VERIFY = + VERIFY_IDCODE, + R_INITIALIZE, + DO_VERIFY_EOL, + DO_VERIFY_RLOCK, + DO_VERIFY_FROM, + DO_EXIT; +ACTION VERIFY_ARRAY = + VERIFY_IDCODE, + AR_INITIALIZE, + DO_VERIFY_EOL, + DO_VERIFY_RLOCK, + DO_EXIT; +ACTION READ_IDCODE = + DO_READ_IDCODE; +ACTION VERIFY_DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_VERIFY_DEVICE_INFO, + DO_EXIT; +ACTION DEVICE_INFO = + VERIFY_IDCODE, + READ_INITIALIZE, + READ_IDCODE_ONLY, + DO_DEVICE_INFO, + DO_QUERY_SECURITY, + DO_EXIT; + + + +DATA CONSTBLOCK; + INTEGER IEEE1532=0; + INTEGER STAPL=1; + INTEGER DIRECTC=2; + INTEGER PDB=3; + INTEGER SVF=4; + INTEGER FP=0; + INTEGER FPLITE=1; + INTEGER FP3=2; + INTEGER SCULPTW=3; + INTEGER BPW=4; + INTEGER DIRECTCP=5; + INTEGER STP=6; + INTEGER FP4=7; + INTEGER FP5=8; + INTEGER FP33=0; + INTEGER FP34=1; + INTEGER FP40=2; + INTEGER FP41=3; + INTEGER FP42=4; + INTEGER FP50=5; + INTEGER FP51=6; + INTEGER FP60=7; + INTEGER FP61=8; + INTEGER FP62=9; + INTEGER FP84=11; + INTEGER FP85=12; + INTEGER FP86=13; + INTEGER FP90=14; + INTEGER FP91=15; + INTEGER FP100=16; + INTEGER FP_11=19; + INTEGER FP_11_1=20; + INTEGER FP_11_2=21; + INTEGER FP_11_3=22; + INTEGER FP_11_4=23; + INTEGER FP_11_5=24; + INTEGER FP_11_6=25; + INTEGER FP_11_7=26; + INTEGER FP_11_8=27; + INTEGER UNKNOWN=127; + INTEGER UNSPECIFIED=0; + INTEGER QN132=1; + INTEGER VQ100=2; + INTEGER TQ144=3; + INTEGER PQ208=4; + INTEGER FG144=5; + INTEGER FG256=6; + INTEGER FG484=7; + INTEGER FG676=8; + INTEGER FG896=9; + INTEGER QN108=10; + INTEGER QN180=11; + INTEGER TQ100=12; + INTEGER CQ208=13; + INTEGER FG1152=14; + INTEGER BG456=15; + INTEGER UNDEFINED=63; + INTEGER GRADE_UNSPEC=0; + INTEGER GRADE_1=1; + INTEGER GRADE_2=2; + INTEGER GRADE_3=3; + INTEGER GRADE_F=4; + INTEGER GRADE_STD=5; + INTEGER GRADE_4=6; + INTEGER GRADE_UNDEF=7; +ENDDATA; + +DATA PARAMETERS; + INTEGER FREQ =4; +ENDDATA; + +DATA GV; + INTEGER ULOPT1_BITLOCATION =11; + INTEGER ULOPT0_BITLOCATION =10; + INTEGER ULUWE_BITLOCATION =9; + INTEGER ULARE_BITLOCATION =8; + INTEGER ULUPC_BITLOCATION =7; + INTEGER ULUFE_BITLOCATION =6; + INTEGER ULUFP_BITLOCATION =5; + INTEGER ULUFJ_BITLOCATION =4; + INTEGER ULFLR_BITLOCATION =3; + INTEGER ULULR_BITLOCATION =2; + INTEGER ULAWE_BITLOCATION =1; + INTEGER ULARD_BITLOCATION =0; + BOOLEAN BUFF128[128]; + BOOLEAN BUFF32[32]; + INTEGER I; + INTEGER J; + INTEGER TEMP; + INTEGER SDNUMBER; + INTEGER ROWNUMBER; + INTEGER DATAINDEX =0; + INTEGER FROMROWNUMBER =1; + INTEGER AESBLOCK; + BOOLEAN ID[32]; + BOOLEAN PASS = 1; + BOOLEAN FADDR[3]; + INTEGER STATUS =0; + BOOLEAN SILSIG[32] = $f1101004; + BOOLEAN ISC_CONFIG_RESULT[18]; + BOOLEAN VERIFYEOL[2]; + BOOLEAN COMBERASESELECT[23]; + BOOLEAN SECKEY_OK = 1; + BOOLEAN SECREG[44]; + BOOLEAN ULUWE = 0; + BOOLEAN ULARE = 0; + BOOLEAN ULUPC = 0; + BOOLEAN ULUFE = 0; + BOOLEAN ULUFP = 0; + BOOLEAN ULUFJ = 0; + BOOLEAN ULFLR = 0; + BOOLEAN ULULR = 0; + BOOLEAN ULAWE = 0; + BOOLEAN ULARD = 0; + BOOLEAN ULOPT[2]; + BOOLEAN SUROWCHECKSUM[16]; + INTEGER SUROWCYCLECOUNT =0; + INTEGER ACT_UROW_CYCLE_COUNT =0; + BOOLEAN ACT_UROW_DESIGN_NAME[70] = $0ad72fed3e9965e331; + BOOLEAN SUROWDESIGNNAME[70]; + BOOLEAN SUROWPROGMETHOD[3]; + BOOLEAN ACT_UROW_ALGO_VERSION[7] = $14; + BOOLEAN SUROWALGOVERSION[7]; + BOOLEAN SUROW_PKG_TYPE[6]; + BOOLEAN ACT_UROW_SW_VERSION[7]; + BOOLEAN SUROW_SW_VERSION[7]; + INTEGER PLAYERVERSIONVARIABLE =0; + INTEGER PLAYERVERSIONSWVARIABLE =0; + INTEGER SCULPTORMAJORBASE =5; + INTEGER SCULPTORMINORBASE =16; + BOOLEAN ACT_UROW_PROGRAM_SW[4]; + BOOLEAN SUROWPROGRAMSW[4]; + BOOLEAN SUROW_SPEED_GRADE[3]; + BOOLEAN SUROW_SRAM_DISTURB[1]; + BOOLEAN ISERASEONLY = 0; + BOOLEAN ISRESTOREDESIGN = 0; + BOOLEAN FLAGDISPLAYCYC = 1; + BOOLEAN ISPRGARRAY = 0; + BOOLEAN BSRPATTERN[708] = $9249249249249249249249249249249249249249249249249 + 249249249249249249249249249249249249249249249249249249249249249249249249 + 24924924924924924924924924924924924924924924924924924924; + BOOLEAN SAMPLEMASK[708] = $0000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000; + BOOLEAN BSR[708]; + BOOLEAN SAMPLE_DEVICE[708]; + BOOLEAN RLOCK[832] = $7fffffcffffffbfffffeffffffbfffffefffffffffffffffffff3f + ffffcffffff3fffffcffffff3fffffcffffff3fffffdffffff3fffffcffffff3fffffcff + ffff3fffffcffffff3fffffdffffffffffffffffffffffffffffffffffffffffffffffff + ffffffffff; + BOOLEAN ARRAYRONLY = 1; + BOOLEAN CHKARRAY = 0; + BOOLEAN FROMRONLY = 1; + BOOLEAN CHKFROM = 0; + BOOLEAN CHKNVM = 0; + BOOLEAN CHKSEC = 1; + BOOLEAN PERMLOCK = 0; + INTEGER HEX[16] = 70,69,68,67,66,65,57,56,55,54,53,52,51,50,49,48; + INTEGER NUMBEROFFROMROWS =8; + BOOLEAN INITIALIZE_DATA[5] = $00; + INTEGER SDTILE; + INTEGER NUMBEROFSDTILES =4; + INTEGER NUMBEROFMAPROWS =2300; + INTEGER IDREV; + INTEGER IDFAB; + INTEGER BM7DEVICE =0; + INTEGER BM1DEVICE =0; + BOOLEAN M1BUFF[128] = $acdd6548ccb488863e291eb18fe95077; + BOOLEAN M7BUFF[128] = $e137623a2eeee91126015f3f73664945; + BOOLEAN IDCODEVALUE[32] = $03a541cf; + BOOLEAN IDMASK[32] = $07ffffff; + INTEGER SECKEYCHK =0; + INTEGER DESIGNPKGTYPE =2; + BOOLEAN ACT_UROW_PROG_METHOD[3] = $1; + INTEGER LABEL_SEPARATOR =0; + INTEGER ROWITERATION =100; + INTEGER PAGEITERATION =100; + INTEGER PERCENT_UPDATE; + INTEGER DIFFERENCE; + INTEGER UNIQUEEXITCODE =0; +ENDDATA; + +DATA BITSTREAM; + BOOLEAN UROW[128]; + BOOLEAN UROW_MASK[128] = $fffffffffffffffffffffffffe01ffc0; + BOOLEAN DATASTREAM[1913600] = @WPw00000110040W0W000020G000400108002200000Wwc + qssso0000p@@lF999IjjjQp0000_@x@@IYaatcjj50000y_@@7HIIIORRRR36uXaa49jjTDq + WD2000y@@EH0vssMj90008@@z@69HIo000049IIICIII2Va00008III0HII2i134999H899f + 67Waaa4aaaKD020Za491aa8900gX7GIIIA0000800m0G0aaaa9mWauWku00000IIIIg1Vqss + sosssc3999A1000jjjQpjjPRMIYay0000tcjjbMjjj8III20000ORRR3RRRhWaaa3ZWQW3sO + RRssba897000mskJAGIIIYC000Wbaa8vIIaaJRpsEJYaaD9IIo4999sijjz8999B999fKHWj + jj19999aaaaGIII2QRRpIIIY4IIoQm6caaausssgZaa4PIIIdW0PRRRsIIIa600So88EH0II + IYxa1r72IF6WaaaySHGDW50IIIr07AK6KV8O0OGDuWIQ1r02AY4K3QeTDHDu22000r05w4Ae + ssscJIIIUy0ejjj2aaa84000G00e6GGhK1ijjjYaaa2d7K3w0JIIIkyWQW2qsssWjjjvIIIY + O@@l@jjDR7RRssaa89X@x@Vsk6KW99992@@@_nssiDjjT@80n@@VD84LIII4@@@zjjjPpQRh + JW04@@@_GRRrMRRpsijLRxlDRRtMjjTtijjNrss6pssssssscsssMHRRRMQRRrYjjPRijLRp + sMD01sORRh1ymssscvssMjRRRsCRRrsljL3GWz000040030OK3uK@Z130Br9SX000WQ0D2De + fjmf1WCZJMB22jOho2q_FGp@1Q_FGp@1Q_FGp@1Q_FG3l8999HIII2baa41999oIIIaeaa89 + 89HIMIYa49f6G10999HGIIc1W089992IIIaaaa81IIg6W7T2ce6W6H3UAGZ@3qu@0D_FG3Nh + 4q0GIIIa200YKW04000W899BpyWS3LOKH3QFyWQ00fJ0AsHyW10I02000800W10sfJ0Aaaaa + O0000GIIYS0000A99I20000ca89H0e6W2400008999N12g1mWqEFe6WEw4OYI6Fmaaa45000 + WIIIz7GWIIII0000W899xHWaQ0eeJWB21m0Waaae000g2W020000IIIa100q7m1jIGGY09SO + m1r0CId0KaB91f1K0WIIoq080HIIID0Gq9G4r0CId0EC0m@30yV0Dr5DmQ1ezVWJ@7uq@12_ + Vy8a7Qm@1qyVm9@7K7GA999ZZx2baaazmTHD0T4yew1dyVm9@7yur1DWMmZ@7yu@1F_@00@7 + Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F6lijjD3000Wsssi50000QRp + s6000WiDRR70r0W0WjjDR000r0GmDX4ejjjf6WHw482ssssGIIIaRRRp899H2jjDRXa49fss + ijJIaa4sM3G1Yjjjh1G1YjjjQaaag18aE1emssscJIIIGRRRs999Hgjjz4m1CJIIaussgjII + g602iGIIY4RRxMW5g1eZE1ce6020000uaaa42000GIIIa2009HU0eaa49200@CUmvX70999f + FI5g1GZE1iG2@@l@Xa499@@_@JIaa4@x@@DHII2l@@@79999r0aW799fQ0809999u@@VFaaa + r0GId0DuZaayZ02KRRR@uW1tFG0sssM5000WQRRrA00K3W23FG0sssss28msssID0cq9G3r0 + Gm00@F0m@1RzVmZ@7yu@1ezVmZ@76s@1ezVmZ@7So@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7 + yu@1RzVmZ@7yu@1ezVm9@76s@1ezVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7yu@1Rz + VmZ@7yu@1F_Vm9@76s@1qyVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7y + u@1F_Vm9@76s@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7yu@1F_V + m9@7yu@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm + @1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm@1qyVm + Z@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VmZ@7Qm@1qyVmZ@7yu@ + 1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9 + @7yu@1F_VmZ@7yu@1F_@00@7yu@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1 + F_VmZ@7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@ + 7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F + _@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7 + Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVm9@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Gp@1F_ + VmZ@7yu@1F_VOO@7Qm@1qyVm9LR0008un@3Uy@WJ_Fun@3qmZq0C8un@3Uy@W7@Fun@70u@0 + Q_Fun@3Uy@W7@Fun@33x@G3_Fun@3Ev@W7@Fun@3Ev@W7NFGZj2Uy@W7@Fun@70u@0q_FOh@ + 3Uy@W7@Fun@708P2000XXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@F0m@30yVmM@7y + u@1F_V0Q@7yexXXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@FQu@30yVmM@7yu@1F_V + 0Q@7yu@XXzV0Q@7yu@1di9808WW7@Fun@3Ev@W7@FG3F889A5yu@1F_VmZ@7y8@W00060mB0 + 1001ezVmM@F0GUrJOGWJYLSH21F_VmZ@F0WL01002EHR80001ez@00c4bm71q4S44q5SYL51 + KHG3bP0008uHY989P5yeKH0KGd0781999un@7KwbG34x8i52qGlW73cbaeKGgPa6W1H38LS2 + I1408866BAP42E0001F_3G00wW77XORRRmZveijHYaaahcss8IGI2r0G0QIIjE180IIiTmZE + XtsEHII2DBRRdE18GQRZ4999NjijH1FA540u4f9921FAcw@7I4aayT2SWz@t4999y_z@F2UK + A200jT2e020WjW7nI004G6Cu1G008Un@RBGrQ0KW000GF2b5D0Hj9ONSf4qNG11Ez420WWsC + Q8QW42Uy@W7ZCMM8YyQjlwO2500Gq0YrFp71DaKq05q9W3FDe0W0WWtNNR_WIYKHeVEpAcP6 + G0004DGI4002oeecu4cvMwmIV8YFROG001Gm9bH0008sYa2CeW0qk8u4f2QOYW7T2P89PSS7 + 8199hJ020991H2IogKk3aWae4XtH8B99L2II6995nmuM8LGtmAQ548KpPC4yeW9LeGmZ59B9 + 9e9Z7a098HIGI8DW2a0a0b601WaWWgVCXQ0IOeF2g1mWE1Ee604Q0WWQ0AW4aaKD04e9919Q + 05099A5e13nzS0W4WaYIAOYc5G0G044G1r0eHI26K3G3DCaHmZGKou11FM3308RMss0020eP + BRR1G20eJ02W40GgzjjBun9APiWW7lHQRZ4199th59G99qcij5IWaaQ6qsEH0II4yuJWjjJK + caG7yu1ORRa089vgWjDY4aaGmZI999H0G00YacaK0400IIJIw4W0oGI21F_au@7IaaayUz@F + H2IIuFz@d9199u@@VVaia1F2550eM9jj00200rcss1010eJ02030GPBRRP5nj70u@GuvCU_O + 70Wm0doDun@ZJG7W000b1vG44UTpBP1LTmv06SoRP8000Y68XOB_QQlCMz3gg6G8qWd06004 + DG3X685W000W000n2SmxU6SL831DOLi5I41HMNqWMq064fW11dyqMbS4e1NLdaGm9CX002eJ + 05Q58101001FwKd08mI2IAeE8ghpWW7F2998Pd0481B9GI2Ica4aaE180aaaLmZK5hqRNmOH + u4FjyD4PoQKZ0Ii9U6X6iKWJ@5RnJoIII4aaeq9m1ab4b8991HMIoAG3ZG0IIM3G2YIII2qW + W8MD8Q05KI204VbQssssS0000QRRBhn3e000quu7r0e1108xE1CWzjj1030WE180400eMssc + W7PGIjjTZZcK3W68RRb2Uq0IGIIQJRR19C9HibjLZaZKmZ4are1M9993Ua09999gjjj3US7b + KaaWsmsiI2IYKRHps9X9IgjWQ0A8uH3m0000caa4v00GPZ4e1000GIIYa10WW7dH00SYqaa1 + W00CIOIo1W00q901W00W8D99v@@@daaa4x@@VVIIIaw@@zV99HI_@t@la499x@W7f1_@B92I + oUV@@d839fy7_@t901Uy@7amaabrO20jjjPB0000tsEhH22UC7B00jIRR1050Wgbjj50400t + csM1030WQJR3UqiWjGBu4qY9ZggTEuMW3A1VBG00016emS_F4d0I33OGGtN4y8nX6yGmZqA0 + 088un@3UCq888BQW3EtxWOBqgWW30300C0GPhRTmK2F4qWK0A0024CjtmCu6cjY6uj10C0a0 + 0Gmm@N9tE1dyVD0W0800eJ05QRQ110091FMLd068IIKYba4KmZLr9m4KWai2UCk0DkzQ46Y6 + ekWJKEsYgaba4q901qa4b2I5B8999H3aW4aaae1K8WpiAsGYW7jWT00GmZp030ssbjT0Q10Q + sss60200GBVRJ1m0eJ022UaX67J9uHEW4ia8t0scHI0Y4QPRs2v9IIi5ORZK4ye38tss2Uy7 + R0RRA1191jaiPb4Y4vs0cjJIOaKR8ss8fOI204yeJG0WJmcaC0W0WHQJIE0a009D89Q0G02U + i1@IIIa_@@3Uy7@L_@aCWaO@Q_xN2GYq@rk@B1BIo@4_@X489P0aru31Fw3WM00roqs40900 + OxUp6W900kf8R3WI00rcgj5060ej0d_VlfP2Qu@e5BfJW241004wumhgb0420WW7@AWc4wAT + Y88UwAEB2Uy@10wuRn22UiiWxTOrljAay04000z5a0G10We1oAOOo_4GXu4EuP14Y6W9G001 + p60HmmKDe05H3uL0DlTu23Htyr15J4@hNr0ma020Wl0o8E1hQ5uXWJcQv692Uqf218GQIYY4 + aaWE18WiaeKGTNXiaaK989Pd05OIoIYiae49898IIIMaWa4YJGA4001B1q0G00W3DI8g3mMs + fZ3lCiAdQ2e9hrHC8Ua42UysE1a8G3T8889L3m4H0KGd078D99XIGIYWqaaW7hAu_BWW0aar + 014WW00000G2IGeP720IG2K30A4009g1O22IG0r0419810010G4iW00W10G2UG00W1001D82 + 0W0r0O220GYQ0cW054GD0GaFP2Wsssi500aF91S0000PRR7MfDY0Wi9RR30G0Wcljj5GO00q + _ssCG100PPR7Mv5waaa2hC74IIkARRZ8489efWj540a4r2sMToHIXLIWJIIIGRRRs999Hgjj + jEm1XLcZGRx4989q0ajT44aao2vs6IWJYSZPR69f9XLU04000Waaa8500AeaWW79WaaaOObr + 000EnRIY0G204XP9f0I00a4aa80900KQIY4_@@y9FmdaaK_a4maaa4y@@lVIIoMAte60DyJx + @3I0IYyFvlFP89Iy9__tab89y1x@F2wZW2odCXx780RRRh200WmApX60GhqsM0Q00WARRx08 + 10WjCjL1600eccsmAVATnqEJtW60C8V05_7Gi9TC8aAgY07jvc8Ol95Q7uWIEd2W01Gh0B80 + 00W400GOOS5eG2H3mGx4L5DWOX6eW00000200G2002hSh60E0e00Gq064qGL@ET0W00W55I8 + QjdsPeXmA7650GmL77iTq180003xdA3001W000W0000m000W20mIXLDco1W90004000G000W + 40Gh15asG6hBk4110WuHgo00GGE3AG0008Q0icHJXk4CuKKjQB0Xe10R0W80C0046sMj0TGO + bOX008eOW3MsGXOBeQP030800SeX1BNeGaAS5rn1H4PLGGE4ohOXLg52IIoE18G2MIWWWaC9 + eB9T2G0G99hmAZgJ04O919HGoIAiI38B9P5M9LXmhsq8aDMG1B0GmHOA01008MMtYaSiyEG8 + ioQ98AD5MvIr0K1IJIIa4a4T2GW0aaiE180aa4Kq064dGK20003QuYW7XW100GmZu08008uH + 50Q10q901S0083Uq2gjjj1FcZos692IIkAPRZ8199e1jjDuH24jjTYXaa8uHdibijv4ca4q0 + tMmZ4mIms6I0IYS3OR69e91F2b20u4f992020G4caa6401caa0800GHNII8uHdyB_@3I2IYy + lyVmZ4uhz@d9899up_@W7b2090GmZ7eyjj3G40Gd04m40WoqrsILXYjeoM7KLsfZD8I00eoW + lEFJhAE7966fY6uhk4A0180m00BG100u12im0004QW2JDG5W02WVBq8m9c0401q9W2FQ8HGG + Y5lOM8004oCjXe1SwsU2o7PZu4WgQlA2Uqf0EN0400ml560H00eRHiWC00ijd2loEr0080B0 + 0e5a6YjOhm9M8I@e_J02m000fGGGa184QmJ0300wjGXe1O8qWg2QOXOoKBQ0d0800qn11V2q + mQSn5SoIXlImu8DCbm31DOr61F4SYHFCWGd07aeI302002Uq9aabaA819XIGIs9G1ca4bC19 + 15K7L89A9HQ2I2b4aiJ024aaaG919fJW20I204yuMFjirELVKF0IVpuG406i1FLdpuGq0I4e + nJt2emw8F4LOJHGKHmZI989HfJ03aWaaq9014aai2qu7IGGIr0C1aa4bE1KWWa04999B2II2 + np@LuM5C0m11Fk40e0WE1GmRR1e40WMjjj18408rMss5yuJGRRai89vgijDY0aaWM0ssW79m + Mss9GKIYW7To6mscJQGIG30Rs9D8HgXaPRaW69v2WjDImW6A8uHc000de99H0000YyXaK001 + 01FI0010AMQI21F_as@7IYaayI_@FHmIIujn@FuH2ir@V8f899uHd0q00esysc0Q200RARs1 + b40WjVPR1a20es6jj0m00TEuO6TPamYNJakRLbPV00100G0007tJLObGzCL6800W_qw02000 + G200YXvde1seJW5Y6Ge8lAPy62YqdX10o2G00Gq0aDu32ZDKGivR5DG31DKrJ4J4yeLLQ8Hq + 0S5ZvTHUD5100m5LwgWW3wJHXI8884nT_vgcW6cwC33UeHirIV8S2n0C00iSJPX6KMG3F499 + Q30mrf194SoJ17rGp67idh2vJcKmZE5KN9p6Omk164yeD4iaag1m2C999T2SW99B80IYIaaa + W819P5yeKGIoIw4e1JIIG4WaiABpWWWmQ2Hgs8ua8MNgJ020B00CEo39iCq00J0I00O90Bm0 + 004FoKxp8Hm9LrNS31FALd0DGGI2AG36I3e0GIKIH3S1898fE1SW4aaKD0GWqaaCQW4qaa4q + MW2acai2qmWIVIOyYCg1ub0QYO1B32US6GajjQP00g1G1xB0006msijD0I10osbjD0200QMs + sM0A00GBVRp0Y0eJ022Uq6BZaa8BssibHIM3W2ifHIa44sWijH2eaahKss82HI2QHRR1v89H + j5jLd4YKmZ4PQaa41nssw040XDWLRd049XMGjjJQaaKxXss8HHIoL1RRKmZv0YIIYq00GD04 + m40000899220WQ0C020S2sa41e008IQII1W008f19fJ032Uy6l399IG_@h1W0Gy@@_daa8By + @xd7IYaaylu@7I1aay6_@FH2IIuF_@d9O99udyVVaaa1FU38gjDRA0004msg1W08mssiC002 + Uq0B00jOQR1W500gfjj30400s4sM5030WQRR3UqgduGu7cp_6eXzqtQhfkgsXYx14BU432JE + gWXX0G80GmMHtRQS1En4108WE1KuLK9ALuePE80WG0GxKEL3W7hAvmA054DGFzbu0G00WQ0E + uc3Bge8f91AO1622Q8Xn1K822bQ1WWE18uqj30100KCBJRG8Hl06C2ZMJm8nK2F4qmHTASGd + 0B4dmMfBEHOBODFJOX5GHs0C4Q0ClQw1280WoOeAxX7YCkX10eBIbb08004ng27EDHr18b_W + 1T2WGh0F4LeJ2400w4WYW7jf6WCababA19HhJW3099AHIIYAEE3Ymp9W4ba8919Z6W0e99PI + IIIeWaa8A99H6IIImZI5R1P334IK7Cr9W1W000QYHXMUzwbi92hyfeftBuHkO99AHGI2gJW2 + 2q88Waaar0e0489eE08eJW3aWbaq9m1qaa4YJ8gEES8Q332UC78ajjr0SWT000OIRRr0G04R + RRM8a0f1K0O00wE18010Ghsss2a10a1FcprY6K3m1C1IIa0ORps29HIm0hos683IIcAQRZ80 + 99ebijjJ02iejTXaaa8uHRKM99HQejLR2a499mMjD4Ih3GWDCIIaaG6WjjJ0camJmssLEJIA + QLRR8j89ICbjPWGa4yeEa4000809HI20e6W308IIYaK0020SYia41W108IJIIh3m0X000WMw + I2UK799@@_pHIaaC@x@x8f602yp19HI2wLz@39JIIUB_@d8899q@_@paaa4mR@lFIGoW7l10 + rscD5000aORss202Ua0sE0002fjPR34H10gLJRB0C000DfjT4Y00mcqsg2A00KRQRmZMD0m@ + rIswq05SH32nmyKnDD0M00AQ0ioVOwvbI0G000W02WuhagJ08I6WWn9I8eXfg8GYW7hgPx9Y + 68iAAi240GIx0C4yuHxAw0W0001000H3imw8N18008Jh6_Gqh19r8e1TI5WYu4QunulUPW10 + 120HTaLq0DqUIS1FsJeRL4W6U1FQRD0A4OxNT2amR6J4TZNh0SGmZEXqaaK9P9PyY40999JI + JIId04G0Io8uneg1mWe1802IIMd094yOLT2enCxh555qX6WMq03Dbz21FY6SIIoE1W8uHew4 + 0ZW7bgJ0D2US6GajzQP0040mswjD0060IhMsN0028WQBRRC0008RRRpO000eijDR900f1G0J + 000Gtss1FUZbHIIa5RRqs891I2jPORW4H91cjifHai44ejjj1aaa8psscnIIY4ORxq08W2RR + hE89fW7jXfzLY4a4Qsms0I2IIORPJ5yO1so89HI2OpsscHII28RRR7899fWjjj1aaa8nssc1 + IIImZv81f1e6020990020GYq4400108IQI2T2O0K000WcaaT2GWcaa4X000WOII2UC7abWy_ + t@3HoIIu@p@7998Bu@xFFa4a8X@@J3W0I_@@_Waa8H@@xVHIYaG@l@@2fW7l140KhMsK0020 + YQBRR0048WjDjq0020WscMj4000eqsijO0000QpssDGQ05eA0004RRRmZi_p2QH3yGpLRTB0 + 3zKTmVSTqVsN7Bu4G0WWe10B8e3w4GXHcRQJW76SZhmxge@882SYce1q8mfEYk9gkWG8L16Q + docqCEeeW623WW67HBuHjALQXE1IOV4AYWG6G0G0HUL68G0Wj9iOohGEaHptFm0200GOOo5i + W1JHeG8LODRlN1tlK77t4d0Mn2qq2geqOYJLdPG69D4EnE200G2Q8ceR6gJ0F2DWWW7l9EE4 + O999HIGGg605Y0eWuue8ekRA8WXoo8e6W6w4G129991rfGmZ05GZ3T2emUBKbAm9XJ0JvkDq + _nMH3uH11GjqW1fiSGJ35ydW11deKkLU4y8Q1QiKD04e999O2028D985Dm81Fw90m_MjD010 + 0ORrt60180e5RRB0080GjjiDT2eHmZsK3G1IRRZ8899ebDj5abW4nsMMDIIMr0SGd0K4y8Ds + qssK2II2QPJp2998Iilbw7PeJWAg1WWW7j10bWKD06GGI0200Wa99900G0Gaac4w48ZW7ln@ + GMYaaVV@@89oIYVzx@a099Xt@x@Wa4aaE1im799PmZr0800Gjijzz3AWDjjDq02ijfjq9G61 + F_p@OAiJM4rLxNb0vayhW7thqg19yq013DyGq1MqVmFTqzGd044DGLnC7vqH6jUq71ErJq0H + 4y8Pl1TGhuEbem51FAS0QS5rUVT1_mN7xTFmFFOzma1X5SJ854SKq074S@@phgIBoTr4nIr0 + 0JKkUKT0FZXMHm9G5rW1W200w4OaW7lf6W28119HIIIYWaW49998IGIInBg0aaaWWwMg609W + 0995Kt6nm4R88AE0WP02022Dmh6pkAuH0bWae4DW50919x4u2Waaar041199XW7l1101mf4q + 4yO7Ysss2UK5GWzjQP022Uq0W10jORV100X06yuCuaaa2Ua3jiCIaaiO3Uq1oq89o22R3Ui4 + WQRR1FA3RRPQ8911Yjjj2Uy6D2001Fg18A19J3001Fg0220WW7HXdaaKmZD0a@@FuHDyEab0 + 1vtFuH3yv@a09PXt@xzGmZp8gjjDuHE044rYjD58uH30408WDjjCunlASiiDnBR00hxYYWSI + oe0dbQfoY01LQxIFwiHfLD7AxnUgCeZ0dIAQW22Uai8l2fan@2U4oS1AO102Y4mWW7bAu28Y + W0a8DiDe1f2DmYu4aAh5Gkm1Y22m9QW32ZuXE1KuS7yA88X19c9rW3sOSXWJ_hvQ1h18am9c + 8msY50006yeM2Io2g1GXW7ReJW48aaa4y8HA8191III6Xt6H3eGmZc_w1CHW3D600W0RdCuH + GJ3u0G2KIH3OX4W4We1mWWaaKD04WWWaCQWFgEO120205pS1181WW66ganB2Ua30WzjQR02g + 1e00100ebjjh1GXW7RfaH22USZQ0C8un3ijjGgaa4h6062U4aI6L8uHJg1GYW7dHY00GmZQ0 + WIGg6042UiWQ0M8uHGAPi1@aaaPDgGmZJuV8BHIolVD05ut@@7989PD0B4y8BWQRR3Ua300G + jtFa0W000ifjjr0SGmZzE00fZcH6100WSMe9_A9U5JZOO_AQ0q60usX749uHa2S2aI5cvckD + 2Uy@0qci606G0044URwnZ0TKXG7Q0QH38qdECq9W3vc6Nm9Ss90D1dGJh4n4yuD1r5HmZMq9 + 014aai2UKd22w8ekBYX1dr0E8Ag72Uy@mM2hpBLUB8ZG3q8IIOYP8Zw8A8u4AwhWXOBKvRH2 + g1e289991Q0Y4a4iQ080a44KmZHqWg1r0KGK7EK3W51Fw1W0WWqwle6W32WSYQ0i8uHa0400 + K@e6ostsC080q902URR3W00G6yeFr0OGmZ4K3W2ORRaO99vgfjDY4aaWsosMGoIIKRQRr919 + 5yODr0G0aa4wQ0e0jjTYWa4QMssEIIIIPJRR3989HkbjTmZyK3G31FgW00u41992T2S01089 + GII01FgZV@@@Q0S8uH5u@@GYbaatt@@PD04e@@DnII2lx@@ZW7lf6W62UaWQ0Km00KhqsMWE + 1C0W200scssW7DT0W@333xW7@F0De2wEge2HBun@3Uim0DG3200Gq016FIRXyMJ11p4DGIXL + gUCcG7SIlrJ3Hm9b5yuDr0qHSSKKAt2Waia2UCbQ0w8unDQysYOOICun@B8WcOst8u4uccXX + uIl9sYI099A5e15H3u2909f89pG2IIGmZQ4dmIfdRHmZnK3m8Ws_si501q9G1W008ross5yO + Gr0CHd08GRRX489fcbjjJaba41FYJD0Pq901CjjTaWaakA91aaaSrts65y8Ir0mGd078199j + J058D994y8Dr0CYF9B9Iyl@T2SWFIGoW75g60A0100gbjjh602yjj5000WocssoeX@F00cBW + lL0Q46yu@T6eI0JC4VLDt0aX080WE1Mu9W72Q8hz9O8unZFDWXu4s93e92UClOYi8ms@x4GZ + JywOflM2GJii2u8wJ13e9sWxPeD3s6CWXWJUA71E2QuflBi8u4c80014yOPKIoIw48198991 + r94aa4aQ0emIIIYWa4bW7r8_tP100004008SYoY68Z9PGBOBb3Uah0D62899PaaeGGIoAuHi + U1mYW7VYljD0G00wW79m00GhossWE1C8ungqqs6H2IIGRORB8H9fW7j2jjTYWa4Q6ssE1FgG + D064yeK2II42Uy020GIqaa0010GHIII8uHfmIIoxx@@CuH2m@@c889Xtx@@n7164y8J40WQL + ss20200iJ02800iPQRB0400LmZ@F0m@1F_@00n6uqQ1DKMmZ0FLt4n9WMaNt6SIwVd7H8Y8L + Yt354KGq095Qm213lLeRh5GJiL2KJk7841X4rduKG1q4le61FwGu4C4S2Djv4JmZEXbaaCeE + H09P95X7GO999LGGI6Dm24aaW2UigOCR8mMY2RnpqPv8qWDZKPlW772889PD0C4Ng5f1mGq0 + mGQ2IAuHbrt0008Wjj602G0jjPP10e_H7w48YW7vnc699IGeDRBBa89Bn2UiXE1c8uHRaM99 + HGejLBBaKzZIq9m41Fs3110WQ0E01899Q20WW7JeJWA2UK7P9@@_zHIg1W0xJII44_@hVqXE + 1Q8uHTGGjjT@W28WjjPQ00K@O4T2qGmZ@F0m@1Rz@00McDK61F_VD0X6yuc88002UiiAE0DU + 4T18004fou1qy@00caXe1ZGeGm9@7TZD1FwKd0PKAt31F2Kd0P4y8Kn@UOm9@7SocnMuq806 + 05aaCG3_2UKJ10Gsajj10000p_ss00100QVRR2W100ibjP3C00WiiLR3400WMsE1A0zjjD32 + 00G_ss1FQ3ss69MIIir0S0jj5IWaaO6ss6HKIImmss6YIIYSPRR6P99T2W0jjjJWaa41FQJD + 05mqsMG2II2RORR8199Yjijh1W0BRRRT2e0JRRR8899oXjjP4aa4yeD20WIqaa00000G2III + D040II204004f991W000ED99XG000acaiJ02aWaaq901Waa42Ui6_@Fa099vz@@FYiaam@_@ + FIMIImV_@U819Hop@xV88HIoxl@@4aq0AWP999uz@VViaa1FQZ00eMfjj0W000ross0G000R + TRRe14OJRR1800WwQRR24000CjjP74000Mscj5200WAxW7@SEOzgQKO0100JfJmgt6q3c4t@ + smfW94SYCH3a1G00WE188Q0a60OYw1A8U_7Q58fB6zPo_Qg7eXRcd8mfTY6OYE1Eu0QBAL0e + @@T8un@7zBd0q_w_13w40Y3F8O2Bo6BqY10I9S432sIj15e8Cic3dGZ0q_FC35Eh0Zu4UgL6 + Lc7mW6JSIG00Gg1HKJJ2L7WJpCZ4MP31dqps0Eq901bACHmZr091BHII2YWaWWQ0A018PP@@ + 44yu22II2w4G1GIIM1F_V88t5eH61daSR374yOOH3iHi5xqaH1r0q0489fOBm8Q0S4aaWK3W + 4H3WGaaJ4yOdr0C1200mQ0OeJW82UicQ0CuQH3g1OYE1e8unTg1022II2T2OHQ044yODr0aW + qaaaQ0WeJ0B2UqcQ0I0199HD07O@@Ve606w4e1Vaaa1FQJD060100i6WBw4GYW7zS0W@3sw@ + OcNjxKq2S2jesHBun@3kVpWJ_F4_@3ev@u4SDua@3izbW7v9UnP2gxc22qej0B2USeB0CO7H + 30100q9G4RhJNm9@7sW6FDKGm9y5NAQH3S4WaaaQ0Ae8W22quYW7Rj6W72UafQ0o8unlg1mW + W7hg6W92UigQ0o8uHcg1uZW7@V0W@3sw@W7@Fun@3Gx@W7@FCi@3Du@W7@Fua@3U4fu5Z92F + qYXnwWJ_FuaD3UyrQ0G8uH6aWaa4yOM1So0W00WW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@ + mm_FqW@3ev@W7@Fun@3Uy@WJ_Fun@3UKl0Du8e1q2Uy@W7@Fun@70u@0Q_Fun@3Uy@W7@Fun + @33x@G3_FWc@3Uy@W7@Fun@3Ev@W7@Fun@rssE4yuP4RRR3Uy@W7@V0W@Z9Bzs24Cun@3Uy@ + W7@Fun@3sw@cP_lWWG02004Gp@1F_VmZ@7yOf1dyV0DZ3G008uno81995yu8f1K089Afe1k0 + a4aKmZBH0G0O0WBg1GZW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@W7@Vvl23Gx@W7@Fua@3U + y@W7@Fua@tZ1fW719302Yje48999nM0JD0H0I22AQWBg1eWW77ApHGQUCbW7Ffan32UCiI6F + 8un@3Uy@10_V0W@3sw@W7@Fun@3Gx@WJ_FCi@3Gx@W7@Fun@3Uy@OOqCua@3EPpOBGBGZr2Q + 0jW7vHVR00W0WsW7Bpcs29IGICRBRZ89B92UqAfjGI4a4Rros8HoIYLRVRKmZSHGI08unoab + 4@xt@99unlG0WjL3G3Cj502UCP020030y@00zSQ11P0W0W00WOOu280GG0DI11008unc3De1 + 20001CnHWJy4DW4T2uGX0F4yu@r0SnY254W6s51OGm6LaWgh1DKMq054Ws@X68QnDJ4yu@1F + k820WWW7bxOd42Ua7GIGIr0a0989fQ08GGIMId098199XIGIIGTS9199eJW68D994dGKnMWM + eEv5XL2FcyLq0C4yu@1F_VmZNm1008unKqs60044ej6W4C0108xVRp0a00ezjDR1200Wstij + 1800eRFunA8sss6yu7QPPag1m2qYss0oGIaP2RpO1AH2CaDRXe59fMqijJ62UqdQ0CGJJZ49 + 88sQ0C0cmscH0IIm3PRs989Hg5jPRaW49fUajDGYW7tnq00GD0J800E1KIY0W0041B9f0I00 + qCaa800004IGImZw01v@l603yzzaK3G2uN@@XPB9H_D@tdya49_iV@BoIa4_xz@Nf7yuD02Y + Qh1G1WW0Rr0aWW600rcss4G800GRQpkW500i9DRh0400rq1FULpMVC0m@5InMYZPKAG3XD8K + q0LaC018200Y6OYWjejPW9YkmfSzQeRW6wLmW0dGAQ03w4uWe1c8unpH000a608p5GH8LkLK + 75HjVwT19CfrMX8_OX79KgWKN5cnvkk4QG8H3KqCpV0200eZWB2QmguSb0500G44PrRm130i + JX0Ca_x41FExy4M4En51dm420800001TQHmI7F4yu9MIIIWaaa8A99f7E2KIIIM3G14aWaYZ + B1GIoInnH0aai4999AGII2w48118891rjYbaa40999YIIIaWaa4D0109993g32B9992Waaw4 + e08991IGIoa4aa4KN3n9qIy27e000exXD2N8Z88AX0W0GM0A4Em1DWOmg55KDIMP4KHR1HKH + 01xQCIq0qykG3ZqtGm9654228000_k@Ye1s9zX92Uy7GIGGb0KG6658191f6028198L302IG + IGg1W0WaaaT2GWWaaiE1K0aaamS05K@8609193Ua90101J13Ja2T4qG4tZOGmZPWWijDuHDq + _0000XjLRV080WWMjjz00003rsssOm60GsRscXO70GxDRs2i500jsPR3m20GtRmZhGM899un + 4msM8HIIcLRR349990jjjXWaa49sss2HIIY1q0cj1YKaaP0ssOHKI2C0QRXGA9fY0ijJCXa4 + 1FoXqA9922jj1FIXcB99I0jjQ3Xa898sejLH2aa0hssE8III0m0ssC2GI2M0QpE009Ij0CRZ + 4W89r1ij12ma408unLGJ004yO2QI20g1e0m0001FIGp34GIIoeJ02Gda80000H8JIA0000Db + 8920G00nOb4yO7s7II2Ui122@@1Fc0GIMU@@VZ8997yt@lZaaaMy@@l4IIIamt__7o5aaiRv + @Fv6IIyD@@N4I99ykv@lWfaa4y878essg1u0t0008Wjj3UC110IjQRR00005gjjj1W004sss + 610004QRRbIGB00QJos2fD00e9QRNmC00_8jjLXM0WoaqsoSY@F0GQ5XqHy744ho1@gqGOOY + yAG3RlSHe0F4yO3XzZIq0k4yu2H3OHaNC1108uZXUULKZOC3P0WjIyvWT2O8sFk2QOh8Yo8c + idIBOYABJ80Df2zmYu4evQ0D2U41G0001DSmVK541n95kUId04GG00u2W3oOqa3xEffW8Y6u + W8l0B7FD244jWJSQ00pYKfcE6M9WJuG104y9m1F4OmQ5C411QfRAKU8ZO0008uaXAQ1Xq0e8 + _tgW2044XW51dyHzALqMG4jPaW0G0WEFf8uHE8O99r3d28099xXRXQ0O8EE6Wbab889H9un3 + YNaX8yM9eEI4baa809HfJW3Y6mW89D88edW001qz07HG8JZ9ebLW6a0020100ySn1h0O0G20 + WzcuAOuuY6OjOBW8f23YjG41918r0GXbaa4D99AT2S0B9HfE1CWcaaGW6F5sQ1H34HmZ74d0 + PQRRRP000Wv@@tdaa4fssMjP0000@@z@V9HIoRpss20000s01Dmsss60000W@@l12IGD060_ + t@tXaaKD09KBO1Q0008000mt000c400mM00090008T0006100m000049IIIiQ3I08999099f + YQEGaaa4XaaaQ0E09999899fQ001WH0GzABW4000a00GI07y6b23AQGH4AyhX2tBQGD0XW00 + 0i605Q8uWu4IWjjjD7IIIK2000QRRrcRRpsia49v1000kDRRBiQRPHaaa40000msss6ossss + G98D030RRRN3W2OBRRVVy0D000a100uI0003008E12O2008900O302aaaauIIIYJRRhERRRs + D99Ioaa89ssgjzscjjd499fIaabOsss6rsssGIII2B999ejjDBjjjQ999HIbaiaP1r0O0IMI + IHRRRr0GW4000N000SB00WP100C100Gk000o600Wr01DKGYl44SG2GIIIgFG1aaaaxieGD06 + 0800u302g1u00108r0mGG34qem1f1OGtA6isd38999IfmWT08GIIIMK99K3G2V0KG837W004 + 8D06g1GXI8Ce604EtiWE1EGjjjDdaaas6E0QRRh09992100ZhGWGRRP2999I200w9W0WjjfY + aaak0x0ncss0IIIa400a6G1osM8HII2040W0000WGGIIC1000288N7W0W899Y40008aa81jj + LRORhska499s@_@VRrssngjjDHIIIe@@@7RRRROss_C999Hm@@dFsscjnjjL880H@@VD04WR + PRRT02y@@@msss6iljjHIII4@z@UPJIa4JJkt014zJJai99Hoy9Py12Gq99H2jjLRjjDRpsM + jj@sijTRrssTpssULRRRCRRRRRRRRwRRR5jjjPXjj5BsscjvsMzDRRss8Rrs6RpssQptsETD + 05e5RRpsSRhscjDRRibQRXDHIIzHQRt6999ZDjjTcaaawcqsyRIIY8JQpU00GGtas9GBH5or + 00nU1a4LWcHS2z4DG4T2eG_YJ41XN57SGi5eL3mG79iGW6TTnW31QuK@SCqSr2T2SmpSzCS0 + E30SLc1DyfX2nZiMW6Ir2o4bNaL6RF4GJln9OH44ID403TlFpXAc04008Q02o60Xe1awRUAg + IKX0DujlYcwO8XCCm2410GWJD63H3HGKMiVwGaaayYC2gv4YE1i8GmR8899LGm6T2G0aaaiE + 1IG6III0dG5eHMH0HHW6HzC35DpeLq05KOH21erNGti4e1Ur0OmE04Kpv3T2KW4WaiE180aa + 44999B2GI21SY4989feEw8GZq08800W00A2H3800010W0040WGS35K3GJ; + INTEGER CHECKSUM =32706; +ENDDATA; + +DATA FROM_V; + BOOLEAN Region_0[128]; + BOOLEAN Region_1[128]; + BOOLEAN Region_2[128]; + BOOLEAN Region_3[128]; + BOOLEAN Region_4[128]; + BOOLEAN Region_5[128]; + BOOLEAN Region_6[128]; + BOOLEAN Region_7[128]; + BOOLEAN FROMADDRESSMASK[8] = $ff; + BOOLEAN FROMSTREAM[1024] = @020000_ubtyqNFxl7Vvh@_ulV@zFuXJyn9NvcVEqJNThpUxS + @Te5jqJZwgjsrOdDjtcRTxzt0EOXDCn5puZHMoAlCcRsPF3RiaTMQLhjt2tSrrkysBV@5KXA + we8jKJTAgfIrLPLhk_A8ZKIJIPbiyICbfcRYpEzqd06817aG5QuXGCH5j8ZDon710; +ENDDATA; + + +PROCEDURE DO_EXIT USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $81; + WAIT IDLE, 250 USEC; + IRSCAN 8, $81, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==0) ) THEN GOTO Label_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $07; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 200 USEC; + Label_0: + IRSCAN 8, $ff; + WAIT IDLE, 200 USEC; + WAIT RESET, 3 CYCLES; + EXIT STATUS; +ENDPROC; + +PROCEDURE DO_READ_SECURITY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a4; + WAIT IDLE, 3 CYCLES; + DRSCAN 44, $00000000000, CAPTURE SECREG[]; + ULUWE = SECREG[ULUWE_BITLOCATION]; + ULARE = SECREG[ULARE_BITLOCATION]; + ULUPC = SECREG[ULUPC_BITLOCATION]; + ULUFE = SECREG[ULUFE_BITLOCATION]; + ULUFP = SECREG[ULUFP_BITLOCATION]; + ULUFJ = SECREG[ULUFJ_BITLOCATION]; + ULFLR = SECREG[ULFLR_BITLOCATION]; + ULULR = SECREG[ULULR_BITLOCATION]; + ULAWE = SECREG[ULAWE_BITLOCATION]; + ULARD = SECREG[ULARD_BITLOCATION]; + ULOPT[1] = SECREG[ULOPT1_BITLOCATION]; + ULOPT[0] = SECREG[ULOPT0_BITLOCATION]; +ENDPROC; + +PROCEDURE DO_OUTPUT_SECURITY USES GV; + PRINT "Security Settings :"; + IF ( ! (ULUFP==1) ) THEN GOTO Label_1; + PRINT "FlashROM Write/Erase protected by pass key."; + Label_1: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_2; + PRINT "FlashROM Read protected by pass key."; + Label_2: + IF ( ! (ULAWE==1) ) THEN GOTO Label_3; + PRINT "Array Write/Erase protected by pass key."; + Label_3: + IF ( ! (ULARD==1) ) THEN GOTO Label_4; + PRINT "Array Verify protected by pass key."; + Label_4: + IF ( ! (ULUFE==1) ) THEN GOTO Label_5; + PRINT "Encrypted FlashROM Programming Enabled."; + Label_5: + IF ( ! (ULARE==1) ) THEN GOTO Label_6; + PRINT "Encrypted FPGA Array Programming Enabled."; + Label_6: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DO_QUERY_SECURITY USES DO_READ_SECURITY,DO_OUTPUT_SECURITY; + CALL DO_READ_SECURITY; + CALL DO_OUTPUT_SECURITY; +ENDPROC; + +PROCEDURE READ_UROW USES BITSTREAM,GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE UROW[]; + SUROWALGOVERSION[6..0] = $00; + IF ( ! ( (UROW[5]==0)&&(UROW[0]==1)) ) THEN GOTO Label_7; + SUROWALGOVERSION[5..4] = UROW[24..23]; + Label_7: + IF ( ! ( (UROW[5]==1)&&(UROW[0]==0)) ) THEN GOTO Label_8; + SUROWALGOVERSION[5..4] = UROW[24..23]; + SUROWALGOVERSION[6] = 1; + Label_8: + SUROWCHECKSUM[15..0] = UROW[127..112]; + SUROWCYCLECOUNT = INT(UROW[111..102]); + SUROWDESIGNNAME[69..0] = UROW[101..32]; + SUROWPROGMETHOD[2..0] = UROW[31..29]; + SUROWALGOVERSION[3..0] = UROW[28..25]; + SUROW_PKG_TYPE[5..0] = UROW[22..17]; + SUROW_SW_VERSION[6..0] = UROW[16..10]; + SUROWPROGRAMSW[3..0] = UROW[9..6]; + SUROW_SRAM_DISTURB[0] = UROW[4]; + SUROW_SPEED_GRADE[2..0] = UROW[3..1]; + ACT_UROW_CYCLE_COUNT = SUROWCYCLECOUNT; +ENDPROC; + +PROCEDURE FIX_INT_ARRAYS USES GV; + IF ( ! (HEX[0]!=48) ) THEN GOTO Label_9; + FOR I = 0 TO 7; + TEMP = HEX[I]; + HEX[I] = HEX[(15-I)]; + HEX[(15-I)] = TEMP; + NEXT I; + Label_9: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISP_CHKSUM_DESIGN USES GV,FIX_INT_ARRAYS; + CALL FIX_INT_ARRAYS; + IF ( ! (INT(SUROWCHECKSUM[15..0])==65535) ) THEN GOTO Label_10; + PRINT "CHECKSUM: "; + Label_10: + IF ( ! (INT(SUROWCHECKSUM[15..0])!=65535) ) THEN GOTO Label_11; + PRINT "CHECKSUM: ",CHR$(HEX[INT(SUROWCHECKSUM[15..12])]),CHR$(HEX[INT(SUROWCHECKSUM[11..8])]) + ,CHR$(HEX[INT(SUROWCHECKSUM[7..4])]),CHR$(HEX[INT(SUROWCHECKSUM[3..0])]); + Label_11: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])==2147483647)&&(INT(SUROWDESIGNNAME[31..61])==2147483647))&&(INT(SUROWDESIGNNAME[62..69])==255)) ) THEN GOTO Label_12; + PRINT "Design Name: "; + Label_12: + IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])!=2147483647)||(INT(SUROWDESIGNNAME[31..61])!=2147483647))||(INT(SUROWDESIGNNAME[62..69])!=255)) ) THEN GOTO Label_13; + PRINT "Design Name: ",CHR$(INT(SUROWDESIGNNAME[63..69])),CHR$(INT(SUROWDESIGNNAME[56..62])) + ,CHR$(INT(SUROWDESIGNNAME[49..55])),CHR$(INT(SUROWDESIGNNAME[42..48])),CHR$(INT(SUROWDESIGNNAME[35..41])) + ,CHR$(INT(SUROWDESIGNNAME[28..34])),CHR$(INT(SUROWDESIGNNAME[21..27])),CHR$(INT(SUROWDESIGNNAME[14..20])) + ,CHR$(INT(SUROWDESIGNNAME[7..13])),CHR$(INT(SUROWDESIGNNAME[0..6])); + Label_13: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISPLAY_UROW USES BITSTREAM,CONSTBLOCK,GV,DISP_CHKSUM_DESIGN; + EXPORT "USER_ROW", UROW[127..0]; + PRINT "User information: "; + CALL DISP_CHKSUM_DESIGN; + IF ( ! (FLAGDISPLAYCYC==1) ) THEN GOTO Label_14; + PRINT "CYCLE COUNT: ",SUROWCYCLECOUNT; + Label_14: + INTEGER TMPINT =INT(SUROWPROGMETHOD[]); + INTEGER TMPINT2 =0; + INTEGER TMPINT3 =0; + INTEGER TMPINT4 =0; + INTEGER TMPINT5 =0; + IF ( ! (TMPINT==IEEE1532) ) THEN GOTO Label_15; + PRINT "Programming Method: IEEE1532"; + Label_15: + IF ( ! (TMPINT==STAPL) ) THEN GOTO Label_16; + PRINT "Programming Method: STAPL"; + Label_16: + IF ( ! (TMPINT==DIRECTC) ) THEN GOTO Label_17; + PRINT "Programming Method: DirectC"; + Label_17: + IF ( ! (TMPINT==PDB) ) THEN GOTO Label_18; + PRINT "Programming Method: PDB"; + Label_18: + IF ( ! (TMPINT==SVF) ) THEN GOTO Label_19; + PRINT "Programming Method: SVF"; + Label_19: + PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]); + TMPINT = INT(SUROW_SPEED_GRADE[]); + IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_20; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_20: + IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_21; + PRINT "Device Speed Grade: -1"; + Label_21: + IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_22; + PRINT "Device Speed Grade: -2"; + Label_22: + IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_23; + PRINT "Device Speed Grade: -3"; + Label_23: + IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_24; + PRINT "Device Speed Grade: -F"; + Label_24: + IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_25; + PRINT "Device Speed Grade: STD"; + Label_25: + IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_26; + PRINT "Device Speed Grade: -4"; + Label_26: + IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_27; + PRINT "Device Speed Grade: speed grade information not available from device"; + Label_27: + TMPINT = INT(SUROWPROGRAMSW[]); + IF ( ! (TMPINT==FP) ) THEN GOTO Label_28; + PRINT "Programmer: FlashPro"; + Label_28: + IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_29; + PRINT "Programmer: FlashPro Lite"; + Label_29: + IF ( ! (TMPINT==FP3) ) THEN GOTO Label_30; + PRINT "Programmer: FlashPro3"; + Label_30: + IF ( ! (TMPINT==FP4) ) THEN GOTO Label_31; + PRINT "Programmer: FlashPro4"; + Label_31: + IF ( ! (TMPINT==FP5) ) THEN GOTO Label_32; + PRINT "Programmer: FlashPro5"; + Label_32: + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_33; + PRINT "Programmer: Sculptor WIN"; + Label_33: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_34; + PRINT "Programmer: BP Programmer"; + Label_34: + IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_35; + PRINT "Programmer: DirectC"; + Label_35: + IF ( ! (TMPINT==STP) ) THEN GOTO Label_36; + PRINT "Programmer: Actel JAM Player"; + Label_36: + IF ( ! ( ( ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3))||(TMPINT==FP4))||(TMPINT==FP5)) ) THEN GOTO Label_52; + TMPINT2 = INT(SUROW_SW_VERSION[]); + IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_37; + PRINT "Software: FlashPro v3.3"; + Label_37: + IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_38; + PRINT "Software: FlashPro v3.4"; + Label_38: + IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_39; + PRINT "Software: FlashPro v4.0"; + Label_39: + IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_40; + PRINT "Software: FlashPro v4.1"; + Label_40: + IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_41; + PRINT "Software: FlashPro v4.2"; + Label_41: + IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_42; + PRINT "Software: FlashPro v5.0"; + Label_42: + IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_43; + PRINT "Software: FlashPro v5.1"; + Label_43: + IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_44; + PRINT "Software: FlashPro v6.0"; + Label_44: + IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_45; + PRINT "Software: FlashPro v6.1"; + Label_45: + IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_46; + PRINT "Software: FlashPro v6.2"; + Label_46: + IF ( ! (TMPINT2==FP84) ) THEN GOTO Label_47; + PRINT "Software: FlashPro v8.4"; + Label_47: + IF ( ! (TMPINT2==FP85) ) THEN GOTO Label_48; + PRINT "Software: FlashPro v8.5"; + Label_48: + IF ( ! (TMPINT2==FP86) ) THEN GOTO Label_49; + PRINT "Software: FlashPro v8.6"; + Label_49: + IF ( ! (TMPINT2==FP90) ) THEN GOTO Label_50; + PRINT "Software: FlashPro v9.0"; + Label_50: + IF ( ! (TMPINT2==FP91) ) THEN GOTO NOT_FP91; + PRINT "Software: FlashPro v9.1"; + NOT_FP91: + IF ( ! (TMPINT2==FP100) ) THEN GOTO NOT_FP100; + PRINT "Software: FlashPro v10.0"; + NOT_FP100: + IF ( ! (TMPINT2==FP_11) ) THEN GOTO NOT_FP_11; + PRINT "Software: FlashPro v11.0"; + NOT_FP_11: + IF ( ! (TMPINT2==FP_11_1) ) THEN GOTO NOT_FP_11_1; + PRINT "Software: FlashPro v11.1"; + NOT_FP_11_1: + IF ( ! (TMPINT2==FP_11_2) ) THEN GOTO NOT_FP_11_2; + PRINT "Software: FlashPro v11.2"; + NOT_FP_11_2: + IF ( ! (TMPINT2==FP_11_3) ) THEN GOTO NOT_FP_11_3; + PRINT "Software: FlashPro v11.3"; + NOT_FP_11_3: + IF ( ! (TMPINT2==FP_11_4) ) THEN GOTO NOT_FP_11_4; + PRINT "Software: FlashPro v11.4"; + NOT_FP_11_4: + IF ( ! (TMPINT2==FP_11_5) ) THEN GOTO NOT_FP_11_5; + PRINT "Software: FlashPro v11.5"; + NOT_FP_11_5: + IF ( ! (TMPINT2==FP_11_6) ) THEN GOTO NOT_FP_11_6; + PRINT "Software: FlashPro v11.6"; + NOT_FP_11_6: + IF ( ! (TMPINT2==FP_11_7) ) THEN GOTO NOT_FP_11_7; + PRINT "Software: FlashPro v11.7"; + NOT_FP_11_7: + IF ( ! (TMPINT2==FP_11_8) ) THEN GOTO NOT_FP_11_8; + PRINT "Software: FlashPro v11.8"; + NOT_FP_11_8: + IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_51; + PRINT "Software: FlashPro vX.X"; + Label_51: + LABEL_SEPARATOR = 0; + Label_52: + IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_56; + TMPINT3 = (INT(SUROW_SW_VERSION[6..5])+SCULPTORMAJORBASE); + TMPINT4 = (INT(SUROW_SW_VERSION[4..1])+SCULPTORMINORBASE); + TMPINT5 = 0; + IF ( ! (SUROW_SW_VERSION[0]==1) ) THEN GOTO Label_53; + TMPINT5 = 1; + Label_53: + INTEGER CURRPGM =INT(ACT_UROW_PROGRAM_SW[3..0]); + IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_54; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4; + PRINT "NOTE: The Sculptor Windows version number below should be converted to HEX."; + NOT_FP3_FP4: + PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_54: + IF ( ! (TMPINT==BPW) ) THEN GOTO Label_55; + IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4_BPW; + PRINT "NOTE: The BP Windows version number below should be converted to HEX."; + NOT_FP3_FP4_BPW: + PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5; + Label_55: + LABEL_SEPARATOR = 0; + Label_56: + PRINT "========================================="; +ENDPROC; + +PROCEDURE DISPLAY_FROM USES FROM_V; + EXPORT "Region_0", Region_0[]; + EXPORT "Region_1", Region_1[]; + EXPORT "Region_2", Region_2[]; + EXPORT "Region_3", Region_3[]; + EXPORT "Region_4", Region_4[]; + EXPORT "Region_5", Region_5[]; + EXPORT "Region_6", Region_6[]; + EXPORT "Region_7", Region_7[]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA0 USES GV,FROM_V; + INTEGER DUMMY0 =0; + Region_0[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA1 USES GV,FROM_V; + INTEGER DUMMY1 =0; + Region_1[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA2 USES GV,FROM_V; + INTEGER DUMMY2 =0; + Region_2[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA3 USES GV,FROM_V; + INTEGER DUMMY3 =0; + Region_3[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA4 USES GV,FROM_V; + INTEGER DUMMY4 =0; + Region_4[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA5 USES GV,FROM_V; + INTEGER DUMMY5 =0; + Region_5[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA6 USES GV,FROM_V; + INTEGER DUMMY6 =0; + Region_6[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE MAP_FROM_DATA7 USES GV,FROM_V; + INTEGER DUMMY7 =0; + Region_7[127..0] = Buff128[127..0]; +ENDPROC; + +PROCEDURE READ_FROM USES FROM_V,GV,DISPLAY_FROM,MAP_FROM_DATA0,MAP_FROM_DATA1,MAP_FROM_DATA2 + ,MAP_FROM_DATA3,MAP_FROM_DATA4,MAP_FROM_DATA5,MAP_FROM_DATA6,MAP_FROM_DATA7; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + PRINT "FlashROM Information: "; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO Label_65; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $93; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 138 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; + IF ( ! ((FROMROWNUMBER-1)==0) ) THEN GOTO Label_57; + CALL MAP_FROM_DATA0; + Label_57: + IF ( ! ((FROMROWNUMBER-1)==1) ) THEN GOTO Label_58; + CALL MAP_FROM_DATA1; + Label_58: + IF ( ! ((FROMROWNUMBER-1)==2) ) THEN GOTO Label_59; + CALL MAP_FROM_DATA2; + Label_59: + IF ( ! ((FROMROWNUMBER-1)==3) ) THEN GOTO Label_60; + CALL MAP_FROM_DATA3; + Label_60: + IF ( ! ((FROMROWNUMBER-1)==4) ) THEN GOTO Label_61; + CALL MAP_FROM_DATA4; + Label_61: + IF ( ! ((FROMROWNUMBER-1)==5) ) THEN GOTO Label_62; + CALL MAP_FROM_DATA5; + Label_62: + IF ( ! ((FROMROWNUMBER-1)==6) ) THEN GOTO Label_63; + CALL MAP_FROM_DATA6; + Label_63: + IF ( ! ((FROMROWNUMBER-1)==7) ) THEN GOTO Label_64; + CALL MAP_FROM_DATA7; + Label_64: + LABEL_SEPARATOR = 0; + Label_65: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; + CALL DISPLAY_FROM; +ENDPROC; + +PROCEDURE READ_F_ROW USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $f9; + DRSCAN 3, FADDR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $bf; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[]; +ENDPROC; + +PROCEDURE DO_DEVICE_INFO USES GV,DO_READ_SECURITY,READ_UROW,DISPLAY_UROW,READ_FROM + ,READ_F_ROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0e; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE BUFF32[]; + EXPORT "SILSIG", BUFF32[]; + IRSCAN 8, $84, CAPTURE BUFF128[7..0]; + IF ( ! (BUFF128[2]==1) ) THEN GOTO CORE_NOT_ENABLED; + PRINT "FPGA Array is programmed and enabled."; + CORE_NOT_ENABLED: + IF ( ! (BUFF128[2]==0) ) THEN GOTO CORE_ENABLED; + PRINT "FPGA Array is not enabled."; + CORE_ENABLED: + CALL READ_UROW; + CALL DISPLAY_UROW; + CALL DO_READ_SECURITY; + IF ( ! (ULUFJ==0) ) THEN GOTO Label_66; + CALL READ_FROM; + Label_66: + IF ( ! (ULUFJ==1) ) THEN GOTO Label_67; + PRINT "FlashROM Information: "; + PRINT "Cannot be displayed due to pass key match failure"; + Label_67: + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + PRINT "========================================="; +ENDPROC; + +PROCEDURE INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $dd; + DRSCAN 128, $00000000000000000000000000000000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; +ENDPROC; + +PROCEDURE DO_VERIFY_DEVICE_INFO USES GV,BITSTREAM,DO_EXIT,DO_READ_SECURITY,READ_UROW + ,DISP_CHKSUM_DESIGN; + CALL READ_UROW; + CALL DISP_CHKSUM_DESIGN; + CALL DO_READ_SECURITY; + BUFF32[31..0] = BOOL(CHECKSUM); + UROW[127..112] = BUFF32[15..0]; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],$ffff003fffffffffffffffff00000000 + ,PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_CMP_OK; + STATUS = -43; + PRINT "Failed to verify design information."; + UNIQUEEXITCODE = 32772; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_CMP_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_IDCODE_ONLY USES GV; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[]; + EXPORT "IDCODE", ID[]; +ENDPROC; + +PROCEDURE VERIFY_RLOCK USES GV; + IRSCAN 8, $84,COMPARE $04,$04,PASS; +ENDPROC; + +PROCEDURE DO_VERIFY_PGM_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_PGM_PASS; + STATUS = 10; + PRINT "Failed to enable FPGA Array."; + UNIQUEEXITCODE = 32891; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_DISABLE_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==1) ) THEN GOTO RLOCK_PGM_FAIL; + STATUS = 10; + PRINT "Failed to disable FPGA Array."; + UNIQUEEXITCODE = 32918; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_PGM_FAIL: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_VERIFY_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK; + CALL VERIFY_RLOCK; + IF ( ! (PASS==0) ) THEN GOTO RLOCK_VERIFY_PASS; + STATUS = 11; + PRINT "FPGA Array is not enabled."; + UNIQUEEXITCODE = 32892; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + RLOCK_VERIFY_PASS: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_ID_DMK USES GV,DO_EXIT,INIT_AES; + CALL INIT_AES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M7BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M7VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32775; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M7VERDONE: + IF ( ! ( (BUFF128[126]==0)||(BM7DEVICE==0)) ) THEN GOTO MXIDOK; + IF ( ! ( (BUFF128[126]==1)&&(BM7DEVICE==0)) ) THEN GOTO LDETECTM1; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M7 device."; + UNIQUEEXITCODE = 32776; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + LDETECTM1: + IF ( ! (BUFF128[126]==0) ) THEN GOTO Label_70; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0a; + DRSCAN 128, M1BUFF[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 90 USEC; + DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000 + ,$c0000000000000000000000000000000,PASS; + IF ( ! (BUFF128[127]==0) ) THEN GOTO M1VERDONE; + STATUS = -31; + PRINT "Failed to verify AES Sec."; + UNIQUEEXITCODE = 32777; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + M1VERDONE: + BOOLEAN BTMPBUFFBIT126 = BUFF128[126]; + IF ( ! ( (BTMPBUFFBIT126==1)&&(BM1DEVICE==0)) ) THEN GOTO REGDEV; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "Target is an M1 device."; + UNIQUEEXITCODE = 32778; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + REGDEV: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM7DEVICE==1)) ) THEN GOTO Label_68; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M7 Device."; + UNIQUEEXITCODE = 32781; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_68: + IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_69; + STATUS = 6; + PRINT "Failed to verify IDCODE."; + PRINT "The Target is not an M1 Device."; + UNIQUEEXITCODE = 32782; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_69: + LABEL_SEPARATOR = 0; + Label_70: + LABEL_SEPARATOR = 0; + MXIDOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE VERIFY_IDCODE USES GV,PARAMETERS,DO_EXIT; + FREQUENCY (FREQ*1000000); + WAIT RESET, 5 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $0f; + DRSCAN 32, $00000000; + WAIT IDLE, 1 CYCLES; + DRSCAN 32, $00000000, CAPTURE ID[],COMPARE IDCODEVALUE[],IDMASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO IDOK; + STATUS = 6; + PRINT "Failed to verify IDCODE"; + UNIQUEEXITCODE = 32797; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + IDOK: + IDREV = INT(ID[31..28]); + IDFAB = INT(ID[24..24]); +ENDPROC; + +PROCEDURE IS_SECOK USES GV,DO_EXIT; + IF ( ! (SECKEY_OK==0) ) THEN GOTO SECOK; + STATUS = -35; + PRINT "Failed to match pass key."; + UNIQUEEXITCODE = 32799; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SECOK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_R USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPR; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text verification is prohibited."; + UNIQUEEXITCODE = 32800; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYEPR: + IF ( ! (ULARD==1) ) THEN GOTO SKIPRCHK1; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32804; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SKIPRCHK1: + IF ( ! (ULARD==0) ) THEN GOTO Label_71; + CHKSEC = 0; + Label_71: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_W USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULAWE==1) ) THEN GOTO ARRAYWP; + STATUS = -28; + PRINT "FPGA Array Write/Erase is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32805; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYWP: + IF ( ! (ULARD==1) ) THEN GOTO ARRAYRPW; + STATUS = -30; + PRINT "FPGA Array Verification is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32806; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + ARRAYRPW: + IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPW; + STATUS = -33; + PRINT "FPGA Array Encryption is enforced. Plain text programming is prohibited."; + CALL DO_EXIT; + ARRAYEPW: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_FROM_W USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULUFP==1) ) THEN GOTO FROMWP; + STATUS = -27; + PRINT "FlashROM Write/Erase is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32810; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMWP: + IF ( ! (ULUFJ==1) ) THEN GOTO WFROMRP; + STATUS = -29; + PRINT "FlashROM Read is protected by pass key."; + PRINT "A valid pass key needs to be provided."; + UNIQUEEXITCODE = 32811; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + WFROMRP: + IF ( ! (ULUFE==1) ) THEN GOTO WFROMEP; + STATUS = -34; + PRINT "FlashROM Encryption is enforced. Plain text programming is prohibited."; + UNIQUEEXITCODE = 32812; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + WFROMEP: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_CHECK_FROM_R USES GV,DO_EXIT,DO_READ_SECURITY; + CALL DO_READ_SECURITY; + IF ( ! (ULUFE==1) ) THEN GOTO FROMEP; + STATUS = -34; + PRINT "FlashROM Encryption is enforced. Plain text verification is prohibited."; + UNIQUEEXITCODE = 32815; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMEP: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE BP_VER USES GV; + BOOLEAN PLAYER_VERSION_BOOLEAN[32]; + PLAYER_VERSION_BOOLEAN[31..0] = BOOL(PLAYERVERSIONVARIABLE); + INTEGER PLAYER_MAJOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[23..16])-SCULPTORMAJORBASE); + INTEGER PLAYER_MINOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[15..8])-SCULPTORMINORBASE); + ACT_UROW_SW_VERSION[6..5] = BOOL(PLAYER_MAJOR_VERSION); + ACT_UROW_SW_VERSION[4..1] = BOOL(PLAYER_MINOR_VERSION); + ACT_UROW_SW_VERSION[0] = PLAYER_VERSION_BOOLEAN[0]; + ACT_UROW_PROGRAM_SW[3..0] = BOOL(PLAYERVERSIONSWVARIABLE); +ENDPROC; + +PROCEDURE POLL_PROGRAM USES GV; + INTEGER ILOOP_0; + FOR ILOOP_0 = 16381 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 100 USEC; + DRSCAN 5, $00,COMPARE $00,$0b,PASS; + IF PASS THEN ILOOP_0 = 0; + NEXT ILOOP_0; +ENDPROC; + +PROCEDURE SET_PRG_ARRAY USES GV; + ISPRGARRAY = 1; +ENDPROC; + +PROCEDURE DO_INITIALIZE USES GV,DO_EXIT,READ_F_ROW,VERIFY_ID_DMK,DO_CHECK_R,DO_CHECK_W + ,DO_CHECK_FROM_W,DO_CHECK_FROM_R,BP_VER; + BSR[707..0] = BSRPATTERN[707..0]; + BOOLEAN SHIFT_DATA[708]; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + DRSCAN 708, SHIFT_DATA[], CAPTURE SAMPLE_DEVICE[]; + FOR I = 0 TO 707; + IF ( ! (SAMPLEMASK[I]==1) ) THEN GOTO Label_72; + BSR[I] = SAMPLE_DEVICE[I]; + Label_72: + LABEL_SEPARATOR = 0; + NEXT I; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $01; + DRSCAN 708, BSR[]; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $80; + DRSCAN 18, $00000; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1875 USEC; + DRSCAN 18, $00000, CAPTURE ISC_CONFIG_RESULT[],COMPARE $30000,$30000,PASS; + IF ( ! (PASS==0) ) THEN GOTO CRCOK; + STATUS = 5; + PRINT "Failed to enter programming mode."; + EXPORT "ISC_Config_Result", ISC_CONFIG_RESULT[]; + UNIQUEEXITCODE = 32850; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + CRCOK: + FADDR[] = $0; + CALL READ_F_ROW; + EXPORT "FSN", BUFF128[55..8]; + CALL VERIFY_ID_DMK; + IF ( ! (CHKARRAY==1) ) THEN GOTO SKIPCHKARRAY; + IF ( ! (ARRAYRONLY==0) ) THEN GOTO Label_73; + CALL DO_CHECK_W; + Label_73: + IF ( ! (ARRAYRONLY==1) ) THEN GOTO Label_74; + CALL DO_CHECK_R; + Label_74: + LABEL_SEPARATOR = 0; + SKIPCHKARRAY: + IF ( ! (CHKFROM==1) ) THEN GOTO SKIPCHKFROM; + IF ( ! (FROMRONLY==0) ) THEN GOTO Label_75; + CALL DO_CHECK_FROM_W; + Label_75: + IF ( ! (FROMRONLY==1) ) THEN GOTO Label_76; + CALL DO_CHECK_FROM_R; + Label_76: + LABEL_SEPARATOR = 0; + SKIPCHKFROM: + IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_77; + CALL BP_VER; + Label_77: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE READ_INITIALIZE USES GV,DO_INITIALIZE; + CHKFROM = 0; + CHKARRAY = 0; + CHKNVM = 0; + CHKSEC = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NW_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NW_INITIALIZE USES DO_INITIALIZE,NW_INITIALIZE_COMMON; + CALL NW_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE NR_INITIALIZE_COMMON USES GV; + CHKFROM = 0; + CHKARRAY = 0; +ENDPROC; + +PROCEDURE NR_INITIALIZE USES DO_INITIALIZE,NR_INITIALIZE_COMMON; + CALL NR_INITIALIZE_COMMON; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE FW_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 0; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE FR_INITIALIZE USES GV,DO_INITIALIZE; + FROMRONLY = 1; + CHKFROM = 1; + CHKSEC = 0; + CHKARRAY = 0; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AW_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE AR_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKFROM = 0; + CHKARRAY = 1; + CHKNVM = 0; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE W_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + CHKARRAY = 1; + FROMRONLY = 0; + CHKFROM = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE R_INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 1; + CHKARRAY = 1; + FROMRONLY = 1; + CHKFROM = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE INITIALIZE USES GV,DO_INITIALIZE; + ARRAYRONLY = 0; + FROMRONLY = 0; + CHKFROM = 1; + CHKARRAY = 1; + CALL DO_INITIALIZE; +ENDPROC; + +PROCEDURE POLL_ERASE USES GV; + PASS = 0; + INTEGER ILOOP_1; + FOR ILOOP_1 = 262141 - 1 TO 0 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $84; + WAIT IDLE, 1 CYCLES; + WAIT IDLE, 1000 USEC; + DRSCAN 5, $00,COMPARE $00,$03,PASS; + IF PASS THEN ILOOP_1 = 0; + NEXT ILOOP_1; +ENDPROC; + +PROCEDURE UFROM_DISTURB USES GV; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, $ffffffffffffffffffffffffffffffff; + WAIT IDLE, 5 CYCLES; + WAIT IDLE, 10000 USEC; + NEXT FROMROWNUMBER; +ENDPROC; + +PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM; + IF ( ! (ISERASEONLY==0) ) THEN GOTO SKIP_CYC_INCREMENT; + IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY; + IF ( ! ( ( ( (INT(UROW[31..0])==-1)&&(INT(UROW[63..32])==-1))&&(INT(UROW[95..64])==-1))&&(INT(UROW[127..96])==-1)) ) THEN GOTO NOT_CORRUPTED_CYCLE_COUNT; + ACT_UROW_CYCLE_COUNT = 0; + NOT_CORRUPTED_CYCLE_COUNT: + IF ( ! (ACT_UROW_CYCLE_COUNT<1000) ) THEN GOTO MAX_CYCLE_COUNT; + ACT_UROW_CYCLE_COUNT = (ACT_UROW_CYCLE_COUNT+1); + MAX_CYCLE_COUNT: + LABEL_SEPARATOR = 0; + NOT_PGM_ARRAY: + LABEL_SEPARATOR = 0; + SKIP_CYC_INCREMENT: + IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_78; + UROW[] = $ffffffffffffffffffffffffffffffff; + Label_78: + IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO; + BUFF32[31..0] = BOOL(CHECKSUM); + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_79; + UROW[127..112] = BUFF32[15..0]; + Label_79: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_80; + UROW[127..112] = SUROWCHECKSUM[15..0]; + Label_80: + IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_81; + UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0]; + Label_81: + IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_82; + UROW[101..32] = SUROWDESIGNNAME[69..0]; + Label_82: + LABEL_SEPARATOR = 0; + SKIP_DESIGN_INFO: + BUFF32[31..0] = BOOL(ACT_UROW_CYCLE_COUNT); + UROW[111..102] = BUFF32[9..0]; + UROW[31..29] = ACT_UROW_PROG_METHOD[2..0]; + UROW[28..25] = ACT_UROW_ALGO_VERSION[3..0]; + UROW[16..10] = ACT_UROW_SW_VERSION[6..0]; + UROW[9..6] = ACT_UROW_PROGRAM_SW[3..0]; + UROW[4] = SUROW_SRAM_DISTURB[0]; + IF ( ! (ACT_UROW_ALGO_VERSION[6]==1) ) THEN GOTO Label_83; + UROW[5] = 1; + UROW[0] = 0; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_83: + IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_84; + UROW[5] = 0; + UROW[0] = 1; + UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4]; + Label_84: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a7; + DRSCAN 128, UROW[]; + WAIT IDLE, 15 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO PROGRAM_OK3; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32853; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + PROGRAM_OK3: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a8; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 165 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],UROW_MASK[],PASS; + IF ( ! (PASS==0) ) THEN GOTO UROW_OK; + STATUS = -24; + PRINT "Failed to program UROW"; + UNIQUEEXITCODE = 32854; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + UROW_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE FAIL_ERASE USES GV,DO_EXIT; + STATUS = 8; + PRINT "Failed Erase Operation"; + UNIQUEEXITCODE = 32855; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; +ENDPROC; + +PROCEDURE EXE_ERASE USES BITSTREAM,GV,READ_UROW,POLL_ERASE,UFROM_DISTURB,PROGRAM_UROW + ,FAIL_ERASE; + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO SKIPRUROW; + CALL READ_UROW; + EXPORT "ACTEL_SLOG_UROW", UROW[]; + SKIPRUROW: + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $85; + DRSCAN 23, COMBERASESELECT[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_ERASE; + IF ( ! (PASS==0) ) THEN GOTO ERASEOK; + CALL FAIL_ERASE; + ERASEOK: + IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO Label_85; + IF ( ! (ISERASEONLY==1) ) THEN GOTO NOT_ERASE_ONLY; + CALL UFROM_DISTURB; + NOT_ERASE_ONLY: + CALL PROGRAM_UROW; + Label_85: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE USES BITSTREAM,FROM_V,GV,EXE_ERASE; + PRINT "Erase ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[0] = 1; + COMBERASESELECT[22..15] = FROMADDRESSMASK[7..0]; + COMBERASESELECT[1] = 1; + CALL EXE_ERASE; + PRINT "Completed erase"; + IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY_ERASE; + BUFF32[31..0] = BOOL(CHECKSUM); + EXPORT "CHECKSUM", BUFF32[15..0]; + NOT_PGM_ARRAY_ERASE: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY USES GV,EXE_ERASE; + PRINT "Erase FPGA Array ..."; + COMBERASESELECT[22..0] = $004001; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ONLY USES GV,DO_ERASE; + ISERASEONLY = 1; + CALL DO_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ARRAY_ONLY USES GV,DO_ERASE_ARRAY; + ISERASEONLY = 1; + CALL DO_ERASE_ARRAY; +ENDPROC; + +PROCEDURE DO_ERASE_FROM USES FROM_V,GV,EXE_ERASE; + PRINT "Erase FlashROM ..."; + COMBERASESELECT[22..0] = $004000; + COMBERASESELECT[22..15] = FROMADDRESSMASK[7..0]; + ISERASEONLY = 1; + ISRESTOREDESIGN = 1; + CALL EXE_ERASE; +ENDPROC; + +PROCEDURE DO_ERASE_ALL USES GV,UFROM_DISTURB,EXE_ERASE; + IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_86; + PRINT "Erase FPGA Array and FlashROM ..."; + Label_86: + IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_87; + PRINT "Erase FPGA Array, FlashROM and Security Settings ..."; + Label_87: + COMBERASESELECT[22..0] = $7fc00f; + ISERASEONLY = 1; + CALL EXE_ERASE; + CALL UFROM_DISTURB; +ENDPROC; + +PROCEDURE LOAD_ROW_DATA USES BITSTREAM,GV; + FOR SDTILE = 1 TO NUMBEROFSDTILES; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, DATASTREAM[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT SDTILE; +ENDPROC; + +PROCEDURE EXE_PROGRAM USES GV,DO_EXIT,POLL_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $83; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_88; + STATUS = 10; + PRINT "Failed to program FPGA array at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32856; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_88: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE EXE_VERIFY USES GV,DO_EXIT,POLL_PROGRAM; + IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_89; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32857; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_89: + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + VERIFY_EOL_0: + IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_0; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8d; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1250 USEC; + DRSCAN 2, $0,COMPARE $0,$3,PASS; + VERIFY_BOL_0: + IF ( ! (PASS==0) ) THEN GOTO Label_90; + STATUS = 11; + PRINT "Verify 0 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32858; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_90: + IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 132 USEC; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_91; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32859; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_91: + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS; + VERIFY_EOL_1: + IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_1; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8e; + DRSCAN 2, VERIFYEOL[]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 1250 USEC; + DRSCAN 2, $0,COMPARE $0,$3,PASS; + VERIFY_BOL_1: + IF ( ! (PASS==0) ) THEN GOTO Label_92; + STATUS = 11; + PRINT "Verify 1 failed at row ",ROWNUMBER,"."; + UNIQUEEXITCODE = 32860; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_92: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_PROGRAM USES GV,LOAD_ROW_DATA,EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Programming FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_0; + FOR IREPEAT_0 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_PROGRAM; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_93; + PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + DIFFERENCE = (PERCENT_UPDATE%10); + IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_PGM_A; + PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE)); + ROUND_DOWN_PGM_A: + IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_PGM_A; + PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE); + ROUND_UP_PGM_A: + EXPORT "PERCENT_DONE", PERCENT_UPDATE; + Label_93: + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_0; +ENDPROC; + +PROCEDURE DO_VERIFY USES GV,LOAD_ROW_DATA,EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $2; + WAIT IDLE, 3 CYCLES; + PRINT "Verifying FPGA Array"; + DATAINDEX = 0; + ROWNUMBER = (NUMBEROFMAPROWS-1); + INTEGER IREPEAT_1; + FOR IREPEAT_1 = NUMBEROFMAPROWS - 1 TO 0 STEP -1; + CALL LOAD_ROW_DATA; + CALL EXE_VERIFY; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $87; + DRSCAN 2, $3; + WAIT IDLE, 3 CYCLES; + IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_94; + PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS); + DIFFERENCE = (PERCENT_UPDATE%10); + IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_VER_ARRAY; + PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE)); + ROUND_DOWN_VER_ARRAY: + IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_VER_ARRAY; + PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE); + ROUND_UP_VER_ARRAY: + EXPORT "PERCENT_DONE", PERCENT_UPDATE; + Label_94: + ROWNUMBER = (ROWNUMBER-1); + NEXT IREPEAT_1; + PRINT " Verifying FPGA Array -- pass"; +ENDPROC; + +PROCEDURE DO_VERIFY_BOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 0; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_VERIFY_EOL USES GV,DO_VERIFY; + VERIFYEOL[0] = 1; + CALL DO_VERIFY; +ENDPROC; + +PROCEDURE DO_PROGRAM_RLOCK USES GV,DO_EXIT,POLL_PROGRAM; + DATAINDEX = 0; + INTEGER IREPEAT_2; + FOR IREPEAT_2 = NUMBEROFSDTILES - 1 TO 0 STEP -1; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, RLOCK[(DATAINDEX+25)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT IREPEAT_2; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8c; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO Label_95; + STATUS = 10; + PRINT "Failed to enable FPGA Array."; + UNIQUEEXITCODE = 32862; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + Label_95: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DO_DISABLE_RLOCK USES GV,DO_EXIT,POLL_PROGRAM; + DATAINDEX = 0; + INTEGER IREPEAT_3; + FOR IREPEAT_3 = NUMBEROFSDTILES - 1 TO 0 STEP -1; + FOR I = 1 TO 8; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $89; + DRSCAN 26, $0000000; + WAIT IDLE, 3 CYCLES; + DATAINDEX = (DATAINDEX+26); + NEXT I; + NEXT IREPEAT_3; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $8c; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO FABRIC_ENABLED; + STATUS = 10; + PRINT "Failed to disable FPGA Array."; + UNIQUEEXITCODE = 32917; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FABRIC_ENABLED: + LABEL_SEPARATOR = 0; +ENDPROC; + +PROCEDURE DISABLE_RLOCK_AND_VERIFY USES DO_VERIFY_DISABLE_RLOCK,DO_DISABLE_RLOCK; + CALL DO_DISABLE_RLOCK; + CALL DO_VERIFY_DISABLE_RLOCK; +ENDPROC; + +PROCEDURE DO_VERIFY_FROM USES FROM_V,GV,DO_EXIT; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $c0; + WAIT IDLE, 1 CYCLES; + DATAINDEX = 0; + PRINT "Verify FlashROM ..."; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO SKIPFROMVRYROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9c; + DRSCAN 128, FROMSTREAM[(DATAINDEX+127)..DATAINDEX]; + WAIT IDLE, 3 CYCLES; + WAIT IDLE, 138 USEC; + DRSCAN 128, $00000000000000000000000000000000,COMPARE $00000000000000000000000000000003 + ,$00000000000000000000000000000003,PASS; + IF ( ! (PASS==0) ) THEN GOTO FROMVERIFYOK; + STATUS = 11; + PRINT "Failed to verify FlashROM at row ",(FROMROWNUMBER-1); + UNIQUEEXITCODE = 32864; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMVERIFYOK: + DATAINDEX = (DATAINDEX+128); + SKIPFROMVRYROW: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; + PRINT " Verify FlashROM -- pass"; +ENDPROC; + +PROCEDURE DO_PROGRAM_FROM USES FROM_V,GV,DO_EXIT,POLL_PROGRAM; + PRINT "Program FlashROM ..."; + DATAINDEX = 0; + FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1; + IF ( ! (FROMADDRESSMASK[(FROMROWNUMBER-1)]==1) ) THEN GOTO SKIPFROMPRGROW; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9f; + DRSCAN 3, BOOL((FROMROWNUMBER-1)); + WAIT IDLE, 1 CYCLES; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $9b; + DRSCAN 128, FROMSTREAM[(DATAINDEX+127)..DATAINDEX]; + WAIT IDLE, 5 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO FROMPROGRAM_OK1; + STATUS = 10; + PRINT "Failed to program FlashROM"; + UNIQUEEXITCODE = 32866; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + FROMPROGRAM_OK1: + DATAINDEX = (DATAINDEX+128); + SKIPFROMPRGROW: + LABEL_SEPARATOR = 0; + NEXT FROMROWNUMBER; +ENDPROC; + +PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY; + WAIT RESET, 5 CYCLES; + CALL READ_IDCODE_ONLY; + EXIT 0; +ENDPROC; + +PROCEDURE DO_PROGRAM_SILSIG USES GV,DO_EXIT,DO_READ_SECURITY,POLL_PROGRAM; + CALL DO_READ_SECURITY; + SECREG[43..12] = SILSIG[31..0]; + SECREG[ULOPT1_BITLOCATION] = ULOPT[1]; + SECREG[ULOPT0_BITLOCATION] = ULOPT[0]; + SECREG[ULUWE_BITLOCATION] = ULUWE; + SECREG[ULARE_BITLOCATION] = ULARE; + SECREG[ULUPC_BITLOCATION] = ULUPC; + SECREG[ULUFE_BITLOCATION] = ULUFE; + SECREG[ULUFP_BITLOCATION] = ULUFP; + SECREG[ULUFJ_BITLOCATION] = ULUFJ; + SECREG[ULFLR_BITLOCATION] = ULFLR; + SECREG[ULULR_BITLOCATION] = ULULR; + SECREG[ULAWE_BITLOCATION] = ULAWE; + SECREG[ULARD_BITLOCATION] = ULARD; + IRSTOP IRPAUSE; + DRSTOP DRPAUSE; + IRSCAN 8, $a3; + DRSCAN 44, SECREG[]; + WAIT IDLE, 3 CYCLES; + CALL POLL_PROGRAM; + IF ( ! (PASS==0) ) THEN GOTO SILSIGPRG_OK; + STATUS = 14; + PRINT "Failed to program Silicon Signature"; + UNIQUEEXITCODE = 32867; + BUFF128[15..0] = BOOL(UNIQUEEXITCODE); + EXPORT "ERROR_CODE", BUFF128[15..0]; + CALL DO_EXIT; + SILSIGPRG_OK: + LABEL_SEPARATOR = 0; +ENDPROC; + + +CRC 18B2; |
