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ń:

 

1,5: x1, x2

1,7: x3, x5, x7

1,9: x2, x3

4,6: x2, x7

 

zapisujemy w postaci binarnej macierzy M:

 

\begin{matrix} & \begin{array}{ c c c c c c c } 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{array}\\ \boldsymbol{M} = & \begin{bmatrix} 1 & 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 1 & 0 & 1\\ 0 & 1 & 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} \end{matrix}

 

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:

  1. Jeżeli kofaktor zawiera tylko jedną jedynkę, jego uzupełnienie jest identyczne jak kofaktor.
  2. 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:

         \begin{bmatrix} 0 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix}

  1. Jeżeli kofaktor zawiera wiersz samych zer (tautologia), to jego uzupełnieniem jest zbiór pusty.
  2. 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:

 

\bar{f}=x_j{\bar{f}}_{x_j}+{\bar{f}}_{{\bar{x}}_j}

 

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]

\mathbf{C}_{2} =x_{2} \cdot \begin{bmatrix} 0 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} +\begin{bmatrix} 1 & 0 & 1 & 0 & 0 & 0 & 1 \end{bmatrix} =\begin{matrix} \begin{array}{ c c c c c c c } 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{array}\\ \begin{bmatrix} 0 & 1 & 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 0 & 0 & 0 & 1 \end{bmatrix} \end{matrix}

 

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 poszcze­gó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 \displaystyle p=\lceil log_{2}( k+1) \rceil 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.