Podręcznik
6. Redukcja argumentów
6.2. Redukcja argumentów metodą uzupełniania
Wyjątkowo skuteczna w redukcji argumentów okazała się metoda zaproponowana w [2.6], w której klasyczne rozwiązanie problemu transformacji CNF na DNF zostało zredukowane do obliczenia uzupełnienia CNF tej funkcji, gdzie uzupełnienie redukuje się do obliczenia pokrycia kolumnowego macierzy binarnej [??]. Zaproponowane podejście bardzo przyspiesza obliczenia, a wydajna reprezentacja algorytmu w pamięci operacyjnej maszyny obliczeniowej pozwala na osiągnięcie wyników, które nie mogą być osiągnięte przy użyciu innych publikowanych metod i systemów [2.1]. Z tych powodów, jak też ze względu na niezbędność stosowania algorytmu redukcji w realizacjach sprzętowych układów dystrybucji adresów IP, skanowania wirusów, itp., wykonano praktycznie użyteczne oprogramowanie Lightning, wykorzystujące zasadę uzupełniania. Zasadę tę wyjaśnimy posługując się funkcją z Przykładu 2.17 (tabl. 2.26a).
Obliczoną w Przykładzie 2.17 zredukowaną tablicę porównań:
Obliczanie uzupełnienia funkcji jednorodnej polega na rozkładzie macierzy M na podzbiory kostek, których uzupełnienie można łatwo obliczyć. Taką postacią jest kofaktor o jednym wierszu. Uzupełnienie takiego kofaktora oblicza się według następujących zasad:
- Jeżeli kofaktor zawiera tylko jedną jedynkę, jego uzupełnienie jest identyczne jak kofaktor.
- Jeżeli kofaktor zawiera więcej niż jedną jedynkę, jego uzupełnienie zawiera tyle kostek (wierszy), ile jest jedynek w kofaktorze, przy czym wszystkie wiersze uzupełnienia mają jedynkę tylko na pozycjach odpowiadających kolejnym jedynkom kofaktora. Takie postępowanie wynika z prawa de Morgana. Przykładowo, dla kofaktora [0 0 1 0 1 0 1] uzupełnieniem będzie macierz:
- Jeżeli kofaktor zawiera wiersz samych zer (tautologia), to jego uzupełnieniem jest zbiór pusty.
- Jeżeli ko faktor jest zbiorem pustym, to jego uzupełnieniem jest wiersz samych zer (tautologia).
Po obliczeniu uzupełnień na poszczególnych poziomach rozkładu należy scalić wyniki cząstkowe zgodnie ze wzorem:
Realizowany według powyższych zasad rozkład macierzy M podany jest na rys. 2.14 (linia ciągła). Linią przerywaną oznaczono kolejne etapy scalania wyników dopełnienia.
Rys. 2.14. Przykład obliczania uzupełnienia funkcji monotonicznej
Na rys. 2.14 podano również wyniki scalania macierzy cząstkowych uzyskanych na poszczególnych etapach:
C7 = x7 [0 0 1 0 0 0 0] + Æ = [0 0 1 0 0 0 1]
C1 = x1 [0 0 1 0 0 0 1] + Æ = [1 0 1 0 0 0 1]
Macierz uzyskana na najwyższym piętrze rozkładu, która została utworzona ze scalenia macierzy cząstkowych dla zmiennej x2, reprezentuje – pozycją jedynek w poszczególnych wierszach – redukty funkcji z Przykładu 2.19. Obliczone uzupełnienie należy interpretować w następujący sposób: jedynka w j-tej kolumnie oznacza, że minimalny redukt uwzględnia zmienną xj. Do uzupełnienia należy dodać zmienne niezbędne x4 oraz x6. Minimalne redukty funkcji F są następujące i takie same jak w rozwiązaniu metodą klasyczną.
{<i>x</i><sub>2</sub>,<i>x</i><sub>3</sub>,<i>x</i><sub>4</sub>,<i>x</i><sub>6</sub>}
{<i>x</i><sub>2</sub>,<i>x</i><sub>4</sub>,<i>x</i><sub>5</sub>,<i>x</i><sub>6</sub>}
{<i>x</i><sub>2</sub>,<i>x</i><sub>4</sub>,<i>x</i><sub>6</sub>,<i>x</i><sub>7</sub>}
{<i>x</i><sub>1</sub>,<i>x</i><sub>3</sub>,<i>x</i><sub>4</sub>,<i>x</i><sub>6</sub>,<i>x</i><sub>7</sub>}
Redukcja argumentów oraz dekompozycja, to – zgodnie z opinią prof. Sasao wyrażoną w referacie [2.14] prezentowanym na konferencji EPFL Workshop on Logic Synthesis & Verification, Dec. 2015 – jedno z najpilniejszych zadań syntezy logicznej.
W przypadku implementacji funkcji boolowskich w układach FPGA (Field Progammable Gate Array) redukcja argumentów, umożliwia realizację funkcji w układzie kombinacyjnym o mniejszej liczbie wejść. Jest to szczególnie istotne dla struktur FPGA z wbudowanymi pamięciami, dla których liczba zmiennych wejściowych jest głównym czynnikiem decydującym o złożoności implementacji. Jeszcze większe znaczenie redukcji argumentów dotyczy syntezy funkcji generowania indeksów. Funkcje generowania indeksów to silnie nieokreślone funkcje boolowskie:
f : Dn ® {1,2,…,<i>k</i>}, gdzie Dn Í {0,1}n , oraz |Dn| = k.
Wektory należące do zbioru Dn nazywa się wektorami rejestrowanymi. Cechą charakterystyczną tych funkcji jest duża liczba zmiennych wejściowych, przy stosunkowo małej liczności zbioru Dn . Konsekwencją tej własności jest skuteczne redukowanie zmiennych wejściowych, umożliwiające realizację generatora indeksów w strukturze zaproponowanej przez Sasao (rys. 2.15). W tak zbudowanym generatorze indeksów wyróżnia się dwie pamięci: pamięć główną i pamięć pomocniczą, komparator i bramę AND.
Rys. 2.15. Generator indeksów
Blok selekcji zmiennych wybiera spośród wszystkich zmiennych podzbiór X1, reprezentujący minimalną liczbę zmiennych (tzw. redukt) realizowanej Funkcji Generowania Indeksów (FGI). Liczność reduktu jest r. Jest to jednocześnie liczba wejść do pamięci głównej. Na wyjściach pamięci głównej pojawia się indeks wektora wejściowego X = X1 + X2. Jest on reprezentowany wektorem binarnym o liczbie bitów . Indeks ten jest poprawnym indeksem wektora wejściowego wtedy, jeżeli jest to wektor rejestrowany. I tylko wtedy indeks ten pojawi się na wyjściach generatora. W przypadku, gdy wektor wejściowy nie jest wektorem rejestrowanym na wyjściach generator pojawi się 0. Sprawdzenie, czy wyjścia pamięci głównej reprezentują poprawny indeks jest realizowane w pamięci pomocniczej i komparatorze. W pamięci pomocniczej są zapisane wektory reprezentowane zmiennymi należącymi do zbioru X2. Wektory te są podawane na wejście komparatora i porównywane z rzeczywistym wektorem X2 podawanym na drugie wejście komparatora. Oczywiście wektor pobrany z pamięci pomocniczej będzie różny od rzeczywistego wektora X2 w przypadku, gdy nie należy on do wektora rejestrowanego. Wtedy komparator sygnałem wyjściowym o 0 zablokuje pojawienie się na wyjściach bramy AND wektora wytworzonego w pamięci głównej.
Działanie tak skonstruowanego generatora indeksów można zaprezentować na przykładzie funkcji generowania indeksów analizowanej w referacie Sasao – tab. 2.29a. Dla funkcji tej wyznaczono 5-argumentowy redukt – tab. 2.29b.
Tablica 2.29
a) |
|
|
b) |
|
c) |
0110000100010000101001100001000100001010 |
1 |
|
01100 |
|
0000 |
0101111101101010001101011111011010100011 |
2 |
|
01011 |
|
1011 |
1111010101110111000011110101011101110001 |
3 |
|
11110 |
|
1111 |
0001111000010001011100011110000100010111 |
4 |
|
00011 |
|
1110 |
0011110000000100010100111100000001000101 |
5 |
|
00111 |
|
1010 |
0111001001000100100101110010010001001001 |
6 |
|
01110 |
|
0010 |
0010001110001111001000100011100011110010 |
7 |
|
00100 |
|
0100 |
1111111111010001111000100011100011110010 |
8 |
|
11111 |
|
1100 |
1110111000110001011011101110001100010110 |
9 |
|
11101 |
|
1101 |
1010000110100100001110100001101001000011 |
10 |
|
10100 |
|
0001 |
Nietrudno zauważyć, że o skuteczności tak skonstruowanego generatora indeksów decyduje skuteczność obliczania reduktów. Stosując program Lightning można obliczyć całą serię reduktów 4-argumentowych. Jedno z tych rozwiązań podano w tab. 2.29c.