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;