eksperymenty do W04 i W05 Pando Nieznany

background image

Krótki opis programu pandor.exe


1. Budowa panelu głównego

Po uruchomieniu programu oba pola są puste. Lewe służy do wprowadzania badanej
funkcji w postaci tablicy prawdy, w prawym natomiast prezentowane są wyniki
obliczeń. Lewe okno służy dodatkowo jako źródło, z którego pobierane są dane do
zapisywania plików – zarówno w formacie PAN, jak i po konwersji w formatach AHDL
oraz VHDL.


Przcisk „Reset fields” czyści oba pola.
Działanie przycisku „Convert to PAN” omówię w dziale 4.2.

W menu

Files

dostępne są funkcje drukowania zawartości lewego i prawego pola.

W menu

Tools

można wybrać jedną z dostępnych funkcji programu – redukcję liczby

argumentów funkcji oraz minimalizację funkcji metodą ekspansji.

Podczas obliczeń metodą ekspansji budowana jest macierz implikantów prostych
funkcji, która nawet przy niewielkich funkcjach potrafi osiągać dużą liczbę kolumn.
Wąskim gardłem metody ze względu na czasochłonność algorytmu jest szukanie
minimalnych pokryć kolumnowych macierzy. Dlatego w celu ewentualnego
zmniejszenia tej macierzy i zwiększenia szybkości obliczeń zaleca się wcześniejsze
przeprowadzenie redukcji argumentów.


background image

2. Format danych wejściowych


Program odczytując z lewego okna tabelę funkcji działa następująco:

a. Wyszukiwane są wszystkie wiersze rozpoczynające się znakiem ‘0’,’1’ lub ‘-‘.
b. Począwszy od lewej strony wiersza wczytywane są wszystkie znaki aż do

momentu napotkania znaku innego niż ‘0’,’1’ lub ‘-‘. Będą one tworzyć blok
argumentów funkcji.

c. Przeszukując analizowany wiersz program posuwa się w prawo, by po

napotkaniu pierwszego znaku ‘0’,’1’ lub ‘-‘ rozpocząć wczytywanie wiersza,
który będzie tworzyć blok wartości funkcji. Naturalnym ograniczeniem
wczytywania jest oczywiście również koniec wiersza.

d. Wszystkie wiersze z wyjątkiem bloku:

Variable names:
x1,x2,x3,x4,x5
Function names:
y1,y2

będą ignorowane i mogą służyć jako komentarz.



Minimalna i wystarczająca postać danych wejściowych może być następująca:

00111000 01
11000101 01
11110011 01
11010011 00
01110100 01
11101010 00
11101101 01
00111001 00
00110001 00
11101100 11
11000001 10
11000010 10


lub też w przypadku funkcji niezupełnych:

0-111000 01
11000101 01
11110011 01
11010011 0-
0111--00 01
11101010 00
11101101 -1
00111001 -0
001-0001 00
11101100 11
11000001 10
11000010 10


Uruchomienie przycisku „Convert to PAN” powoduje, że program po sprawdzeniu
poprawności tablicy funkcyjnej przedstawia ją w standardowym formacie Pandora. W
przypadku drugiego przykładu będzie to:

Variables = 8
Functions = 2
Data lines = 16

2

background image

Variable names:
x1,x2,x3,x4,x5,x6,x7,x8
Function names:
y1,y2

11000101 01
11110011 01
11010011 0-
11101010 00
11101101 -1
00111001 -0
11101100 11
11000001 10
11000010 10
00111000 01
00100001 00
00110001 00
01110000 01
01110100 01
01111000 01
01111100 01


Zauważmy, że przy okazji Pandor rozwinął wszystkie znaki ‘-‘ po stronie argumentów
– raz zastępując każdy z nich znakiem ‘0’, a następnie znakiem ‘1’.
Jeśli istniał wiersz, w którym po stronie wartości funkcji istnieją same znaki ‘-‘, to w
czasie sprawdzania poprawności funkcji będzie on usunięty.

Warto zwrócić uwagę na fakt, iż w podanym przykładzie program sam wygenerował
nazwy argumentów oraz wartości funkcji.
Nazwy te możemy poprawić w lewym oknie w tym momencie zanim zostanie
uruchomiona procedura redukcji lub ekspansji.
Możemy też wprowadzić je od razu budując właściwie wejściowy plik danych.
Bardzo ważne jest, aby wiersze zapowiadające wystąpienie w wierszu kolejnym
definicji nazw brzmiały dokładnie tak: „Variable names:” oraz „Function names:”. W
przeciwnym razie będą one zignorowane jako komentarz.
Nazwy muszą być oddzielone przecinkami i podawane bez żadnej spasji. Oczywiście
ich liczba musi odpowiadać podanej tablicy. W przypadku nieprawidłowości program
sam wygeneruje nowe nazwy.









3. Pliki wejściowe w formacie PAN i PLA


Typowym standardem zapisu funkcji boolowskich dla obliczeń w komputerowych
systemach syntezy na poziomie akademickim jest tzw. standard espresso, w którym
funkcje są zapisywane w plikach z rozszerzeniem *.pla.

Przykładowy zapis funkcji w standardzie espresso:

3

background image

.type fr
.i 9
.o 6
.p 12
000111000 0000-0
101000000 00-101
101110000 011011
111101000 011110
101010000 000-01
001110000 110100
111000000 10-010
101101000 1100-1
101101100 -101-1
111000010 10101-
000111001 0010-1
000110001 --1000
.e


Pandor będzie je oczywiście akceptować i dalej przetwarzać, choć przy pierwszej
nadarzającej się okazji przekonwertuje je na format *.pan, jeśli użytkownik nie uczyni
tego wcześniej przy pomocy przycisku „Convert to PAN”.

4. Redukcja argumentów


Program liczy metodą opisaną w rozdziale III.

Działanie procedury pokażę na przykładzie następującego pliku wejściowego:

Variables = 9
Functions = 6
Data lines = 12

Variable names:
x1,x2,x3,x4,x5,x6,x7,x8,x9
Function names:
y1,y2,y3,y4,y5,y6

000111000 0000-0
101000000 00-101
101110000 011011
111101000 011110
101010000 000-01
001110000 110100
111000000 10-010
101101000 1100-1
101101100 -101-1
111000010 10101-
000111001 0010-1
000110001 --1000


W przypadku funkcji wielowartościowej pojawi się zapytanie, czy redukcja ma być
przeprowadzona dla wszystkich funkcji łącznie, czy też dla każdej oddzielnie.





4

background image

Przeprowadzenie redukcji dla wszystich funkcji łącznie:

Wyniki obliczeń:

Input data OK!

REDUCTION


Computing for function y1,y2,y3,y4,y5,y6


Essential variables

x1,x2,x4,x6,x7,x9


Status of all variables

++-+-++-+


Table C full size

Table C is empty.


All results as status lines

++-+-++-+


Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x4,x6,x7,x9}


Istnieje zatem tylko jedna minimalna realizacja przy użyciu argumentów
x1, x2, x4, x6, x7 oraz x9.
Możliwe jest uzyskanie kilku minimalnych realizacji przy różnych doborach
argumentów. Liczba argumentów będzie w każdej takiej realizacji jednakowa.



Przeprowadzenie redukcji dla wszystich funkcji oddzielnie:

Wyniki obliczeń:

Input data OK!

REDUCTION


Computing for function y1

Essential variables

x1,x2

Status of all variables

++-------

Table C full size

5

background image

1001000
0101000
0011000
0101000
0101010
0111000
1001001

Table C reduced

1001
0101
0011

New status of all variables

++----xxx

All results as status lines

++---cxxx

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x6}

Computing for function y2

Essential variables

x4

Status of all variables

---+-----

Table C full size

10101000
11110000
00101000
10110000
10110100
10101001
11110001
00101001
10110001
10110101

Table C reduced

0101
1110

New status of all variables

-x-+--xxx

All results as status lines

-xc+--xxx

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables

6

background image

"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x3,x4}

Computing for function y3

Essential variables

x1,x2,x4,x9

Status of all variables

++-+----+

Table C full size

01100
01110

Table C reduced

11

New status of all variables

++x+--xx+

All results as status lines

++x+c-xx+
++x+-cxx+

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x4,x5,x9}
R2 = {x1,x2,x4,x6,x9}

Computing for function y4

Essential variables

x1,x2,x7

Status of all variables

++----+--

Table C full size

100100
011000
010100
010100
010110
100101
100001

Table C reduced

10010
01100
01010
10001

New status of all variables

7

background image

++----+x-

All results as status lines

++cc--+x-

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x3,x4,x7}

Computing for function y5

Essential variables

x1,x2,x4

Status of all variables

++-+-----

Table C full size

Table C is empty.

All results as status lines

++-+-----

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x4}

Computing for function y6

Essential variables

x1,x2,x6,x9

Status of all variables

++---+--+

Table C full size

Table C is empty.

All results as status lines

++---+--+

Explanation od status lines
"+" essential variables
"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.

All results

R1 = {x1,x2,x6,x9}

8

background image

Results for all functions


Results for function y1:
R1 = {x1,x2,x6}

Results for function y2:
R1 = {x3,x4}

Results for function y3:
R1 = {x1,x2,x4,x5,x9}
R2 = {x1,x2,x4,x6,x9}

Results for function y4:
R1 = {x1,x2,x3,x4,x7}

Results for function y5:
R1 = {x1,x2,x4}

Results for function y6:
R1 = {x1,x2,x6,x9}


Widzimy, że dla każdej funkcji minimalna liczba argumentów może być różna.
Każda z funkcji może również posiadać kilka różnych minimalnych realizacji, tak jak
w przypadku funkcji y3.

Zwróćmy uwagę na to, jak wygląda teraz panel programu.
Aktywne stały się przyciski ‘<’ oraz ‘>’ służące do przewijania wyświetlanych w lewym
oknie w postaci pliku w formacie *.pan kolejnych realizacji funkcji.
Oczywiście każdy z wyświetlanych plików możemy teraz poddać metodzie ekspansji.

9

background image

5. Ekspansja


Program liczy metodą opisaną w dziale II.
Ze względu na specyfikę metody ekspansji obliczenia możliwe są tylko dla
wszystkich funkcji oddzielnie.

Aby nie przytaczać tu bardzo obszernych wyników obliczeń, jakie powstaną w
poprzednim przykładzie, wybiorę na potrzeby ekspansji inny plik:

Variables = 8
Functions = 1
Data lines = 12

Variable names:
x1,x2,x3,x4,x5,x6,x7,x8
Function names:
y1

00111000 0
11000101 0
11110011 0
11010011 0
01110100 0
11101010 0
11101101 0
00111001 0
00110001 0
11101100 1
11000001 1
11000010 1


Celowo wybrałem tabelę jednofunkcyjną, bo w przypadku tabeli wielofunkcyjnej
metoda obliczeń będzie taka sama. Program wykona wtedy w pętli kolejne obliczenia
dla każdej funkcji oddzielnie.

Wyniki obliczeń:

Input data OK!

New variable names generated.
New function names generated.

EXPANSION

Computing for function y1

Table F of function y1

11101100
11000001
11000010

Table R of function y1

00111000
11000101
11110011
11010011
01110100
11101010
11101101
00111001
00110001

10

background image

Table B1 of function y1

11010100
00101001
00011111
00111111
10011000
00000110
00000001
11010101
11011101

All minimal cover columns in table B1 of function y1:

c-x--c-+
c-x---c+
--xc-c-+
--xc--c+
--x-cc-+

Current cube:

k1 = (11101100)

All cube expansions of table B1:

1****1*0
1*****00
***0*1*0
***0**00
****11*0

Table B2 of function y1

11111001
00000100
00110010
00010010
10110101
00101011
00101100
11111000
11110000

All minimal cover columns in table B2 of function y1:

c----+c-
-c---+c-
--cc-+--
--c--+c-
---cc+--
---c-+c-
---c-+-c

Current cube:

k2 = (11000001)

All cube expansions of table B2:

1****00*
*1***00*
**00*0**
**0**00*
***000**
***0*00*
***0*0*1

Table B3 of function y1

11111010
00000111

11

background image

00110001
00010001
10110110
00101000
00101111
11111011
11110011

All minimal cover columns in table B3 of function y1:

-xc----c

Current cube:

k3 = (11000010)

All cube expansions of table B3:

**0****0

All cube expansions of function y1 and their implicants

1****1*0 ==> x1x6!x8
1*****00 ==> x1!x7!x8
***0*1*0 ==> !x4x6!x8
***0**00 ==> !x4!x7!x8
****11*0 ==> x5x6!x8
1****00* ==> x1!x6!x7
*1***00* ==> x2!x6!x7
**00*0** ==> !x3!x4!x6
**0**00* ==> !x3!x6!x7
***000** ==> !x4!x5!x6
***0*00* ==> !x4!x6!x7
***0*0*1 ==> !x4!x6x8
**0****0 ==> !x3!x8

Implicants table of function y1

1111100000000
0000011111110
0000000101001

All minimal cover columns:

c------c-----
c--------c---
-c-----c-----
-c-------c---
--c----c-----
--c------c---
---c---c-----
---c-----c---
----c--c-----
----c----c---

All results of function y1

y1 = x1x6!x8 + !x3!x4!x6
y1 = x1x6!x8 + !x4!x5!x6
y1 = x1!x7!x8 + !x3!x4!x6
y1 = x1!x7!x8 + !x4!x5!x6
y1 = !x4x6!x8 + !x3!x4!x6
y1 = !x4x6!x8 + !x4!x5!x6
y1 = !x4!x7!x8 + !x3!x4!x6
y1 = !x4!x7!x8 + !x4!x5!x6
y1 = x5x6!x8 + !x3!x4!x6
y1 = x5x6!x8 + !x4!x5!x6

Explanation od status lines
"+" essential variables

12

background image

"-" non-essential variables
"x" needless variables
"c" cover variables
Results consist only variables on "+" and "c" positions.


Podaną funkcję można zatem uprościć do postaci minimalnej składającej się tylko z
dwóch implikantów prostych. W podanym przykładzie takich minimalnych rozwiązań
jest aż 10.

Bardzo ważne jest, że przeprowadzenie ekspansji nie ingeruje w zawartość lewego
okna, jeśli jest ono podane w poprawnym formacie Pandora.
Dzięki temu po przeprowadzeniu wcześniejszej redukcji zachowana zostaje
możliwość przewijania kolejnych realizacji funkcji i wielokrotnego wykonywania
ekspansji dla dowolnie wybranej realizacji.


6. Zapisywanie plików w formacie PAN


Przed zapisaniem pliku program wykona szereg czynności sprawdzających
poprawność tabeli funkcji.
Jeśli nie jest ona podana w formacie Pandora, będzie przed zapisem do tego formatu
przekonwertowana.

7. Zapisywanie plików w formacie PLA


Jest to format flików wejściowych dla programu Espresso.
Tabela będzie najpierw poddana procedurze sprawdzającej jej poprawność.
Następnie konwerter na podstawie podanej tabeli stworzy plik, który powinien być
zapisany z rozszerzeniem *.pla.

Przykład:

Zawartość lewego okna:

.type fr
.i 8
.o 1
.p 12
00111000 0
11000101 0
11110011 0
11010011 0
01110100 0
11101010 0
11101101 0
00111001 0
00110001 0
11101100 1
11000001 1
11000010 1
.e

13

background image

8. Zapisywanie plików w formacie AHDL


Podobnie jak w przypadku zapisu w formacie PAN tabela będzie najpierw poddana
procedurze sprawdzającej jej poprawność.
Następnie konwerter na podstawie podanej tabeli stworzy plik, który powinien być
zapisany z rozszerzeniem *.tdf.

Przykład:

Zawartość lewego okna:

Variables = 5
Functions = 2
Data lines = 8

Variable names:
x1,x2,x3,x4,x5
Function names:
y1,y2

00000 01
00111 01
01010 00
01111 01
01100 01
00011 10
01000 10
01101 11


Otrzymany plik *.tdf

Zapisując plik nadałem mu nazwę ahdl1.tdf.
Taka sama nazwa pojawia się wtedy automatycznie wewnątrz pliku.



TITLE "Project Pandor ahdl1";

SUBDESIGN ahdl1
(
-- input signals
in[4..0] : INPUT;
-- output signals
out[1..0] : OUTPUT;
)

BEGIN
TABLE (in[4..0]) => (out[1..0]);
B"00000" => B"01";
B"00111" => B"01";
B"01010" => B"00";
B"01111" => B"01";
B"01100" => B"01";
B"00011" => B"10";
B"01000" => B"10";
B"01101" => B"11";
END TABLE;
END;


14

background image

9. Zapisywanie plików w formacie VHDL


Podobnie jak w przy konwersji na format AHDL tabela będzie najpierw poddana
procedurze sprawdzającej jej poprawność.
Następnie konwerter na podstawie podanej tabeli stworzy plik, który powinien być
zapisany z rozszerzeniem *.vhd.

Przykład:

Zawartość lewego okna:

Variables = 5
Functions = 2
Data lines = 8

Variable names:
x1,x2,x3,x4,x5
Function names:
y1,y2

00000 01
00111 01
01010 00
01111 01
01100 01
00011 10
01000 10
01101 11


Otrzymany plik *.vhd

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY vhdl1 IS
PORT (
in: IN STD_LOGIC_VECTOR(4 DOWNTO 0);
out: OUT STD_LOGIC_VECTOR(1 DOWNTO 0)
);
END vhdl1;

ARCHITECTURE vhdl1_arch OF vhdl1 IS
BEGIN
pandor: PROCESS (in)
BEGIN
CASE in IS
WHEN "00000" => out <= "01";
WHEN "00111" => out <= "01";
WHEN "01010" => out <= "00";
WHEN "01111" => out <= "01";
WHEN "01100" => out <= "01";
WHEN "00011" => out <= "10";
WHEN "01000" => out <= "10";
WHEN "01101" => out <= "11";
WHEN OTHERS => out <= "00";
END CASE;
END PROCESS pandor;
END vhdl1_arch;

15

background image

10. Drukowanie danych wejściowych i wyjściowych


Zawartość obu okien można wydrukować bezpośrednio korzystając z menu

Files/Print left panel

oraz

Files/Print righ panel

.

t

11. Granice możliwości programu


Jedynym ograniczeniem programu jest procedura szukająca minimalne pokrycia
kolumnowe macierzy. Problem jest NP-zupełny, a w związku z tym bardzo
czasochłonny.
Procedura sprawdza kolejno możliwość pokrycia dla 1, 2 , 3 … kolumn. W skrajnie
niekorzystnym przypadku pokrycie może być znalezione dopiero dla kombinacji
wszystkich kolumn. Nastąpi to przykładowo w przypadku tabeli:

100000
010000
001000
000100
000010
000001


Aby nie dopuścić do takiej sytuacji oraz zmniejszyć czasochłonność procedury
wbudowałem w nią mechanizm redukujący tablicę według metody opisanej w dziale
1.2.
Przy poszukiwaniu k-kolumnowego pokrycia n-kolumnowej macierzy trzeba wykonać

obliczenia sprawdzające dla

(

)

!

!

!

n

k n

k

kombinacji.

Najbardziej czasochłone jest przeszukiwanie kombinacji, gdzie n = 2 k.
Już w przypadku tablicy 30 kolumnowej przeszukanie tylko kombinacji 15
kolumnowych wymaga 155 117 520 obliczeń.


12. Podsumowanie

Minimalizacja funkcji boolowskich jest podstawową procedurą syntezy logicznej w
komputerowych systemach projektowania układów cyfrowych. Skuteczność i
szybkość działania tej procedury może być decydująca o jakości implementacji
sprzętowych wielu systemów cyfrowych o różnorodnych zastosowaniach. Typowymi
układami cyfrowymi wymagającymi stosowania w procesie ich optymalizacji
procedur minimalizacji funkcji boolowskich są m.in. S-boxy układów
kryptograficznych lub struktury arytmetyki rozproszonej filtrów cyfrowych [16].
Z tych powodów zagadnieniu temu poświęcano specjalne zadania badawcze
niejednokrotnie sponsorowane przez renomowane instytucje, jak np. IBM. Miały one
na celu opracowanie metod i algorytmów minimalizacji odpowiednich do ogromnej
złożoności układów wykonywanych w zaawansowanych technologiach. Jednym z
najważniejszych rezultatów tych badań jest program Espresso, opracowany na
początku lat osiemdziesiątych na Uniwersytecie kalifornijskim w Berkeley.

Rozbudowane procedury programu ESPRESSO weszły już dzisiaj do kanonów syntezy
logicznej, a ich różnorodność i obszerność uprawnia do stosowania hasłowej nazwy:
metoda espresso. W skład metody espresso wchodzą przede wszystkim procedury
ekspansji, pokrycia, uzupełnienia i tautologii. Procedury te operując na zbiorach kostek

16

background image

funkcji boolowskiej

f

= (

F

,

R

) umożliwiają obliczenie zminimalizowanego zbioru

F

M

wg

następującego schematu.

Najpierw procedura

ekspansji

(Expand) oblicza zbiór

F

E

= EXPAND((

F

,

R

). Następnie

obliczany jest zbiór nieokreśloności

D,

jako uzupełnienie sumy zbiorów

F

i

R

. Obliczenia

te realizuje procedura

uzupełnienie

(COMPLEMENT), czyli

D

= COMPLEMENT(

F

,

R

).

Wreszcie w procedurze

pokrycie

(IRREDUNDANT-COVER) zbiory

F

E

i

D

transformowane są do zbioru

F

M

= IRREDUNDANT_ COVER(

F

E

,

D

),

uznawanego za

minimalne pokrycie funkcji

f

.


Niestety ze względu na heurystyczny sposób obliczeń uzyskany wynik

F

M

może nie

być pokryciem minimalnym, co przy wzrastającej złożoności układów realizowanych
w nowoczesnych technologiach może okazać się istotną barierą.

Niniejsza praca prezentuje oryginalną metodę zmniejszania złożoności obliczeniowej
algorytmów minimalizacji funkcji boolowskich. Istotą tej metody jest zastosowanie
algorytmu redukcji argumentów, jako oddzielnej procedury poprzedzającej właściwą
minimalizację. Redukcja argumentów jest procedurą do tej pory rzadko stosowaną w
komputerowych systemach syntezy logicznej. Jedną z przyczyn takiej sytuacji jest
brak świadomości, że złożone układy cyfrowe są – od strony pojedynczych wyjść –
reprezentowane funkcjami boolowskimi o znacznie nadmiarowych zależnościach
wejściowych. Dodatkowo okazuje się, że redukcja tych zależności po procesie
klasycznej minimalizacji jest mało skuteczna.

Program Pandor opracowany w ramach niniejszej pracy pozwalając na wykonanie

procesu redukcji argumentów dla pojedynczych i grupowych funkcji boolowskich
przed procesem minimalizacji umożliwia efektywne wykorzystanie tego zjawiska dla
wszystkich następnych procesów syntezy.

Uzasadnienie skuteczności takiej strategii omówione jest w poniższych
eksperymentach.





Wiele funkcji nie da się zminimalizować poprzez bezpośrednie zastosowanie
systematycznej procedury minimalizacji np. zmodyfikowanej

ekspansji

.

Przykład

Variables = 21
Functions = 1
Data lines = 31

Variable names:
x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21
Function names:
y1

100110010110011111101 1
111011111011110111100 1
001010101000111100000 1
001001101100110110001 1
100110010011011001101 1
100101100100110110011 1

17

background image

001100100111010011011 1
001101100011011011001 1
110110010011001001101 1
100110110011010010011 1
110011011011010001100 1
010001010000001100111 0
100110101011111110100 0
111001111011110011000 0
101101011100010111100 0
110110000001010100000 0
110110110111100010111 0
110000100011110010001 0
001001000101111101101 0
100100011111100110110 0
100011000110011011110 0
110101000110101100001 0
110110001101101100111 0
010000111001000000001 0
001001100101111110000 0


Procedura ekspansji generuje 416 implikantów prostych, co oznacza, że macierz
implikantów zawiera 416 kolumn.
Systematyczne szukanie minimalnego pokrycia kolumnowego jest praktycznie
niewykonalne. Przykładowo sprawdzenie, czy istnieją pokrycia 3-kolumnowe

wymaga

416!

3! 413!

czyli prawie 12 milionów uruchomień procedury sprawdzającej, czy

dla danej kombinacji kolumn istnieje pokrycie kolumnowe.
Trzeba koniecznie zdawać sobie sprawę z tego jak szybko rośnie ta liczba wraz ze
zwiększeniem się liczby sprawdzanych kolumn.
W naszym 416-kolumnowym przykładzie:

n

k

(

)

!

!

!

n

k n

k

416 1

416

416 2

86320

416 3

11912160

416 4

1229930520

416 5

101346274848

416 6

6942219827088

416 7

406615732729440

416 8

20788229335792620

416 9

942399729889265440

416 10

38355669006493103408

416 11

1415672874239654543968

416 12

47778959505588340858920

416 13

1484823049250591515923360


Najbardziej czasochłonne jest sprawdzenie połowy spośród całkowitej liczby kolumn.
W naszym przykładzie w celu sprawdzenia pokrycia wszystkich kombinacji
208-kolumnowych trzeba wykaonać następującą liczbę operacji sprawdzających:

6616230063578456454088151537337222572939614651059079377712426254170
976447903825456241212171286045820096024918596033164779400

18

background image

Jest to w przybliżeniu

.

123

6, 6 10


Procedura reducji zmniejsza w podanym przykładzie liczbę argumentów z 21 do 5-
ciu.
Dla każdej z pięcioargumentowych realizacji funkcji z osobna można teraz bez
problemu przeprowadzić minimalizację metodą ekspansji.



Porównanie wyników programów Espresso i Pandor


Przykład 1 (funkcja TL27.pla)

.type fr
.i 10
.o 1
.p 25
0010111010 0
1010010100 0
0100011110 0
1011101011 0
1100010011 0
0100010110 0
1110100110 0
0100110000 0
0101000010 0
0111111011 1
0000010100 1
1101110011 1
0100100000 1
0100011111 1
0010000110 1
1111010001 1
1111101001 1
1111111111 1
0010000000 1
1101100111 1
0010001111 1
1111100010 1
1010111101 1
0110000110 1
0100111000 1
.e


Wyniki obliczeń programu Espresso:

.i 10
.o 1
.p 6
----00-1-- 1
00------0- 1
----10-0-0 1
---1--0--1 1
------1-0- 1
-----11--1 1
.e

19

background image

Jak widać, program Espresso potrafił zredukować zadaną funkcję do liczby 9
argumentów. Funkcja ta składa się z 6 termów.

y = !x5!x6x8 + !x1!x2!x9 + x5!x6!x8!x9 + x4!x7x10 + x7!x9 + x6x7x10






Wyniki obliczeń programu Pandor:

All results

R1 = {x1,x2,x4,x5,x6,x7,x10}
R2 = {x1,x2,x4,x6,x7,x8,x10}
R3 = {x1,x2,x4,x6,x7,x9,x10}
R4 = {x1,x4,x5,x6,x7,x9,x10}
R5 = {x1,x4,x6,x7,x8,x9,x10}
R6 = {x1,x5,x6,x7,x8,x9,x10}
R7 = {x2,x3,x4,x5,x6,x7,x10}
R8 = {x2,x3,x5,x6,x7,x8,x10}
R9 = {x3,x4,x5,x6,x7,x9,x10}
R10 = {x3,x5,x6,x7,x8,x9,x10}


Jak widać, program Pandor potrafił zredukować zadaną funkcję do liczby 7
argumentów.

Każdą z otrzymanych realizacji możemy poddać procedurze ekspansji.
Dla kilku różnych realizacji otrzymujemy rozwiązania składające się tylko z 5 termów,
a każdy z nich wykorzystuje tylko 7 argumentów.

Przykładowo dla realizacji R3 otrzymamy 5 bardzo prostych termów:

y1 = !x1x10 + !x1!x2!x7 + !x1!x4!x6 + x7!x9 + x1x2x4
y1 = !x1x10 + !x1!x2!x9 + !x1!x4!x6 + x7!x9 + x1x2x4


Przykład 2 (funkcja KAZ.pla)

.type fr
.i 21
.o 1
.p 31
100110010110011111101 1
111011111011110111100 1
001010101000111100000 1
001001101100110110001 1
100110010011011001101 1
100101100100110110011 1
001100100111010011011 1
001101100011011011001 1
110110010011001001101 1
100110110011010010011 1
110011011011010001100 1
010001010000001100111 0
100110101011111110100 0
111001111011110011000 0
101101011100010111100 0
110110000001010100000 0

20

background image

110110110111100010111 0
110000100011110010001 0
001001000101111101101 0
100100011111100110110 0
100011000110011011110 0
110101000110101100001 0
110110001101101100111 0
010000111001000000001 0
001001100101111110000 0
100100111111001110010 0
000010001110001101101 0
101000010100001110000 0
101000110101010011111 0
101010000001100011001 0
011100111110111101111 0
.end


Wyniki obliczeń programu Espresso:

.i 21
.o 1
.p 3
-0-----------1----0-1 1
-------0--00--------- 1
----1--1-----------0- 1
.e

Jak widać, program Espresso potrafił zredukować zadaną funkcję do liczby 9
argumentów, na którą składają się łącznie 3 termy:

y = !x2x14!x19x21 + !x8!x11!x12 + x5x8!x20


Wyniki obliczeń programu Pandor:

All results

R1 = {x1,x5,x8,x10,x15}
R2 = {x2,x4,x5,x9,x18}
R3 = {x2,x4,x5,x18,x21}
R4 = {x2,x4,x7,x9,x16}
R5 = {x2,x4,x7,x9,x19}
R6 = {x2,x4,x9,x10,x19}
R7 = {x2,x4,x9,x13,x19}
R8 = {x2,x4,x9,x15,x19}
R9 = {x2,x4,x9,x17,x19}
R10 = {x2,x4,x9,x18,x19}
R11 = {x2,x4,x9,x19,x20}
R12 = {x2,x4,x10,x19,x21}
R13 = {x2,x4,x16,x17,x21}
R14 = {x2,x5,x8,x17,x21}
R15 = {x2,x9,x11,x19,x20}
R16 = {x2,x11,x16,x17,x21}
R17 = {x3,x5,x8,x10,x15}
R18 = {x4,x5,x8,x10,x15}
R19 = {x4,x7,x8,x9,x19}
R20 = {x4,x7,x9,x12,x19}
R21 = {x4,x7,x9,x16,x19}
R22 = {x4,x9,x11,x13,x16}
R23 = {x4,x9,x12,x17,x19}
R24 = {x4,x9,x14,x16,x17}
R25 = {x4,x9,x16,x17,x19}
R26 = {x4,x10,x15,x17,x19}
R27 = {x4,x11,x12,x13,x16}

21

background image

R28 = {x4,x16,x17,x19,x21}
R29 = {x5,x8,x10,x11,x15}
R30 = {x5,x8,x10,x12,x15}
R31 = {x5,x8,x10,x15,x17}
R32 = {x5,x8,x10,x15,x19}
R33 = {x5,x8,x12,x13,x14}
R34 = {x8,x10,x15,x19,x20}
R35 = {x10,x15,x17,x19,x20}



Jak widać, program Pandor potrafił zredukować zadaną funkcję do liczby 5
argumentów, przy czym znalazł wszystkie 35 minimalnych realizacji funkcji.

Poddanie procedurze ekspancji realizacji R11 daje w wyniku tylko 3 termy, a
wykorzystują one łącznie tylko 5 argumentów.

y1 = !x2x4!x9 + x2x19!x20 + !x2!x4x9!x19
y1 = !x2x4!x9 + x2x19!x20 + !x2x9!x19!x20




Przykład 3 (funkcja LeI20.pla)

Variables = 20
Functions = 1
Data lines = 40

Variable names:
x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20
Function names:
y1

11101101100011000111 1
00010010111100111000 1
00100100000100110001 1
01001011110110100111 1
11110111100111010111 1
00001000011110101000 1
11000010000100010000 1
11010110000100011100 1
10001100001011111010 1
01110111110100000101 1
00110111111100110000 1
00010101000101100000 1
10000101110000010100 1
10001001100001111111 1
10101010010101111001 1
01010001101010110111 1
11101001000101111010 1
00000110111000100101 1
01110000110010011010 1
01010110010011110101 1
11011000111101100010 0
11010001111000011110 0
11000111001001010101 0
11011001000000111111 0
00010001000100101000 0
11100110111011000111 0
01111110110101001100 0
10010001011010110001 0
10100110110011000011 0

22

background image

11001011100011111110 0
00110100101110001100 0
01100101000000111100 0
10110100101011110011 0
01001011010010001100 0
11011111111001010101 0
10110100000111101100 0
00001011000000101000 0
00010011010010101000 0
00011010111010010111 0
11000100010011000011 0


Program espresso daje następujący wynik:

.i 20
.o 1
.p 5
----------0---01---- 1
----------0-----01-- 1
1--0-0------0------- 1
-------0--------10-- 1
0-------------1-0--- 1
.e


Zminimalizowana funkcja używa 10 argumentów, które składają się na 5 termów
funkcji:

y1 = !x11!x15x16 + !x11!x17x18 + x1!x4!x6!x13 + !x8x17!x18 + !x1x15!x17

Program Pandor daje następujące wyniki:

Po redukcji argumentów:

Program generuje wszystkie możliwe minimalne ze względu na liczbę agrumentów
realizacje funkcji, które są funkcjami tylko 6-argumentowymi:

R1 = {x1,x2,x3,x6,x11,x17}
R2 = {x1,x2,x4,x8,x13,x17}
R3 = {x1,x2,x6,x11,x17,x18}
R4 = {x1,x2,x8,x17,x18,x19}
R5 = {x1,x2,x11,x17,x18,x19}
R6 = {x1,x3,x4,x6,x8,x20}
R7 = {x1,x3,x6,x8,x9,x20}
R8 = {x1,x4,x5,x7,x12,x14}
R9 = {x1,x4,x6,x8,x13,x20}
R10 = {x1,x4,x8,x11,x13,x17}
R11 = {x1,x5,x6,x9,x12,x13}
R12 = {x1,x5,x9,x12,x13,x17}
R13 = {x1,x8,x13,x14,x17,x18}
R14 = {x2,x3,x6,x8,x17,x19}
R15 = {x2,x3,x8,x13,x14,x15}
R16 = {x2,x3,x8,x13,x17,x19}
R17 = {x2,x3,x8,x17,x19,x20}
R18 = {x2,x4,x7,x9,x13,x14}
R19 = {x2,x4,x8,x13,x14,x17}
R20 = {x2,x5,x6,x12,x13,x16}
R21 = {x2,x5,x12,x13,x14,x16}
R22 = {x2,x5,x12,x13,x16,x17}
R23 = {x2,x8,x13,x16,x17,x18}
R24 = {x2,x10,x12,x13,x17,x19}
R25 = {x3,x4,x7,x9,x12,x17}
R26 = {x3,x4,x8,x17,x19,x20}

23

background image

R27 = {x3,x6,x7,x8,x9,x20}
R28 = {x3,x6,x8,x9,x16,x20}
R29 = {x3,x6,x8,x9,x19,x20}
R30 = {x3,x8,x9,x14,x19,x20}
R31 = {x3,x8,x9,x17,x19,x20}
R32 = {x3,x8,x13,x14,x17,x18}
R33 = {x3,x8,x14,x17,x19,x20}
R34 = {x4,x7,x8,x10,x14,x17}
R35 = {x4,x7,x8,x14,x17,x19}
R36 = {x4,x7,x10,x13,x14,x17}
R37 = {x4,x8,x10,x13,x14,x17}
R38 = {x4,x8,x13,x14,x17,x18}
R39 = {x5,x6,x7,x9,x12,x13}
R40 = {x5,x6,x9,x12,x13,x16}
R41 = {x6,x7,x8,x14,x17,x19}
R42 = {x6,x7,x9,x13,x16,x20}
R43 = {x6,x8,x9,x13,x16,x20}
R44 = {x6,x8,x9,x14,x19,x20}
R45 = {x6,x8,x9,x16,x19,x20}
R46 = {x7,x8,x9,x11,x14,x15}
R47 = {x7,x8,x9,x14,x15,x19}
R48 = {x7,x8,x9,x14,x17,x19}
R49 = {x7,x8,x9,x14,x19,x20}
R50 = {x7,x8,x14,x15,x17,x19}
R51 = {x7,x8,x14,x17,x18,x19}
R52 = {x7,x9,x13,x14,x16,x17}
R53 = {x7,x10,x13,x14,x16,x17}
R54 = {x7,x11,x13,x14,x17,x18}
R55 = {x8,x9,x10,x14,x19,x20}
R56 = {x8,x9,x11,x14,x15,x20}
R57 = {x8,x9,x13,x14,x16,x17}
R58 = {x8,x9,x13,x14,x17,x18}
R59 = {x8,x9,x13,x14,x19,x20}
R60 = {x8,x9,x14,x15,x19,x20}
R61 = {x8,x9,x14,x16,x19,x20}
R62 = {x8,x9,x14,x18,x19,x20}
R63 = {x8,x10,x13,x14,x16,x17}
R64 = {x8,x10,x13,x14,x19,x20}
R65 = {x8,x11,x13,x14,x17,x18}
R66 = {x8,x13,x14,x15,x17,x18}
R67 = {x8,x13,x14,x15,x17,x19}
R68 = {x8,x13,x14,x16,x17,x18}
R69 = {x8,x13,x14,x17,x18,x19}
R70 = {x11,x13,x14,x15,x17,x18}
R71 = {x11,x13,x14,x15,x18,x20}
R72 = {x11,x14,x15,x16,x18,x20}


Każdą z powyższych realizacji możemy poddać procedurze ekspansji.

Wniosek:

Program Pandor znalazł szereg minimalizacji funkcji, które mają 6 argumentów
(Espresso ma ich 10).



W przypadku używania programu Pandor do projektowania wszelkiego rodzaju
układów sekwencyjnych lub kombinacyjnych jesteśmy w stanie utworzyć rozwiązanie
o strukturze najprostszej ze wszystkich możliwych.

24

background image

Bardzo często ma to zdecydowany wpływ na koszty produkcji, zwłaszcza gdy mamy
do czynienia z elementami produkowanymi masowo jak na przykład układy scalone.

I jakkolwiek celem niniejszej pracy nie były realizacje praktycznych układów, to już
można przewidywać zastosowania Pandora w zadaniach o charakterze aplikacyjnym.
Typowym przykładem takich zastosowań może być redukcja argumentów bloków
kombinacyjnych filtrów cyfrowych.

Filtr cyfrowy 4-rzędu jest opisany tablicą prawdy o 7 wejściach i 8 wyjściach.
Programem Pandor szybko można obliczyć, że w rzeczywistości poszczególne
wyjścia są zależne od następujących argumentów:

Results for function y1:
R1 = {x1,x3,x4,x5,x7}

Results for function y2:
R1 = {x1,x3,x4,x5,x7}

Results for function y3:
R1 = {x1,x3,x4,x5,x7}

Results for function y4:
R1 = {x1,x3,x5,x7}

Results for function y5:
R1 = {x1,x3,x5,x7}

Results for function y6:
R1 = {x1,x3,x5,x7}

Results for function y7:
R1 = {x1,x3,x5,x7}

Results for function y8:
R1 = {x1,x3,x5,x7}


Można przypuszczać, że uwzględnienie tej redukcji w dalszych zabiegach
optymalizacyjnych istotnie wpłynie na realizację całego filtru.


Filtr cyfrowy 7-rzędu jest opisany tablicą prawdy o 11 wejściach i 12 wyjściach.
Tabela prawdy składa się z 2048 rzędów, jest to więc funkcja pełna.
Programem Pandor można obliczyć, że w rzeczywistości poszczególne wyjścia są
zależne od następujących argumentów:


Results for function y1:
R1 = {x3,x5,x6,x7,x9}

Results for function y2:
R1 = {x1,x3,x5,x6,x7,x9,x11}

Results for function y3:
R1 = {x1,x3,x5,x6,x7,x9,x11}

Results for function y4:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y5:
R1 = {x1,x3,x5,x7,x9,x11}

25

background image


Results for function y6:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y7:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y8:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y9:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y10:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y11:
R1 = {x1,x3,x5,x7,x9,x11}

Results for function y12:
R1 = {x1,x3,x9,x11}

Uwzględnienie tej redukcji w dalszych zabiegach optymalizacyjnych istotnie wpłynie
na realizację całego filtru.

Przeprowadzenie redukcji dla wszystkich wyjść funkcji łącznie daje wynik:

R1 = {x1,x3,x5,x6,x7,x9,x11}


Program Pandor pozwala stwierdzić, że funkcja jest niezależna od argumentów
x2, x4, x8 oraz x10, co wpłynie na znaczne uproszczenie dalszych obliczeń.
Z 11 argumentów funkcja redukuje się do 7-miu. Oznacza to jednocześnie redukcję
liczby wierszy w tabeli prawdy z 2048 do 128.

26


Wyszukiwarka

Podobne podstrony:
odpowiedzi do testu id 332437 Nieznany
Montaz zamka do drzwi id 307578 Nieznany
Formatki do zaj z OC Cwiczenie Nieznany
objjasnienie do pit36 za 2011 i Nieznany
MATERIALY DO WYKLADU CZ VIII i Nieznany
mnozenie do 25 2[1] id 304290 Nieznany
MATERIALY DO WYKLADU CZ V id 2 Nieznany
DO Gimn 1 id 137870 Nieznany
dodawanie do 10 4 id 138940 Nieznany
F Zadania do kol 1 id 167111 Nieznany
Droga Polski do NATO id 142564 Nieznany
mechanika do poprawki id 290847 Nieznany
karta do prezentacji zajecia id Nieznany
gs w04 id 197501 Nieznany
DO P gimn 4 id 137938 Nieznany
podroz do ziemi swietej neapolu Nieznany

więcej podobnych podstron