--- /dev/null
+NOTE "CREATOR" "Designer Version: 9.1.0.18";
+NOTE "CAPTURE" "9.1.0.18";
+NOTE "DEVICE" "AGL250V2";
+NOTE "PACKAGE" "AGL250V2-vq100";
+NOTE "DATE" "2013/07/12";
+NOTE "TIME" "00:49:40";
+NOTE "STAPL_VERSION" "JESD71";
+NOTE "VENDOR" "Actel Corporation";
+NOTE "IDCODE" "03A141CF";
+NOTE "IDMASK" "06FFFFFF";
+NOTE "DESIGN" "prodlex";
+NOTE "DESIGN_DIRECTORY" "/home/marek/astro/pwccd/prodlex/";
+NOTE "CHECKSUM" "1643";
+NOTE "SECURITY" "Disable";
+NOTE "ALG_VERSION" "20";
+NOTE "MAP_VERSION" "1";
+NOTE "TOOL_VERSION" "1";
+NOTE "MAX_FREQ" "10000000";
+NOTE "SILSIG" "00000000";
+NOTE "TRACKING_SAR" "76713";
+NOTE "SPEED_GRAD" "STD";
+NOTE "TEMP_GRAD" "COM";
+
+ACTION PROGRAM =
+ VERIFY_IDCODE,
+ SET_PRG_ARRAY,
+ W_INITIALIZE,
+ DO_ERASE,
+ DO_PROGRAM,
+ DO_VERIFY_BOL,
+ DO_PROGRAM_RLOCK,
+ DO_VERIFY_PGM_RLOCK,
+ DO_EXIT;
+ACTION PROGRAM_ARRAY =
+ VERIFY_IDCODE,
+ SET_PRG_ARRAY,
+ AW_INITIALIZE,
+ DO_ERASE_ARRAY,
+ DO_PROGRAM,
+ DO_VERIFY_BOL,
+ DO_PROGRAM_RLOCK,
+ DO_VERIFY_PGM_RLOCK,
+ DO_EXIT;
+ACTION ERASE_ARRAY =
+ VERIFY_IDCODE,
+ AW_INITIALIZE,
+ DO_ERASE_ARRAY_ONLY,
+ 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_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 IAP=5;
+ 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 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 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] = $0102041d3fb266e98f;
+ 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 SCULPTORMAJORBASE =4;
+ INTEGER SCULPTORMINORBASE =50;
+ INTEGER PLAYER_VERSION_VARIABLE =0;
+ INTEGER SCULPTOR_MAJOR_BASE =4;
+ INTEGER SCULPTOR_MINOR_BASE =50;
+ BOOLEAN ACT_UROW_PROGRAM_SW[4] = $2;
+ 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] = $03a141cf;
+ BOOLEAN IDMASK[32] = $06ffffff;
+ 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@N3W960002gx2baaannTXIIIoUuke6WE2UKzWJ_Fua@3UKvQ0C8GZ32Q0j
+ W7@Fun@3Uy@10_FWc@3Uy@W7@Fun@3Uy@mm_FqW@3ev@W7@Fu4v2Uy@W7@Fua@3Uy@0Dk8e1
+ qajjjP0000qsscj0000GRRss0000ajPRx0e6040ijjP300e602k9a0jjjDr0CId0Am100eJ0
+ 2ORRR3999HkjjDZaa49qssi5IIaaQRpsE9HIIORD058sssk6058sssgHIIg6WGw4e1YjjjT2
+ GWjjjDdaaaWsssiJIIYKRRx9W3Ocaa8njjLRbaKD04OXaa49sssj0BK3G7T2CHD040000m99
+ 994000Waaa8500IYy0G999I400_PyWp3F0IIIIVaAK3W6T2OX4_@V@399II_@z@da899_t@@
+ RYaa4U@@@FIIIIg181FIIIr0G0IIIIm@@@U899h1WaE1Qm799v714esss_n13kVW0ijjjA00
+ 00rssgL00e6056UW0ijjjj5GWjjjbQ0CfJW6g1WW10_lnn@BmfkW7@Fun@3Uy@0qY4300Gz9
+ @F0WDn9WMOB26Ws@1F_VmZ@7yu@1dyVm9@F006nMG5MIIoW7@FunXw4uWW73hJW32Uy@W7@V
+ 0W@3ev@WjEFun@3Uy@0qkEua@3X@@0Q_Fun@3Uy@W7@F6663Ev@WJsCs2q2Uy@W7@Fun@3Uy
+ @10_FWc@3Uy@W7@Fun@3Uy@mm_FqW@3ev@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@3Uy@10_FW
+ c@3Uy@W7@Fun@3Uy@mm_FqW@3ev@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@3Uy@10_FWc@3Uy@
+ W7@F0j@3Uy@mm_FqW@3Uy@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@3Uy@10_FOh@3Uy@W7@F0j
+ @3Uy@mm_FqW@3Uy@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@3Uy@10_FOh@3Uy@W7@F0j@3Uy@m
+ m_FqW@3Uy@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@70u@10_FOh@3Uy@W7@F0j@3Uy@mm_F0j@
+ 3Uy@WJ_Fun@3Uy@WJ_Fun@3Uy@W7@Fun@70u@W7@FOh@3Uy@W7@F0j@JgpoI5SAQWc2Gx@0Q
+ _lJWQ80004yu@1Fw9899nW7@FuHF11004So@1Fw9199nW7@Fun@3Uy@W7@V0W@3Uy@W7@Fun
+ @3Uy@W7@Fu4t3Du@0Q_F7r43Ev@W7d9EE32Uy@W7tCua@3UCqOBYAun@3Uy@W7@Fun@70u@0
+ Q_Fun@3Uy@W7@Fun@33x@G3_FWc@3Ev@W7@Fun@3Ev@W7@FQ0eg1mWW75Z000GmZ@7yu@1F_
+ @00@7yu@1F_VmZu0G008un@3Uy@8l_2G00Gm9@76s@1qyVmZ@7yu@1F_VmZ@7So@1FYUW6D4
+ dGPW000AP4262001FA5JRRR88991FAcbjjjI6FGJIIQmZA0IIICuHd01004yOPU@@@1D99Lo
+ O3Wx@@3UaBfjjT1FQTWOJ7Ws@1F_VJMe4yuHH3eGmZ@7yu@HUDSorH46s@X6m@BGA5yu@1dy
+ VmZb8B99ewj44Waa4yOMoII2aWaaL3m14aai2UiCG000nmW6400WWmeAib@3UKq0DO8uHkY6
+ 8iW7r6aaaWosssW7nomsscJIIIGPRR1FgWSQRxW7n2Y00GmZVvy@@7aaa4v_@@W7@2200GmZ
+ A01000RRRh210WW73E26gY6Wlh1M3800G0Db5DWI1FkVaNN5x7Qr0GGh2A5yu@1FoSiAh5Yu
+ @X6yV0D37ODQvUSGGgJ4S2M@9SKmZ3A8998Ek92UKge1i8unlY@LuWJ_Fu4bYxfdW7tGIIIW
+ caaiAAEWbaaLmZOL3G3H3GLG3e1B00Gsssc1D00GVRRsY60APa06300Wajj3Uy96sssNBI0q
+ ss82II22QRR1099HbjjLdbaKmZFPPRRpX8998WjDx0aa8LmsiDAJYayOpscXPmZG1000mf99
+ 94800Wmaa85400GQIMoO1caa43Uq9t_@@WWaa8V_@xpOIY4B@l@D8fW7B0IIIImZE1400GTj
+ jDX6000ossi33000NQ7yO1assM3Uit0aGBYiV3E0lOO4BgTtILVoW7TAQ032Uigmmc8uHnk2
+ mWI6Z2W00GmZlLEm51ejKFx94vrmTptGmMzsZh27quLq06KG01H3eKe1UC4W1nMGKmZddDJQ
+ 14OG44J4Ohj2400g1mXAQI8uHfgUZ110991FArL064y812IIog1G1QIIY1FQRJBaD0W28a00
+ 2Uy@WJ8QZAW2Uq3899PoIII2Uiie1sAeXr2Ua0400qyjjj0300WssscX2008BRxW7VYbjjTm
+ Z70GIIG3RRB8899gbjjwaba2Uy93QRRED9915ijPdWa4f6scjHGIaaZRssC83USAddaa1FIW
+ YaaK8000bCU0D99nW7ho_@@9KII27@@@C9993Ua019991Fw4q000rqss4O000OPRpEe0eaH2
+ 2Ua0JRRh1Fcy00D7VrM7RrGTWLLI25H3CKNAQWG008kdcJZ4jWkHBwcoo9u0G000310HCPH5
+ yOPbA4HiIKLtm5xkPGmZp66cRXm@Vd0vqweN1F_VcmDLr01Z0aGmZp22008mM5EW6YW7nI2I
+ IIrR94yuJbobHmZtMJr6XjyVm9kZaaa4199Pi5Y5enQn9K6W000vRRR6400APa08000eijjB
+ PyWW7TYjjjzrY4WjjD2aaaWIssMmGIIbCI0JIIYW7Zo1899eYjjI69WdjjzJ06mC999uHfSG
+ II2X00ean3asaaKoe11F_aN@@VmIIIaZ@@BPy06Waa1FIGZZc4yuAG200KPRRJ0100WljDx0
+ 200mqsbCUGmZ47t3430ORlDXjh550900Y68B1001H3qKmM@5dW3h9SLRwH4qWMbBvGq0C4yu
+ jx4yGO3A4lOKr0KMr1AiDnH1evHaNbTYLP40003sAko18Q7XBkJv0200017aG0DM5s23H3GK
+ 0Q@7r1K1FMNm9UXG10uFXb2iTbWJY2199P9ZA80999unjG0II6KdOG2002UKkGGAhk9b2Ev@
+ e1Q2D99PyYbL305Waai2UiA4001n946W100PRRR6Y100jbjPB20ean2W00GgljjBuHdOJRR3
+ 189HkXjDZ0b49assi5GIaaQJpsE98uHeCajjv4aa4KwscTGIIaAJRs6f9N7W0cD891F2b00u
+ 49992800GacaaY000ean388996yeJkn@@1999Hsz@td4a49sx@I698uH2abaa4yeJG000APy
+ 0TjjT0400mdssg0200KARRmZ4lskRpAnsbNKTH655AG5010W0rRUDEq600DX0001EXMmZcj4
+ G6bb95A00WW7Hx04b2GRb5iC8ohgw9ygMXhBu4p4000y_Q2Bamb00WWVPZ80j@3ePbuuIEtZ
+ 3E1QYWJMAo23YX1jW6k8uHigUJ1oIIY1F65IGIo8y43G00Gr1K44Y1nmaR11EiT2G1deE210
+ We1_2f99PmZv5D0L1FY6e000vRRR6400APa08600eijj3UaWN_C8unbOQRR3189HEijDZWa4
+ 9KYsi56GaaQ3psED8unfS0JI2gPRhaH2O1RR3f89HEXjDpaaaW7boH9994I0WI690210Wqca
+ 41W00WIII2Uy9lw@@Wbaa87v@No81kp@@P8II2kv@tF99PmZIfoqs_n12qtss1P000JQRh2f
+ 00Gjjj1FISFC7yy8PH38MqDD4luL3086G00WW7b3210GREbD3a2h4XL7ICqD012200I6ege1
+ i8m9dYmhC0200v4SGF0J4lOKrtZMmMN4RXJ2P00GW004zvO2000O000CZbOX8omn9S5Y84XX
+ j6900Wmmsw2F5Y6edWxtN600Gq0ED144B_SG0DK9G20uMWB2ijgmLs9uHLw5uW70A0G00GmZ
+ P1B99ewD3o@Y02IIM0aa43UKA999AoII2aWaa5D041rvKr1G0G20866h8000StrP82200e00
+ 4i5IX6S1900001101daMo9AL9W682002TgX4DM8QWZgeG1199PLKOW0aa4P9891FkRG3Cq@B
+ Hn9G14000PRRR1FI0xRRB0600bCI0A00IjijT1Fw4RRRR8899ofijtHa0bfjjW4aaesosgJY
+ IAundiajjvWca4KcscTIGIaQ3Rs6D8HIknPRp4CuneAPq01008IHII10008D999uH28D996y
+ eJk@@@BPa0_@@d8A99yd@@pWaaCuH2aWaa4yeJbCIWqsM0O00WQPRxW800WfjjL1400esqsW
+ 7FU00g3oIm232AWgc2s2bTT0AU1KMyvi7ysg4BD2U4sU5fg6WDE8mY0quAEXj8004SRX5HjN
+ rn5lLqYRXXHLiVeLG05H3qJ4hN4y8vn@mxQ6HW10082232UyhWKlga47M2WXWJMganB8B996
+ yOLr001C99nW73B8ej211wWJ_FuHT4aa4KHH31FESG3XLoe20400APa0800alyPGmZE1989H
+ kbjT9ZBOQRx4599HmZEPBRRp9D99ezjjI6HOTW2Ocaa4yeLG00GAPK1800Kaaa43Uq9@z@@W
+ qaa8@z@No81_x@@BPa0p@@FIJII2UigI6b8un@70upyRMBW6iECGfWjWCu7lIJkXW7tgnW9Y
+ zBge1YupuU2USmQ08BunqYACZW7dDGm32KVjW7TR9W32Uy@W7jd000KmZrX0008uHn2Enh62
+ i8uHfWaa4Kzc2qaaiYZpWW753aaaOmZv62oq1dyVmZ690999un@3rnaI6Z0100PmZHncssU7
+ H22UiXI6D8uHfAPK2c9891FQ50004f99fbCoGmZFLoe28899APy0x@@FDEQImZlejj50200O
+ mZ@F0m@1qyVSFd6rEQ1EXMaNe5yu@1FgKaN@666rv_HM8lezMCQ1qyVmZ75So@T2K2IJIoI6
+ j8uniaWaa5KdNL7GGOjM4yu@1F_VmZS5lOO1F2T9Z6u0000qssMZZnK3m5T2q0500WQ08Wjj
+ jDbWaaW79WWaaaMsssI6DGZqaKmZuG999PkH28999L3G3sossoQa0ossAbCQWaaa4rcssCJI
+ I2U4dQ0IeJ02iaaaesssEuH5m0100cqa4v00G9Z4e1000GIIYa10WW7n130008IIoE1QGI@y
+ l@ba49P@_1FI0f_@V@NIIaa_zz@B9HIo_FuHRw4WWW7BeJW3m@@@xXaa4P0000gzjW790ejj
+ DR1200ussiD122UKeE1800000tsssmA98unuAluWleEAm903Z9kDr9G000m6yNLQW3HFrHmM
+ @F0W8G000g48gobee7032SYeo2Q8un@3Gx@xHmuq4i2s2Q20011dOzM3X5W6mryemnHASkd5
+ 1FsBG00WWWsAuaoAPi19899LlH0899hW7Fg6032gR3QIIY1FML0qC7Cy@1dSKK7NLHH31QSG
+ mZ@7dG90140ibjjLoe2eljj9G000msscT00GmZrORRRBun9OdbDORab09vsciDIIaaORssM8
+ GQIg1RRR4859HmZt0999HkjjTD0HOVBRhaH3iIIIYC3Ros989IgrDORca1F_ZLIIIaRRRTHM
+ GmZ9uqacian2e9vW000IWaaq0100eW712C99PmZEu@l@74aW4xx@V@IIGa_xlzVP9HI_v7@l
+ aKmZ@uNIIYq@@VmZC080kvn1280WjPRRW080uI9Z480esclj2GmZyK3m11FkG0835qj@LEXG
+ xYWjg41zC0Mr044DWI1DOOS2Yz115TGCLvIE4D031EPRE174qG3RePGmZq6oG11ss0W40WOC
+ DDQ0Akyp04G00pbcr0078G000W0Gm90DKYNL58aGl0A82008uaj44004SIPH3eKlDSyeYP80
+ 000240Ce2In9e1A00WJ6b88el2UKhlHE8uHowIWW3GIAuHHoWm00A001d45omIoI69mKIIW4
+ aaC9BA9K2II4a4a4y8Innf0omIIaWWaGPB9H00IYiab59A1HGTN90028un@70me7lqgwW501
+ 0080008w6WYJ8aqMG8rWV2UK3aaaaLKGWabaaW7t2899Pq08GGIK2aa44099hE169uHQwkJC
+ 8809tGL0220000W4e11004002aW4e6W8G220K3W60000h184IG20020W8O110030W4iW0001
+ 002QG4001g1u1yW00r0e1m00mQ0010W1WijbD30W0Wssoi50000QRts6001WiDVR70XLQJD0
+ 60QRRhJW2qss6000WCiI3Wa4b4MP1O9XsAci0gjDjw4aW2h49gjjjwaaa2ha0daaaWsssiJI
+ IYKJRos891IobDORcb09nj3hqcE1KOTW602G0uaac42000GIIJa2000899GI0100ea4892GO
+ bvq9G1aaK022eWW79WaaaWl@yVGI2Ia@@@z991HYt@t@caC9XtVz@JIiaa@3hqcQ0CmdaaKD
+ 04maaa4y@@lFIIoV88GjjfTOb5OQxW080mcjijWmA9Wij2GOb@C911ORRRL0004MP130y@00
+ v02008rD3_RoXGtYg5_s25bwEubBSlhAaAYe1I8aAdgggZW6Y280WGh570e008QDiUvuYw7B
+ BqjgQ8mYs26BRZeIroWW2OOUl2m0004S2LH30nd1zi7063jOmSjDS2YKn9KG1144DWIR88oy
+ P7awMMX64H0DR5D0P5qCtRbC4MfKxbsKS2L0402e6W4cqWWG388iofAcK1889PoIIIYmZ0II
+ IMWaa43hqfb08e603aWca9B89X2GIID04GGIICiIU78o1G00G8010YZageEM8SYhAOjWm_t_
+ t0Y2hKZOBA8io2Wa4a8819H6I2Ii5F144ai605YnShqBC8eXoAPyYW7TYjiizrY44y81bCQ0
+ JJIDRRRd8e892Uq9RRPRbCMWts99IIgDQQRa899vgCiDZaaaOmZELo81QQI40W0W4yu1bCYG
+ mZFv@l@7aWW4v@l@W79mVV@V9Z4uU_@fnHJ2Ua511GjbCc0011WI6BG0GjDRR5WW7@FX98BT
+ Sic4QBOBqoTOjICFegXV50G04EUpzA6LD0z5kN21fkN44Fztr1@0O0500WGuLUw2ZYzJmeSN
+ EOOpdHqeSF4Pn732UChDTCAOuO2UiggtU8uHeAb3ZWwaAunq66Vh8mrEuadZj0j0DMBe1pG0
+ 0Pp_s60G10DRPRB0010ejbjBPa0jljT1F_4qs69AIIkQHRZ8L89ejaj5aYb4rMsMTIGI1F2b
+ GRx4989qCajT2Ua0ijDIaaaSLqscH2IICund400de19H0G00YacaK0010IIRIAPa0IHIY1F_
+ 4y@7IWbayUq@FH2IIuFt@d9189ul@V@aea1F2590eMjij0W200rcss1G900RRQh2W10Gjbj1
+ F2LyzUC00kHcdG@lAbHs78200cyAha6GBmMpg1OXNxDAQWCYJ8X@ybAEev40104yu@r0uPr1
+ 44uMJn9Knb5541nOdPOnjNLjAG38000W0000K008Q0g23Zj1y8O8c4YzZg22E8QW62GZvi92
+ AGmOY_CtQ06BU430200SPX2hM0KmZz119B9uHt4aaa5yeOJWOHGGHD0mOX9tMm9oD23H1FEe
+ qaaWW7BJ2IIGD04GGIKAunp2Q8B10Gsajj1110GNou1URR3W00G_od11Fo4ss6DUGIEQBRZ0
+ 199eiijjaH2CijTYWca8uHdCDbjvaaa4K6scTMGIawJRs698HIkbHRpaCuHgqaa8Ko81qaK4
+ 00091JI200005f99nW7TozS@F8199ozy@_aaW8nz@xVJ6YamVF@@9XW7X2230WQJRR20X0bC
+ I00500ibjjA0Y00rss6y8K30ut5mgD0mK7MFHaNLjFo130CsIbErCZ68400YxfvFBM8ZJj40
+ 20KT02H3KGU6A4uaJ1ePsA07CKG5nB6LDQeLT02XxrLq07Sdo4HGuqDk70840OPZoguLXOLc
+ eYYbYJuWG36wG0CaW0043ZP4W00YKnidUGB662wVGf0R@x147ccMB14W01d8MB344Ci10X00
+ Y@zBG001f9emI0C4y8JbCI08HPfgtAG2IIImZS188HnIIIGmZb50zPX82tgI65OxZ1F2C2II
+ oWKl8uHdY6G119991FYMG3PH00odjjDO9Z601000bjjT9Z74yuJQRR4819vejiD2qaaWoosM
+ m2IIKRPRr99D5yuJ6sosSKGI6y81IIIIvBRR39D9HkjfTmZJ100Eean3e9f0G00IhaH32UCA
+ @tz@Wbaa8tx@7y81_d@@PGJI2k@zFunf000Lgjj58uH30W00WffjDuHg33hi10wzAEZA9Xc1
+ 52AOh0tQGlc7fAGGAY6mW0dYAeXoYdtiQ0KhwW52UqB4201H30n40641nJLxnmV@54r_Lb_1
+ nv9QLTW34000k6edW7pefolY6GX22884Ho2Uaj0qCU0Wr4G004S2RG000UWsWL888kqU2irZ
+ OBEeX862Uy9199gnBoW0aaaW7lYaeiKq058189f6W3C9996yu@zT1IDB54rXOH3OGmZA3210
+ e605EGxeW7398L82UKA8991HIwLCCfP00ocijD0000QstsM0800GxRRp0C00ajiTmZGXjjHY
+ Xaahsss8GII2A3RR1889HbXjLd4bKmZFPRORp9H9PmZ48199bEijDaea4vMts1FEb00u4D99
+ Y020GaWaaY100GIOIImZLvU_@7aWa4P_zVVIMIaOU@zl93HIuls@@aGmZG1W100jfjD1W000
+ _wsi3G100RPpsY000GjPmZ0@fIRnAzLkAHCDGM1RL04000G000lLsLiI5Cha102002D0eWJe
+ eo02W004S3L3H3GLJTKaKNM30K0H00WTHzgSf3YJuWr3C0O00GmZwMJ75P1KGmZ17KtTHGm4
+ G00020000100ozxWl25BGTZhMOYuHgI004G11G4fYNd9JMmzAF0mQ2400YMyYWJmw442ACUe
+ W7zeUY92Uy9999A22I2iaaa9919XIQIYW4aaW7jA2F8Y68XW7xjoBl6VmW22GORIZ2UiY0QW
+ U5W2Y6GiAAEGMIIGyYUj401H3GMG3e1G00G__sc111WI6902300ABRR6G00bCIGmZEncss6I
+ IIYSAQR61191FI0OH9fI6F8uHdC5jjvWWaCuH2acaaoNts_903OcWa4y8K00W34aa80000HQ
+ IIA0000ff9920200baa4yuJ_@@@1BB9Hkd@td4aK9Z4mWWa4yh@lVIIoW7V2220WABRR2W10
+ 0ifjlVW0CDjjbCQGmZ@E0Wq4400AXXB0104PAHq00Z0202ea49AFXdWjs8_xU2swndxHBmfr
+ 2U4kd2C84W4Y9Bgw7HBag5YJeh8lIBg336s8ivCygwL5YzpCH00033VMKXD7yu@HJhK8194y
+ eK7YgGuh35yuA1d45GIGoI6j8unfmaae4DW51rj4W00WW7VBagnA8eW89LAua@3UaA19911F
+ _LD0J4awLn9K6a008PxRR6040APi0304jARR3000M6yOKijjDXWaa8NcscGIGY4A1Rs29AbC
+ IWC9992ORR1Foa5fj570aaaQosiJIIYMRPpc8D9ImfDR3ca89mj3Ui9G000E989XG00Waia4
+ f0900IppW790LIIImZFvq@@7aiaavT_VRQIIaut_zh11HIuUt@va49fv@W7R2G200QBRR000
+ 08iljP6I208sacj5200aQxW7@V_NK60eDW080V6mLf19iYOJ1qu7100WE3KgreLkqlgU6EhS
+ f3Y6OYW79hEXTQdofQ0oC6prYygv10IBuHqsRHXSoCOT4jA8uWe1EAq0EwwthW7@V00V4800
+ C0m2A0002Enhmz2haa921uWWJM2999foIIoWwk8uHcaWaaK301WaWaYmhhgTegJWO21fgTjQ
+ ethU2Uy@W7fgYY38B9ALH11A9B93USAabaaH38Mr1H4OxL0I00bjjj90G00sssM9Z7u0400b
+ jjzBV4eRRRp400GZZ480000ijjTmZzOBac49xsajDI0aaGBbCQWfjDI4aa0l9QWGRRR6899I
+ WjjPBba4y8FscssS2GI2Q9RpE9B92jfDRWqc81toijOIYa4rcjj5Yaa4uW7F2010eJIIIA00
+ 0bCI0W00Wo6D0KIIYK10004IIDEk0caaaW7tnly@78999ml@@kaca8nF@No81Y@@@jJIIYW@
+ @t@KIYa4@@67H0899PmZx0010Kjjjzl94ejjj3m004sasM4000mQRRrR000WORRu1440000j
+ jjDun@7bConqejjd22ePie1CuyicY6GZXoCxxXp4010KDm1XY2HmZa5mfP1FoSv415d06200
+ 2290YrFD8un@FEHaO@O3W00oMKASyuL54OGq085Ws@j5ir9US1e088OOC2iLC01041FIMqDI
+ X4aaiaHB2U4gIvM0H99PD08GGIICekegEmWOwM8_W4YXfgLptgM3JoUCcWJcVfXY2UK4IIgI
+ nbULD0P4aARn9i40100PVRR6W10WjrjPBW300qocjD0200PFssk0oQiWW7FenHB2US5smssG
+ 2IIaRORp8H9H2jeDRXC49XsoijJooQ41Xsssl9I0ssss67X8uHNiXjjv4ca4qgscPIGI4QFR
+ s298N7W0c989ITRR3Uq1C9991Fs30E1fI6BGAIIQ9Z4OII2040W5X99n67RG000GZZD4yOC_
+ p@@1P99H_z@tb4b49_pV@R2Ia4_tz@DvGIIylnH6u@@@tuu41Fk2W200rYss4020WO3RNoO1
+ qss2G10GPHRRinn62Uy@esnerHp80000200Oue3sZ9i0dc8WcgY6GfJ4ied12Yd7XsS83O00
+ Gq07DcvCZ2yKGte58O4j6TMKxAy6s5naTpc6nKgmFtEMGmZAaemD1DKIZaC4yeOH5ULq0eLT
+ 01t2SGuh35d061qOmw8AiPG2Z1OG79911088Q0EYwWfRqEBuHdF5UhuVVewZB2UKijWw9EXA
+ 80014Tp71QGHmZoKoe12II22UKC199AIII2aWaa5D0409993UyfuKcG000GCCV5k5M4002Yu
+ csWJA7f999IGIoAASWcaaLmZKXWaai604099A5yeM01002QWC8ajjQR0008ssgji0iaH3m00
+ GgjjlhnnH2US5sssqGII2aRPRn899n2jjT9Z5OQRh4199HZZW4yeBsosoSIJI2QRRtE9992j
+ fjW7Dmcc98IGTx67v8unQAPa002IQaqK0APS1e200DEkHmZnuV@llan2ytb4898_haH3i@@@
+ 899BennH2USbI69GQRB0400GjjDT0400msssw0202MRRRmZEquO61FoVt9iij5FHIIMCDiX0
+ 088Ohc3znj593BuHpM9hWQ0Y8SlUQBuc8lYf6W@AdeZ9qe9uHGI5821000H3SHmZvsQBJXXX
+ Gg0K4qmIHTV0e00Wb0KuNWCQ3n7400W52SIJ0a411853xLylB4GpnJ27Om9Lr0n2dtyJWjbi
+ 403Hti4IGIoI6D0399PmZa81999unSY6m0989Hr0GW999eWwu8QW32USfuV3xnq66YnfW7@F
+ uaDhe8ZW7bg6W28119L3W3Gaaa2UyfWJSOtjXYJW20E26oMsMC0022QRBJM0000ezDxR0204
+ osyzT04yOJiXfXX4549tsoYHIoY5QBxW7DWDTIWaWmsH5HW1IIY4ORxW712brTYXa4QMs_EI
+ IIIPJRJ3989GkXf1pa448gjjDEI0Wjjj679mjjjTmZ01YJQYq8W00199QQA000WaW911Ko81
+ 01H0QSiWuH8efH32Uy7SVEa091vT@VVYaWWeaH2CaimR_@_HIMM2@@@VGIII4@@@RSa0_@@@
+ 1F_Z10WMfjf00G00rsqq1G1G0RPRh2888GjjiQD002UagyJ4S0WN50014UMP5yaGy87agK65
+ EGKm9B4DW117CHq0g4Gp6GG00QpfC8800javL01N0C00eDBLYQNbg1Y8Q03w5GXe1W8mfQY_
+ yii6vCuHW6Keeu4m8gG30800S404HUzKC0B0G0CeH3m2Du020W0jX9HW63z0I11DmmTBL4DG
+ Bn9WnDK6Ce21V2ymoEF1108O46BY6uct0yuw6n2xNXi1C896W2DGZDBGG400Gj13zjGCHGua
+ 000a3DOuTY5K0004S2J82022d0Xg1GeunU2UCac1G8d09Yk98aWbbA991XIGIMzM14a4b899
+ 1HGIoYaaaeIIIIXaaazmT0aaaa67X8unNW5Xa801HHIIIW4aaie1E0aaaLq060aaaCekb2WM
+ jJbeOGigGW00C0W11yTGK7P5DGJ9xgH11GyQZF1FEIS2PX4iaiYY20919HIoIEunjWbaa819
+ H9G33Y681O999H3yKr194xO2Xt8KG3L840mckjD0G02QsssU0G00HxPRp0604cjjDh20Wi69
+ m400GmZ5nIcM6IMGYSBAJ6919GejiP3qe89qccDL2WcWnst4BGejjzRY44yOGshoySIGI2QB
+ RnCf9f2jnDJX4b89NoebR6Ya4rcjj5ImZ9qu841F63G002dKaabCIWqaaG0001I2JI40002B
+ 99Hg00GZZEW9999unTyzth3IKIYyF@lF989oy_@cpaX89yoplRQYa6uVMZ8uPIIAhH20III6
+ y8F4W0Q5ss2011GKJRR50101i5jjA0W00rssgn00enn540004yOGBZeG8p@4DTE30qx2H9KV
+ 36na5qB37CDW120G001000800vWBgA9P110800004Y6mY0Qw9gT502001G040804GmMbj554
+ D4jKI2BqPm1T7HLmZDyoG3n_vKaaKyKa31DG4GG0WA1W0202GyYNDlN3@9eGq0D1Y0086Jo8
+ 0014Xd1FCCHaNFX100efzBw_pfhiRO_LcALeYu4KueRWYJWYO4Eu605W0804QmM74iGq02rN
+ n6010026eW5LqAuUq_PnYe2fgQQr0W0G4Yu7LXCK7844@BQr0SGEx44SoLO199BPa09B91II
+ Io4Wa44ye1YIIIYZZW67x8uHNmIIIYWaaCQW209P9L3018889ZmRgg3MeG59Y@zf5G_eHibA
+ 8OYdJE8W6QwheaYJwAGZoY6eCamaa8189hem04baa1fkGmZF1199f6W50YII49fLjLOGS2Y1
+ 61OGMssc1e1GHRRVo30W49zjPR3B17OsYblAWW7RYXj5D4d40v2mMCIGIiGBPI4811IefDHf
+ K0H9Zj1FY03aaa67f8uHNiciWviWC4qIcgPQHO0QEBK21D1IEqfGt0218kTmZFW9999unT00
+ 01uqaq42100GIRG6240081DHJ0000ea4Di2GZZ54221DEEHmZnur_b74a44vL@VUI8MWvdFv
+ dP1HOuqsz@a413m@i6BWu@@VZZQ4y8B0mWQqst2892GKIBI584e0iSjjA40a4rccYH00enH7
+ Wsss6yeFfDzr00o5tL3lZ@LhMCKv5N0002Yp9XuG8ur0hg5W04040bGiGq0y4GJAlgypV0fq
+ sF69DtKaNR1220uJkAYQ@cW6_uHZ6YDWdMntuLW8IqeWOoO2204Kq0EyQm2HI65200eZ2NAE
+ XAWG014ye1rCiGl184vrI7WGGRS7i7W1h6GGN3ESTHHFVI00W0WC18uF53O0004rILlFKGYA
+ 80801ehBn0800Lqn1401A2D0AG2G054WGq0A004W8Ibo03004W6Pn@gLqQeTOm2BGY5G08Ws
+ IDu_12A8A1G0201duqS65082082MA2Uag9BOeib44000CSn51d4J9Z70919GIIIciaa4A889
+ 2IMKab5aeHIIAuHcAbR1IGMMH3S06oI04a891FML148ipI31F_q4YZjRq1804GoyQfG3e8OW
+ 34080C00P54GGr0A5yOVIGIIgem1W4aa89B0Zj0gh0C0A89PD048199X2IIID040IIICGZeg
+ EWYBdw9E1A0a008RRxp0o04ijjDR1988YssiiX402ARvbl2qjjj5yu120000RRR7yuEiibiW
+ aWa8NYsaHIG84QPRo298eIji9Oa4819iDuH6msssYIIIAunTiWifvKY4aq06YPAHI4Q0Bu2X
+ CG2EWfTnG699gTmZFquO31F63G200daqWK850APi021Gocac0W19GnJoJ5000WGIIo67FG00
+ 00caaaW7tndyzFe91BmJyckaqa8nRTYNJGYWmDib@98IGm@_@VA3UC1_@@@09993US7W1aXg
+ 9jb1m640niscTG3W0OJQdMe500h9PRh1000YTuX440004yOG30aNsUPDBG5TH1Kz7C55oB37
+ P0W40Wv1C01000W14WfTY284W0200G00WGH3W000002180HuaGq0n4e_AdqqJq0O4d02ZDmG
+ BHQX044uag580104EnK1SMGq0I4u4KbXLGKxajOn5naj4010WQ0a8844Y6mfg3AuUa580004
+ fWF1ej12G0Wo1COtY3G20G41XK1FQGNkZX2028QW6800GCEWL88002GJ12W00XLwJCcLaGd5
+ 405060mfe188aAAw3Zd88gO5078800SVMMLKGnH3F4yOiVCOmk97GG00eD8gc_CXEMV8mMg4
+ 008W44W8q02gPedWJ2H120GrIJ4SoIe1983Ui00HGIaaia819AHII2204WLSS6q2611Fw4aa
+ a0f99Pr0e0898nW7jgxXa2UCa@0G8MhdsXeX22I8122QqeWmnjwM57IYQhj4QAu4H_6meW7h
+ 0IIIYaa45D991II2YaqaaKHn14Wb4Zjmfe1E02IIGD04GGIKYaa449892IGIY1FML2G7ioS1
+ 7M7KS2K0620GMssc1i30GRBxs2G080zjPR3B0QGskji3W6759unLO8QR3n19Hk1i4Z4e09qo
+ se5II4aQ8poE1HoIORZZV4yeBM2MoSIJI2Q1BoEb85JDcDPZ0a89NWifP8X04tknHE2UC6G4
+ 00ED9BXG000aqcYf0180IGIa40001AjGQY0qu871F6ZNnxVGHIQa7z@z9X82YV_J@cd49XJV
+ N_JWaWa@RSKaW7N1830WQIRR2W5i0C9TG74000M_cj5O3mWQ2sqA0DEMImZrKoUH300oCG3T
+ 9vWdfd0008mrvDO8U3cC0i0lGOQDh_BG1W100Nj7q62K4NW180D0MDWYeRW240Wqj0DiqSO4
+ 000ErvWW6cgSf5Y6mWE088QW22So910041ebsv87af31a000YB5XeslvTaF4000yhMAbAKKK
+ K9yiqDn9SXW00WQ0AuNW402004gX1HGm4200Wk4CWY00GK37aK8Knm81140e0r3BE12YWGXm
+ 1uPxbmA8ujE1m8602wjf002W07gGGfRN5S@P9vMG8CDrmG8pPGmxHQrnB2T6aGl54433F97e
+ 1200eBTMuq0W2kl200G0W002k1W10201H5A5MMIIbKaaG9P9hUZ01899LlL0GoooW7HenHD2
+ Uq5eiaa8889Z6e0GIMIWa4b89911IIoYaaaOGTH1400ewW5sPWXW7hg@X72jUAG001NZdmsD
+ 4G000eiZUEAe2200G9YcmBC7StkMnAXMq0YLHH1W4ba8911H2oIYaae09998OIIMnM4LD048
+ B9H1III0WaaieEE0aaaLK764aQLNJZGXN25d05mW00ajljPWG00qoscj0G00GPPss0M00alz
+ oN11Fw44ca4vImsCY9IWGBPJMeKHIg5CRx4W6759uHNiIijvWWa4KGsYTIJIaQ9Rs6D9HIEq
+ PRp0099kTmZD1a00m91994G08Wqqa85100GIQYa0W00G19II4WW7RoX_lF8z99o7yl_46a8n
+ H_xVJ2YamBi@@Pf67B9unL0a00esosc0B100JQRsXa08WffPRX200eocjj2GmZDTUNOnkrHO
+ OVjWeL30a0600WFOK04G0m00SjvM1p2hL0DtLfZHj58IPFQ10000e00Gp0Z59Q1L7OGq0H4u
+ KKHHvGI80rAkJr0aPSSH4X7G1S6I88AK1W1HGya800WuDD8Q058200CNQLfO2nb6Hj@k1L7G
+ mc18KMu1nZGL0460G00A64jcBm04200H3iKObg7OhQ30Cc020W32Yu2232EPfOcFutF8EUid
+ 0RzeTc92EP94baabCM0988fgtGGmIIIGT74yuI8A99H2IIM3G1amiaY681GIIY1rv4G00Wg3
+ A8hdA2UigZm831W0Gr94Shr1XwSL3yRLGW6HDSm3Qz4ua8LyQKmZNWWaaiYY888996yeKIII
+ KWaa4K3m31FALr14Cc01h9KGCU45d05Go00ajjjPG300qotkj0C02GRPssGQ02ajOBx08unc
+ OBQR3119HEXjDZWW49qYse5IG4aQ9poE1JoIORmZDP1PRp1499e0i9xKo48rIsaDQPYaS9p_
+ cXGmZG1W20m99994320Wag485110GoJYa0408G9FIJ4WW7Roju@Fe999onx@_aea9nPyhVJG
+ Yambjl@f1IGo@1Fwa00eMfjj0s040bWss18100JIRh2a00GDfD1F_K3HgDEoIH3GuRbh55o4
+ N2MLyLgL3m301042s2iP6AOpqhoD7XThr8gTaodVXe1O8unj6MoW88gIW20G9ZvL1X1H3m44
+ 00020011QGMT34KHb5HG450X0WMP7xsH72ibu10MW400Ge1b5DmG1F2f000W8Vw9uU_61oXF
+ YwQN02G000qfY2T3aGWjLzqn16000YJugW7F8u4lG2IIgaiaCEE7099P5yOKB1GGGT68D99h
+ 60208915KtLLkeHmZsM4n1RvYGm9I7iLQ1FQL55A8P9998r62Uq9acaaH3e05aaae1gwO222
+ sQYW6eIsosc1a00GBRxs2o080jjPR3108GsMmZGnoss62HIYSBRR69891FYWijiJKai41F_4
+ RRxKD99qajfTKW4aoIso62GIYS0RVcXD91F2b00uKB992200Gaa4a2W00eaH2018GHJIJCuH
+ dyZ@@32IIYye@lF99PIyc@wtaa89ShxxV2AuHe0M00ecqsc09020JRRs140bCIW2D0WW7tT0
+ WfNypXJ@eA8A3Y2fXhesAun6Y6Oe0QuO2J6YP6hu4GBgTr2SgiQ0EOpQbApH418001FgLDtQ
+ 49PK1FcseiMqMGLt9qmHM2MgmH0Y002D8emmKF0j@ZJmpES5BE1tYAiiW79mIIYIrR68199X
+ IMIIrR4GMIICund2gZXQ0O8uHVl1G14W00xNT5W00WWJ_FuHKbcaa4R1Mr0aHW6I5dGPWJ00
+ abjzP0G0gaH20204W_sMcX10G9Z44yeJCijjXiaa8NcsaHQG24QORo219oIDiPRdWque81Fw
+ YrjDDd0aWWMoMiJJIYK3Rpt8i9IorDRR6a1F6500uS9982010Gqaaa2818G2IIZ0400G9991
+ F_aVx@VGGIMalxVz989HYFxt_cb41XZV@@JIDEMImZh0008GDjjD12000c_si3A000BIpq20
+ eaH22Uy@10E9CE760OgMXDO00nY6uWkTCOpD2UaqgIIM810280004DmG1RT_jqEK5p130Cb0
+ 10Wg3M8Q062SAg8ZBBcCqg1GXrEW80jj27Vhw68uV4BYyAhTK5kKX8_jOe31muebkY6eX0q_
+ F_tSYJGPG0001FA7820004021F_r9lJ4SoI8899BPa089911FI089H9IIIGcaaiO9996yeJN
+ 1GWWa459991IJIo2gZB20G01FkM88kT1X2V6tGK7HTQjI548IWwV5yORnMirL064yeo0G00A
+ Py0stsMW800APa0G00aQPRx2Uq9MsssbCk0ij5IWaaQMssEHMII4yeJssssSQGI2Q3RpE989
+ IDbDRZWc89NsijPI6yuKED99BPa09A9f0G00APy0IJIY1Fwa@x@VGGIIbCI0oII2lp@@bCQW
+ VQGoW7V2800GmZ40200KBRR78400iDjjA0200rcs6yOkxf4s00M7j31jsmmrQRX0W88WcwgX
+ 0eMMAH000G15O5XqP2W002S2jQ08eeG4QJGeW7JCu_@ZQldW7XE4n@3k@@u4OEt32MQnYWJ6
+ EAt62EP9aWaWbCgW4aaauuQ8unbYm3jOOUhmuZ2EP@W7dcWaaLi5H5enQXJWM9ZN4yeJbCgH
+ mZHLou41FML9ZM4y8KbCMXVIIoW7VganC2UCt10_Fn9XsXViIIM8QWX2swy62GhSf3Y6OYW7
+ hAoBoUAuYOoYg_Hq2UCw10UkwW5k0mWx3wPF0CEQfhe1Q8un@3e9820001FQSWjb5EnP1dKM
+ 9Z70999ewD2099A5yuM2IIK2USw0R@Fms@ZN4jW7b6GPRR9ZGGG9RBuHfi8IIkZ814IIIAPC
+ 1qq99222R3Uy9jSIIbC2Xi8JIa4us1Fw4W0uaI6H0j00G9Z60GeaCuneyx@GMo824u@lTl99
+ HIu@tVzaKmZI1YQRps30008ijI6NWKRRRmZ@F00b0100ISIl0Q_Fun@3UyuQ0AEEXOw20aW7
+ x7400GI7XzxtF1ez@00F1800eW0808004Gp@1FALg264SIP1FgQSSFquO4abaa2U42B9991F
+ YIGTgGMIIY4aaGD0DO9991GIIImZ@VdhH1F_VmZ7ZWWai6024899r9m3WaWW2USfQCqW0W0G
+ G3x040okaH5022qgjjD4012PmZIffbGoaaaBsos82II2QPRR1999PjjjHda441ijjW7PocMs
+ cJIQQGBRRs99DHgjDPQaa01vqci43IWaus1F_40F9PIh0000ace9f0Kou140A93U4A@_xVWa
+ a40@_@xJG2Y4@@jRD99I2t@uVda8fD@7yOJ0208LRRQIW040WzDDx0248mssijG0APaWW773
+ W0WmQ5QakqF30OMCt65mkOHXSIsPKCM11fky420WWe1QAuHtBe8iobg8QW22USiPbufTgCw9
+ 0ZI6vAm462UylsM190jHMnZW8lmgA16Y6m02200vBoIC7HA020Og3c2E0a8eOOciUA8uZWXH
+ AiX_AgeWG3U8WJgY6OX@aHAEXFkV0ZAbkwLWI2Ev64200NMiKm9RS302P3uGE1AqK041FA3a
+ aiagtWW4a0LmZG0999fnH8g1u09B991FM2aaa4999AIGI2aaa4991992lOY6W0GIIG1r92W2
+ 000G0G3jKHCCCL6W1n18nuHGTOG154Omj084T2GX6K1808W5TS8Q08w10YW7Lz8PSY50Y0Dk
+ 0f99PGg78P999uHj8899K302H3G0989e8Mj0GIGIq0N4aw91DS2404WfNEfJ0Aqsccm0000p
+ zzlF999IjjfQp0000URx@@IYaatcjj50000iD1Q0jjjD0000W@@VR2aWQ0C0yl@l3999Iijj
+ r0G0m@@@Q08G30001000_700ma000s20081000v300m80006000W8HIIYLRG209991899Lfn
+ 1Yaaa8aaaK3m189991999L3080C20gmO1a000W400I2u01000bPS0aaaa2GRe9456MqWQ021
+ 100OD0AqGm1n9SWjjrIaij3IIIABDi0jvoIi4B9HIU000WRpss2hsMM499910000ijjjXijj
+ LGIIoU04K3G1sMaag101ibjjxEUW6000s000S900W1004d01S100a400i101IIIISJJ9nfjj
+ LdjjDxca49P4qaDRRrsURpssJYaaK8IoICRRRZQRRR8999Xba44qsscbssMjaaa8fIGa4ORN
+ 3020P995jjjL301I000C100mj000c500m4000P2008R000M34qG10DD9120481448u02Wsca
+ 4Y61TKM00e9f80Au213Waaq8200u3W3GIJI_501020G0000W9999uH22QmWe_QeYY5W0002a
+ W4O802aa40al01x0KWaaaiXGIe6W3G00G4om28001g1OXg6MeH23g1u00aaaT2eWA8IJC999
+ IGI0U7e02QRW899XGG002000GfjjSh4A0ijDLaaaKu478sqs_aX3IGW0PRBa8991sam0raaa
+ O200wua00000OHII49000089H2QRhsmxJjT99IIisy@@sgjjZ6TRRYaaaGxx@FssssWijzPI
+ IIYm@@lVijDRpRRhGG0Y@@@Q080tosc899fQ0E0iljjHIII4@z@_PJIa4MIYaA9HIY@9IIs4
+ 99Pz899Jaaa4xaaaWssscsttMPRRRsF9RrkjjPx_@LRlscjDMMijzsijj_ijjHFyG1OnssiD
+ ssglPRps6PhssORssMR_ssfPRRBORRRXjjjDkjjDpsssCsosimca8fsscjRJYaaRRssk9IIo
+ iPRR@A999cjjjNcEDC8241r1OGtgrUuBPeFLR2ST8a92W002w_de1O8uHKwyYdXXEeLSdIbw
+ Yq0s0110GUJA4Q031Qy422WWe1i86peYc_YespjGGq2k7jQ0MenlXQBmaMoM88LkY6GB0100
+ n9S6880W88ARODS2quI100198anr1N4dWC2200Y8gCW0G0JJCHHE641XBZOOGQ0bKKu31E1L
+ i5O4dmI0200YKvdy9beJ0AG62IMnd222IIguh0acba12g2191fO@6f302WaWeK3G3WaaiYAC
+ gg3eule42e1hmdO8ZaTwUOZMFj8W6fY6Wi0quCmMPaWaaKHH2IGII2uKhe1s0898Pd0N0aaa
+ CG3XIGGX1roG100GW6l0GG08K02G000010400010W0020WW0r045;
+ INTEGER CHECKSUM =5699;
+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:
+ IF ( ! (TMPINT==IAP) ) THEN GOTO NOT_IAP;
+ PRINT "Progarmming Method: IAP";
+ NOT_IAP:
+ PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]);
+ TMPINT = INT(SUROW_PKG_TYPE[]);
+ IF ( ! (TMPINT==UNSPECIFIED) ) THEN GOTO Label_20;
+ PRINT "Device Package Type: package information not available from device";
+ Label_20:
+ IF ( ! (TMPINT==QN132) ) THEN GOTO Label_21;
+ PRINT "Device Package Type: QN132/QNG132";
+ Label_21:
+ IF ( ! (TMPINT==VQ100) ) THEN GOTO Label_22;
+ PRINT "Device Package Type: VQ100/VQG100";
+ Label_22:
+ IF ( ! (TMPINT==TQ144) ) THEN GOTO Label_23;
+ PRINT "Device Package Type: TQ144/TQG144";
+ Label_23:
+ IF ( ! (TMPINT==PQ208) ) THEN GOTO Label_24;
+ PRINT "Device Package Type: PQ208/PQG208";
+ Label_24:
+ IF ( ! (TMPINT==FG144) ) THEN GOTO Label_25;
+ PRINT "Device Package Type: FG144/FGG144";
+ Label_25:
+ IF ( ! (TMPINT==FG256) ) THEN GOTO Label_26;
+ PRINT "Device Package Type: FG256/FGG256";
+ Label_26:
+ IF ( ! (TMPINT==FG484) ) THEN GOTO Label_27;
+ PRINT "Device Package Type: FG484/FGG484";
+ Label_27:
+ IF ( ! (TMPINT==FG676) ) THEN GOTO Label_28;
+ PRINT "Device Package Type: FG676/FGG676";
+ Label_28:
+ IF ( ! (TMPINT==FG896) ) THEN GOTO Label_29;
+ PRINT "Device Package Type: FG896/FGG896";
+ Label_29:
+ IF ( ! (TMPINT==QN108) ) THEN GOTO Label_30;
+ PRINT "Device Package Type: QN108/QNG108";
+ Label_30:
+ IF ( ! (TMPINT==QN180) ) THEN GOTO Label_31;
+ PRINT "Device Package Type: QN180/QNG180";
+ Label_31:
+ IF ( ! (TMPINT==TQ100) ) THEN GOTO Label_32;
+ PRINT "Device Package Type: TQ100/TQG100";
+ Label_32:
+ IF ( ! (TMPINT==CQ208) ) THEN GOTO Label_33;
+ PRINT "Device Package Type: CQ208/CQG208";
+ Label_33:
+ IF ( ! (TMPINT==FG1152) ) THEN GOTO Label_34;
+ PRINT "Device Package Type: FG1152/FGG1152";
+ Label_34:
+ IF ( ! (TMPINT==BG456) ) THEN GOTO Label_35;
+ PRINT "Device Package Type: BG456/BGG456";
+ Label_35:
+ IF ( ! (TMPINT==UNDEFINED) ) THEN GOTO Label_36;
+ PRINT "Device Package Type: package information not available from device";
+ Label_36:
+ TMPINT = INT(SUROW_SPEED_GRADE[]);
+ IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_37;
+ PRINT "Device Speed Grade: speed grade information not available from device";
+ Label_37:
+ IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_38;
+ PRINT "Device Speed Grade: -1";
+ Label_38:
+ IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_39;
+ PRINT "Device Speed Grade: -2";
+ Label_39:
+ IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_40;
+ PRINT "Device Speed Grade: -3";
+ Label_40:
+ IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_41;
+ PRINT "Device Speed Grade: -F";
+ Label_41:
+ IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_42;
+ PRINT "Device Speed Grade: STD";
+ Label_42:
+ IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_43;
+ PRINT "Device Speed Grade: -4";
+ Label_43:
+ IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_44;
+ PRINT "Device Speed Grade: speed grade information not available from device";
+ Label_44:
+ TMPINT = INT(SUROWPROGRAMSW[]);
+ IF ( ! (TMPINT==FP) ) THEN GOTO Label_45;
+ PRINT "Programmer: FlashPro";
+ Label_45:
+ IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_46;
+ PRINT "Programmer: FlashPro Lite";
+ Label_46:
+ IF ( ! (TMPINT==FP3) ) THEN GOTO Label_47;
+ PRINT "Programmer: FlashPro3";
+ Label_47:
+ IF ( ! (TMPINT==FP4) ) THEN GOTO Label_48;
+ PRINT "Programmer: FlashPro4";
+ Label_48:
+ IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_49;
+ PRINT "Programmer: SiliconSculptor II";
+ Label_49:
+ IF ( ! (TMPINT==BPW) ) THEN GOTO Label_50;
+ PRINT "Programmer: BP Programmer";
+ Label_50:
+ IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_51;
+ PRINT "Programmer: DirectC";
+ Label_51:
+ IF ( ! (TMPINT==STP) ) THEN GOTO Label_52;
+ PRINT "Programmer: Actel JAM Player";
+ Label_52:
+ IF ( ! ( ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3))||(TMPINT==FP4)) ) THEN GOTO Label_68;
+ TMPINT2 = INT(SUROW_SW_VERSION[]);
+ IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_53;
+ PRINT "Software: FlashPro v3.3";
+ Label_53:
+ IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_54;
+ PRINT "Software: FlashPro v3.4";
+ Label_54:
+ IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_55;
+ PRINT "Software: FlashPro v4.0";
+ Label_55:
+ IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_56;
+ PRINT "Software: FlashPro v4.1";
+ Label_56:
+ IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_57;
+ PRINT "Software: FlashPro v4.2";
+ Label_57:
+ IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_58;
+ PRINT "Software: FlashPro v5.0";
+ Label_58:
+ IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_59;
+ PRINT "Software: FlashPro v5.1";
+ Label_59:
+ IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_60;
+ PRINT "Software: FlashPro v6.0";
+ Label_60:
+ IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_61;
+ PRINT "Software: FlashPro v6.1";
+ Label_61:
+ IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_62;
+ PRINT "Software: FlashPro v6.2";
+ Label_62:
+ IF ( ! (TMPINT2==FP84) ) THEN GOTO Label_63;
+ PRINT "Software: FlashPro v8.4";
+ Label_63:
+ IF ( ! (TMPINT2==FP85) ) THEN GOTO Label_64;
+ PRINT "Software: FlashPro v8.5";
+ Label_64:
+ IF ( ! (TMPINT2==FP86) ) THEN GOTO Label_65;
+ PRINT "Software: FlashPro v8.6";
+ Label_65:
+ IF ( ! (TMPINT2==FP90) ) THEN GOTO Label_66;
+ PRINT "Software: FlashPro v9.0";
+ Label_66:
+ IF ( ! (TMPINT2==FP91) ) THEN GOTO NOT_FP91;
+ PRINT "Software: FlashPro v9.1";
+ NOT_FP91:
+ IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_67;
+ PRINT "Software: FlashPro vX.X";
+ Label_67:
+ LABEL_SEPARATOR = 0;
+ Label_68:
+ IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_72;
+ 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_69;
+ TMPINT5 = 1;
+ Label_69:
+ IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_70;
+ PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5;
+ Label_70:
+ IF ( ! (TMPINT==BPW) ) THEN GOTO Label_71;
+ PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5;
+ Label_71:
+ LABEL_SEPARATOR = 0;
+ Label_72:
+ 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_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_75;
+ 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_73;
+ 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_73:
+ IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_74;
+ 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_74:
+ LABEL_SEPARATOR = 0;
+ Label_75:
+ 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_76;
+ CHKSEC = 0;
+ Label_76:
+ 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];
+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;
+ IRSTOP IRPAUSE;
+ DRSTOP DRPAUSE;
+ IRSCAN 8, $7f;
+ WAIT IDLE, 3 CYCLES;
+ WAIT IDLE, 50 USEC;
+ 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_77;
+ BSR[I] = SAMPLE_DEVICE[I];
+ Label_77:
+ 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_78;
+ CALL DO_CHECK_W;
+ Label_78:
+ IF ( ! (ARRAYRONLY==1) ) THEN GOTO Label_79;
+ CALL DO_CHECK_R;
+ Label_79:
+ LABEL_SEPARATOR = 0;
+ SKIPCHKARRAY:
+ IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_80;
+ CALL BP_VER;
+ Label_80:
+ 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_0;
+ FOR ILOOP_0 = 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_0 = 0;
+ NEXT ILOOP_0;
+ENDPROC;
+
+PROCEDURE POLL_PROGRAM USES GV;
+ INTEGER ILOOP_1;
+ FOR ILOOP_1 = 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_1 = 0;
+ NEXT ILOOP_1;
+ENDPROC;
+
+PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM;
+ 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;
+ IF ( ! (ISERASEONLY==0) ) THEN GOTO SKIP_CYC_INCREMENT;
+ IF ( ! ( (ISPRGARRAY==1)&&(ACT_UROW_CYCLE_COUNT!=1023)) ) THEN GOTO Label_81;
+ ACT_UROW_CYCLE_COUNT = (ACT_UROW_CYCLE_COUNT+1);
+ Label_81:
+ LABEL_SEPARATOR = 0;
+ SKIP_CYC_INCREMENT:
+ IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_82;
+ UROW[] = $ffffffffffffffffffffffffffffffff;
+ Label_82:
+ IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO;
+ BUFF32[31..0] = BOOL(CHECKSUM);
+ IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_83;
+ UROW[127..112] = BUFF32[15..0];
+ Label_83:
+ IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_84;
+ UROW[127..112] = SUROWCHECKSUM[15..0];
+ Label_84:
+ IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_85;
+ UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0];
+ Label_85:
+ IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_86;
+ UROW[101..32] = SUROWDESIGNNAME[69..0];
+ Label_86:
+ 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_87;
+ UROW[5] = 1;
+ UROW[0] = 0;
+ UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4];
+ Label_87:
+ IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_88;
+ UROW[5] = 0;
+ UROW[0] = 1;
+ UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4];
+ Label_88:
+ 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_89;
+ CALL PROGRAM_UROW;
+ Label_89:
+ LABEL_SEPARATOR = 0;
+ENDPROC;
+
+PROCEDURE DO_ERASE USES GV,EXE_ERASE;
+ PRINT "Erase ...";
+ COMBERASESELECT[22..0] = $004000;
+ COMBERASESELECT[0] = 1;
+ CALL EXE_ERASE;
+ PRINT "Completed erase";
+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,EXE_ERASE;
+ IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_90;
+ PRINT "Erase FPGA Array and FlashROM ...";
+ Label_90:
+ IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_91;
+ PRINT "Erase FPGA Array, FlashROM and Security Settings ...";
+ Label_91:
+ COMBERASESELECT[22..0] = $7fc00f;
+ ISERASEONLY = 1;
+ CALL EXE_ERASE;
+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_92;
+ 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_92:
+ LABEL_SEPARATOR = 0;
+ENDPROC;
+
+PROCEDURE EXE_VERIFY USES GV,DO_EXIT,POLL_PROGRAM;
+ 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_93;
+ 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_93:
+ IRSCAN 8, $8d;
+ DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS;
+ IF ( ! (PASS==0) ) THEN GOTO Label_94;
+ 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_94:
+ 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_95;
+ 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_95:
+ IRSCAN 8, $8e;
+ DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS;
+ IF ( ! (PASS==0) ) THEN GOTO Label_96;
+ 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_96:
+ 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_97;
+ 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_97:
+ 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_98;
+ 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_98:
+ 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_99;
+ 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_99:
+ LABEL_SEPARATOR = 0;
+ENDPROC;
+
+PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY;
+ WAIT RESET, 5 CYCLES;
+ CALL READ_IDCODE_ONLY;
+ EXIT 0;
+ENDPROC;
+
+
+CRC A713;