Logiczna obwód w TCS jest w zasadzie DAG składający AND, OR, NOT bramy, a przez to, co jest znane to „kompletność funkcjonalna” mogą obliczyć wszystkie możliwe funkcje. np. jest to podstawowa zasada ALU .
Wyzwanie: utwórz obwód, aby ustalić, czy 8-cyfrowa liczba binarna jest podzielna przez 3 i jakoś wizualizuj swój wynik (tj. Na jakimś obrazie)
Kryteria oceniania dla wyborców są oparte na tym, czy kod generujący obwód ładnie generalizuje się do dowolnych liczb wielkości i czy wizualizacja utworzona algorytmicznie jest zwarta / zrównoważona, ale wciąż czytelna dla człowieka (tj. Wizualizacja przy pomocy układu rąk niedozwolona). tzn. wizualizacja dotyczy tylko n = 8, ale kod idealnie będzie działał dla wszystkich „n”. zwycięskie zgłoszenie jest właśnie najlepiej ocenione.
Nieco podobne pytanie: Zbuduj maszynę do mnożenia za pomocą bramek logicznych NAND
gate-golf
? ten tag nie istnieje. Uwaga dla uczestników: proszę podać, jakiego narzędzia języka / wizualizacji używasz. jeśli ktoś chce wprowadzić komentarz PLZ. w przeciwnym razie zaakceptuje zwycięzcę tonite. bardzo dziękuję respondentom jak dotąd „BTE” lepiej niż oczekiwano!Odpowiedzi:
Wykres utrzymuje 3 wartości logiczne na każdym poziomie i. Reprezentują one fakt, że bity i wyższego rzędu liczby są równe 0, 1 lub 2 mod 3. Na każdym poziomie obliczamy kolejne trzy bity na podstawie poprzednich trzech bitów i następnego bitu wejściowego.
Oto kod python, który wygenerował wykres. Wystarczy zmienić N, aby uzyskać inną liczbę bitów, lub K, aby uzyskać inny moduł. Uruchom dane wyjściowe programu python przez kropkę, aby wygenerować obraz.
źródło
Głębokość: 7 (logarytmiczna), 18x AND, 6x OR, 7x XOR, 31 bramek (liniowy)
Pozwól mi obliczyć sumę cyfr w bazie czwartej, modulo trzy:
obwód narysowany w Logisim
Uogólnienie, formalnie (mam nadzieję, że w pewnym stopniu czytelne):
teraz w języku angielskim:
Chociaż liczba zawiera więcej niż dwa bity, weź dwie najniższe pary bitów i zsumuj je modulo 3, a następnie dołącz wynik z tyłu liczby, a następnie zwróć, jeśli ostatnia para ma zero modulo 3. Jeśli jest nieparzysta liczbę bitów w liczbie, dodaj dodatkowy zero bitów na górę, a następnie wypoleruj ze stałą propagacją wartości.
Dołączenie do tyłu zamiast do przodu zapewnia, że drzewo dodatków jest zrównoważonym drzewem, a nie połączoną listą. To z kolei zapewnia głębokość logarytmiczną w liczbie bitów: pięć bramek i trzy poziomy anulowania pary oraz dodatkowa bramka na końcu.
Oczywiście, jeśli pożądana jest przybliżona płaskość, przepuść górną parę niezmodyfikowaną do następnej warstwy zamiast owijać ją do przodu. Łatwiej to jednak powiedzieć niż zaimplementować (nawet w pseudokodzie). Jeśli liczba bitów w liczbie jest potęgą dwóch (jak to jest w każdym nowoczesnym systemie komputerowym od marca 2014 r.), Nie wystąpią jednak żadne pojedyncze pary.
Jeśli router układający zachowuje lokalizację / wykonuje minimalizację długości trasy, powinien zachować czytelność obwodu.
Ten kod Ruby wygeneruje schemat połączeń dla dowolnej liczby bitów (nawet jednego). Aby wydrukować, otwórz w Logisim i wyeksportuj jako obraz:
na koniec, gdy poproszono mnie o utworzenie wyjścia dla 32 bitów, mój Layouter generuje to. Trzeba przyznać, że nie jest bardzo kompaktowy dla bardzo szerokich wejść:
źródło
2 × 24 NOT, 2 × 10 + 5 AND, 2 × 2 + 5 OR, 2 × 2 NOR
To całkowicie się nie skaluje. Wcale nie. Może spróbuję to poprawić.
Testowałem to dla liczb do 30 i działało dobrze.
Te 2 duże obwody liczą liczbę aktywnych wejść:
Jeśli różnica tych liczb jest
0
lub3
liczba jest podzielna przez3
. Im niższy obwód tuż zasadzie odwzorowuje każdą poprawną kombinację (4,4
,4,1
,3,3
,3,0
,2, 2
,1, 1
,0, 0
) na OR.Małe kółko na środku to dioda LED, która świeci się, jeśli liczba jest podzielna przez 3, a w przeciwnym razie zgaśnie.
źródło