1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
|
NOTE "CREATOR" "Designer Version: 11.8.0.26";
NOTE "CAPTURE" "11.8.0.26";
NOTE "DEVICE" "AGLN250V2";
NOTE "PACKAGE" "AGLN250V2-vq100";
NOTE "DATE" "2018/05/28";
NOTE "TIME" "12:15:23";
NOTE "STAPL_VERSION" "JESD71";
NOTE "VENDOR" "Microsemi Corporation";
NOTE "IDCODE" "03A541CF";
NOTE "IDMASK" "07FFFFFF";
NOTE "DESIGN" "TutorKit1FlashRom1_v100_Top";
NOTE "DESIGN_DIRECTORY" "D:\_ZDROJE\Libero\Tutorial\TUTOR--KIT-1--FLASHROM-1--V1-00\designer\impl1\";
NOTE "CHECKSUM" "7FC2";
NOTE "SECURITY" "Disable";
NOTE "ALG_VERSION" "20";
NOTE "MAP_VERSION" "1";
NOTE "TOOL_VERSION" "1";
NOTE "MAX_FREQ" "20000000";
NOTE "SILSIG" "F1101004";
NOTE "SPEED_GRAD" "STD";
NOTE "TEMP_GRAD" "COM";
NOTE "PLAYER_VERSION_VARIABLE" "PLAYERVERSIONVARIABLE";
NOTE "PLAYER_VERSION_SW_VARIABLE" "PLAYERVERSIONSWVARIABLE";
ACTION DISABLE_FPGA_ARRAY =
VERIFY_IDCODE,
W_INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_EXIT;
ACTION PROGRAM =
VERIFY_IDCODE,
SET_PRG_ARRAY,
W_INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_ERASE,
DO_PROGRAM,
DO_VERIFY_BOL,
DO_PROGRAM_RLOCK,
DO_VERIFY_PGM_RLOCK,
DO_PROGRAM_SILSIG,
DO_EXIT;
ACTION DISABLE_FPGA_ARRAY_PROGRAM =
VERIFY_IDCODE,
SET_PRG_ARRAY,
W_INITIALIZE,
DO_DISABLE_RLOCK,
DO_VERIFY_DISABLE_RLOCK,
DO_ERASE,
DO_PROGRAM,
DO_VERIFY_BOL,
DO_PROGRAM_RLOCK,
DO_VERIFY_PGM_RLOCK,
DO_PROGRAM_SILSIG,
DO_EXIT;
ACTION PROGRAM_ARRAY =
VERIFY_IDCODE,
SET_PRG_ARRAY,
AW_INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_ERASE_ARRAY,
DO_PROGRAM,
DO_VERIFY_BOL,
DO_PROGRAM_RLOCK,
DO_VERIFY_PGM_RLOCK,
DO_EXIT;
ACTION ERASE_ARRAY =
VERIFY_IDCODE,
AW_INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_ERASE_ARRAY_ONLY,
DO_EXIT;
ACTION ERASE =
VERIFY_IDCODE,
W_INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_ERASE_ONLY,
DO_EXIT;
ACTION ERASE_ALL =
VERIFY_IDCODE,
INITIALIZE,
DISABLE_RLOCK_AND_VERIFY,
DO_ERASE_ALL,
DO_EXIT;
ACTION VERIFY =
VERIFY_IDCODE,
R_INITIALIZE,
DO_VERIFY_EOL,
DO_VERIFY_RLOCK,
DO_EXIT;
ACTION VERIFY_ARRAY =
VERIFY_IDCODE,
AR_INITIALIZE,
DO_VERIFY_EOL,
DO_VERIFY_RLOCK,
DO_EXIT;
ACTION READ_IDCODE =
DO_READ_IDCODE;
ACTION VERIFY_DEVICE_INFO =
VERIFY_IDCODE,
READ_INITIALIZE,
READ_IDCODE_ONLY,
DO_VERIFY_DEVICE_INFO,
DO_EXIT;
ACTION DEVICE_INFO =
VERIFY_IDCODE,
READ_INITIALIZE,
READ_IDCODE_ONLY,
DO_DEVICE_INFO,
DO_QUERY_SECURITY,
DO_EXIT;
DATA CONSTBLOCK;
INTEGER IEEE1532=0;
INTEGER STAPL=1;
INTEGER DIRECTC=2;
INTEGER PDB=3;
INTEGER SVF=4;
INTEGER FP=0;
INTEGER FPLITE=1;
INTEGER FP3=2;
INTEGER SCULPTW=3;
INTEGER BPW=4;
INTEGER DIRECTCP=5;
INTEGER STP=6;
INTEGER FP4=7;
INTEGER FP5=8;
INTEGER FP33=0;
INTEGER FP34=1;
INTEGER FP40=2;
INTEGER FP41=3;
INTEGER FP42=4;
INTEGER FP50=5;
INTEGER FP51=6;
INTEGER FP60=7;
INTEGER FP61=8;
INTEGER FP62=9;
INTEGER FP84=11;
INTEGER FP85=12;
INTEGER FP86=13;
INTEGER FP90=14;
INTEGER FP91=15;
INTEGER FP100=16;
INTEGER FP_11=19;
INTEGER FP_11_1=20;
INTEGER FP_11_2=21;
INTEGER FP_11_3=22;
INTEGER FP_11_4=23;
INTEGER FP_11_5=24;
INTEGER FP_11_6=25;
INTEGER FP_11_7=26;
INTEGER FP_11_8=27;
INTEGER UNKNOWN=127;
INTEGER UNSPECIFIED=0;
INTEGER QN132=1;
INTEGER VQ100=2;
INTEGER TQ144=3;
INTEGER PQ208=4;
INTEGER FG144=5;
INTEGER FG256=6;
INTEGER FG484=7;
INTEGER FG676=8;
INTEGER FG896=9;
INTEGER QN108=10;
INTEGER QN180=11;
INTEGER TQ100=12;
INTEGER CQ208=13;
INTEGER FG1152=14;
INTEGER BG456=15;
INTEGER UNDEFINED=63;
INTEGER GRADE_UNSPEC=0;
INTEGER GRADE_1=1;
INTEGER GRADE_2=2;
INTEGER GRADE_3=3;
INTEGER GRADE_F=4;
INTEGER GRADE_STD=5;
INTEGER GRADE_4=6;
INTEGER GRADE_UNDEF=7;
ENDDATA;
DATA PARAMETERS;
INTEGER FREQ =4;
ENDDATA;
DATA GV;
INTEGER ULOPT1_BITLOCATION =11;
INTEGER ULOPT0_BITLOCATION =10;
INTEGER ULUWE_BITLOCATION =9;
INTEGER ULARE_BITLOCATION =8;
INTEGER ULUPC_BITLOCATION =7;
INTEGER ULUFE_BITLOCATION =6;
INTEGER ULUFP_BITLOCATION =5;
INTEGER ULUFJ_BITLOCATION =4;
INTEGER ULFLR_BITLOCATION =3;
INTEGER ULULR_BITLOCATION =2;
INTEGER ULAWE_BITLOCATION =1;
INTEGER ULARD_BITLOCATION =0;
BOOLEAN BUFF128[128];
BOOLEAN BUFF32[32];
INTEGER I;
INTEGER J;
INTEGER TEMP;
INTEGER SDNUMBER;
INTEGER ROWNUMBER;
INTEGER DATAINDEX =0;
INTEGER FROMROWNUMBER =1;
INTEGER AESBLOCK;
BOOLEAN ID[32];
BOOLEAN PASS = 1;
BOOLEAN FADDR[3];
INTEGER STATUS =0;
BOOLEAN SILSIG[32] = $f1101004;
BOOLEAN ISC_CONFIG_RESULT[18];
BOOLEAN VERIFYEOL[2];
BOOLEAN COMBERASESELECT[23];
BOOLEAN SECKEY_OK = 1;
BOOLEAN SECREG[44];
BOOLEAN ULUWE = 0;
BOOLEAN ULARE = 0;
BOOLEAN ULUPC = 0;
BOOLEAN ULUFE = 0;
BOOLEAN ULUFP = 0;
BOOLEAN ULUFJ = 0;
BOOLEAN ULFLR = 0;
BOOLEAN ULULR = 0;
BOOLEAN ULAWE = 0;
BOOLEAN ULARD = 0;
BOOLEAN ULOPT[2];
BOOLEAN SUROWCHECKSUM[16];
INTEGER SUROWCYCLECOUNT =0;
INTEGER ACT_UROW_CYCLE_COUNT =0;
BOOLEAN ACT_UROW_DESIGN_NAME[70] = $0ad72fed3e9965e331;
BOOLEAN SUROWDESIGNNAME[70];
BOOLEAN SUROWPROGMETHOD[3];
BOOLEAN ACT_UROW_ALGO_VERSION[7] = $14;
BOOLEAN SUROWALGOVERSION[7];
BOOLEAN SUROW_PKG_TYPE[6];
BOOLEAN ACT_UROW_SW_VERSION[7];
BOOLEAN SUROW_SW_VERSION[7];
INTEGER PLAYERVERSIONVARIABLE =0;
INTEGER PLAYERVERSIONSWVARIABLE =0;
INTEGER SCULPTORMAJORBASE =5;
INTEGER SCULPTORMINORBASE =16;
BOOLEAN ACT_UROW_PROGRAM_SW[4];
BOOLEAN SUROWPROGRAMSW[4];
BOOLEAN SUROW_SPEED_GRADE[3];
BOOLEAN SUROW_SRAM_DISTURB[1];
BOOLEAN ISERASEONLY = 0;
BOOLEAN ISRESTOREDESIGN = 0;
BOOLEAN FLAGDISPLAYCYC = 1;
BOOLEAN ISPRGARRAY = 0;
BOOLEAN BSRPATTERN[708] = $9249249249249249249249249249249249249249249249249
249249249249249249249249249249249249249249249249249249249249249249249249
24924924924924924924924924924924924924924924924924924924;
BOOLEAN SAMPLEMASK[708] = $0000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000;
BOOLEAN BSR[708];
BOOLEAN SAMPLE_DEVICE[708];
BOOLEAN RLOCK[832] = $7fffffcffffffbfffffeffffffbfffffefffffffffffffffffff3f
ffffcffffff3fffffcffffff3fffffcffffff3fffffdffffff3fffffcffffff3fffffcff
ffff3fffffcffffff3fffffdffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffff;
BOOLEAN ARRAYRONLY = 1;
BOOLEAN CHKARRAY = 0;
BOOLEAN FROMRONLY = 1;
BOOLEAN CHKFROM = 0;
BOOLEAN CHKNVM = 0;
BOOLEAN CHKSEC = 1;
BOOLEAN PERMLOCK = 0;
INTEGER HEX[16] = 70,69,68,67,66,65,57,56,55,54,53,52,51,50,49,48;
INTEGER NUMBEROFFROMROWS =8;
BOOLEAN INITIALIZE_DATA[5] = $00;
INTEGER SDTILE;
INTEGER NUMBEROFSDTILES =4;
INTEGER NUMBEROFMAPROWS =2300;
INTEGER IDREV;
INTEGER IDFAB;
INTEGER BM7DEVICE =0;
INTEGER BM1DEVICE =0;
BOOLEAN M1BUFF[128] = $acdd6548ccb488863e291eb18fe95077;
BOOLEAN M7BUFF[128] = $e137623a2eeee91126015f3f73664945;
BOOLEAN IDCODEVALUE[32] = $03a541cf;
BOOLEAN IDMASK[32] = $07ffffff;
INTEGER SECKEYCHK =0;
INTEGER DESIGNPKGTYPE =2;
BOOLEAN ACT_UROW_PROG_METHOD[3] = $1;
INTEGER LABEL_SEPARATOR =0;
INTEGER ROWITERATION =100;
INTEGER PAGEITERATION =100;
INTEGER PERCENT_UPDATE;
INTEGER DIFFERENCE;
INTEGER UNIQUEEXITCODE =0;
ENDDATA;
DATA BITSTREAM;
BOOLEAN UROW[128];
BOOLEAN UROW_MASK[128] = $fffffffffffffffffffffffffe01ffc0;
BOOLEAN DATASTREAM[1913600] = @WPw00000110040W0W000020G000400108002200000Wwc
qssso0000p@@lF999IjjjQp0000_@x@@IYaatcjj50000y_@@7HIIIORRRR36uXaa49jjTDq
WD2000y@@EH0vssMj90008@@z@69HIo000049IIICIII2Va00008III0HII2i134999H899f
67Waaa4aaaKD020Za491aa8900gX7GIIIA0000800m0G0aaaa9mWauWku00000IIIIg1Vqss
sosssc3999A1000jjjQpjjPRMIYay0000tcjjbMjjj8III20000ORRR3RRRhWaaa3ZWQW3sO
RRssba897000mskJAGIIIYC000Wbaa8vIIaaJRpsEJYaaD9IIo4999sijjz8999B999fKHWj
jj19999aaaaGIII2QRRpIIIY4IIoQm6caaausssgZaa4PIIIdW0PRRRsIIIa600So88EH0II
IYxa1r72IF6WaaaySHGDW50IIIr07AK6KV8O0OGDuWIQ1r02AY4K3QeTDHDu22000r05w4Ae
ssscJIIIUy0ejjj2aaa84000G00e6GGhK1ijjjYaaa2d7K3w0JIIIkyWQW2qsssWjjjvIIIY
O@@l@jjDR7RRssaa89X@x@Vsk6KW99992@@@_nssiDjjT@80n@@VD84LIII4@@@zjjjPpQRh
JW04@@@_GRRrMRRpsijLRxlDRRtMjjTtijjNrss6pssssssscsssMHRRRMQRRrYjjPRijLRp
sMD01sORRh1ymssscvssMjRRRsCRRrsljL3GWz000040030OK3uK@Z130Br9SX000WQ0D2De
fjmf1WCZJMB22jOho2q_FGp@1Q_FGp@1Q_FGp@1Q_FG3l8999HIII2baa41999oIIIaeaa89
89HIMIYa49f6G10999HGIIc1W089992IIIaaaa81IIg6W7T2ce6W6H3UAGZ@3qu@0D_FG3Nh
4q0GIIIa200YKW04000W899BpyWS3LOKH3QFyWQ00fJ0AsHyW10I02000800W10sfJ0Aaaaa
O0000GIIYS0000A99I20000ca89H0e6W2400008999N12g1mWqEFe6WEw4OYI6Fmaaa45000
WIIIz7GWIIII0000W899xHWaQ0eeJWB21m0Waaae000g2W020000IIIa100q7m1jIGGY09SO
m1r0CId0KaB91f1K0WIIoq080HIIID0Gq9G4r0CId0EC0m@30yV0Dr5DmQ1ezVWJ@7uq@12_
Vy8a7Qm@1qyVm9@7K7GA999ZZx2baaazmTHD0T4yew1dyVm9@7yur1DWMmZ@7yu@1F_@00@7
Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F6lijjD3000Wsssi50000QRp
s6000WiDRR70r0W0WjjDR000r0GmDX4ejjjf6WHw482ssssGIIIaRRRp899H2jjDRXa49fss
ijJIaa4sM3G1Yjjjh1G1YjjjQaaag18aE1emssscJIIIGRRRs999Hgjjz4m1CJIIaussgjII
g602iGIIY4RRxMW5g1eZE1ce6020000uaaa42000GIIIa2009HU0eaa49200@CUmvX70999f
FI5g1GZE1iG2@@l@Xa499@@_@JIaa4@x@@DHII2l@@@79999r0aW799fQ0809999u@@VFaaa
r0GId0DuZaayZ02KRRR@uW1tFG0sssM5000WQRRrA00K3W23FG0sssss28msssID0cq9G3r0
Gm00@F0m@1RzVmZ@7yu@1ezVmZ@76s@1ezVmZ@7So@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7
yu@1RzVmZ@7yu@1ezVm9@76s@1ezVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7yu@1Rz
VmZ@7yu@1F_Vm9@76s@1qyVmZ@7yu@1F_VmZ@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7y
u@1F_Vm9@76s@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1RzVmZ@7yu@1F_V
m9@7yu@1qyVmZ@7yu@1F_Vm9@7So@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm
@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_Vm9@7Qm@1qyVm
Z@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VmZ@7Qm@1qyVmZ@7yu@
1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Ws@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9
@7yu@1F_VmZ@7yu@1F_@00@7yu@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1
F_VmZ@7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@
7yu@1F_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F
_@00@7Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVmZ@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7
Gp@1F_VmZ@7yu@1F_VOO@7Qm@1qyVm9@7yu@1F_Vm9@7yu@1F_VmZ@7yu@1F_@00@7Gp@1F_
VmZ@7yu@1F_VOO@7Qm@1qyVm9LR0008un@3Uy@WJ_Fun@3qmZq0C8un@3Uy@W7@Fun@70u@0
Q_Fun@3Uy@W7@Fun@33x@G3_Fun@3Ev@W7@Fun@3Ev@W7NFGZj2Uy@W7@Fun@70u@0q_FOh@
3Uy@W7@Fun@708P2000XXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@F0m@30yVmM@7y
u@1F_V0Q@7yexXXzVe1@7yu@1dyVmZ@7yu@1dyVmZ@7yu@1F_VmZ@FQu@30yVmM@7yu@1F_V
0Q@7yu@XXzV0Q@7yu@1di9808WW7@Fun@3Ev@W7@FG3F889A5yu@1F_VmZ@7y8@W00060mB0
1001ezVmM@F0GUrJOGWJYLSH21F_VmZ@F0WL01002EHR80001ez@00c4bm71q4S44q5SYL51
KHG3bP0008uHY989P5yeKH0KGd0781999un@7KwbG34x8i52qGlW73cbaeKGgPa6W1H38LS2
I1408866BAP42E0001F_3G00wW77XORRRmZveijHYaaahcss8IGI2r0G0QIIjE180IIiTmZE
XtsEHII2DBRRdE18GQRZ4999NjijH1FA540u4f9921FAcw@7I4aayT2SWz@t4999y_z@F2UK
A200jT2e020WjW7nI004G6Cu1G008Un@RBGrQ0KW000GF2b5D0Hj9ONSf4qNG11Ez420WWsC
Q8QW42Uy@W7ZCMM8YyQjlwO2500Gq0YrFp71DaKq05q9W3FDe0W0WWtNNR_WIYKHeVEpAcP6
G0004DGI4002oeecu4cvMwmIV8YFROG001Gm9bH0008sYa2CeW0qk8u4f2QOYW7T2P89PSS7
8199hJ020991H2IogKk3aWae4XtH8B99L2II6995nmuM8LGtmAQ548KpPC4yeW9LeGmZ59B9
9e9Z7a098HIGI8DW2a0a0b601WaWWgVCXQ0IOeF2g1mWE1Ee604Q0WWQ0AW4aaKD04e9919Q
05099A5e13nzS0W4WaYIAOYc5G0G044G1r0eHI26K3G3DCaHmZGKou11FM3308RMss0020eP
BRR1G20eJ02W40GgzjjBun9APiWW7lHQRZ4199th59G99qcij5IWaaQ6qsEH0II4yuJWjjJK
caG7yu1ORRa089vgWjDY4aaGmZI999H0G00YacaK0400IIJIw4W0oGI21F_au@7IaaayUz@F
H2IIuFz@d9199u@@VVaia1F2550eM9jj00200rcss1010eJ02030GPBRRP5nj70u@GuvCU_O
70Wm0doDun@ZJG7W000b1vG44UTpBP1LTmv06SoRP8000Y68XOB_QQlCMz3gg6G8qWd06004
DG3X685W000W000n2SmxU6SL831DOLi5I41HMNqWMq064fW11dyqMbS4e1NLdaGm9CX002eJ
05Q58101001FwKd08mI2IAeE8ghpWW7F2998Pd0481B9GI2Ica4aaE180aaaLmZK5hqRNmOH
u4FjyD4PoQKZ0Ii9U6X6iKWJ@5RnJoIII4aaeq9m1ab4b8991HMIoAG3ZG0IIM3G2YIII2qW
W8MD8Q05KI204VbQssssS0000QRRBhn3e000quu7r0e1108xE1CWzjj1030WE180400eMssc
W7PGIjjTZZcK3W68RRb2Uq0IGIIQJRR19C9HibjLZaZKmZ4are1M9993Ua09999gjjj3US7b
KaaWsmsiI2IYKRHps9X9IgjWQ0A8uH3m0000caa4v00GPZ4e1000GIIYa10WW7dH00SYqaa1
W00CIOIo1W00q901W00W8D99v@@@daaa4x@@VVIIIaw@@zV99HI_@t@la499x@W7f1_@B92I
oUV@@d839fy7_@t901Uy@7amaabrO20jjjPB0000tsEhH22UC7B00jIRR1050Wgbjj50400t
csM1030WQJR3UqiWjGBu4qY9ZggTEuMW3A1VBG00016emS_F4d0I33OGGtN4y8nX6yGmZqA0
088un@3UCq888BQW3EtxWOBqgWW30300C0GPhRTmK2F4qWK0A0024CjtmCu6cjY6uj10C0a0
0Gmm@N9tE1dyVD0W0800eJ05QRQ110091FMLd068IIKYba4KmZLr9m4KWai2UCk0DkzQ46Y6
ekWJKEsYgaba4q901qa4b2I5B8999H3aW4aaae1K8WpiAsGYW7jWT00GmZp030ssbjT0Q10Q
sss60200GBVRJ1m0eJ022UaX67J9uHEW4ia8t0scHI0Y4QPRs2v9IIi5ORZK4ye38tss2Uy7
R0RRA1191jaiPb4Y4vs0cjJIOaKR8ss8fOI204yeJG0WJmcaC0W0WHQJIE0a009D89Q0G02U
i1@IIIa_@@3Uy7@L_@aCWaO@Q_xN2GYq@rk@B1BIo@4_@X489P0aru31Fw3WM00roqs40900
OxUp6W900kf8R3WI00rcgj5060ej0d_VlfP2Qu@e5BfJW241004wumhgb0420WW7@AWc4wAT
Y88UwAEB2Uy@10wuRn22UiiWxTOrljAay04000z5a0G10We1oAOOo_4GXu4EuP14Y6W9G001
p60HmmKDe05H3uL0DlTu23Htyr15J4@hNr0ma020Wl0o8E1hQ5uXWJcQv692Uqf218GQIYY4
aaWE18WiaeKGTNXiaaK989Pd05OIoIYiae49898IIIMaWa4YJGA4001B1q0G00W3DI8g3mMs
fZ3lCiAdQ2e9hrHC8Ua42UysE1a8G3T8889L3m4H0KGd078D99XIGIYWqaaW7hAu_BWW0aar
014WW00000G2IGeP720IG2K30A4009g1O22IG0r0419810010G4iW00W10G2UG00W1001D82
0W0r0O220GYQ0cW054GD0GaFP2Wsssi500aF91S0000PRR7MfDY0Wi9RR30G0Wcljj5GO00q
_ssCG100PPR7Mv5waaa2hC74IIkARRZ8489efWj540a4r2sMToHIXLIWJIIIGRRRs999Hgjj
jEm1XLcZGRx4989q0ajT44aao2vs6IWJYSZPR69f9XLU04000Waaa8500AeaWW79WaaaOObr
000EnRIY0G204XP9f0I00a4aa80900KQIY4_@@y9FmdaaK_a4maaa4y@@lVIIoMAte60DyJx
@3I0IYyFvlFP89Iy9__tab89y1x@F2wZW2odCXx780RRRh200WmApX60GhqsM0Q00WARRx08
10WjCjL1600eccsmAVATnqEJtW60C8V05_7Gi9TC8aAgY07jvc8Ol95Q7uWIEd2W01Gh0B80
00W400GOOS5eG2H3mGx4L5DWOX6eW00000200G2002hSh60E0e00Gq064qGL@ET0W00W55I8
QjdsPeXmA7650GmL77iTq180003xdA3001W000W0000m000W20mIXLDco1W90004000G000W
40Gh15asG6hBk4110WuHgo00GGE3AG0008Q0icHJXk4CuKKjQB0Xe10R0W80C0046sMj0TGO
bOX008eOW3MsGXOBeQP030800SeX1BNeGaAS5rn1H4PLGGE4ohOXLg52IIoE18G2MIWWWaC9
eB9T2G0G99hmAZgJ04O919HGoIAiI38B9P5M9LXmhsq8aDMG1B0GmHOA01008MMtYaSiyEG8
ioQ98AD5MvIr0K1IJIIa4a4T2GW0aaiE180aa4Kq064dGK20003QuYW7XW100GmZu08008uH
50Q10q901S0083Uq2gjjj1FcZos692IIkAPRZ8199e1jjDuH24jjTYXaa8uHdibijv4ca4q0
tMmZ4mIms6I0IYS3OR69e91F2b20u4f992020G4caa6401caa0800GHNII8uHdyB_@3I2IYy
lyVmZ4uhz@d9899up_@W7b2090GmZ7eyjj3G40Gd04m40WoqrsILXYjeoM7KLsfZD8I00eoW
lEFJhAE7966fY6uhk4A0180m00BG100u12im0004QW2JDG5W02WVBq8m9c0401q9W2FQ8HGG
Y5lOM8004oCjXe1SwsU2o7PZu4WgQlA2Uqf0EN0400ml560H00eRHiWC00ijd2loEr0080B0
0e5a6YjOhm9M8I@e_J02m000fGGGa184QmJ0300wjGXe1O8qWg2QOXOoKBQ0d0800qn11V2q
mQSn5SoIXlImu8DCbm31DOr61F4SYHFCWGd07aeI302002Uq9aabaA819XIGIs9G1ca4bC19
15K7L89A9HQ2I2b4aiJ024aaaG919fJW20I204yuMFjirELVKF0IVpuG406i1FLdpuGq0I4e
nJt2emw8F4LOJHGKHmZI989HfJ03aWaaq9014aai2qu7IGGIr0C1aa4bE1KWWa04999B2II2
np@LuM5C0m11Fk40e0WE1GmRR1e40WMjjj18408rMss5yuJGRRai89vgijDY0aaWM0ssW79m
Mss9GKIYW7To6mscJQGIG30Rs9D8HgXaPRaW69v2WjDImW6A8uHc000de99H0000YyXaK001
01FI0010AMQI21F_as@7IYaayI_@FHmIIujn@FuH2ir@V8f899uHd0q00esysc0Q200RARs1
b40WjVPR1a20es6jj0m00TEuO6TPamYNJakRLbPV00100G0007tJLObGzCL6800W_qw02000
G200YXvde1seJW5Y6Ge8lAPy62YqdX10o2G00Gq0aDu32ZDKGivR5DG31DKrJ4J4yeLLQ8Hq
0S5ZvTHUD5100m5LwgWW3wJHXI8884nT_vgcW6cwC33UeHirIV8S2n0C00iSJPX6KMG3F499
Q30mrf194SoJ17rGp67idh2vJcKmZE5KN9p6Omk164yeD4iaag1m2C999T2SW99B80IYIaaa
W819P5yeKGIoIw4e1JIIG4WaiABpWWWmQ2Hgs8ua8MNgJ020B00CEo39iCq00J0I00O90Bm0
004FoKxp8Hm9LrNS31FALd0DGGI2AG36I3e0GIKIH3S1898fE1SW4aaKD0GWqaaCQW4qaa4q
MW2acai2qmWIVIOyYCg1ub0QYO1B32US6GajjQP00g1G1xB0006msijD0I10osbjD0200QMs
sM0A00GBVRp0Y0eJ022Uq6BZaa8BssibHIM3W2ifHIa44sWijH2eaahKss82HI2QHRR1v89H
j5jLd4YKmZ4PQaa41nssw040XDWLRd049XMGjjJQaaKxXss8HHIoL1RRKmZv0YIIYq00GD04
m40000899220WQ0C020S2sa41e008IQII1W008f19fJ032Uy6l399IG_@h1W0Gy@@_daa8By
@xd7IYaaylu@7I1aay6_@FH2IIuF_@d9O99udyVVaaa1FU38gjDRA0004msg1W08mssiC002
Uq0B00jOQR1W500gfjj30400s4sM5030WQRR3UqgduGu7cp_6eXzqtQhfkgsXYx14BU432JE
gWXX0G80GmMHtRQS1En4108WE1KuLK9ALuePE80WG0GxKEL3W7hAvmA054DGFzbu0G00WQ0E
uc3Bge8f91AO1622Q8Xn1K822bQ1WWE18uqj30100KCBJRG8Hl06C2ZMJm8nK2F4qmHTASGd
0B4dmMfBEHOBODFJOX5GHs0C4Q0ClQw1280WoOeAxX7YCkX10eBIbb08004ng27EDHr18b_W
1T2WGh0F4LeJ2400w4WYW7jf6WCababA19HhJW3099AHIIYAEE3Ymp9W4ba8919Z6W0e99PI
IIIeWaa8A99H6IIImZI5R1P334IK7Cr9W1W000QYHXMUzwbi92hyfeftBuHkO99AHGI2gJW2
2q88Waaar0e0489eE08eJW3aWbaq9m1qaa4YJ8gEES8Q332UC78ajjr0SWT000OIRRr0G04R
RRM8a0f1K0O00wE18010Ghsss2a10a1FcprY6K3m1C1IIa0ORps29HIm0hos683IIcAQRZ80
99ebijjJ02iejTXaaa8uHRKM99HQejLR2a499mMjD4Ih3GWDCIIaaG6WjjJ0camJmssLEJIA
QLRR8j89ICbjPWGa4yeEa4000809HI20e6W308IIYaK0020SYia41W108IJIIh3m0X000WMw
I2UK799@@_pHIaaC@x@x8f602yp19HI2wLz@39JIIUB_@d8899q@_@paaa4mR@lFIGoW7l10
rscD5000aORss202Ua0sE0002fjPR34H10gLJRB0C000DfjT4Y00mcqsg2A00KRQRmZMD0m@
rIswq05SH32nmyKnDD0M00AQ0ioVOwvbI0G000W02WuhagJ08I6WWn9I8eXfg8GYW7hgPx9Y
68iAAi240GIx0C4yuHxAw0W0001000H3imw8N18008Jh6_Gqh19r8e1TI5WYu4QunulUPW10
120HTaLq0DqUIS1FsJeRL4W6U1FQRD0A4OxNT2amR6J4TZNh0SGmZEXqaaK9P9PyY40999JI
JIId04G0Io8uneg1mWe1802IIMd094yOLT2enCxh555qX6WMq03Dbz21FY6SIIoE1W8uHew4
0ZW7bgJ0D2US6GajzQP0040mswjD0060IhMsN0028WQBRRC0008RRRpO000eijDR900f1G0J
000Gtss1FUZbHIIa5RRqs891I2jPORW4H91cjifHai44ejjj1aaa8psscnIIY4ORxq08W2RR
hE89fW7jXfzLY4a4Qsms0I2IIORPJ5yO1so89HI2OpsscHII28RRR7899fWjjj1aaa8nssc1
IIImZv81f1e6020990020GYq4400108IQI2T2O0K000WcaaT2GWcaa4X000WOII2UC7abWy_
t@3HoIIu@p@7998Bu@xFFa4a8X@@J3W0I_@@_Waa8H@@xVHIYaG@l@@2fW7l140KhMsK0020
YQBRR0048WjDjq0020WscMj4000eqsijO0000QpssDGQ05eA0004RRRmZi_p2QH3yGpLRTB0
3zKTmVSTqVsN7Bu4G0WWe10B8e3w4GXHcRQJW76SZhmxge@882SYce1q8mfEYk9gkWG8L16Q
docqCEeeW623WW67HBuHjALQXE1IOV4AYWG6G0G0HUL68G0Wj9iOohGEaHptFm0200GOOo5i
W1JHeG8LODRlN1tlK77t4d0Mn2qq2geqOYJLdPG69D4EnE200G2Q8ceR6gJ0F2DWWW7l9EE4
O999HIGGg605Y0eWuue8ekRA8WXoo8e6W6w4G129991rfGmZ05GZ3T2emUBKbAm9XJ0JvkDq
_nMH3uH11GjqW1fiSGJ35ydW11deKkLU4y8Q1QiKD04e999O2028D985Dm81Fw90m_MjD010
0ORrt60180e5RRB0080GjjiDT2eHmZsK3G1IRRZ8899ebDj5abW4nsMMDIIMr0SGd0K4y8Ds
qssK2II2QPJp2998Iilbw7PeJWAg1WWW7j10bWKD06GGI0200Wa99900G0Gaac4w48ZW7ln@
GMYaaVV@@89oIYVzx@a099Xt@x@Wa4aaE1im799PmZr0800Gjijzz3AWDjjDq02ijfjq9G61
F_p@OAiJM4rLxNb0vayhW7thqg19yq013DyGq1MqVmFTqzGd044DGLnC7vqH6jUq71ErJq0H
4y8Pl1TGhuEbem51FAS0QS5rUVT1_mN7xTFmFFOzma1X5SJ854SKq074S@@phgIBoTr4nIr0
0JKkUKT0FZXMHm9G5rW1W200w4OaW7lf6W28119HIIIYWaW49998IGIInBg0aaaWWwMg609W
0995Kt6nm4R88AE0WP02022Dmh6pkAuH0bWae4DW50919x4u2Waaar041199XW7l1101mf4q
4yO7Ysss2UK5GWzjQP022Uq0W10jORV100X06yuCuaaa2Ua3jiCIaaiO3Uq1oq89o22R3Ui4
WQRR1FA3RRPQ8911Yjjj2Uy6D2001Fg18A19J3001Fg0220WW7HXdaaKmZD0a@@FuHDyEab0
1vtFuH3yv@a09PXt@xzGmZp8gjjDuHE044rYjD58uH30408WDjjCunlASiiDnBR00hxYYWSI
oe0dbQfoY01LQxIFwiHfLD7AxnUgCeZ0dIAQW22Uai8l2fan@2U4oS1AO102Y4mWW7bAu28Y
W0a8DiDe1f2DmYu4aAh5Gkm1Y22m9QW32ZuXE1KuS7yA88X19c9rW3sOSXWJ_hvQ1h18am9c
8msY50006yeM2Io2g1GXW7ReJW48aaa4y8HA8191III6Xt6H3eGmZc_w1CHW3D600W0RdCuH
GJ3u0G2KIH3OX4W4We1mWWaaKD04WWWaCQWFgEO120205pS1181WW66ganB2Ua30WzjQR02g
1e00100ebjjh1GXW7RfaH22USZQ0C8un3ijjGgaa4h6062U4aI6L8uHJg1GYW7dHY00GmZQ0
WIGg6042UiWQ0M8uHGAPi1@aaaPDgGmZJuV8BHIolVD05ut@@7989PD0B4y8BWQRR3Ua300G
jtFa0W000ifjjr0SGmZzE00fZcH6100WSMe9_A9U5JZOO_AQ0q60usX749uHa2S2aI5cvckD
2Uy@0qci606G0044URwnZ0TKXG7Q0QH38qdECq9W3vc6Nm9Ss90D1dGJh4n4yuD1r5HmZMq9
014aai2UKd22w8ekBYX1dr0E8Ag72Uy@mM2hpBLUB8ZG3q8IIOYP8Zw8A8u4AwhWXOBKvRH2
g1e289991Q0Y4a4iQ080a44KmZHqWg1r0KGK7EK3W51Fw1W0WWqwle6W32WSYQ0i8uHa0400
K@e6ostsC080q902URR3W00G6yeFr0OGmZ4K3W2ORRaO99vgfjDY4aaWsosMGoIIKRQRr919
5yODr0G0aa4wQ0e0jjTYWa4QMssEIIIIPJRR3989HkbjTmZyK3G31FgW00u41992T2S01089
GII01FgZV@@@Q0S8uH5u@@GYbaatt@@PD04e@@DnII2lx@@ZW7lf6W62UaWQ0Km00KhqsMWE
1C0W200scssW7DT0W@333xW7@F0De2wEge2HBun@3Uim0DG3200Gq016FIRXyMJ11p4DGIXL
gUCcG7SIlrJ3Hm9b5yuDr0qHSSKKAt2Waia2UCbQ0w8unDQysYOOICun@B8WcOst8u4uccXX
uIl9sYI099A5e15H3u2909f89pG2IIGmZQ4dmIfdRHmZnK3m8Ws_si501q9G1W008ross5yO
Gr0CHd08GRRX489fcbjjJaba41FYJD0Pq901CjjTaWaakA91aaaSrts65y8Ir0mGd078199j
J058D994y8Dr0CYF9B9Iyl@T2SWFIGoW75g60A0100gbjjh602yjj5000WocssoeX@F00cBW
lL0Q46yu@T6eI0JC4VLDt0aX080WE1Mu9W72Q8hz9O8unZFDWXu4s93e92UClOYi8ms@x4GZ
JywOflM2GJii2u8wJ13e9sWxPeD3s6CWXWJUA71E2QuflBi8u4c80014yOPKIoIw48198991
r94aa4aQ0emIIIYWa4bW7r8_tP100004008SYoY68Z9PGBOBb3Uah0D62899PaaeGGIoAuHi
U1mYW7VYljD0G00wW79m00GhossWE1C8ungqqs6H2IIGRORB8H9fW7j2jjTYWa4Q6ssE1FgG
D064yeK2II42Uy020GIqaa0010GHIII8uHfmIIoxx@@CuH2m@@c889Xtx@@n7164y8J40WQL
ss20200iJ02800iPQRB0400LmZ@F0m@1F_@00n6uqQ1DKMmZ0FLt4n9WMaNt6SIwVd7H8Y8L
Yt354KGq095Qm213lLeRh5GJiL2KJk7841X4rduKG1q4le61FwGu4C4S2Djv4JmZEXbaaCeE
H09P95X7GO999LGGI6Dm24aaW2UigOCR8mMY2RnpqPv8qWDZKPlW772889PD0C4Ng5f1mGq0
mGQ2IAuHbrt0008Wjj602G0jjPP10e_H7w48YW7vnc699IGeDRBBa89Bn2UiXE1c8uHRaM99
HGejLBBaKzZIq9m41Fs3110WQ0E01899Q20WW7JeJWA2UK7P9@@_zHIg1W0xJII44_@hVqXE
1Q8uHTGGjjT@W28WjjPQ00K@O4T2qGmZ@F0m@1Rz@00McDK61F_VD0X6yuc88002UiiAE0DU
4T18004fou1qy@00caXe1ZGeGm9@7TZD1FwKd0PKAt31F2Kd0P4y8Kn@UOm9@7SocnMuq806
05aaCG3_2UKJ10Gsajj10000p_ss00100QVRR2W100ibjP3C00WiiLR3400WMsE1A0zjjD32
00G_ss1FQ3ss69MIIir0S0jj5IWaaO6ss6HKIImmss6YIIYSPRR6P99T2W0jjjJWaa41FQJD
05mqsMG2II2RORR8199Yjijh1W0BRRRT2e0JRRR8899oXjjP4aa4yeD20WIqaa00000G2III
D040II204004f991W000ED99XG000acaiJ02aWaaq901Waa42Ui6_@Fa099vz@@FYiaam@_@
FIMIImV_@U819Hop@xV88HIoxl@@4aq0AWP999uz@VViaa1FQZ00eMfjj0W000ross0G000R
TRRe14OJRR1800WwQRR24000CjjP74000Mscj5200WAxW7@SEOzgQKO0100JfJmgt6q3c4t@
smfW94SYCH3a1G00WE188Q0a60OYw1A8U_7Q58fB6zPo_Qg7eXRcd8mfTY6OYE1Eu0QBAL0e
@@T8un@7zBd0q_w_13w40Y3F8O2Bo6BqY10I9S432sIj15e8Cic3dGZ0q_FC35Eh0Zu4UgL6
Lc7mW6JSIG00Gg1HKJJ2L7WJpCZ4MP31dqps0Eq901bACHmZr091BHII2YWaWWQ0A018PP@@
44yu22II2w4G1GIIM1F_V88t5eH61daSR374yOOH3iHi5xqaH1r0q0489fOBm8Q0S4aaWK3W
4H3WGaaJ4yOdr0C1200mQ0OeJW82UicQ0CuQH3g1OYE1e8unTg1022II2T2OHQ044yODr0aW
qaaaQ0WeJ0B2UqcQ0I0199HD07O@@Ve606w4e1Vaaa1FQJD060100i6WBw4GYW7zS0W@3sw@
OcNjxKq2S2jesHBun@3kVpWJ_F4_@3ev@u4SDua@3izbW7v9UnP2gxc22qej0B2USeB0CO7H
30100q9G4RhJNm9@7sW6FDKGm9y5NAQH3S4WaaaQ0Ae8W22quYW7Rj6W72UafQ0o8unlg1mW
W7hg6W92UigQ0o8uHcg1uZW7@V0W@3sw@W7@Fun@3Gx@W7@FCi@3Du@W7@Fua@3U4fu5Z92F
qYXnwWJ_FuaD3UyrQ0G8uH6aWaa4yOM1So0W00WW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@
mm_FqW@3ev@W7@Fun@3Uy@WJ_Fun@3UKl0Du8e1q2Uy@W7@Fun@70u@0Q_Fun@3Uy@W7@Fun
@33x@G3_FWc@3Uy@W7@Fun@3Ev@W7@Fun@rssE4yuP4RRR3Uy@W7@V0W@Z9Bzs24Cun@3Uy@
W7@Fun@3sw@cP_lWWG02004Gp@1F_VmZ@7yOf1dyV0DZ3G008uno81995yu8f1K089Afe1k0
a4aKmZBH0G0O0WBg1GZW7@Fun@3Uy@10_Fun@3Uy@W7@Fun@3Uy@W7@Vvl23Gx@W7@Fua@3U
y@W7@Fua@tZ1fW719302Yje48999nM0JD0H0I22AQWBg1eWW77ApHGQUCbW7Ffan32UCiI6F
8un@3Uy@10_V0W@3sw@W7@Fun@3Gx@WJ_FCi@3Gx@W7@Fun@3Uy@OOqCua@3EPpOBGBGZr2Q
0jW7vHVR00W0WsW7Bpcs29IGICRBRZ89B92UqAfjGI4a4Rros8HoIYLRVRKmZSHGI08unoab
4@xt@99unlG0WjL3G3Cj502UCP020030y@00zSQ11P0W0W00WOOu280GG0DI11008unc3De1
20001CnHWJy4DW4T2uGX0F4yu@r0SnY254W6s51OGm6LaWgh1DKMq054Ws@X68QnDJ4yu@1F
k820WWW7bxOd42Ua7GIGIr0a0989fQ08GGIMId098199XIGIIGTS9199eJW68D994dGKnMWM
eEv5XL2FcyLq0C4yu@1F_VmZNm1008unKqs60044ej6W4C0108xVRp0a00ezjDR1200Wstij
1800eRFunA8sss6yu7QPPag1m2qYss0oGIaP2RpO1AH2CaDRXe59fMqijJ62UqdQ0CGJJZ49
88sQ0C0cmscH0IIm3PRs989Hg5jPRaW49fUajDGYW7tnq00GD0J800E1KIY0W0041B9f0I00
qCaa800004IGImZw01v@l603yzzaK3G2uN@@XPB9H_D@tdya49_iV@BoIa4_xz@Nf7yuD02Y
Qh1G1WW0Rr0aWW600rcss4G800GRQpkW500i9DRh0400rq1FULpMVC0m@5InMYZPKAG3XD8K
q0LaC018200Y6OYWjejPW9YkmfSzQeRW6wLmW0dGAQ03w4uWe1c8unpH000a608p5GH8LkLK
75HjVwT19CfrMX8_OX79KgWKN5cnvkk4QG8H3KqCpV0200eZWB2QmguSb0500G44PrRm130i
JX0Ca_x41FExy4M4En51dm420800001TQHmI7F4yu9MIIIWaaa8A99f7E2KIIIM3G14aWaYZ
B1GIoInnH0aai4999AGII2w48118891rjYbaa40999YIIIaWaa4D0109993g32B9992Waaw4
e08991IGIoa4aa4KN3n9qIy27e000exXD2N8Z88AX0W0GM0A4Em1DWOmg55KDIMP4KHR1HKH
01xQCIq0qykG3ZqtGm9654228000_k@Ye1s9zX92Uy7GIGGb0KG6658191f6028198L302IG
IGg1W0WaaaT2GWWaaiE1K0aaamS05K@8609193Ua90101J13Ja2T4qG4tZOGmZPWWijDuHDq
_0000XjLRV080WWMjjz00003rsssOm60GsRscXO70GxDRs2i500jsPR3m20GtRmZhGM899un
4msM8HIIcLRR349990jjjXWaa49sss2HIIY1q0cj1YKaaP0ssOHKI2C0QRXGA9fY0ijJCXa4
1FoXqA9922jj1FIXcB99I0jjQ3Xa898sejLH2aa0hssE8III0m0ssC2GI2M0QpE009Ij0CRZ
4W89r1ij12ma408unLGJ004yO2QI20g1e0m0001FIGp34GIIoeJ02Gda80000H8JIA0000Db
8920G00nOb4yO7s7II2Ui122@@1Fc0GIMU@@VZ8997yt@lZaaaMy@@l4IIIamt__7o5aaiRv
@Fv6IIyD@@N4I99ykv@lWfaa4y878essg1u0t0008Wjj3UC110IjQRR00005gjjj1W004sss
610004QRRbIGB00QJos2fD00e9QRNmC00_8jjLXM0WoaqsoSY@F0GQ5XqHy744ho1@gqGOOY
yAG3RlSHe0F4yO3XzZIq0k4yu2H3OHaNC1108uZXUULKZOC3P0WjIyvWT2O8sFk2QOh8Yo8c
idIBOYABJ80Df2zmYu4evQ0D2U41G0001DSmVK541n95kUId04GG00u2W3oOqa3xEffW8Y6u
W8l0B7FD244jWJSQ00pYKfcE6M9WJuG104y9m1F4OmQ5C411QfRAKU8ZO0008uaXAQ1Xq0e8
_tgW2044XW51dyHzALqMG4jPaW0G0WEFf8uHE8O99r3d28099xXRXQ0O8EE6Wbab889H9un3
YNaX8yM9eEI4baa809HfJW3Y6mW89D88edW001qz07HG8JZ9ebLW6a0020100ySn1h0O0G20
WzcuAOuuY6OjOBW8f23YjG41918r0GXbaa4D99AT2S0B9HfE1CWcaaGW6F5sQ1H34HmZ74d0
PQRRRP000Wv@@tdaa4fssMjP0000@@z@V9HIoRpss20000s01Dmsss60000W@@l12IGD060_
t@tXaaKD09KBO1Q0008000mt000c400mM00090008T0006100m000049IIIiQ3I08999099f
YQEGaaa4XaaaQ0E09999899fQ001WH0GzABW4000a00GI07y6b23AQGH4AyhX2tBQGD0XW00
0i605Q8uWu4IWjjjD7IIIK2000QRRrcRRpsia49v1000kDRRBiQRPHaaa40000msss6ossss
G98D030RRRN3W2OBRRVVy0D000a100uI0003008E12O2008900O302aaaauIIIYJRRhERRRs
D99Ioaa89ssgjzscjjd499fIaabOsss6rsssGIII2B999ejjDBjjjQ999HIbaiaP1r0O0IMI
IHRRRr0GW4000N000SB00WP100C100Gk000o600Wr01DKGYl44SG2GIIIgFG1aaaaxieGD06
0800u302g1u00108r0mGG34qem1f1OGtA6isd38999IfmWT08GIIIMK99K3G2V0KG837W004
8D06g1GXI8Ce604EtiWE1EGjjjDdaaas6E0QRRh09992100ZhGWGRRP2999I200w9W0WjjfY
aaak0x0ncss0IIIa400a6G1osM8HII2040W0000WGGIIC1000288N7W0W899Y40008aa81jj
LRORhska499s@_@VRrssngjjDHIIIe@@@7RRRROss_C999Hm@@dFsscjnjjL880H@@VD04WR
PRRT02y@@@msss6iljjHIII4@z@UPJIa4JJkt014zJJai99Hoy9Py12Gq99H2jjLRjjDRpsM
jj@sijTRrssTpssULRRRCRRRRRRRRwRRR5jjjPXjj5BsscjvsMzDRRss8Rrs6RpssQptsETD
05e5RRpsSRhscjDRRibQRXDHIIzHQRt6999ZDjjTcaaawcqsyRIIY8JQpU00GGtas9GBH5or
00nU1a4LWcHS2z4DG4T2eG_YJ41XN57SGi5eL3mG79iGW6TTnW31QuK@SCqSr2T2SmpSzCS0
E30SLc1DyfX2nZiMW6Ir2o4bNaL6RF4GJln9OH44ID403TlFpXAc04008Q02o60Xe1awRUAg
IKX0DujlYcwO8XCCm2410GWJD63H3HGKMiVwGaaayYC2gv4YE1i8GmR8899LGm6T2G0aaaiE
1IG6III0dG5eHMH0HHW6HzC35DpeLq05KOH21erNGti4e1Ur0OmE04Kpv3T2KW4WaiE180aa
44999B2GI21SY4989feEw8GZq08800W00A2H3800010W0040WGS35K3GJ;
INTEGER CHECKSUM =32706;
ENDDATA;
PROCEDURE DO_EXIT USES GV;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $81;
WAIT IDLE, 250 USEC;
IRSCAN 8, $81, CAPTURE BUFF128[7..0];
IF ( ! (BUFF128[2]==0) ) THEN GOTO Label_0;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $07;
WAIT IDLE, 1 CYCLES;
WAIT IDLE, 200 USEC;
Label_0:
IRSCAN 8, $ff;
WAIT IDLE, 200 USEC;
WAIT RESET, 3 CYCLES;
EXIT STATUS;
ENDPROC;
PROCEDURE DO_READ_SECURITY USES GV;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a4;
WAIT IDLE, 3 CYCLES;
DRSCAN 44, $00000000000, CAPTURE SECREG[];
ULUWE = SECREG[ULUWE_BITLOCATION];
ULARE = SECREG[ULARE_BITLOCATION];
ULUPC = SECREG[ULUPC_BITLOCATION];
ULUFE = SECREG[ULUFE_BITLOCATION];
ULUFP = SECREG[ULUFP_BITLOCATION];
ULUFJ = SECREG[ULUFJ_BITLOCATION];
ULFLR = SECREG[ULFLR_BITLOCATION];
ULULR = SECREG[ULULR_BITLOCATION];
ULAWE = SECREG[ULAWE_BITLOCATION];
ULARD = SECREG[ULARD_BITLOCATION];
ULOPT[1] = SECREG[ULOPT1_BITLOCATION];
ULOPT[0] = SECREG[ULOPT0_BITLOCATION];
ENDPROC;
PROCEDURE DO_OUTPUT_SECURITY USES GV;
PRINT "Security Settings :";
IF ( ! (ULUFP==1) ) THEN GOTO Label_1;
PRINT "FlashROM Write/Erase protected by pass key.";
Label_1:
IF ( ! (ULUFJ==1) ) THEN GOTO Label_2;
PRINT "FlashROM Read protected by pass key.";
Label_2:
IF ( ! (ULAWE==1) ) THEN GOTO Label_3;
PRINT "Array Write/Erase protected by pass key.";
Label_3:
IF ( ! (ULARD==1) ) THEN GOTO Label_4;
PRINT "Array Verify protected by pass key.";
Label_4:
IF ( ! (ULUFE==1) ) THEN GOTO Label_5;
PRINT "Encrypted FlashROM Programming Enabled.";
Label_5:
IF ( ! (ULARE==1) ) THEN GOTO Label_6;
PRINT "Encrypted FPGA Array Programming Enabled.";
Label_6:
PRINT "=========================================";
ENDPROC;
PROCEDURE DO_QUERY_SECURITY USES DO_READ_SECURITY,DO_OUTPUT_SECURITY;
CALL DO_READ_SECURITY;
CALL DO_OUTPUT_SECURITY;
ENDPROC;
PROCEDURE READ_UROW USES BITSTREAM,GV;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $c0;
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a8;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 165 USEC;
DRSCAN 128, $00000000000000000000000000000000, CAPTURE UROW[];
SUROWALGOVERSION[6..0] = $00;
IF ( ! ( (UROW[5]==0)&&(UROW[0]==1)) ) THEN GOTO Label_7;
SUROWALGOVERSION[5..4] = UROW[24..23];
Label_7:
IF ( ! ( (UROW[5]==1)&&(UROW[0]==0)) ) THEN GOTO Label_8;
SUROWALGOVERSION[5..4] = UROW[24..23];
SUROWALGOVERSION[6] = 1;
Label_8:
SUROWCHECKSUM[15..0] = UROW[127..112];
SUROWCYCLECOUNT = INT(UROW[111..102]);
SUROWDESIGNNAME[69..0] = UROW[101..32];
SUROWPROGMETHOD[2..0] = UROW[31..29];
SUROWALGOVERSION[3..0] = UROW[28..25];
SUROW_PKG_TYPE[5..0] = UROW[22..17];
SUROW_SW_VERSION[6..0] = UROW[16..10];
SUROWPROGRAMSW[3..0] = UROW[9..6];
SUROW_SRAM_DISTURB[0] = UROW[4];
SUROW_SPEED_GRADE[2..0] = UROW[3..1];
ACT_UROW_CYCLE_COUNT = SUROWCYCLECOUNT;
ENDPROC;
PROCEDURE FIX_INT_ARRAYS USES GV;
IF ( ! (HEX[0]!=48) ) THEN GOTO Label_9;
FOR I = 0 TO 7;
TEMP = HEX[I];
HEX[I] = HEX[(15-I)];
HEX[(15-I)] = TEMP;
NEXT I;
Label_9:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DISP_CHKSUM_DESIGN USES GV,FIX_INT_ARRAYS;
CALL FIX_INT_ARRAYS;
IF ( ! (INT(SUROWCHECKSUM[15..0])==65535) ) THEN GOTO Label_10;
PRINT "CHECKSUM: ";
Label_10:
IF ( ! (INT(SUROWCHECKSUM[15..0])!=65535) ) THEN GOTO Label_11;
PRINT "CHECKSUM: ",CHR$(HEX[INT(SUROWCHECKSUM[15..12])]),CHR$(HEX[INT(SUROWCHECKSUM[11..8])])
,CHR$(HEX[INT(SUROWCHECKSUM[7..4])]),CHR$(HEX[INT(SUROWCHECKSUM[3..0])]);
Label_11:
IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])==2147483647)&&(INT(SUROWDESIGNNAME[31..61])==2147483647))&&(INT(SUROWDESIGNNAME[62..69])==255)) ) THEN GOTO Label_12;
PRINT "Design Name: ";
Label_12:
IF ( ! ( ( (INT(SUROWDESIGNNAME[0..30])!=2147483647)||(INT(SUROWDESIGNNAME[31..61])!=2147483647))||(INT(SUROWDESIGNNAME[62..69])!=255)) ) THEN GOTO Label_13;
PRINT "Design Name: ",CHR$(INT(SUROWDESIGNNAME[63..69])),CHR$(INT(SUROWDESIGNNAME[56..62]))
,CHR$(INT(SUROWDESIGNNAME[49..55])),CHR$(INT(SUROWDESIGNNAME[42..48])),CHR$(INT(SUROWDESIGNNAME[35..41]))
,CHR$(INT(SUROWDESIGNNAME[28..34])),CHR$(INT(SUROWDESIGNNAME[21..27])),CHR$(INT(SUROWDESIGNNAME[14..20]))
,CHR$(INT(SUROWDESIGNNAME[7..13])),CHR$(INT(SUROWDESIGNNAME[0..6]));
Label_13:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DISPLAY_UROW USES BITSTREAM,CONSTBLOCK,GV,DISP_CHKSUM_DESIGN;
EXPORT "USER_ROW", UROW[127..0];
PRINT "User information: ";
CALL DISP_CHKSUM_DESIGN;
IF ( ! (FLAGDISPLAYCYC==1) ) THEN GOTO Label_14;
PRINT "CYCLE COUNT: ",SUROWCYCLECOUNT;
Label_14:
INTEGER TMPINT =INT(SUROWPROGMETHOD[]);
INTEGER TMPINT2 =0;
INTEGER TMPINT3 =0;
INTEGER TMPINT4 =0;
INTEGER TMPINT5 =0;
IF ( ! (TMPINT==IEEE1532) ) THEN GOTO Label_15;
PRINT "Programming Method: IEEE1532";
Label_15:
IF ( ! (TMPINT==STAPL) ) THEN GOTO Label_16;
PRINT "Programming Method: STAPL";
Label_16:
IF ( ! (TMPINT==DIRECTC) ) THEN GOTO Label_17;
PRINT "Programming Method: DirectC";
Label_17:
IF ( ! (TMPINT==PDB) ) THEN GOTO Label_18;
PRINT "Programming Method: PDB";
Label_18:
IF ( ! (TMPINT==SVF) ) THEN GOTO Label_19;
PRINT "Programming Method: SVF";
Label_19:
PRINT "Algorithm Version: ",INT(SUROWALGOVERSION[6..0]);
TMPINT = INT(SUROW_SPEED_GRADE[]);
IF ( ! (TMPINT==GRADE_UNSPEC) ) THEN GOTO Label_20;
PRINT "Device Speed Grade: speed grade information not available from device";
Label_20:
IF ( ! (TMPINT==GRADE_1) ) THEN GOTO Label_21;
PRINT "Device Speed Grade: -1";
Label_21:
IF ( ! (TMPINT==GRADE_2) ) THEN GOTO Label_22;
PRINT "Device Speed Grade: -2";
Label_22:
IF ( ! (TMPINT==GRADE_3) ) THEN GOTO Label_23;
PRINT "Device Speed Grade: -3";
Label_23:
IF ( ! (TMPINT==GRADE_F) ) THEN GOTO Label_24;
PRINT "Device Speed Grade: -F";
Label_24:
IF ( ! (TMPINT==GRADE_STD) ) THEN GOTO Label_25;
PRINT "Device Speed Grade: STD";
Label_25:
IF ( ! (TMPINT==GRADE_4) ) THEN GOTO Label_26;
PRINT "Device Speed Grade: -4";
Label_26:
IF ( ! (TMPINT==GRADE_UNDEF) ) THEN GOTO Label_27;
PRINT "Device Speed Grade: speed grade information not available from device";
Label_27:
TMPINT = INT(SUROWPROGRAMSW[]);
IF ( ! (TMPINT==FP) ) THEN GOTO Label_28;
PRINT "Programmer: FlashPro";
Label_28:
IF ( ! (TMPINT==FPLITE) ) THEN GOTO Label_29;
PRINT "Programmer: FlashPro Lite";
Label_29:
IF ( ! (TMPINT==FP3) ) THEN GOTO Label_30;
PRINT "Programmer: FlashPro3";
Label_30:
IF ( ! (TMPINT==FP4) ) THEN GOTO Label_31;
PRINT "Programmer: FlashPro4";
Label_31:
IF ( ! (TMPINT==FP5) ) THEN GOTO Label_32;
PRINT "Programmer: FlashPro5";
Label_32:
IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_33;
PRINT "Programmer: Sculptor WIN";
Label_33:
IF ( ! (TMPINT==BPW) ) THEN GOTO Label_34;
PRINT "Programmer: BP Programmer";
Label_34:
IF ( ! (TMPINT==DIRECTCP) ) THEN GOTO Label_35;
PRINT "Programmer: DirectC";
Label_35:
IF ( ! (TMPINT==STP) ) THEN GOTO Label_36;
PRINT "Programmer: Actel JAM Player";
Label_36:
IF ( ! ( ( ( ( (TMPINT==FP)||(TMPINT==FPLITE))||(TMPINT==FP3))||(TMPINT==FP4))||(TMPINT==FP5)) ) THEN GOTO Label_52;
TMPINT2 = INT(SUROW_SW_VERSION[]);
IF ( ! (TMPINT2==FP33) ) THEN GOTO Label_37;
PRINT "Software: FlashPro v3.3";
Label_37:
IF ( ! (TMPINT2==FP34) ) THEN GOTO Label_38;
PRINT "Software: FlashPro v3.4";
Label_38:
IF ( ! (TMPINT2==FP40) ) THEN GOTO Label_39;
PRINT "Software: FlashPro v4.0";
Label_39:
IF ( ! (TMPINT2==FP41) ) THEN GOTO Label_40;
PRINT "Software: FlashPro v4.1";
Label_40:
IF ( ! (TMPINT2==FP42) ) THEN GOTO Label_41;
PRINT "Software: FlashPro v4.2";
Label_41:
IF ( ! (TMPINT2==FP50) ) THEN GOTO Label_42;
PRINT "Software: FlashPro v5.0";
Label_42:
IF ( ! (TMPINT2==FP51) ) THEN GOTO Label_43;
PRINT "Software: FlashPro v5.1";
Label_43:
IF ( ! (TMPINT2==FP60) ) THEN GOTO Label_44;
PRINT "Software: FlashPro v6.0";
Label_44:
IF ( ! (TMPINT2==FP61) ) THEN GOTO Label_45;
PRINT "Software: FlashPro v6.1";
Label_45:
IF ( ! (TMPINT2==FP62) ) THEN GOTO Label_46;
PRINT "Software: FlashPro v6.2";
Label_46:
IF ( ! (TMPINT2==FP84) ) THEN GOTO Label_47;
PRINT "Software: FlashPro v8.4";
Label_47:
IF ( ! (TMPINT2==FP85) ) THEN GOTO Label_48;
PRINT "Software: FlashPro v8.5";
Label_48:
IF ( ! (TMPINT2==FP86) ) THEN GOTO Label_49;
PRINT "Software: FlashPro v8.6";
Label_49:
IF ( ! (TMPINT2==FP90) ) THEN GOTO Label_50;
PRINT "Software: FlashPro v9.0";
Label_50:
IF ( ! (TMPINT2==FP91) ) THEN GOTO NOT_FP91;
PRINT "Software: FlashPro v9.1";
NOT_FP91:
IF ( ! (TMPINT2==FP100) ) THEN GOTO NOT_FP100;
PRINT "Software: FlashPro v10.0";
NOT_FP100:
IF ( ! (TMPINT2==FP_11) ) THEN GOTO NOT_FP_11;
PRINT "Software: FlashPro v11.0";
NOT_FP_11:
IF ( ! (TMPINT2==FP_11_1) ) THEN GOTO NOT_FP_11_1;
PRINT "Software: FlashPro v11.1";
NOT_FP_11_1:
IF ( ! (TMPINT2==FP_11_2) ) THEN GOTO NOT_FP_11_2;
PRINT "Software: FlashPro v11.2";
NOT_FP_11_2:
IF ( ! (TMPINT2==FP_11_3) ) THEN GOTO NOT_FP_11_3;
PRINT "Software: FlashPro v11.3";
NOT_FP_11_3:
IF ( ! (TMPINT2==FP_11_4) ) THEN GOTO NOT_FP_11_4;
PRINT "Software: FlashPro v11.4";
NOT_FP_11_4:
IF ( ! (TMPINT2==FP_11_5) ) THEN GOTO NOT_FP_11_5;
PRINT "Software: FlashPro v11.5";
NOT_FP_11_5:
IF ( ! (TMPINT2==FP_11_6) ) THEN GOTO NOT_FP_11_6;
PRINT "Software: FlashPro v11.6";
NOT_FP_11_6:
IF ( ! (TMPINT2==FP_11_7) ) THEN GOTO NOT_FP_11_7;
PRINT "Software: FlashPro v11.7";
NOT_FP_11_7:
IF ( ! (TMPINT2==FP_11_8) ) THEN GOTO NOT_FP_11_8;
PRINT "Software: FlashPro v11.8";
NOT_FP_11_8:
IF ( ! (TMPINT2==UNKNOWN) ) THEN GOTO Label_51;
PRINT "Software: FlashPro vX.X";
Label_51:
LABEL_SEPARATOR = 0;
Label_52:
IF ( ! ( (TMPINT==SCULPTW)||(TMPINT==BPW)) ) THEN GOTO Label_56;
TMPINT3 = (INT(SUROW_SW_VERSION[6..5])+SCULPTORMAJORBASE);
TMPINT4 = (INT(SUROW_SW_VERSION[4..1])+SCULPTORMINORBASE);
TMPINT5 = 0;
IF ( ! (SUROW_SW_VERSION[0]==1) ) THEN GOTO Label_53;
TMPINT5 = 1;
Label_53:
INTEGER CURRPGM =INT(ACT_UROW_PROGRAM_SW[3..0]);
IF ( ! (TMPINT==SCULPTW) ) THEN GOTO Label_54;
IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4;
PRINT "NOTE: The Sculptor Windows version number below should be converted to HEX.";
NOT_FP3_FP4:
PRINT "Software: Sculptor Win v",TMPINT3,".",TMPINT4,".",TMPINT5;
Label_54:
IF ( ! (TMPINT==BPW) ) THEN GOTO Label_55;
IF ( ! ( ( (CURRPGM==FP3)||(CURRPGM==FP4))||(CURRPGM==FP5)) ) THEN GOTO NOT_FP3_FP4_BPW;
PRINT "NOTE: The BP Windows version number below should be converted to HEX.";
NOT_FP3_FP4_BPW:
PRINT "Software: BP Win v",TMPINT3,".",TMPINT4,".",TMPINT5;
Label_55:
LABEL_SEPARATOR = 0;
Label_56:
PRINT "=========================================";
ENDPROC;
PROCEDURE READ_F_ROW USES GV;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $c0;
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $f9;
DRSCAN 3, FADDR[];
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $bf;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 165 USEC;
DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[];
ENDPROC;
PROCEDURE DO_DEVICE_INFO USES GV,READ_UROW,DISPLAY_UROW,READ_F_ROW;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $0e;
WAIT IDLE, 1 CYCLES;
DRSCAN 32, $00000000, CAPTURE BUFF32[];
EXPORT "SILSIG", BUFF32[];
IRSCAN 8, $84, CAPTURE BUFF128[7..0];
IF ( ! (BUFF128[2]==1) ) THEN GOTO CORE_NOT_ENABLED;
PRINT "FPGA Array is programmed and enabled.";
CORE_NOT_ENABLED:
IF ( ! (BUFF128[2]==0) ) THEN GOTO CORE_ENABLED;
PRINT "FPGA Array is not enabled.";
CORE_ENABLED:
CALL READ_UROW;
CALL DISPLAY_UROW;
FADDR[] = $0;
CALL READ_F_ROW;
EXPORT "FSN", BUFF128[55..8];
PRINT "=========================================";
ENDPROC;
PROCEDURE INIT_AES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $dd;
DRSCAN 128, $00000000000000000000000000000000;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 165 USEC;
ENDPROC;
PROCEDURE DO_VERIFY_DEVICE_INFO USES GV,BITSTREAM,DO_EXIT,DO_READ_SECURITY,READ_UROW
,DISP_CHKSUM_DESIGN;
CALL READ_UROW;
CALL DISP_CHKSUM_DESIGN;
CALL DO_READ_SECURITY;
BUFF32[31..0] = BOOL(CHECKSUM);
UROW[127..112] = BUFF32[15..0];
UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0];
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $c0;
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a8;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 165 USEC;
DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],$ffff003fffffffffffffffff00000000
,PASS;
IF ( ! (PASS==0) ) THEN GOTO UROW_CMP_OK;
STATUS = -43;
PRINT "Failed to verify design information.";
UNIQUEEXITCODE = 32772;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
UROW_CMP_OK:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE READ_IDCODE_ONLY USES GV;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $0f;
WAIT IDLE, 1 CYCLES;
DRSCAN 32, $00000000, CAPTURE ID[];
EXPORT "IDCODE", ID[];
ENDPROC;
PROCEDURE VERIFY_RLOCK USES GV;
IRSCAN 8, $84,COMPARE $04,$04,PASS;
ENDPROC;
PROCEDURE DO_VERIFY_PGM_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK;
CALL VERIFY_RLOCK;
IF ( ! (PASS==0) ) THEN GOTO RLOCK_PGM_PASS;
STATUS = 10;
PRINT "Failed to enable FPGA Array.";
UNIQUEEXITCODE = 32891;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
RLOCK_PGM_PASS:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_VERIFY_DISABLE_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK;
CALL VERIFY_RLOCK;
IF ( ! (PASS==1) ) THEN GOTO RLOCK_PGM_FAIL;
STATUS = 10;
PRINT "Failed to disable FPGA Array.";
UNIQUEEXITCODE = 32918;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
RLOCK_PGM_FAIL:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_VERIFY_RLOCK USES GV,DO_EXIT,VERIFY_RLOCK;
CALL VERIFY_RLOCK;
IF ( ! (PASS==0) ) THEN GOTO RLOCK_VERIFY_PASS;
STATUS = 11;
PRINT "FPGA Array is not enabled.";
UNIQUEEXITCODE = 32892;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
RLOCK_VERIFY_PASS:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE VERIFY_ID_DMK USES GV,DO_EXIT,INIT_AES;
CALL INIT_AES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $0a;
DRSCAN 128, M7BUFF[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 90 USEC;
DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000
,$c0000000000000000000000000000000,PASS;
IF ( ! (BUFF128[127]==0) ) THEN GOTO M7VERDONE;
STATUS = -31;
PRINT "Failed to verify AES Sec.";
UNIQUEEXITCODE = 32775;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
M7VERDONE:
IF ( ! ( (BUFF128[126]==0)||(BM7DEVICE==0)) ) THEN GOTO MXIDOK;
IF ( ! ( (BUFF128[126]==1)&&(BM7DEVICE==0)) ) THEN GOTO LDETECTM1;
STATUS = 6;
PRINT "Failed to verify IDCODE.";
PRINT "Target is an M7 device.";
UNIQUEEXITCODE = 32776;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
LDETECTM1:
IF ( ! (BUFF128[126]==0) ) THEN GOTO Label_59;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $0a;
DRSCAN 128, M1BUFF[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 90 USEC;
DRSCAN 128, $00000000000000000000000000000000, CAPTURE BUFF128[],COMPARE $c0000000000000000000000000000000
,$c0000000000000000000000000000000,PASS;
IF ( ! (BUFF128[127]==0) ) THEN GOTO M1VERDONE;
STATUS = -31;
PRINT "Failed to verify AES Sec.";
UNIQUEEXITCODE = 32777;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
M1VERDONE:
BOOLEAN BTMPBUFFBIT126 = BUFF128[126];
IF ( ! ( (BTMPBUFFBIT126==1)&&(BM1DEVICE==0)) ) THEN GOTO REGDEV;
STATUS = 6;
PRINT "Failed to verify IDCODE.";
PRINT "Target is an M1 device.";
UNIQUEEXITCODE = 32778;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
REGDEV:
IF ( ! ( (BTMPBUFFBIT126==0)&&(BM7DEVICE==1)) ) THEN GOTO Label_57;
STATUS = 6;
PRINT "Failed to verify IDCODE.";
PRINT "The Target is not an M7 Device.";
UNIQUEEXITCODE = 32781;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_57:
IF ( ! ( (BTMPBUFFBIT126==0)&&(BM1DEVICE==1)) ) THEN GOTO Label_58;
STATUS = 6;
PRINT "Failed to verify IDCODE.";
PRINT "The Target is not an M1 Device.";
UNIQUEEXITCODE = 32782;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_58:
LABEL_SEPARATOR = 0;
Label_59:
LABEL_SEPARATOR = 0;
MXIDOK:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE VERIFY_IDCODE USES GV,PARAMETERS,DO_EXIT;
FREQUENCY (FREQ*1000000);
WAIT RESET, 5 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $0f;
DRSCAN 32, $00000000;
WAIT IDLE, 1 CYCLES;
DRSCAN 32, $00000000, CAPTURE ID[],COMPARE IDCODEVALUE[],IDMASK[],PASS;
IF ( ! (PASS==0) ) THEN GOTO IDOK;
STATUS = 6;
PRINT "Failed to verify IDCODE";
UNIQUEEXITCODE = 32797;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
IDOK:
IDREV = INT(ID[31..28]);
IDFAB = INT(ID[24..24]);
ENDPROC;
PROCEDURE IS_SECOK USES GV,DO_EXIT;
IF ( ! (SECKEY_OK==0) ) THEN GOTO SECOK;
STATUS = -35;
PRINT "Failed to match pass key.";
UNIQUEEXITCODE = 32799;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
SECOK:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_CHECK_R USES GV,DO_EXIT,DO_READ_SECURITY;
CALL DO_READ_SECURITY;
IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPR;
STATUS = -33;
PRINT "FPGA Array Encryption is enforced. Plain text verification is prohibited.";
UNIQUEEXITCODE = 32800;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
ARRAYEPR:
IF ( ! (ULARD==1) ) THEN GOTO SKIPRCHK1;
STATUS = -30;
PRINT "FPGA Array Verification is protected by pass key.";
PRINT "A valid pass key needs to be provided.";
UNIQUEEXITCODE = 32804;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
SKIPRCHK1:
IF ( ! (ULARD==0) ) THEN GOTO Label_60;
CHKSEC = 0;
Label_60:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_CHECK_W USES GV,DO_EXIT,DO_READ_SECURITY;
CALL DO_READ_SECURITY;
IF ( ! (ULAWE==1) ) THEN GOTO ARRAYWP;
STATUS = -28;
PRINT "FPGA Array Write/Erase is protected by pass key.";
PRINT "A valid pass key needs to be provided.";
UNIQUEEXITCODE = 32805;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
ARRAYWP:
IF ( ! (ULARD==1) ) THEN GOTO ARRAYRPW;
STATUS = -30;
PRINT "FPGA Array Verification is protected by pass key.";
PRINT "A valid pass key needs to be provided.";
UNIQUEEXITCODE = 32806;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
ARRAYRPW:
IF ( ! (ULARE==1) ) THEN GOTO ARRAYEPW;
STATUS = -33;
PRINT "FPGA Array Encryption is enforced. Plain text programming is prohibited.";
CALL DO_EXIT;
ARRAYEPW:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE BP_VER USES GV;
BOOLEAN PLAYER_VERSION_BOOLEAN[32];
PLAYER_VERSION_BOOLEAN[31..0] = BOOL(PLAYERVERSIONVARIABLE);
INTEGER PLAYER_MAJOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[23..16])-SCULPTORMAJORBASE);
INTEGER PLAYER_MINOR_VERSION =(INT(PLAYER_VERSION_BOOLEAN[15..8])-SCULPTORMINORBASE);
ACT_UROW_SW_VERSION[6..5] = BOOL(PLAYER_MAJOR_VERSION);
ACT_UROW_SW_VERSION[4..1] = BOOL(PLAYER_MINOR_VERSION);
ACT_UROW_SW_VERSION[0] = PLAYER_VERSION_BOOLEAN[0];
ACT_UROW_PROGRAM_SW[3..0] = BOOL(PLAYERVERSIONSWVARIABLE);
ENDPROC;
PROCEDURE POLL_PROGRAM USES GV;
INTEGER ILOOP_0;
FOR ILOOP_0 = 16381 - 1 TO 0 STEP -1;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $84;
WAIT IDLE, 1 CYCLES;
WAIT IDLE, 100 USEC;
DRSCAN 5, $00,COMPARE $00,$0b,PASS;
IF PASS THEN ILOOP_0 = 0;
NEXT ILOOP_0;
ENDPROC;
PROCEDURE SET_PRG_ARRAY USES GV;
ISPRGARRAY = 1;
ENDPROC;
PROCEDURE DO_INITIALIZE USES GV,DO_EXIT,READ_F_ROW,VERIFY_ID_DMK,DO_CHECK_R,DO_CHECK_W
,BP_VER;
BSR[707..0] = BSRPATTERN[707..0];
BOOLEAN SHIFT_DATA[708];
IRSCAN 8, $01;
DRSCAN 708, BSR[];
WAIT IDLE, 1 CYCLES;
DRSCAN 708, SHIFT_DATA[], CAPTURE SAMPLE_DEVICE[];
FOR I = 0 TO 707;
IF ( ! (SAMPLEMASK[I]==1) ) THEN GOTO Label_61;
BSR[I] = SAMPLE_DEVICE[I];
Label_61:
LABEL_SEPARATOR = 0;
NEXT I;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $01;
DRSCAN 708, BSR[];
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $c0;
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $80;
DRSCAN 18, $00000;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 1875 USEC;
DRSCAN 18, $00000, CAPTURE ISC_CONFIG_RESULT[],COMPARE $30000,$30000,PASS;
IF ( ! (PASS==0) ) THEN GOTO CRCOK;
STATUS = 5;
PRINT "Failed to enter programming mode.";
EXPORT "ISC_Config_Result", ISC_CONFIG_RESULT[];
UNIQUEEXITCODE = 32850;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
CRCOK:
FADDR[] = $0;
CALL READ_F_ROW;
EXPORT "FSN", BUFF128[55..8];
CALL VERIFY_ID_DMK;
IF ( ! (CHKARRAY==1) ) THEN GOTO SKIPCHKARRAY;
IF ( ! (ARRAYRONLY==0) ) THEN GOTO Label_62;
CALL DO_CHECK_W;
Label_62:
IF ( ! (ARRAYRONLY==1) ) THEN GOTO Label_63;
CALL DO_CHECK_R;
Label_63:
LABEL_SEPARATOR = 0;
SKIPCHKARRAY:
IF ( ! (PLAYERVERSIONVARIABLE!=0) ) THEN GOTO Label_64;
CALL BP_VER;
Label_64:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE READ_INITIALIZE USES GV,DO_INITIALIZE;
CHKFROM = 0;
CHKARRAY = 0;
CHKNVM = 0;
CHKSEC = 0;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE NW_INITIALIZE_COMMON USES GV;
CHKFROM = 0;
CHKARRAY = 0;
ENDPROC;
PROCEDURE NW_INITIALIZE USES DO_INITIALIZE,NW_INITIALIZE_COMMON;
CALL NW_INITIALIZE_COMMON;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE NR_INITIALIZE_COMMON USES GV;
CHKFROM = 0;
CHKARRAY = 0;
ENDPROC;
PROCEDURE NR_INITIALIZE USES DO_INITIALIZE,NR_INITIALIZE_COMMON;
CALL NR_INITIALIZE_COMMON;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE AW_INITIALIZE USES GV,DO_INITIALIZE;
ARRAYRONLY = 0;
CHKFROM = 0;
CHKARRAY = 1;
CHKNVM = 0;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE AR_INITIALIZE USES GV,DO_INITIALIZE;
ARRAYRONLY = 1;
CHKFROM = 0;
CHKARRAY = 1;
CHKNVM = 0;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE W_INITIALIZE USES GV,DO_INITIALIZE;
ARRAYRONLY = 0;
CHKARRAY = 1;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE R_INITIALIZE USES GV,DO_INITIALIZE;
ARRAYRONLY = 1;
CHKARRAY = 1;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE INITIALIZE USES GV,DO_INITIALIZE;
ARRAYRONLY = 0;
FROMRONLY = 0;
CHKFROM = 1;
CHKARRAY = 1;
CALL DO_INITIALIZE;
ENDPROC;
PROCEDURE POLL_ERASE USES GV;
PASS = 0;
INTEGER ILOOP_1;
FOR ILOOP_1 = 262141 - 1 TO 0 STEP -1;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $84;
WAIT IDLE, 1 CYCLES;
WAIT IDLE, 1000 USEC;
DRSCAN 5, $00,COMPARE $00,$03,PASS;
IF PASS THEN ILOOP_1 = 0;
NEXT ILOOP_1;
ENDPROC;
PROCEDURE UFROM_DISTURB USES GV;
FOR FROMROWNUMBER = NUMBEROFFROMROWS TO 1 STEP -1;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $9f;
DRSCAN 3, BOOL((FROMROWNUMBER-1));
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $9b;
DRSCAN 128, $ffffffffffffffffffffffffffffffff;
WAIT IDLE, 5 CYCLES;
WAIT IDLE, 10000 USEC;
NEXT FROMROWNUMBER;
ENDPROC;
PROCEDURE PROGRAM_UROW USES GV,BITSTREAM,DO_EXIT,POLL_PROGRAM;
IF ( ! (ISERASEONLY==0) ) THEN GOTO SKIP_CYC_INCREMENT;
IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY;
IF ( ! ( ( ( (INT(UROW[31..0])==-1)&&(INT(UROW[63..32])==-1))&&(INT(UROW[95..64])==-1))&&(INT(UROW[127..96])==-1)) ) THEN GOTO NOT_CORRUPTED_CYCLE_COUNT;
ACT_UROW_CYCLE_COUNT = 0;
NOT_CORRUPTED_CYCLE_COUNT:
IF ( ! (ACT_UROW_CYCLE_COUNT<1000) ) THEN GOTO MAX_CYCLE_COUNT;
ACT_UROW_CYCLE_COUNT = (ACT_UROW_CYCLE_COUNT+1);
MAX_CYCLE_COUNT:
LABEL_SEPARATOR = 0;
NOT_PGM_ARRAY:
LABEL_SEPARATOR = 0;
SKIP_CYC_INCREMENT:
IF ( ! (ISERASEONLY==1) ) THEN GOTO Label_65;
UROW[] = $ffffffffffffffffffffffffffffffff;
Label_65:
IF ( ! ( (ISERASEONLY==0)||(ISRESTOREDESIGN==1)) ) THEN GOTO SKIP_DESIGN_INFO;
BUFF32[31..0] = BOOL(CHECKSUM);
IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_66;
UROW[127..112] = BUFF32[15..0];
Label_66:
IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_67;
UROW[127..112] = SUROWCHECKSUM[15..0];
Label_67:
IF ( ! ( !ISRESTOREDESIGN) ) THEN GOTO Label_68;
UROW[101..32] = ACT_UROW_DESIGN_NAME[69..0];
Label_68:
IF ( ! ISRESTOREDESIGN ) THEN GOTO Label_69;
UROW[101..32] = SUROWDESIGNNAME[69..0];
Label_69:
LABEL_SEPARATOR = 0;
SKIP_DESIGN_INFO:
BUFF32[31..0] = BOOL(ACT_UROW_CYCLE_COUNT);
UROW[111..102] = BUFF32[9..0];
UROW[31..29] = ACT_UROW_PROG_METHOD[2..0];
UROW[28..25] = ACT_UROW_ALGO_VERSION[3..0];
UROW[16..10] = ACT_UROW_SW_VERSION[6..0];
UROW[9..6] = ACT_UROW_PROGRAM_SW[3..0];
UROW[4] = SUROW_SRAM_DISTURB[0];
IF ( ! (ACT_UROW_ALGO_VERSION[6]==1) ) THEN GOTO Label_70;
UROW[5] = 1;
UROW[0] = 0;
UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4];
Label_70:
IF ( ! (ACT_UROW_ALGO_VERSION[6]==0) ) THEN GOTO Label_71;
UROW[5] = 0;
UROW[0] = 1;
UROW[24..23] = ACT_UROW_ALGO_VERSION[5..4];
Label_71:
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a7;
DRSCAN 128, UROW[];
WAIT IDLE, 15 CYCLES;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO PROGRAM_OK3;
STATUS = -24;
PRINT "Failed to program UROW";
UNIQUEEXITCODE = 32853;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
PROGRAM_OK3:
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $c0;
WAIT IDLE, 1 CYCLES;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a8;
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 165 USEC;
DRSCAN 128, $00000000000000000000000000000000,COMPARE UROW[],UROW_MASK[],PASS;
IF ( ! (PASS==0) ) THEN GOTO UROW_OK;
STATUS = -24;
PRINT "Failed to program UROW";
UNIQUEEXITCODE = 32854;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
UROW_OK:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE FAIL_ERASE USES GV,DO_EXIT;
STATUS = 8;
PRINT "Failed Erase Operation";
UNIQUEEXITCODE = 32855;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
ENDPROC;
PROCEDURE EXE_ERASE USES BITSTREAM,GV,READ_UROW,POLL_ERASE,PROGRAM_UROW,FAIL_ERASE;
IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO SKIPRUROW;
CALL READ_UROW;
EXPORT "ACTEL_SLOG_UROW", UROW[];
SKIPRUROW:
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $85;
DRSCAN 23, COMBERASESELECT[];
WAIT IDLE, 3 CYCLES;
CALL POLL_ERASE;
IF ( ! (PASS==0) ) THEN GOTO ERASEOK;
CALL FAIL_ERASE;
ERASEOK:
IF ( ! (COMBERASESELECT[14]==1) ) THEN GOTO Label_72;
CALL PROGRAM_UROW;
Label_72:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_ERASE USES BITSTREAM,GV,EXE_ERASE;
PRINT "Erase ...";
COMBERASESELECT[22..0] = $004000;
COMBERASESELECT[0] = 1;
COMBERASESELECT[1] = 1;
CALL EXE_ERASE;
PRINT "Completed erase";
IF ( ! (ISPRGARRAY==1) ) THEN GOTO NOT_PGM_ARRAY_ERASE;
BUFF32[31..0] = BOOL(CHECKSUM);
EXPORT "CHECKSUM", BUFF32[15..0];
NOT_PGM_ARRAY_ERASE:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_ERASE_ARRAY USES GV,EXE_ERASE;
PRINT "Erase FPGA Array ...";
COMBERASESELECT[22..0] = $004001;
CALL EXE_ERASE;
ENDPROC;
PROCEDURE DO_ERASE_ONLY USES GV,DO_ERASE;
ISERASEONLY = 1;
CALL DO_ERASE;
ENDPROC;
PROCEDURE DO_ERASE_ARRAY_ONLY USES GV,DO_ERASE_ARRAY;
ISERASEONLY = 1;
CALL DO_ERASE_ARRAY;
ENDPROC;
PROCEDURE DO_ERASE_ALL USES GV,UFROM_DISTURB,EXE_ERASE;
IF ( ! ( (BM7DEVICE==1)||(BM1DEVICE==1)) ) THEN GOTO Label_73;
PRINT "Erase FPGA Array and FlashROM ...";
Label_73:
IF ( ! ( (BM7DEVICE!=1)&&(BM1DEVICE!=1)) ) THEN GOTO Label_74;
PRINT "Erase FPGA Array, FlashROM and Security Settings ...";
Label_74:
COMBERASESELECT[22..0] = $7fc00f;
ISERASEONLY = 1;
CALL EXE_ERASE;
CALL UFROM_DISTURB;
ENDPROC;
PROCEDURE LOAD_ROW_DATA USES BITSTREAM,GV;
FOR SDTILE = 1 TO NUMBEROFSDTILES;
FOR I = 1 TO 8;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $89;
DRSCAN 26, DATASTREAM[(DATAINDEX+25)..DATAINDEX];
WAIT IDLE, 3 CYCLES;
DATAINDEX = (DATAINDEX+26);
NEXT I;
NEXT SDTILE;
ENDPROC;
PROCEDURE EXE_PROGRAM USES GV,DO_EXIT,POLL_PROGRAM;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $83;
WAIT IDLE, 3 CYCLES;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO Label_75;
STATUS = 10;
PRINT "Failed to program FPGA array at row ",ROWNUMBER,".";
UNIQUEEXITCODE = 32856;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_75:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE EXE_VERIFY USES GV,DO_EXIT,POLL_PROGRAM;
IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_0;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8d;
DRSCAN 2, VERIFYEOL[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 132 USEC;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO Label_76;
STATUS = 11;
PRINT "Verify 0 failed at row ",ROWNUMBER,".";
UNIQUEEXITCODE = 32857;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_76:
IRSCAN 8, $8d;
DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS;
VERIFY_EOL_0:
IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_0;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8d;
DRSCAN 2, VERIFYEOL[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 1250 USEC;
DRSCAN 2, $0,COMPARE $0,$3,PASS;
VERIFY_BOL_0:
IF ( ! (PASS==0) ) THEN GOTO Label_77;
STATUS = 11;
PRINT "Verify 0 failed at row ",ROWNUMBER,".";
UNIQUEEXITCODE = 32858;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_77:
IF ( ! (VERIFYEOL[0]==0) ) THEN GOTO VERIFY_EOL_1;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8e;
DRSCAN 2, VERIFYEOL[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 132 USEC;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO Label_78;
STATUS = 11;
PRINT "Verify 1 failed at row ",ROWNUMBER,".";
UNIQUEEXITCODE = 32859;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_78:
IRSCAN 8, $8e;
DRSCAN 2, VERIFYEOL[],COMPARE $0,$3,PASS;
VERIFY_EOL_1:
IF ( ! (VERIFYEOL[0]==1) ) THEN GOTO VERIFY_BOL_1;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8e;
DRSCAN 2, VERIFYEOL[];
WAIT IDLE, 3 CYCLES;
WAIT IDLE, 1250 USEC;
DRSCAN 2, $0,COMPARE $0,$3,PASS;
VERIFY_BOL_1:
IF ( ! (PASS==0) ) THEN GOTO Label_79;
STATUS = 11;
PRINT "Verify 1 failed at row ",ROWNUMBER,".";
UNIQUEEXITCODE = 32860;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_79:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_PROGRAM USES GV,LOAD_ROW_DATA,EXE_PROGRAM;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $87;
DRSCAN 2, $2;
WAIT IDLE, 3 CYCLES;
PRINT "Programming FPGA Array";
DATAINDEX = 0;
ROWNUMBER = (NUMBEROFMAPROWS-1);
INTEGER IREPEAT_0;
FOR IREPEAT_0 = NUMBEROFMAPROWS - 1 TO 0 STEP -1;
CALL LOAD_ROW_DATA;
CALL EXE_PROGRAM;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $87;
DRSCAN 2, $3;
WAIT IDLE, 3 CYCLES;
IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_80;
PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS);
DIFFERENCE = (PERCENT_UPDATE%10);
IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_PGM_A;
PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE));
ROUND_DOWN_PGM_A:
IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_PGM_A;
PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE);
ROUND_UP_PGM_A:
EXPORT "PERCENT_DONE", PERCENT_UPDATE;
Label_80:
ROWNUMBER = (ROWNUMBER-1);
NEXT IREPEAT_0;
ENDPROC;
PROCEDURE DO_VERIFY USES GV,LOAD_ROW_DATA,EXE_VERIFY;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $87;
DRSCAN 2, $2;
WAIT IDLE, 3 CYCLES;
PRINT "Verifying FPGA Array";
DATAINDEX = 0;
ROWNUMBER = (NUMBEROFMAPROWS-1);
INTEGER IREPEAT_1;
FOR IREPEAT_1 = NUMBEROFMAPROWS - 1 TO 0 STEP -1;
CALL LOAD_ROW_DATA;
CALL EXE_VERIFY;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $87;
DRSCAN 2, $3;
WAIT IDLE, 3 CYCLES;
IF ( ! ((ROWNUMBER%ROWITERATION)==0) ) THEN GOTO Label_81;
PERCENT_UPDATE = ((100*((NUMBEROFMAPROWS-ROWNUMBER)+1))/NUMBEROFMAPROWS);
DIFFERENCE = (PERCENT_UPDATE%10);
IF ( ! (DIFFERENCE>=5) ) THEN GOTO ROUND_DOWN_VER_ARRAY;
PERCENT_UPDATE = (PERCENT_UPDATE+(10-DIFFERENCE));
ROUND_DOWN_VER_ARRAY:
IF ( ! (DIFFERENCE<5) ) THEN GOTO ROUND_UP_VER_ARRAY;
PERCENT_UPDATE = (PERCENT_UPDATE-DIFFERENCE);
ROUND_UP_VER_ARRAY:
EXPORT "PERCENT_DONE", PERCENT_UPDATE;
Label_81:
ROWNUMBER = (ROWNUMBER-1);
NEXT IREPEAT_1;
PRINT " Verifying FPGA Array -- pass";
ENDPROC;
PROCEDURE DO_VERIFY_BOL USES GV,DO_VERIFY;
VERIFYEOL[0] = 0;
CALL DO_VERIFY;
ENDPROC;
PROCEDURE DO_VERIFY_EOL USES GV,DO_VERIFY;
VERIFYEOL[0] = 1;
CALL DO_VERIFY;
ENDPROC;
PROCEDURE DO_PROGRAM_RLOCK USES GV,DO_EXIT,POLL_PROGRAM;
DATAINDEX = 0;
INTEGER IREPEAT_2;
FOR IREPEAT_2 = NUMBEROFSDTILES - 1 TO 0 STEP -1;
FOR I = 1 TO 8;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $89;
DRSCAN 26, RLOCK[(DATAINDEX+25)..DATAINDEX];
WAIT IDLE, 3 CYCLES;
DATAINDEX = (DATAINDEX+26);
NEXT I;
NEXT IREPEAT_2;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8c;
WAIT IDLE, 3 CYCLES;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO Label_82;
STATUS = 10;
PRINT "Failed to enable FPGA Array.";
UNIQUEEXITCODE = 32862;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
Label_82:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DO_DISABLE_RLOCK USES GV,DO_EXIT,POLL_PROGRAM;
DATAINDEX = 0;
INTEGER IREPEAT_3;
FOR IREPEAT_3 = NUMBEROFSDTILES - 1 TO 0 STEP -1;
FOR I = 1 TO 8;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $89;
DRSCAN 26, $0000000;
WAIT IDLE, 3 CYCLES;
DATAINDEX = (DATAINDEX+26);
NEXT I;
NEXT IREPEAT_3;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $8c;
WAIT IDLE, 3 CYCLES;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO FABRIC_ENABLED;
STATUS = 10;
PRINT "Failed to disable FPGA Array.";
UNIQUEEXITCODE = 32917;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
FABRIC_ENABLED:
LABEL_SEPARATOR = 0;
ENDPROC;
PROCEDURE DISABLE_RLOCK_AND_VERIFY USES DO_VERIFY_DISABLE_RLOCK,DO_DISABLE_RLOCK;
CALL DO_DISABLE_RLOCK;
CALL DO_VERIFY_DISABLE_RLOCK;
ENDPROC;
PROCEDURE DO_READ_IDCODE USES READ_IDCODE_ONLY;
WAIT RESET, 5 CYCLES;
CALL READ_IDCODE_ONLY;
EXIT 0;
ENDPROC;
PROCEDURE DO_PROGRAM_SILSIG USES GV,DO_EXIT,DO_READ_SECURITY,POLL_PROGRAM;
CALL DO_READ_SECURITY;
SECREG[43..12] = SILSIG[31..0];
SECREG[ULOPT1_BITLOCATION] = ULOPT[1];
SECREG[ULOPT0_BITLOCATION] = ULOPT[0];
SECREG[ULUWE_BITLOCATION] = ULUWE;
SECREG[ULARE_BITLOCATION] = ULARE;
SECREG[ULUPC_BITLOCATION] = ULUPC;
SECREG[ULUFE_BITLOCATION] = ULUFE;
SECREG[ULUFP_BITLOCATION] = ULUFP;
SECREG[ULUFJ_BITLOCATION] = ULUFJ;
SECREG[ULFLR_BITLOCATION] = ULFLR;
SECREG[ULULR_BITLOCATION] = ULULR;
SECREG[ULAWE_BITLOCATION] = ULAWE;
SECREG[ULARD_BITLOCATION] = ULARD;
IRSTOP IRPAUSE;
DRSTOP DRPAUSE;
IRSCAN 8, $a3;
DRSCAN 44, SECREG[];
WAIT IDLE, 3 CYCLES;
CALL POLL_PROGRAM;
IF ( ! (PASS==0) ) THEN GOTO SILSIGPRG_OK;
STATUS = 14;
PRINT "Failed to program Silicon Signature";
UNIQUEEXITCODE = 32867;
BUFF128[15..0] = BOOL(UNIQUEEXITCODE);
EXPORT "ERROR_CODE", BUFF128[15..0];
CALL DO_EXIT;
SILSIGPRG_OK:
LABEL_SEPARATOR = 0;
ENDPROC;
CRC 2066;
|