From 61bf2100fbd5e0a5f4bd1f013d70d8027604bbba Mon Sep 17 00:00:00 2001 From: JulianCamacho Date: Thu, 17 Nov 2022 08:16:14 -0600 Subject: Bug fixes --- app/descifrador.s | 65 ------------------------- conspiracion.qsf | 9 ++++ doc/block_diagram.drawio | 120 ++++++++++++++++++++++++++++++---------------- hps/fpga.kermit | 2 + image_processing/out_file | 1 + nix/flake.nix | 2 +- platform.qsys | 98 +++++++++++++++++++++++++++++++++++++ rtl/top/conspiracion.sv | 14 ++++++ tb/platform.sv | 2 + tb/sim/blank.S | 13 +++++ tb/sim/blank.py | 2 + tb/sim/descifrador.S | 72 ++++++++++++++++++++++++++++ tb/sim/descifrador.py | 2 + 13 files changed, 294 insertions(+), 108 deletions(-) delete mode 100644 app/descifrador.s create mode 100644 image_processing/out_file create mode 100644 tb/sim/blank.S create mode 100644 tb/sim/blank.py create mode 100644 tb/sim/descifrador.S create mode 100644 tb/sim/descifrador.py diff --git a/app/descifrador.s b/app/descifrador.s deleted file mode 100644 index bb10e87..0000000 --- a/app/descifrador.s +++ /dev/null @@ -1,65 +0,0 @@ -.global reset -reset: - -@ IO utilizado: -@ 5 switches para la llave -@ 1 switch de selección de algoritmo (xor o not) -@ 1 botón de inicio - -.equ START_BUTTON, 0x30050000 @ Dirección de memoria del botón -.equ KEY_SWITCHES, 0x30060000 @ Dirección de memoria de los switches -.equ START, 0x00010000 @ Dirección de memoria de los pixeles - -@ Dirección inicial de lectura, contador y tamaño de la imagen -ldr r1, =START -mov r7, #0x0 -ldr r8, =307200 - -@Esperar botón -ldr r2, =START_BUTTON -ldr r3, =KEY_SWITCHES - - -idle: - ldr r5, [r2] @ Lee valor del botón - ldr r6, [r3] @ Lee valores de los switches - cmp r5, #1 @ Si el botón de inicio es 1, se salta a start - bne idle - -@ Verificar el algoritmo seleccionado - and r10, r6, #1 @ Bit mask para seleccionar el primer bit de los switches - cmp r10, #1 @ Si el valor es 1, se salta a not, si es 0 a xor - beq not - cmp r10, #0 - beq xor - - -@ Recorrer la memoria desde START y hacer not al valor en cada posicion -@ y volverlo a guardar -not: - @Procesar la mask - mov r9, #0b11111111 @Hacer mask de 1s - mov r0, r9, lsl #8 - orr r0, r0, r9, lsl #16 - orr r0, r0, r9, lsl #24 - b loop - -xor: -@Procesar la llave - lsr r9, r6, #1 - mov r0, r9, lsl #8 - orr r0, r0, r9, lsl #16 - orr r0, r0, r9, lsl #24 - -loop: - ldr r4, [r1] @ Guarda en r4 el dato en la posición de memoria de start - eor r4, r4, r0 @ Hace XOR entre r4 y 46 - str r4, [r1] @ Vuelve a guardar en memoria ya modificado - add r1, r1, #4 @ Incrementa el valor de r4, para ir al siguiente pixel - add r7, r7, #1 @ Incrementa contador de tamaño de la imagen - cmp r7, r8 @ Compara contador con tamaño de la imagen 640 * 480 - bne loop - b halt - -halt: - b halt \ No newline at end of file diff --git a/conspiracion.qsf b/conspiracion.qsf index d4e404a..c6252b9 100644 --- a/conspiracion.qsf +++ b/conspiracion.qsf @@ -120,6 +120,15 @@ set_location_assignment PIN_W19 -to pio_leds[5] set_location_assignment PIN_Y19 -to pio_leds[6] set_location_assignment PIN_W20 -to pio_leds[7] +set_location_assignment PIN_AA14 -to pio_buttons + +set_location_assignment PIN_AD11 -to pio_switches[0] +set_location_assignment PIN_AD12 -to pio_switches[1] +set_location_assignment PIN_AE11 -to pio_switches[2] +set_location_assignment PIN_AC9 -to pio_switches[3] +set_location_assignment PIN_AD10 -to pio_switches[4] +set_location_assignment PIN_AE12 -to pio_switches[5] + set_location_assignment PIN_A11 -to vga_dac_clk set_location_assignment PIN_B11 -to vga_dac_hsync set_location_assignment PIN_D11 -to vga_dac_vsync diff --git a/doc/block_diagram.drawio b/doc/block_diagram.drawio index a8366a9..a17e16e 100644 --- a/doc/block_diagram.drawio +++ b/doc/block_diagram.drawio @@ -1,6 +1,6 @@ - + @@ -20,90 +20,126 @@ - + - - + + - + - + - + - - + - - + + + + + + + + + + - + - + - - + + - + + + + - + - + - + - - + + - + - - + + - + - - + + - - + + - + - + - - + + - - + + - + + + + - - - + - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hps/fpga.kermit b/hps/fpga.kermit index 0f53b24..36579bc 100644 --- a/hps/fpga.kermit +++ b/hps/fpga.kermit @@ -63,6 +63,8 @@ lineout "fatload mmc 0:1 0x20000000 taller_bootrom.bin" input 1 "SOCFPGA_CYCLONE5 #" lineout "fatload mmc 0:1 0x2000000 soc_system.rbf" input 1 "SOCFPGA_CYCLONE5 #" +lineout "fatload mmc 0:1 0x20010000 jerry" +input 1 "SOCFPGA_CYCLONE5 #" lineout "fpga load 0 0x2000000 0x700000" # Falla con mw 0xFFC2505C 0xA input 1 "SOCFPGA_CYCLONE5 #" diff --git a/image_processing/out_file b/image_processing/out_file new file mode 100644 index 0000000..7961383 --- /dev/null +++ b/image_processing/out_file @@ -0,0 +1 @@ +ssskkkeeebbbaaabbbdddfffggghhhhhhiiijjjlllnnnqqquuuzzz}}}|||{{{|||}}}~~~~~~~~~|||zzzxxxvvvuuutttuuuwwwzzz|||~~~~~~|||wwwsssmmmiiiggghhhnnnxxx{{{lll^^^SSSLLLGGGFFFFFFHHHIIIJJJKKKLLLMMMNNNPPPSSSVVV[[[aaahhhmmmqqqrrrqqqnnnjjjeeebbb___^^^___```aaabbbcccbbb```^^^\\\ZZZZZZZZZ\\\___dddhhhkkknnnpppqqqppppppooommmjjjddd]]]TTTNNNJJJLLLRRR```qqqssseeeYYYOOOHHHCCC@@@??????@@@AAABBBDDDHHHKKKOOOSSSXXX]]]cccjjjooorrrsssrrrnnniiiddd```]]]\\\]]]^^^___```aaabbb```^^^\\\ZZZZZZZZZ\\\```eeeiiimmmppprrrsssssstttsssqqqnnnfff]]]RRRJJJDDDDDDKKKZZZlllwwwoooiiiaaa\\\WWWQQQMMMIIIFFFEEEFFFJJJPPPXXX```iiipppuuu{{{|||xxxuuutttuuuwwwxxxzzz{{{|||zzzyyywwwvvvvvvuuuwwwyyy}}}}}}rrreeeZZZRRRPPPUUUbbbsss~~~xxxsssooonnnnnnppprrrssssssqqqllleee]]]WWWTTTVVV\\\gggtttvvvkkkgggiiissswwwttttttyyy}}}nnneee^^^ZZZXXXWWWXXXZZZ___hhhsssvvvmmmhhhjjjrrrwwwjjjddd```______aaadddiiiooovvvzzzcccQQQGGGAAA>>>???BBBGGGMMMXXXfffxxx{{{}}}rrrdddZZZSSSOOOKKKJJJJJJNNNSSS\\\gggsss{{{www{{{ppp\\\LLLCCC===<<<<<<@@@FFFMMMYYYkkktttdddZZZSSSNNNJJJHHHHHHJJJNNNUUU^^^gggrrr~~~uuuiiidddfffmmmxxx{{{nnnaaaXXXRRRNNNKKKKKKLLLPPPWWWcccuuu|||lll```ZZZWWWVVVVVVWWWYYYZZZ[[[]]]___cccjjjsssuuueeeYYYQQQQQQUUU]]]eeemmmrrrttttttsssqqqooonnnllliiifffbbbaaabbbgggrrrwwwlllhhhhhhkkknnnqqqrrrpppjjjccc[[[WWWVVV\\\iii|||zzziiiZZZMMMEEEBBBCCCFFFKKKRRRXXX^^^eeeoooxxx~~~yyyvvvzzz|||zzz}}}|||lll\\\OOOGGGJJJUUUiiissscccVVVKKKBBB???======???CCCIIIRRR___pppxxxaaaOOOBBBAAAJJJ]]]sssyyyoooeee^^^WWWQQQMMMIIIFFFFFFGGGLLLUUUdddwwwnnnYYYJJJFFFKKKYYYjjj}}}tttpppnnnnnnooopppnnnkkkeee___[[[XXXZZZcccqqqmmm\\\TTTTTTYYYcccooozzzuuujjjeeehhhpppzzz~~~vvvppppppwwwttthhhbbb___^^^```bbbfffiiimmmssszzzrrrddd\\\[[[dddtttsssggg^^^VVVQQQMMMLLLLLLNNNRRRWWW^^^dddnnnyyyvvvhhh]]]XXX[[[gggzzzsssdddUUUJJJBBB<<<999888:::<<>>888333222222666<<>>JJJXXXffftttvvvbbbWWWWWW___lll||||||jjj]]]QQQFFF>>>777555666<<>>AAAEEEQQQ```qqqsssdddWWWKKKFFFDDDFFFJJJPPPVVV]]]dddllluuu~~~vvvlllbbbXXXPPPJJJEEE@@@>>><<<<<>>DDDRRRdddxxx~~~qqqggg___^^^gggxxx{{{cccLLL>>>:::@@@OOOdddyyy}}}{{{vvvrrroooooorrr|||jjjQQQ@@@;;;@@@OOOeee{{{xxxssspppmmmlllmmmooorrrwww}}}uuuZZZHHHBBBGGGUUUiii~~~ssskkkddd___^^^aaahhhppp{{{kkk[[[UUUXXXddduuurrrfff\\\UUUSSSVVV___jjjxxxxxxrrrttt|||uuudddVVVKKKHHHJJJSSS```ooo}}}xxxdddRRREEE???AAAIIIVVVeeesss{{{eeeRRRCCC<<<===DDDQQQ___nnn{{{|||gggVVVHHHBBBCCCJJJVVVdddrrrzzzlllaaaXXXVVVYYY```kkkxxx|||wwwtttrrrrrrtttyyy~~~yyyxxx|||}}}sssmmmkkkmmmsss{{{vvvmmmhhhfffhhhoooyyy{{{nnncccZZZVVVXXXaaappp}}}qqqfff^^^[[[\\\bbbmmmxxxzzzlll___TTTLLLJJJNNN[[[mmmttteeeZZZUUUWWW^^^jjjwwwvvvhhh\\\RRRKKKIIIMMMZZZlll|||iii[[[SSSUUU^^^mmm}}}yyylll```WWWPPPNNNQQQ[[[jjj}}}ppp^^^TTTVVVaaarrr}}}qqqfff]]]WWWUUUWWW___jjjxxxyyydddYYYZZZeeewww~~~sssiiibbb\\\ZZZ[[[bbbkkkwwwmmm``````iiixxxxxxmmmeee^^^ZZZZZZ[[[cccnnn{{{yyyllljjjmmmvvvxxxkkkaaaYYYTTTQQQSSSWWWcccsss|||vvvssstttwww{{{|||hhh\\\RRRJJJGGGFFFJJJQQQcccyyyzzzsssmmmiiihhhkkkrrrzzznnnZZZNNNDDD===;;;<<>>???EEENNNZZZiiipppWWWEEE;;;999;;;AAAJJJTTT]]]hhhuuukkkUUUHHHDDDEEEKKKUUUaaannn}}}xxx\\\GGG;;;666555999???FFFMMMUUU```mmmzzz|||gggUUUKKKJJJPPPZZZggguuucccMMM???888666777:::???CCCJJJRRR\\\gggtttvvvfffXXXRRRTTT]]]iiixxxoooZZZLLLEEE@@@??????BBBDDDGGGMMMTTT\\\fffppp}}}ssshhh```^^^bbblll{{{oooccc[[[TTTQQQNNNMMMLLLLLLNNNQQQUUU[[[ccclllyyyxxxqqqnnnlllnnnttt|||tttlllfffaaa]]]XXXUUUSSSRRRRRRSSSXXX^^^hhhuuu{{{tttpppppprrruuuzzzyyyrrrkkkddd___YYYUUUQQQOOOPPPTTT[[[dddooo{{{sssgggcccdddjjjttt~~~|||ssskkkddd]]]VVVPPPLLLLLLNNNTTT\\\fffqqq}}}qqqcccYYYWWW\\\hhhxxxwwwoooggg___WWWPPPLLLKKKMMMTTT\\\gggsssssscccWWWOOOPPPZZZjjj~~~wwwpppiiiaaaYYYRRRNNNNNNQQQYYYdddqqqssseeeXXXNNNIIIMMMZZZooo{{{uuupppiiibbb[[[VVVSSSSSSXXXbbbooo~~~zzzqqqeeeYYYOOOHHHFFFMMM^^^vvv~~~zzzvvvrrrooojjjddd___[[[ZZZ[[[bbbmmm{{{zzzqqqjjjcccYYYPPPIIIEEEFFFOOOccc~~~|||wwwtttqqqooommmjjjgggdddbbbccceeemmmxxxyyypppjjjccc^^^XXXQQQKKKGGGFFFIIITTTiii}}}vvvqqqmmmkkkiiihhhhhhhhhiiijjjmmmqqqvvv}}}{{{qqqiiibbb]]]XXXTTTQQQLLLIIIHHHJJJPPP\\\qqqzzzpppjjjeeeaaa_________bbbeeekkkrrrzzzxxxlllbbb[[[UUURRROOOMMMLLLKKKKKKMMMRRRZZZfff{{{xxxlllccc^^^ZZZWWWUUUVVVWWW\\\cccnnnzzz{{{kkk^^^VVVPPPKKKIIIIIIIIIJJJLLLPPPUUU\\\fffssswwwlllaaaYYYUUURRRPPPOOOQQQUUU[[[eeerrrppp```TTTLLLHHHEEEEEEFFFHHHKKKPPPWWW^^^iiisssvvvlllcccZZZTTTQQQPPPPPPQQQUUUZZZaaakkkxxxxxxfffWWWMMMGGGCCCBBBDDDGGGKKKPPPWWW```jjjvvv{{{rrriiibbb[[[UUURRRQQQSSSVVVZZZ```fffmmmuuunnn^^^QQQHHHDDDCCCDDDHHHMMMSSSZZZcccooo{{{tttkkkddd]]]YYYUUUSSSRRRTTTYYY```gggpppxxx~~~ttteeeXXXLLLFFFEEEFFFJJJOOOWWW___gggsss|||pppeee\\\WWWSSSRRRQQQRRRUUUYYYaaakkkwww~~~}}}~~~yyysssnnnnnnppptttzzz~~~|||tttiii^^^SSSKKKGGGHHHLLLRRRYYYccclllvvv|||ooocccYYYQQQNNNLLLNNNPPPTTTYYY```jjjxxx}}}~~~{{{{{{vvviii\\\SSSMMMMMMQQQXXXaaaiiimmmnnniiiaaaYYYQQQKKKKKKNNNTTT\\\eeeppp{{{~~~qqqeeeZZZQQQKKKIIIIIIMMMRRRXXX```hhhuuu{{{lll^^^QQQGGGAAA@@@DDDKKKSSSZZZ___aaa___ZZZVVVQQQOOOQQQVVV___hhhsss|||qqqfff[[[QQQJJJGGGGGGJJJPPPWWWaaajjjuuuuuuiii]]]SSSJJJDDDBBBCCCFFFJJJNNNQQQSSSSSSSSSSSSSSSUUUZZZbbbmmmyyy~~~vvvooofff\\\TTTLLLGGGEEEGGGMMMVVV___jjjvvvyyyrrrjjjccc\\\UUUPPPLLLIIIGGGFFFFFFFFFHHHJJJMMMRRRWWW]]]eeeppp~~~xxxqqqllleee___WWWPPPJJJHHHHHHKKKSSS]]]hhhtttyyytttrrrrrrrrrtttsssrrrpppmmmjjjgggccc___ZZZUUUNNNHHHDDDBBBCCCGGGMMMUUU___hhhrrryyytttoookkkhhhddd^^^XXXSSSNNNMMMNNNRRRZZZdddooo{{{}}}pppddd\\\XXXXXX\\\___eeeiiikkklllmmmnnnooommmkkkgggaaaYYYQQQKKKHHHIIINNNVVV```kkkvvv}}}uuuqqqppppppppppppnnnjjjeeeaaa\\\[[[\\\___eeemmmvvvrrrcccVVVNNNJJJJJJNNNSSSZZZ___cccgggjjjmmmqqqssssssrrrnnniiiddd```___```eeellluuu~~~tttmmmnnnqqqwww}}}}}}yyyuuusssrrrsssuuuyyy}}}|||lll]]]PPPHHHDDDCCCGGGJJJPPPUUUZZZ___eeekkkqqqvvv{{{~~~{{{lllggglllttt}}}wwwiii\\\PPPHHHDDDBBBCCCEEEIIIMMMRRRXXX```hhhrrrzzzuuufffbbbjjjxxxuuuhhh___\\\\\\^^^bbbfffjjjnnnrrrwww||||||ttthhh^^^TTTMMMHHHFFFEEEDDDEEEHHHMMMTTT^^^hhhtttnnn___]]]hhhxxxwwwfffWWWMMMHHHGGGHHHKKKNNNRRRVVV\\\ccckkkqqqvvvwwwtttppphhh```ZZZTTTPPPMMMJJJHHHFFFHHHMMMUUUaaammm{{{}}}zzz{{{yyycccXXXWWWbbbsss~~~{{{xxxvvvtttttttttuuuvvvxxx{{{~~~ooo___RRRIIIDDDBBBAAACCCFFFHHHKKKPPPUUU[[[```eeehhhhhhhhhfffdddbbb___]]]ZZZUUUQQQNNNOOOTTT]]]jjjxxx}}}~~~wwweeeVVVOOOQQQ\\\lllvvvjjjbbb______bbbggglllppprrruuuxxx{{{}}}~~~}}}||||||}}}uuujjj___UUUMMMIIIGGGEEEEEEFFFFFFGGGHHHJJJMMMOOORRRVVVZZZ___dddiiinnnpppooolllfff```[[[[[[___iiixxxsssfff[[[QQQKKKIIILLLVVVddduuuppp\\\OOOJJJLLLRRR[[[eeellloooqqqrrrsssssstttttttttsssrrrrrrqqqqqqqqqsssuuuwwwyyyyyywwwsssooohhhbbb]]]XXXUUUQQQOOOMMMLLLJJJHHHFFFDDDBBBAAACCCFFFNNNYYYeeerrr}}}zzzrrrkkkiiimmmxxxlllZZZOOOHHHDDDCCCDDDGGGKKKUUU```mmmzzzoooTTTBBB<<>>EEEQQQ\\\eeehhhjjjjjjiiihhhgggfffeeedddcccaaa`````````ccceeehhhjjjlllmmmooopppqqqqqqqqqooonnniiieeeaaa]]]XXXUUUPPPKKKGGGEEEEEEJJJUUUeeeyyyfffJJJ999333555===GGGRRRZZZ```fffmmmssszzz~~~~~~cccQQQIIIIIILLLSSSZZZ```bbbdddfffgggiiiiiiiiigggdddaaa^^^\\\[[[\\\aaagggmmmsssxxx{{{~~~~~~yyysssnnniiieeecccaaa``````bbbeeelllvvv~~~^^^DDD666444:::GGGUUUdddoootttyyy|||~~~yyyjjjaaa\\\YYYYYYZZZ[[[\\\___cccggglllnnnooommmhhhbbb]]]YYYXXX[[[cccmmmxxx~~~xxxuuuuuuxxx~~~zzzsssmmmkkkkkkpppvvvwwwZZZDDD999:::DDDUUUgggyyy|||rrrjjjbbb\\\YYYXXX[[[aaahhhppptttvvvssslllddd]]]WWWVVV[[[ffftttqqqfff___ZZZUUUTTTRRRUUUXXX```iiitttqqqYYYGGG@@@DDDPPPcccwww{{{nnnbbb[[[XXX[[[aaajjjrrrwwwzzzvvvnnneee\\\VVVUUUZZZgggyyy{{{eeeRRRFFFAAA>>>===AAADDDJJJPPPYYYdddppp}}}nnn\\\OOOJJJPPP]]]ooo|||nnnddd______dddjjjqqqtttvvvrrrjjjbbbZZZTTTTTTZZZfffxxx{{{|||sss\\\III>>>:::;;;===DDDKKKSSSZZZdddooozzzxxxmmmddd^^^^^^cccnnn}}}}}}}}}|||}}}vvvnnnjjjiiiiiijjjjjjhhheee___ZZZUUUSSSTTTYYYdddrrrsssiiikkkuuuwwwcccSSSJJJJJJNNNUUU^^^hhhrrryyyzzztttpppnnnnnnppprrrvvv{{{~~~}}}}}}|||{{{zzzzzzyyy{{{yyypppiiibbb\\\XXXUUURRRQQQQQQRRRUUUYYY```jjjsss|||}}}{{{{{{sssaaaWWWZZZfffxxxsssgggcccfffmmmyyy{{{zzziii^^^ZZZ^^^fffppp|||}}}||||||{{{{{{zzzzzzyyyyyy|||xxxiii\\\QQQIIIGGGGGGIIIMMMQQQVVVYYY\\\aaadddiiikkkllljjjfffbbb___]]]___fffqqq|||dddQQQHHHLLLZZZnnn}}}hhh```cccooo~~~xxxdddSSSIIIGGGPPP___rrr~~~~~~mmm\\\NNNEEEBBBCCCFFFLLLQQQUUUWWWWWWXXXXXXXXXXXXWWWSSSOOOJJJGGGFFFIIIRRRaaarrrsss\\\IIIAAAFFFUUUkkkqqqYYYOOOPPP[[[jjj}}}{{{gggTTTEEE<<<<<>>GGGVVVgggyyy~~~sss]]]MMMFFFKKKZZZppppppVVVJJJIIIQQQ^^^mmm}}}wwwfffUUUFFF;;;555777DDDXXXooowwwnnnfff```[[[VVVRRROOOLLLJJJHHHFFFEEEEEEDDDCCC???<<<888666666888???KKKYYYhhhuuu}}}vvvqqqoooqqqzzzyyyxxx~~~zzzhhh[[[VVV\\\jjjuuu\\\OOOKKKMMMTTT^^^iiivvvmmm___QQQEEE;;;555333777DDDWWWmmm|||qqqeeeYYYNNNFFFAAA>>>======>>>>>>===;;;999777555555777;;;CCCMMMVVV___eeeiiijjjhhhdddbbbbbbdddiiiqqq{{{uuukkkccc```dddoooxxxnnnlllrrriii[[[SSSOOONNNPPPVVV```qqqkkkWWWKKK@@@999555444666<<>>===???EEEOOO```vvv|||nnnaaaSSSIIIFFFJJJZZZuuusssUUUAAA888555777===EEELLLTTT^^^jjjxxxuuu\\\KKKBBB>>>>>>BBBEEEIIIJJJLLLNNNOOOPPPRRRRRRRRRRRRPPPNNNNNNNNNOOORRRUUUXXX[[[^^^___^^^[[[YYYUUURRROOOMMMKKKJJJHHHGGGFFFEEEDDDCCCCCCBBBBBBCCCDDDDDDDDDEEEHHHNNNWWWgggzzztttdddXXXRRRSSS^^^tttlllPPP???999;;;CCCNNNZZZdddlllttt|||jjjXXXOOOLLLLLLPPPTTTXXX[[[]]]aaaeeehhhkkkllllllkkkhhhfffdddcccccceeegggjjjmmmoooooonnnjjjgggddd```^^^\\\[[[[[[[[[\\\\\\\\\[[[[[[ZZZZZZZZZ[[[[[[\\\\\\^^^aaaeeelllwwwuuukkkhhhlllvvvgggOOOAAA???GGGSSScccsssyyyhhh```]]]^^^bbbgggkkkooosssyyy}}}}}}}}}}}}~~~~~~{{{xxxuuutttssssssuuuwwwyyyzzz{{{{{{{{{{{{{{{{{{{{{|||}}}}}}~~~~~~{{{zzzzzz}}}~~~eeeRRRGGGHHHTTTdddwwwzzzsssqqqrrrwww{{{ssseee]]]ZZZ```pppyyyeeeWWWPPPSSS```qqq~~~~~~qqq]]]OOOHHHLLL]]]wwwvvvjjjbbb___cccnnn||||||zzzyyy}}}}}}|||}}}wwwdddXXXQQQUUUdddzzz|||wwwuuusssssstttxxx{{{yyyyyy}}}~~~|||{{{|||wwwppplllpppzzztttkkkiiimmmttt}}}}}}|||}}}zzzzzzwww```WWWYYYdddttt}}}||||||}}}~~~}}}}}}kkkSSSJJJNNN]]]qqqcccLLLCCCGGGVVViii~~~}}}|||{{{^^^III@@@CCCOOO```rrr{{{lllddddddpppuuu\\\IIIAAACCCLLLXXXhhhwwwxxxfffVVVNNNOOO___zzzqqq]]]NNNGGGGGGOOOXXXeeerrr}}}~~~~~~mmmYYYIIIAAACCCUUUtttooo```VVVQQQSSS[[[dddppp|||~~~~~~qqq]]]LLLDDDEEEVVVtttzzzqqqjjjfffeeejjjsss~~~}}}}}}~~~~~~qqq___VVVVVVccc|||{{{wwwttttttvvvyyy~~~{{{zzz||||||qqqooowww}}}nnniiijjjooowww|||{{{|||nnn^^^ZZZ___jjjyyyzzzaaaRRRPPPWWWeeewwwmmmVVVGGGFFFOOO^^^qqq~~~~~~}}}}}}zzz```LLL@@@@@@HHHXXXkkk~~~~~~~~~|||zzzyyy|||lllWWWGGG===>>>GGGVVVhhh}}}|||{{{}}}|||zzzyyy|||tttdddSSSGGGAAADDDMMM\\\mmm|||zzz{{{xxxkkkaaaXXXRRRPPPUUU___nnn~~~|||qqqkkkfffddddddfffjjjqqq{{{|||kkkbbb```cccjjjsss}}}qqq^^^VVVXXXaaapppkkkWWWOOOSSS```tttkkkVVVMMMRRRaaawww~~~{{{yyy{{{}}}|||}}}pppZZZQQQUUUdddyyy}}}|||}}}{{{{{{~~~xxx```WWWZZZhhh{{{{{{|||~~~fff\\\^^^kkk}}}}}}hhh^^^```lll}}}zzzeee\\\^^^jjj{{{}}}{{{yyyzzz}}}ttt```XXX[[[gggwww~~~}}}}}}}}}}}}}}}~~~~~~}}}|||zzzyyyzzz{{{mmm\\\VVVYYYeeettt~~~~~~~~~|||jjj]]]XXX[[[ffftttyyyllldddaaadddlllwww}}}yyytttssssssuuuzzz~~~}}}vvvqqqqqqtttzzz{{{yyy{{{}}}}}}rrrnnnnnnqqqwww~~~{{{jjj^^^[[[aaammm}}}~~~yyywwwxxxzzzsssaaaTTTQQQUUU]]]jjjvvvnnnXXXKKKJJJUUUgggzzzyyyzzz}}}{{{cccOOOBBBAAAHHHTTTeeeuuuhhhPPPAAA@@@NNNddd~~~rrr^^^NNNEEEFFFOOO]]]oookkkPPP???>>>LLLddduuujjj```ZZZXXX\\\fffuuuqqqTTTBBB@@@MMMeeesssjjjeeedddeeehhhmmmsss{{{wwwXXXEEEBBBOOOfff}}}gggWWWOOOPPPXXXeeetttxxxZZZGGGDDDPPPgggoooYYYHHHCCCIIIWWWlllsssWWWFFFCCCPPPfff{{{{{{kkkZZZNNNLLLTTTfff}}}iiiRRRDDDCCCOOOeeerrriiihhhlllttt|||yyynnnfffbbbeeeooouuu___LLLBBBBBBOOOccc|||}}}mmmaaaXXXUUUWWW\\\bbbjjjooosssuuuvvvvvvyyy}}}yyygggUUUHHH@@@BBBOOObbbyyy}}}mmm^^^RRRJJJGGGFFFIIIMMMTTTZZZbbblllvvvppp```QQQFFF@@@BBBOOOaaawwwqqqbbbTTTIIIBBB???>>>@@@DDDKKKRRR\\\jjj{{{ppp___PPPFFF@@@BBBNNN```uuuvvviii[[[OOOFFF@@@>>>???BBBGGGOOOXXXcccsssvvvdddSSSFFF???@@@MMM^^^ttt{{{vvvmmmcccXXXNNNGGGCCCDDDFFFLLLSSS]]]gggtttkkkXXXIII@@@AAALLL^^^ttt~~~uuuooojjjjjjkkkmmmoooooommmggg```WWWPPPKKKJJJMMMRRRZZZeeeqqq|||ttt___OOOEEEEEEPPP```uuu|||nnnbbbWWWPPPMMMPPPUUU\\\cccggghhhfffaaaZZZUUUQQQRRRWWW___jjjwww}}}jjjZZZPPPPPPXXXfffxxx|||mmm^^^QQQFFF@@@>>>CCCLLLVVV```gggkkkjjjfff```]]]ZZZ\\\bbblllxxx|||nnneeedddiiisssqqqdddVVVJJJAAA<<<<<>>PPPiiizzzfffSSSEEE>>>===BBBIIIRRRYYY^^^]]]YYYTTTOOOLLLKKKOOOXXXdddqqq}}}~~~}}}{{{zzzxxxwwwvvvtttqqqnnnmmmnnnqqqxxx{{{jjjZZZMMMEEEEEELLLWWWdddpppzzz~~~{{{xxxvvvtttpppkkkhhhgggjjjrrrbbbIII<<>>BBBMMM]]]ooo{{{wwwvvvxxxhhhNNNAAAEEEVVVooolll[[[MMMEEEDDDFFFKKKPPPUUUXXXXXXWWWUUUSSSSSSRRRTTTYYY___ffflllqqqtttvvvvvvvvvuuutttsssrrrrrrrrrrrrpppooonnnjjjgggccc^^^\\\YYYYYYZZZ\\\^^^```bbbccccccddddddddddddddddddccccccbbbbbbaaabbbbbbbbbbbbbbbccccccccccccbbbaaaaaaaaaaaaaaa`````````aaabbbdddhhhkkknnnqqqsssuuuvvvwwwxxxxxxxxxxxxxxxvvvvvvuuuttttttuuuwwwzzz|||}}}}}}{{{zzzwwwtttqqqnnnllljjjhhheeeccc```]]]WWWOOOGGG@@@<<<===DDDSSSfff{{{lllQQQCCCGGGXXXqqqrrrbbbVVVNNNKKKKKKNNNQQQSSSUUUUUUUUUUUUTTTUUUUUUWWWZZZ]]]aaaeeehhhjjjkkklllllllllllllllllllllmmmmmmlllkkkiiifffbbb^^^YYYUUUQQQNNNLLLIIIGGGFFFEEEEEEEEEFFFHHHIIIIIIJJJJJJJJJIIIHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFEEEEEEEEEFFFHHHJJJNNNQQQUUUXXXZZZ\\\^^^___`````````___^^^[[[YYYWWWVVVVVVXXX\\\___cccfffiiijjjkkklllllllllkkkiiifffbbb]]]XXXTTTQQQLLLGGGBBB>>>===@@@IIIYYYmmmnnnQQQCCCFFFXXXqqq|||oooddd\\\WWWTTTSSSRRRQQQPPPPPPPPPQQQRRRTTTUUUVVVYYYZZZ]]]___aaabbbbbbcccccccccccccccddddddeeeeeedddcccaaa___[[[WWWRRRNNNJJJGGGDDDAAA>>>;;;:::::::::<<>>>>>>>>=====================<<<<<<<<<<<<======<<<<<<<<<===???@@@DDDGGGJJJMMMNNNOOOQQQQQQQQQQQQQQQOOONNNKKKIIIGGGFFFHHHKKKQQQXXX^^^dddiiikkkoooqqqrrrsssrrrqqqnnniiiddd^^^ZZZWWWRRRNNNKKKHHHIIILLLTTTbbbssspppRRRBBBEEEWWWpppyyyqqqjjjbbbZZZSSSMMMJJJHHHIIIKKKNNNRRRTTTUUUWWWXXXZZZZZZ[[[\\\\\\\\\[[[[[[ZZZZZZZZZ[[[[[[\\\[[[[[[YYYWWWSSSPPPKKKHHHEEEBBB@@@>>>===;;;;;;<<<===???CCCEEEGGGHHHHHHGGGEEECCCBBB@@@??????>>>>>>>>>>>>>>>>>>>>>>>>>>>?????????????????????@@@AAABBBEEEGGGIIIJJJKKKKKKKKKIIIHHHFFFFFFDDDCCC@@@>>>>>>???BBBHHHRRR\\\fffnnnuuuzzz~~~{{{vvvpppllliiifffccc```]]]^^^```eeemmmxxxqqqRRRBBBDDDVVVppp}}}pppcccVVVJJJDDDAAABBBFFFKKKPPPTTTUUUWWWWWWXXXWWWXXXWWWVVVVVVTTTSSSRRRQQQRRRRRRRRRRRRSSSRRRQQQOOOLLLIIIFFFDDDBBBAAAAAAAAAAAABBBDDDEEEGGGKKKNNNQQQSSSTTTTTTRRROOOMMMJJJHHHGGGGGGFFFFFFFFFFFFFFFFFFGGGGGGGGGHHHHHHHHHIIIIIIIIIIIIIIIJJJKKKLLLMMMNNNNNNMMMKKKJJJGGGDDDAAA@@@>>><<<;;;::::::===BBBLLLYYYfffttt}}}{{{xxxxxxxxxyyy{{{~~~qqqRRRAAADDDUUUooo~~~kkkZZZJJJAAA===???DDDJJJQQQVVVWWWXXXXXXWWWVVVUUUTTTRRRQQQOOONNNLLLKKKKKKKKKKKKKKKLLLKKKKKKJJJHHHFFFDDDCCCCCCDDDEEEGGGIIILLLOOORRRUUUXXX\\\___aaacccbbb___\\\YYYUUURRRQQQQQQQQQQQQRRRRRRRRRRRRSSSSSSSSSUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVUUUTTTPPPMMMHHHDDD@@@>>>===;;;:::999;;;???FFFSSSccctttpppRRRBBBDDDUUUnnnsss```OOOEEEAAACCCIIIPPPWWW\\\]]]]]]ZZZXXXUUUSSSQQQOOOMMMKKKJJJHHHGGGGGGGGGGGGGGGHHHHHHHHHHHHGGGGGGHHHHHHIIIKKKMMMPPPSSSVVVZZZ]]]```dddhhhkkkmmmnnnmmmjjjfffccc___\\\[[[[[[[[[\\\]]]^^^^^^^^^_________``````````````````````````````______^^^]]][[[WWWSSSNNNIIIEEECCCAAA???>>><<<>>>CCCLLLZZZlllkkkRRRDDDFFFVVVmmmxxxgggXXXOOOLLLOOOUUU\\\bbbffffffddd```[[[UUUQQQMMMKKKIIIHHHGGGFFFFFFFFFFFFFFFFFFHHHIIIJJJLLLNNNQQQTTTWWWYYY\\\^^^```bbbcccfffiiikkknnnrrrtttvvvwwwuuurrrnnnkkkgggeeedddeeefffiiikkklllmmmmmmmmmmmmlllllllllkkkkkkjjjjjjiiiiiihhhiiihhhhhhggggggeeeaaa^^^ZZZUUUQQQOOOMMMJJJHHHEEEFFFJJJSSSbbbvvv~~~eeeQQQGGGJJJXXXlll|||pppeee___^^^aaagggmmmrrruuusssnnnggg___VVVOOOJJJGGGFFFFFFFFFGGGHHHHHHHHHHHHIIIJJJLLLOOOTTTZZZaaahhhmmmrrrtttuuuvvvuuuuuuuuuwwwxxxzzz}}}~~~~~~{{{wwwtttqqqpppppprrruuuyyy|||~~~~~~|||{{{zzzyyywwwvvvtttsssrrrrrrsssrrrsssssstttsssqqqnnnkkkhhheeeccc```\\\XXXSSSRRRUUU]]]nnnppp^^^PPPJJJNNNZZZkkk~~~zzzuuussssssvvv{{{zzzooodddXXXOOOHHHEEEEEEEEEHHHIIIKKKLLLLLLLLLMMMNNNQQQVVV^^^gggrrr|||||||||}}}}}}}}}~~~~~~~~~|||zzzvvvqqqkkkdddaaabbbjjj{{{sssdddXXXOOOMMMQQQ[[[jjjzzzzzzlll]]]QQQIIIFFFGGGHHHKKKOOOQQQRRRQQQQQQQQQRRRVVV[[[dddppp~~~~~~vvvrrrqqqyyyuuuiii^^^TTTOOONNNRRR\\\jjjyyyuuueeeWWWNNNKKKLLLNNNSSSWWWZZZZZZXXXWWWUUUTTTWWW\\\eeeqqq~~~ssshhh]]]SSSNNNNNNRRR]]]kkk{{{~~~}}}||||||~~~pppaaaVVVSSSUUUXXX]]]bbbeeedddaaa]]]XXXUUUTTTWWW___iiivvvxxxkkk^^^TTTNNNLLLRRR]]]mmm}}}|||~~~}}}{{{zzzzzz}}}~~~mmmaaa^^^```eeekkkqqqtttqqqkkkccc[[[TTTPPPPPPTTT[[[dddmmmwwwqqqbbbUUUMMMKKKPPP]]]ooo{{{{{{}}}}}}{{{yyyyyy}}}{{{ooolllnnnuuu{{{vvvlll```UUUMMMIIIJJJLLLQQQXXX```gggqqq|||vvveeeWWWMMMIIIOOO]]]ppp}}}}}}{{{yyyyyy}}}~~~|||uuugggYYYMMMGGGEEEDDDEEEIIIPPPWWWbbbpppxxxgggWWWMMMIIIOOO]]]ooo}}}{{{yyyyyy}}}qqqaaaSSSKKKHHHEEEFFFHHHNNNUUU```oooyyyhhhXXXNNNIIINNN[[[mmm}}}{{{zzzzzz}}}~~~mmm^^^UUUQQQOOOOOORRRWWW]]]hhhwwwzzziiiYYYNNNIIINNNYYYjjj}}}~~~}}}|||{{{{{{~~~|||mmmccc___]]]^^^aaagggmmmuuu{{{jjjZZZOOOIIIMMMWWWgggxxx~~~}}}}}}|||}}}}}}ssspppoooqqqtttzzzrrrggggggttt|||lll\\\PPPJJJMMMVVVddduuu~~~~~~mmmVVVHHHHHHWWWttt~~~mmm\\\PPPIIILLLUUUcccsssiiiTTTGGGFFFSSSmmmmmm[[[MMMGGGIIISSSbbbsss~~~~~~}}}~~~rrrddd\\\\\\dddtttmmmZZZKKKDDDGGGRRRaaattt~~~{{{|||}}}|||~~~~~~}}}}}}~~~ooo[[[LLLEEEGGGRRRcccuuu~~~{{{|||xxxuuuyyytttaaaRRRKKKMMMWWWfffxxxwwwggg^^^___hhhvvvnnnaaaZZZ[[[cccnnn|||}}}{{{|||xxxeeeYYYXXX]]]hhhwwwxxxrrrqqqtttzzz}}}{{{|||lll___[[[[[[```hhhqqqyyyzzzmmmeee```^^^]]]^^^___aaacccfffjjjoootttzzz}}}rrriiiaaaYYYTTTNNNLLLIIIIIIJJJLLLOOOUUU[[[dddnnnyyytttiii___VVVNNNIIIDDD@@@??????AAAEEEKKKSSS]]]iiiuuu}}}tttmmmeee```ZZZVVVRRRPPPOOOPPPRRRUUUZZZ```hhhpppyyy||||||~~~~~~zzztttppplllhhhddd___\\\\\\^^^eeeqqqxxxnnnhhhhhhppp}}}}}}~~~zzzzzz}}}xxxjjj\\\SSSNNNRRR^^^ppp~~~pppcccXXXSSSTTT]]]mmm~~~}}}{{{vvv```OOOEEEEEEPPPcccyyyxxxjjj^^^TTTOOOPPPZZZjjj|||hhhSSSFFFDDDLLL]]]qqqwwwmmmeeeaaaaaaiiiuuuwwwbbbTTTPPPSSS^^^lll|||~~~xxxjjjcccaaadddhhhooovvvzzz~~~~~~{{{sssmmmiiifffdddcccdddfffiiimmmrrrwww{{{|||}}}yyynnneee]]]WWWTTTRRRQQQRRRUUUXXX]]]dddmmmwww~~~{{{}}}}}}rrrhhh___YYYRRRLLLIIIGGGGGGJJJRRR[[[fffqqq}}}zzzxxxzzz}}}tttgggZZZMMMDDD>>>===CCCKKKUUU```lllvvv{{{wwwvvvxxx{{{qqq[[[HHH<<<666888>>>GGGQQQ[[[eeeooo|||vvvnnnjjjkkksss|||zzzvvvwwwyyy|||nnnRRR???666444777===EEENNNWWW```kkkwww~~~sssjjjbbb\\\ZZZ[[[cccnnnzzz|||}}}```JJJ===999888<<>>DDD[[[|||zzzeeeRRRFFFCCCLLL^^^vvvsss```PPPDDDBBBJJJaaatttaaaTTTPPPWWWggg{{{|||pppcccXXXPPPLLLOOOYYYnnn{{{nnnhhhlllxxxxxxggg]]]VVVTTTUUUYYYaaallljjjYYYQQQQQQUUU^^^iiiuuufffWWWRRRVVV___lllzzz~~~}}}}}}yyyiii``````hhhttt{{{yyywwwvvvwwwyyy}}}zzztttpppqqqvvv|||wwwuuutttvvvyyy|||qqqhhhdddeeekkkrrr{{{zzzxxxxxxzzz}}}jjjSSSJJJKKKTTTddduuueeeOOOGGGJJJWWWjjj~~~|||{{{zzzzzz|||ooo^^^YYY^^^kkk~~~}}}xxxwwwuuuvvvyyy|||xxxvvv|||zzzwwwuuuwwwyyy}}}|||yyy{{{}}}|||yyyyyy|||{{{vvvsssrrrttt{{{|||}}}|||xxxtttqqqrrrtttyyy~~~}}}{{{vvvttttttuuuxxx{{{~~~iii___bbbnnn}}}yyywwwxxxzzz}}}~~~pppXXXMMMRRRaaawww~~~~~~~~~ttt^^^TTTXXXggg}}}rrrjjjnnn{{{~~~~~~~~~zzzxxxxxx{{{~~~yyyuuuvvvyyy}}}||||||}}}}}}}}}~~~}}}|||}}}yyytttpppooorrrwwwwwwnnnfffbbb``````cccjjjvvv||||||~~~qqqddd\\\UUURRRQQQRRRVVV]]]kkk~~~||||||rrrbbbWWWOOOIIIFFFFFFGGGLLLSSSaaatttuuugggZZZPPPJJJDDDAAAAAAAAAFFFLLLXXXiii}}}vvvjjjaaaWWWOOOJJJDDDAAA??????AAAEEENNN\\\lll{{{zzzxxx|||~~~tttkkkccc]]]WWWRRRMMMHHHDDDAAA??????AAAGGGPPPZZZeeeooouuuxxxvvvrrrnnnkkkkkkrrr~~~xxxnnnfffaaa]]][[[YYYVVVSSSNNNIIIEEEBBB@@@@@@BBBGGGLLLSSSYYY]]]```___^^^]]]]]]aaaiiiuuuuuuiiiaaa\\\ZZZYYY[[[\\\\\\YYYUUUPPPKKKGGGDDDBBBCCCEEEGGGKKKNNNPPPRRRRRRSSSSSSUUUYYYaaalllzzz}}}qqqfff\\\VVVSSSSSSVVV[[[^^^``````]]]XXXTTTPPPLLLJJJJJJLLLMMMQQQSSSTTTUUUTTTRRRQQQQQQSSSZZZcccooo}}}}}}rrrggg]]]TTTMMMJJJJJJMMMSSS[[[bbbfffhhhfffccc___[[[YYYWWWXXX[[[]]]aaacccdddccc___ZZZUUUQQQOOOSSSYYYbbbmmmyyy{{{nnnddd[[[SSSKKKFFFBBBAAADDDKKKSSS^^^gggmmmqqqqqqooollliiiggggggiiimmmrrrvvvyyyzzzwwwpppggg]]]TTTNNNMMMPPPVVV^^^gggooovvv|||}}}~~~zzzkkkaaa```ffftttssseeeXXXOOOHHHCCC???>>>>>>@@@EEENNNYYYeeeooowww|||}}}|||{{{xxxwwwxxx{{{uuugggZZZOOOKKKKKKNNNSSSZZZ___dddffffffggghhhjjjnnnuuu~~~}}}iiiXXXMMMLLLUUUfff|||qqqaaaTTTIIIAAA=========AAAEEEJJJQQQ[[[fffrrr}}}qqqaaaTTTMMMKKKMMMQQQVVVZZZ]]]]]]YYYVVVTTTRRRUUU\\\iiiyyyyyyeeeUUUKKKKKKUUUhhh~~~pppaaaSSSHHH@@@<<<===CCCJJJTTT^^^fffnnnwww|||kkk\\\UUUSSSUUUZZZ___bbbdddbbb[[[TTTNNNIIIHHHMMMXXXgggyyyzzziii\\\TTTUUU```tttzzzkkk]]]QQQGGG???<<<<<>>HHH\\\wwwwwwcccQQQEEE>>>???CCCIIIOOOVVVYYYZZZYYYXXXVVVWWWZZZ```hhhrrr}}}}}}|||}}}mmm___SSSMMMNNNVVVddduuu~~~eeePPPBBB:::666666:::CCCOOOfffmmmXXXJJJAAA@@@CCCHHHMMMQQQSSSQQQMMMHHHDDDBBBCCCIIIRRR^^^kkkzzznnn^^^PPPHHHGGGNNNZZZiiizzz{{{^^^JJJ>>>888777:::AAAKKKXXXooowwwbbbRRRJJJHHHLLLQQQWWW[[[\\\XXXQQQIII@@@;;;999===EEEOOO\\\iiixxxooo___TTTQQQSSSYYYaaammmxxxsssYYYGGG===:::<<>>DDDMMMWWWbbbrrr~~~rrrfff\\\VVVTTTZZZiiiiiiWWWLLLGGGJJJQQQ\\\hhhuuu~~~xxx{{{rrr___OOOCCC>>>======AAAGGGNNNXXXgggyyyrrraaaSSSLLLOOO___zzzyyyhhh[[[TTTRRRWWW```mmmzzzkkkYYYLLLEEECCCCCCFFFKKKQQQZZZfffuuunnn]]]RRRTTTaaa{{{|||qqqnnntttsssiiiccc```bbbjjjvvvzzzgggXXXRRRQQQRRRVVV\\\bbbhhhpppyyywwwtttvvvuuujjjiiittt|||jjj___]]]eeetttxxxsssooommmnnnqqqvvvwwwiiiccccccgggmmmtttzzz}}}{{{ssslllfffdddhhhqqq}}}lll[[[QQQPPPZZZkkk|||rrrkkkiiijjjnnnttt{{{{{{uuuwww}}}zzzuuuooohhhaaa[[[VVVWWW[[[dddqqqtttaaaRRRKKKKKKUUUggg|||xxxkkkccc___aaahhhrrr}}}}}}ssskkkddd\\\UUUPPPLLLNNNRRRZZZfffvvv{{{lll```UUUQQQSSS\\\lll~~~}}}{{{|||xxxmmmddd```___dddooo}}}~~~tttllleee\\\UUUOOOJJJKKKNNNUUU___mmmzzz}}}vvvnnniiieeeccccccgggnnnzzz{{{zzz{{{~~~|||ssslllgggdddeeehhhqqq|||vvvooofff]]]VVVOOOMMMNNNRRRYYYdddnnnzzzyyyllldddaaaccchhhnnnuuu|||~~~|||{{{|||qqqiiieeedddfffjjjpppxxxvvvkkkaaaXXXSSSQQQRRRVVV\\\cccllluuu}}}tttooonnnrrr}}}ppp```UUUPPPRRR[[[jjjzzzpppaaa\\\\\\aaaiiittt{{{nnncccZZZVVVTTTTTTWWW[[[aaaiiitttsssggg]]]VVVUUUZZZgggyyypppaaaSSSJJJHHHNNN[[[oooxxxfffZZZXXX[[[eeerrrzzzlllaaa[[[XXXWWWXXXZZZ___eeemmmyyy{{{lll___SSSKKKIIIMMMZZZkkk~~~yyymmmbbbXXXRRRRRRYYYgggzzz}}}zzzxxxwwwzzzssshhh```bbbhhhuuutttggg```]]]]]]```ccchhhmmmrrrzzzxxxkkk^^^UUUQQQRRRZZZfffttt{{{tttoookkkjjjlllrrr|||zzzvvvrrrqqqqqquuu|||zzzvvvrrrqqqsssyyyzzzlllfffeeeiiiooouuu|||yyyoooiiifffeeegggkkkpppwwwyyytttpppooopppuuu}}}xxxllldddccceeellluuurrrlllnnnvvv}}}uuuqqqppprrrvvv{{{vvvmmmddd______fffvvv|||wwwtttsssuuuzzzsss```QQQJJJMMMWWWgggyyy{{{vvvyyyyyyjjj```ZZZWWWVVVVVVXXX[[[___eeemmmvvvsssaaaTTTMMMRRRddd~~~~~~~~~~~~}}}}}}}}}gggUUUGGGAAAFFFSSSggg}}}xxxgggZZZQQQKKKEEEBBBAAABBBDDDKKKTTT___mmmyyyxxxbbbQQQHHHKKK^^^{{{~~~~~~uuuggg[[[SSSPPPVVVaaaqqq{{{lllaaaWWWOOOGGG@@@<<<;;;<<>>AAAGGGPPPZZZdddnnnyyyvvvooolllqqq~~~rrrfff```dddlllwww}}}ttthhh\\\RRRJJJFFFGGGJJJOOOVVV^^^fffoooyyynnn[[[OOOMMMWWWhhh}}}ooocccXXXRRRPPPPPPRRRUUUZZZ___fffnnnxxxrrr^^^LLLBBBBBBOOOeee~~~qqqeee]]]YYYVVVUUUUUUWWW[[[___fffnnnxxxrrraaaQQQCCC<<<>>>KKK```zzzuuullleee```[[[XXXWWWXXX[[[___fffmmmwww}}}{{{{{{|||}}}{{{ooofff[[[OOOFFF???<<>>???DDDLLLXXXffftttzzzoooeee^^^YYYVVVWWWXXX\\\aaahhhqqq~~~|||lll___YYY[[[dddpppzzznnncccXXXOOOJJJIIINNN[[[lll~~~ppp___QQQEEE???<<<;;;===@@@EEEKKKPPPXXXaaakkkvvv{{{nnnccc\\\WWWUUUTTTUUUYYY^^^fffqqqnnn\\\NNNFFFHHHPPP]]]lll|||vvvgggVVVHHH???<<>>AAAKKKXXXhhhxxxqqqeee______jjjzzz{{{pppbbbTTTHHH@@@>>>DDDWWWsssxxxcccRRRGGGDDDGGGPPP]]]lll|||~~~yyyvvvuuuvvv}}}zzzkkk[[[MMMCCC>>>AAANNNccc{{{sssdddWWWOOONNNQQQZZZeeerrr{{{xxxuuurrrqqqrrrtttyyyvvvfffXXXMMMFFFEEEJJJUUUcccsss~~~~~~~~~qqqeee]]]WWWWWW[[[bbbmmmxxx|||rrrhhh```[[[WWWTTTTTTTTTVVV[[[dddqqqtttfffZZZQQQMMMKKKMMMPPPWWW```mmm~~~uuuooojjjhhhiiinnnuuu}}}ttthhh```[[[[[[___fffqqq|||xxxkkk___TTTKKKFFFBBBAAABBBDDDJJJQQQ]]]nnnsssggg]]]VVVPPPKKKHHHHHHLLLVVVggguuujjjaaa[[[XXXZZZaaakkkwww|||mmmaaaXXXWWW[[[dddqqq}}}tttiii]]]SSSJJJCCC@@@???AAAEEEJJJQQQYYYdddssswwwlllddd[[[SSSLLLIIIIIIOOO]]]sssuuuiii^^^UUUOOOMMMPPPXXXeeerrrrrr___RRROOOTTT^^^mmm}}}xxxlllcccZZZRRRLLLGGGDDDDDDFFFLLLTTT\\\eeemmmuuu~~~vvvmmmcccZZZTTTPPPRRRZZZgggyyyyyyooodddYYYPPPIIIEEEDDDHHHRRR```nnn|||yyy___MMMGGGLLLXXXjjj}}}ssseeeZZZSSSMMMJJJIIIIIIKKKNNNTTT^^^iiisss}}}vvvlllddd]]][[[[[[___dddmmmuuuxxxnnnddd\\\RRRKKKEEE@@@>>>???EEEPPP^^^lll{{{aaaKKKCCCIIIVVViii~~~qqqaaaTTTKKKEEECCCEEEHHHNNNSSSYYYbbbooo|||uuulllfff```ZZZUUUSSSSSSYYYeeezzzyyymmmcccZZZSSSLLLFFFAAA>>>======@@@GGGRRRaaappphhhQQQIIINNNZZZnnnssscccUUUHHHAAA===>>>CCCJJJSSS[[[cccmmmyyyxxxpppfff[[[OOOGGGBBBDDDNNNddduuuiii___VVVPPPKKKFFFBBB@@@???@@@CCCGGGOOO\\\kkkzzzsss^^^WWW\\\hhhzzzsssdddVVVJJJ@@@;;;:::===EEEOOOZZZdddllluuu~~~{{{ooobbbTTTIIIAAA???GGGXXXpppvvvjjj```XXXRRRMMMJJJHHHFFFGGGIIILLLQQQWWWaaaoooqqqkkkpppzzz}}}nnnaaaTTTJJJAAA:::888999@@@KKKWWWdddpppwww}}}{{{mmm___SSSIIIEEEHHHQQQ```rrr{{{lllccc\\\UUURRROOONNNOOOPPPSSSXXX^^^fffnnnzzz|||kkk]]]RRRHHHAAA;;;888888<<>>;;;999<<>>FFFTTTfff{{{{{{tttlllddd^^^ZZZXXXZZZaaagggnnnrrrtttpppggg]]]QQQIIICCCFFFOOO]]]nnn}}}zzzpppiiihhhpppxxxooojjjlllwwwtttkkkccc]]]XXXUUUTTTUUUZZZeeerrrlllQQQAAA>>>GGGXXXllluuummmgggaaa\\\WWWSSSOOOLLLJJJJJJJJJLLLQQQWWW\\\___```^^^WWWOOOFFFAAA???EEETTThhh~~~zzzwww~~~xxxhhh______jjj~~~qqqggg___ZZZXXXWWWXXX\\\aaahhhuuuuuuYYYHHHEEELLL[[[mmm~~~rrrfff\\\TTTMMMHHHCCC@@@>>>>>>>>>@@@AAADDDJJJOOOTTTWWWYYYXXXRRRKKKEEEAAABBBJJJ\\\rrrtttbbbWWWTTT___uuuqqqfff\\\WWWSSSTTTWWW[[[aaaiiisssjjjYYYTTTWWW```kkkyyyssshhh^^^TTTLLLEEE@@@<<<:::888888999<<<>>>BBBIIIPPPVVV[[[^^^^^^YYYSSSMMMJJJLLLUUUhhhlllZZZNNNKKKTTTggg}}}qqqeee[[[SSSPPPOOORRRWWW]]]gggppp|||qqqjjjffffffhhhlllqqqxxxyyyqqqhhhaaaYYYQQQJJJDDD@@@===;;;999999999;;;???EEEMMMVVV___gggkkklllhhhbbb]]]ZZZ[[[eeexxxtttaaaRRRGGGDDDJJJXXXmmmzzztttkkkbbbXXXQQQLLLKKKLLLQQQYYYaaammmxxxxxxnnneee___\\\^^^cccnnnzzzyyyrrrllliiigggdddccc___\\\WWWRRRMMMIIIFFFDDDAAA>>>===<<<>>>BBBJJJTTTaaammmvvv}}}~~~{{{uuuppplllnnnwwwvvvhhhYYYLLLCCC@@@CCCKKKXXXhhhwwwwwwqqqmmmkkkiiigggeeeaaa\\\UUUOOOJJJGGGIIILLLSSS]]]gggtttwwweeeWWWLLLJJJMMMVVVbbbqqqtttcccUUUNNNKKKMMMPPPTTTWWWXXXXXXVVVTTTRRRPPPNNNMMMJJJFFFCCCBBBCCCHHHQQQ]]]lll{{{{{{ooobbbVVVLLLDDD???@@@CCCIIIRRR[[[eeeppp~~~mmm]]]RRRLLLLLLNNNRRRUUUWWWWWWTTTPPPKKKHHHFFFJJJOOOXXXdddppp~~~jjjUUUFFFAAACCCLLLXXXgggwwwyyyzzztttaaaOOOAAA<<<;;;>>>DDDJJJPPPSSSUUUVVVVVVVVVVVVVVVVVVSSSNNNKKKIIIJJJOOOYYYgggxxxuuuiii]]]SSSJJJDDDBBBAAACCCGGGLLLRRR[[[iiiyyynnnZZZIII>>>:::===CCCKKKRRRWWWYYYWWWSSSOOOLLLKKKOOOVVVaaannn|||sssZZZGGG@@@BBBLLLZZZjjj|||uuuoooooouuu|||tttdddSSSEEE:::666555999>>>DDDJJJNNNRRRVVVZZZ]]]```bbbbbb___ZZZVVVSSSSSSYYYeeettt}}}ooocccWWWOOOIIIEEECCCCCCEEEHHHNNNXXXfffuuuuuuaaaNNN???666555<<>>===<<<>>>@@@CCCGGGLLLRRR\\\fffqqqyyy~~~yyyrrrnnnmmmsss}}}nnncccZZZRRRKKKFFFBBBBBBDDDIIIOOOVVV]]]aaadddhhhjjjllloooppprrruuuvvvxxxxxxwwwsssjjj^^^QQQEEE===;;;AAAOOOaaatttyyytttvvvwwwaaaVVVYYYcccsssmmm]]]QQQLLLLLLOOOTTTZZZ^^^^^^]]]\\\YYYVVVSSSQQQNNNMMMJJJHHHFFFEEEEEEDDDDDDDDDGGGJJJOOOVVVcccooo|||}}}|||ttthhh]]]TTTLLLFFFBBBBBBCCCGGGKKKOOORRRVVV[[[```dddiiilllnnnppppppppppppnnnkkkcccZZZPPPFFFAAABBBJJJ[[[ooolll``````gggsss~~~sss___NNNCCC>>>@@@DDDKKKRRRXXXYYYYYYZZZXXXVVVTTTSSSQQQQQQOOONNNMMMMMMMMMLLLKKKKKKMMMPPPUUU^^^lllzzzzzzlll```UUULLLGGGFFFFFFIIIMMMQQQTTTXXX]]]ccchhhnnnqqqssstttssssssqqqooollleee]]]SSSKKKHHHJJJTTTeee{{{zzzmmmiiihhhlllqqqzzz{{{sssqqqtttzzzxxxhhhXXXIII@@@<<<===@@@FFFLLLRRRTTTWWWZZZ\\\]]]^^^```___^^^]]]ZZZYYYWWWWWWVVVUUUUUUVVVYYY___iiiyyyqqqcccYYYRRRQQQRRRVVV[[[```cccgggmmmrrrwww|||~~~{{{xxxuuunnnfff]]]VVVSSSUUU```qqq|||rrrjjjccc``````dddnnnwwwpppjjjeeeeeehhhnnntttzzz~~~}}}xxxnnnbbbVVVKKKDDD@@@@@@BBBDDDHHHMMMPPPUUU]]]cccjjjooossstttrrroookkkhhheeedddcccaaaaaabbbeeelllwwwuuuhhhbbbaaadddiiipppvvvzzz~~~|||tttllldddbbbdddnnn~~~nnn___SSSLLLKKKSSSfff~~~yyykkkaaa]]]\\\]]]___aaabbbaaa___]]][[[ZZZYYY[[[^^^ccchhhmmmqqqpppmmmggg```YYYQQQMMMJJJHHHFFFFFFGGGJJJOOOVVVbbbnnnyyy~~~yyyuuusssqqqpppoooppptttzzzyyyssssssxxx|||uuurrrttt}}}xxxcccQQQEEE@@@FFFWWWooowwwbbbRRRGGGBBB@@@@@@BBBDDDFFFGGGHHHIIIKKKNNNPPPTTTWWW]]]bbbgggkkklllkkkhhhccc___ZZZWWWTTTQQQMMMJJJJJJLLLQQQZZZiiiyyy~~~tttaaaRRRJJJMMMYYYkkk~~~jjjWWWGGG===888555444666777999:::<<>>CCCLLL[[[mmm~~~xxxwww|||yyyiii^^^YYY[[[```hhhpppvvvxxxuuupppiiibbb[[[WWWUUUUUUVVVYYY[[[[[[[[[XXXTTTPPPLLLHHHFFFEEECCCAAAAAACCCHHHRRRbbbvvvnnnaaaZZZ\\\aaajjjssszzz}}}zzzvvvoooiiibbb___^^^^^^aaadddggghhhhhhfffbbb^^^ZZZVVVSSSRRROOOLLLKKKLLLQQQ[[[lllzzzkkkdddeeekkkttt}}}~~~yyytttqqqqqqqqqsssvvvxxxyyyyyywwwssspppllliiifffddd```\\\ZZZ[[[___iiizzzzzzssstttyyy~~~{{{xxxsssooolllllloooxxx~~~}}} \ No newline at end of file diff --git a/nix/flake.nix b/nix/flake.nix index 582beda..b9f443a 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -20,7 +20,7 @@ gnumake gtkwave pkg-config - (python39.withPackages (py: [ py.numpy py.pillow ])) + (python39.withPackages (py: [ py.numpy py.pillow py.matplotlib ])) (quartus-prime-lite.override { supportedDevices = [ "Cyclone V" ]; }) verilator ]; diff --git a/platform.qsys b/platform.qsys index 30158b8..7e92b3e 100644 --- a/platform.qsys +++ b/platform.qsys @@ -17,6 +17,14 @@ type = "int"; } } + element buttons + { + datum _sortIndex + { + value = "17"; + type = "int"; + } + } element clk_0 { datum _sortIndex @@ -134,6 +142,14 @@ type = "int"; } } + element switches + { + datum _sortIndex + { + value = "16"; + type = "int"; + } + } element sys_sdram_pll_0 { datum _sortIndex @@ -200,6 +216,11 @@ + + + + + + + + + + + + + + + + @@ -1070,6 +1110,20 @@ Automatic Switchover + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +