.. _z3-calc: ===================== Zadanie 3: Kalkulator ===================== Data ogĹoszenia: 01.12.2020 Termin oddania: 12.01.2021 Archiwum z plikami: :download:`z3_calc.tar.gz`, zawiera: - ``calc_template.py``: szablon rozwiÄ zania - ``calc_sw.py``: wzorcowa implementacja w Pythonie - ``calc_gentest.py``: generator testĂłw (uĹźywany przez oba testy) - ``calc_test_sim.py``: testuje rozwiÄ zanie w symulacji - ``calc_wrapper.py``: syntezuje rozwiÄ zanie na Zynq (uruchamiamy bez argumentĂłw, otrzymujemy bitstream w ``build/top.bin``) - ``calc_run_hw.py``: uruchamia zsyntezowane rozwiÄ zanie na serwerze, pozwalajÄ c na interakcjÄ z portem szeregowym (podajemy ĹcieĹźkÄ do pliku ``.bin`` jako argument) - ``calc_test_hw.py``: testuje zsyntezowane rozwiÄ zanie na serwerze (podajemy ĹcieĹźkÄ do pliku ``.bin`` jako argument) NapisaÄ ukĹad implementujÄ cy kalkulator z interfejsem przez port szeregowy. Jedynym interfejsem ukĹadu jest port szeregowy uĹźywajÄ cy wyĹÄ cznie sygnaĹĂłw ``rxd`` i ``txd``. UkĹad powinien odbieraÄ wyraĹźenia do obliczenia na sygnale ``rxd`` i wypisywaÄ wyniki (lub oznaczenia bĹÄdĂłw) na sygnale ``txd``. WejĹciem do ukĹadu sÄ wyraĹźenia arytmetyczne, zapisane w formacie ASCII. KaĹźde wyraĹźenie jest zakoĹczone znakiem nowej linii (``0x0a``). Kalkulator powinien na kaĹźdÄ liniÄ wejĹcia (niezaleĹźnie od tego, czy jest to poprawne wyraĹźenie czy bĹÄ d) odpowiedzieÄ jednÄ liniÄ wyjĹcia. WyraĹźenia mogÄ zawieraÄ nastÄpujÄ ce tokeny: - liczby, zapisane dziesiÄtnie - binarne operatory dodawania (``+``), odejmowania (``-``), mnoĹźenia (``*``), dzielenia (``/``), liczenia reszty z dzielenia (``%``) - unarny operator negacji (``-``) - nawiasy (``(``, ``)``) Tokeny mogÄ (ale nie muszÄ ) byÄ oddzielone od siebie biaĹymi znakami (spacjami i/lub znakami tabulacji). Kalkulator powinien poprawnie implementowaÄ kolejnoĹÄ wykonywania dziaĹaĹ. Wszystkie wyniki poĹrednie powinny byÄ przechowywane jako liczby 32-bitowe bez znaku, a ewentualne przepeĹnienia zawijane modulo ``2**32``. Kalkulator nie musi obsĹugiwaÄ arbitralnie dĹugich wyraĹźeĹ â wymagane jest jedynie, by dziaĹaĹ poprawnie na wejĹciu dĹugoĹci max. 1023 znakĂłw. DĹuĹźsze wyraĹźenia mogÄ (ale nie muszÄ ) byÄ odrzucane. Implementacja logiki kalkulatora napisana w jÄzyku Python jest dostÄpna wyĹźej. MoĹźna jÄ wykorzystaÄ jako bazÄ do swojego rozwiÄ zania. Jako odpowiedĹş na liniÄ wejĹcia kalkulator powinien wypisaÄ jednÄ z nastÄpujÄ cych rzeczy i znak nowej linii (``0x0a``): - wynik obliczenia (liczbÄ zapisanÄ dziesiÄtnie, bez wiodÄ cych zer) - napis ``ERR LEX``, jeĹli nie udaĹo mu siÄ podzieliÄ linii wejĹcia na tokeny (nierozpoznany znak itp) - napis ``ERR PARSE``, jeĹli wyraĹźenie byĹo niepoprawne skĹadniowo - napis ``ERR DIVIDE``, jeĹli nastÄ piĹo dzielenie przez zero - napis ``ERR OVERFLOW``, jeĹli wyraĹźenie jest zbyt duĹźe bÄ dĹş zbyt skomplikowane dla kalkulatora (nie powinno wystÄ piÄ przy wyraĹźeniach o dĹugoĹci â¤1023 znakĂłw) - napis ``ERR SERIAL``, jeĹli wystÄ piĹ bĹÄ d odbierania danych z portu szeregowego (framing, overflow, itp) Nie trzeba pisaÄ wĹasnej obsĹugi portu szeregowego â moĹźna wykorzystaÄ tÄ z laboratorium bÄ dĹş z biblioteki ``nmigen-stdio``.