aboutsummaryrefslogtreecommitdiff
path: root/testing/DMAppFpgaProg/fpga_data
diff options
context:
space:
mode:
Diffstat (limited to 'testing/DMAppFpgaProg/fpga_data')
-rw-r--r--testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.datbin0 -> 360 bytes
-rw-r--r--testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.stp1401
-rw-r--r--testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.datbin0 -> 239535 bytes
-rw-r--r--testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.stp1791
-rw-r--r--testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.datbin0 -> 239682 bytes
-rw-r--r--testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.stp2098
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
new file mode 100644
index 0000000..cebbd27
--- /dev/null
+++ b/testing/DMAppFpgaProg/fpga_data/FlashRom1kbitPattern01_80 - 2018-07-27.dat
Binary files differ
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
new file mode 100644
index 0000000..9533d10
--- /dev/null
+++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR.dat
Binary files differ
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
new file mode 100644
index 0000000..3574c8a
--- /dev/null
+++ b/testing/DMAppFpgaProg/fpga_data/TutorKit1FlashRom1_v1004_Top - 2018-05-28_ARR_FROM.dat
Binary files differ
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;