Einführung in die Logikminimierung In diesem Kapitel soll die Grundlage für das Verständnis des Inhalts der entwickelten Lernsoftware gebildet werden. Das Thema Logikminimierung wird in einen Gesamtkontext eingeordnet, sowie einige wichtige Begriffe und natürlich der ESPRESSOAlgorithmus vorgestellt. Dieses Kapitel soll lediglich einen Überblick geben und hat nicht den Anspruch, ausführlich in den Entwurf Integrierter Schaltungen bzw. Verfahren zur Logikminimierung einzuführen, auch wenn der Kapitelname dies vielleicht vermuten lassen könnte. Das Kapitel orientiert sich im wesentlichen an Ausführungen in [Eschermann 93] und [Nebel 98]. Die Informationen über den ESPRESSO-Algorithmus wurden im wesentlichen [Brayton 84] und [DeMicheli 93] entnommen. 1.1Einleitung Integrierte Schaltungen (englisch Integrated Circuits, abgekürzt ICs) haben seit ihren Anfängen in den 60er Jahren eine rasante Entwicklung erfahren und sind aus unserer heutigen Zivilisation nicht mehr wegzudenken. Meistens spricht man von Chips, und meint damit fertige, in einem kleinen Gehäuse untergebrachte Integrierte Schaltungen; der Begriff Chip bezeichnet jedoch ursprünglich nur ein Plättchen aus dem Halbleitermaterial Silizium, auf dem Integrierte Schaltungen realisiert werden [INF 93]. Je schneller und kleiner Integrierte Schaltungen wurden, desto mehr Anwendungsfelder wurden für sie erschlossen. Anfangs wurden sie nur in teuren Großrechnern und der Forschung eingesetzt, heute befinden sie sich in fast jedem Haushalt und sogar im Kinderzimmer, steuern Motoren oder regulieren Kühlschränke. Je nach Anzahl Transistoren, den kleinsten „Bauteilen“, aus denen Integrierte Schaltungen bestehen, unterscheidet man die folgenden Integrationsstufen: Anzahl Integrationsstufe Transistoren SSI (Small Scale Integration) bis zu 10 MSI (Medium Scale Integration) 10 bis 1000 LSI (Large Scale Integration) 1000 bis 20000 VLSI (Very Large Scale Integration) 20000 bis 500000 ULSI (Ultra Large Scale Integration) über 500000 Realisierbar seit (Jahr) 1961 1966 1971 1980 1985 Tabelle 1: Integrationsstufen in der Chiptechnologie Abbildung 1 illustriert die Entwicklung der Transistorzahlen noch einmal anhand der Intel-Prozessor-Generationen für den heimischen PC. Abbildung 1: Transistorzahlen der Intel-Prozessor-Generationen [OFFIS 97] Durch immer fortschrittlichere Technologien konnten Transistoren im Laufe der Zeit immer kleiner realisiert werden, so daß immer mehr Transistoren auf der gleichen Chipfläche untergebracht werden konnten. Gleichzeitig ließen sich immer größere Chips unter akzeptablem Aufwand herstellen, da die Wahrscheinlichkeit für einen Fehler auf dem Chip, die ja mit der Größe des Chips ansteigt, durch fortschrittlichere Fertigungstechniken reduziert werden konnte. Die wachsende Integrationsdichte bei gleichzeitiger Reduzierung der Fehlerwahrscheinlicheit ist mit ein Grund dafür, daß Integrierten Schaltungen für immer neue Anwendungen interessant wurden und werden. 1.2Entwurf Integrierter Schaltungen Aufgrund der Komplexität Integrierter Schaltungen sind strukturierte Verfahren zu deren Entwurf notwendig. Als „kleinste Einheiten“ einer Integrierten Schaltung können Verbindungsleitungen und sogenannte Transistoren betrachtet werden. Sehr einfach ausgedrückt kann durch Transistoren reguliert werden, wann und wo wieviel Strom fließt. Transistoren und Verbindungsleitungen lassen sich funktional in sogenannten logischen Gattern gruppieren. Dadurch können elektrische Vorgänge durch das Zusammenspiel logischer Komponenten (z.B. UND und ODER) abstrahiert werden. Diese logischen Gatter lassen sich weiter zu größeren funktionalen Blöcken (z.B. Register zum Speichern von Werten) gruppieren, welche sich wiederum gruppieren lassen. Am Ende dieser Abstraktionsfolge befindet sich der Chip, der ebenfalls eine bestimmte Funktion realisiert. Diese Technik der Beschreibung einer Integrierten Schaltung auf verschiedenen Abstraktionsebenen wird beim strukturierten Entwurf eingesetzt: Eine Schaltung wird zunächst sehr abstrakt und ohne viele Details modelliert und dann schrittweise in immer konkretere Teilsysteme aufgeteilt, bis schließlich eine direkt implementierbare Struktur aus Transistoren und Leitungen entstanden ist (siehe Abbildung 2). Abbildung 2: Abstraktionsebenen beim Schaltungsentwurf Die meisten Übergänge zwischen den Abstraktionsebenen lassen sich mittlerweile durch Computer automatisieren. Dadurch können die Entwurfszeit und somit auch die Entwurfskosten für eine Schaltung reduziert werden. Eine Automatisierung des Entwurfs ist jedoch nur dann möglich, wenn standardisierte Bauteile einheitlicher Größe bzw. regulärer Struktur verwendet werden, die sich z.B. automatisch plazieren und verdrahten lassen. Diese Standardlösungen sind in den meisten Fällen jedoch nicht optimal, da sie z.B. mehr Fläche benötigen oder langsamer sind, als eine speziell auf die zu realisierende Schaltung zugeschnittene Lösung. Ist also eine optimale Realisierung für das Anwendungsziel einer speziellen Schaltung notwendig, wie z.B. in der Raumfahrttechnik oder für Supercomputer, so lassen sich höhere Entwurfskosten nicht vermeiden und müssen akzeptiert werden. Soll eine Schaltung in hoher Stückzahl hergestellt werden, kann es sich ebenfalls lohnen, auf Seite der Entwurfskosten mehr zu investieren, d.h. mehr Entwurfsschritte manuell durchzuführen, da die Entwurfskosten auf die Anzahl der produzierten Schaltungen verteilt werden können. Man unterscheidet die folgenden typischen Entwurfsverfahren, die je nach Anwendung bzw. zu akzeptierender Entwurfskosten eingesetzt werden: • Vollkundenentwurf (Full-Custom Design) Vollkundenschaltungen werden vollkommen neu entwickelt, so daß sie sowohl vom Flächenbedarf, als auch vom Zeitverhalten her optimiert werden können. Aufgrund des sehr hohen Zeit- und Kostenaufwands lohnt sich dieses Verfahren nur für hohe Fertigungsstückzahlen. • Standardzellen Standardzellen sind sozusagen vorgefertigte kleine Schaltungen, die jeweils eine bestimmte Funktion realisieren. Sie können einer Standardzellenbibliothek entnommen werden und realisieren durch geeignete Kombination und Verdrahtung eine gewünschte Schaltung. Da Standardzellen in der Regel alle die gleiche Höhe besitzen, lassen sie sich in regelmäßigen Reihen platzsparend anordnen. Der Entwurfsaufwand reduziert sich hier auf die Auswahl, Plazierung und Verdrahtung der Zellen. Es gibt zwar keine redundanten Transistoren, wie z.B. im nachfolgenden Entwurfsverfahren der Fall, jedoch sind Flächenbedarf und Zeitverhalten aufgrund der vorgefertigten Funktionsblöcke nicht so optimal, wie bei Vollkundenschaltungen. Können Flächenbedarf und Zeitverhalten bei der Zielanwendung einer Schaltung vernachlässigt werden, lohnen sich Standardzellen aufgrund des reduzierten Entwurfsaufwands auch für nicht ganz so hohe Fertigungsstückzahlen. • Gate-Arrays Bei Gate-Arrays handelt es sich um in regelmäßigen Reihen angeordnete Transistoren, denen durch geeignete Verdrahtung eine Funktion zugeordnet werden kann. Der Entwurfsaufwand reduziert sich hier also auf diese Verdrahtung. GateArrays werden jedoch nur in einem groben Raster von Größen angeboten, so daß sie meistens nicht optimal ausgenutzt werden, d.h. viele Transistoren des Gate-Arrays werden nicht benutzt. Gate-Arrays lohnen sich für einfache Schaltungen mit geringeren Fertigungsstückzahlen. • PLDs (Programmable Logic Devices) Bei PLDs handelt es sich um Schaltungen, die in großen Stückzahlen vorgefertigt werden und erst vor ihrem Einsatz beim Anwender durch einen Programmiervorgang ihre Funktion erhalten. Bei diesem Programmiervorgang werden durch gezielt angelegte elektrische Spannungen z.B. Kapazitäten erzeugt oder Sicherungen durchgebrannt. Der Entwurfsaufwand reduziert sich hier auf das verhältnismäßig einfache Programmieren, so daß PLDs bei sehr geringen Fertigungsstückzahlen kostengünstig eingesetzt werden können. Wie Gate-Arrays werden auch PLDs meistens nicht optimal ausgenutzt. Außerdem werden sie nur in kleineren Größen angeboten, so daß sich nur Schaltungen mit bis zu etwa 1000 Gattern realisieren lassen. • FPGAs (Field Programmable Gate Arrays) FPGAs bestehen aus regelmäßig angeordneten, programmierbaren Zellen, die sich untereinander verdrahten lassen. Man könnte sie als „große Art“ von PLDs bezeichnen, da hier Schaltungen mit 20000 bis 30000 Gattern realisierbar sind. Zusätzlich zum Programmieraufwand kommt hier jedoch noch der Entwurfsaufwand für die Zuordnung von Funktionen an die verschiedenen Zellen sowie für die Verdrahtung hinzu. Es sind also etwas höhere Fertigungsstückzahlen als bei PLDs erforderlich, um die höheren Entwurfskosten verteilen zu können. Während der Entwicklung einer Schaltung werden häufig PLDs und besonders FPGAs eingesetzt, da sich diese relativ einfach löschen und neu programmieren lassen. Für die entgültige Serienproduktion finden häufig Gate-Arrays oder Standardzellen Verwendung. 1.3Optimierungsziele Wie im letzten Kapitel schon mehrfach angedeutet wurde, spielen beim Entwurf Integrierter Schaltungen ein optimaler Flächenbedarf und ein optimales Zeitverhalten eine wichtige Rolle. Je nachdem, zu welchem Zweck eine Schaltung entworfen wird, sind jedoch weitere Optimierungsziele möglich, wie z.B. Chipkosten, Leistungsaufnahme oder Testbarkeit. In vielen Fällen gibt es Konflikte zwischen diesen Zielen: Die Geschwindigkeit vieler Schaltungen läßt sich z.B. nur erhöhen, indem mehr Bauteile eingesetzt werden, d.h. die Chipfläche vergrößert wird. Je nach geplantem Entwurfsverfahren können die Optimierungsziele auf verschiedene Art erreicht werden, wie am Beispiel einer möglichst minimalen Chipgröße in Tabelle 2 deutlich werden soll: Entwurfsverfahren: Minimale Chipgröße durch: Vollkundenentwurf Reduzierung von Transistorzahl und Verdrahtungsfläche. Standardzellen Reduzierung der benötigten Anzahl Zellen. Gate-Arrays Reduzierung der benötigten Anzahl Transistoren. PLDs Reduzierung der Anzahl Produktterme der Schaltfunktion. FPGAs Reduzierung der benötigten Anzahl Programmierzellen. Tabelle 2: Verschiedene Optimierungsverfahren für eine minimale Chipgröße Damit nicht für jedes Entwurfsverfahren ein neues Optimierungssverfahren entwickelt werden muß, zerlegt man die Optimierung in einen technologieunabhängigen und einen technologieabhängigen Teil. Im technologieunabhängigen Teil wird ein abstraktes Optimierungsziel verfolgt, das gemeinsames Ziel aller Entwurfsverfahren ist, so daß das Ergebnis je nach technologieabhängigem Teil nur noch den jeweiligen technologiespezifischen Eigenschaften angepaßt werden muß. Heutzutage kommen im wesentlichen zwei abstrakte Ziele zum Einsatz: Basiert die zu realisierende Schaltfunktion auf einer zweistufigen Struktur, so lautet das Ziel, die Anzahl der Produktterme zu minimieren, handelt es sich um eine mehrstufige Struktur, so wird in der Regel versucht, die Anzahl Literale bzw. Eingänge der Schaltung zu minimieren [Eschermann 93]. Diese Diplomarbeit und die zugehörige Lernsoftware beschäftigen sich mit der technologieunabhängigen Optimierung zweistufiger Logik, d.h. das Ziel lautet „Minimierung der Anzahl Produkterme einer Schaltfunktion“. Wird im folgenden von Logikminimierung gesprochen, so ist dieses Ziel damit gemeint. 1.4Begriffe und Notationen Grundsätzlich lassen sich zwei Arten von Schaltungen unterscheiden: Schaltwerke und Schaltnetze. Die Ausgangswerte eines Schaltwerks werden durch die aktuellen Eingangswerte sowie durch gespeicherte Werte bestimmt. Bei den gespeicherten Werten handelt es sich um Ein- oder Ausgangswerte eines vergangenen Zeitpunkts, also z.B. um einen im letzten Schritt bestimmten Ausgangswert. Von einem Schaltnetz spricht man, wenn die Ausgangswerte nur direkt aus den aktuellen Eingangswerten berechnet werden. Schaltwerke bezeichnet man auch als sequentielle, Schaltnetze als kombinatorische Schaltungen. Im Rahmen dieser Diplomarbeit werden nur Schaltnetze betrachtet. Die Funktion eines Schaltnetzes wird durch eine Schaltfunktion beschrieben, die jeder Kombination von Eingangswerten eindeutig einen Ausgangswert zuordnet. In manchen Fällen wird nicht jede dieser Kombinationen für die Funktion eines Schaltnetzes benötigt. Die Kombinationen von Eingangswerten, um die man sich „nicht kümmern“ muß, bezeichnet man als don’t-care-conditions. Da eine Schaltfunktion auch für diese Eingangwerte definiert sein muß, ordnet man ihnen sogenannte don’tcare-Ausgangswerte zu. Diese lassen sich bei der Logikminimierung miteinbeziehen. 1.4.1Notationen Eine Schaltfunktion läßt sich auf unterschiedliche Arten darstellen. Im folgenden werden einige gängige Notationen und damit verbundene Begriffe vorgestellt. Ein Grundwissen um Elemente der Logik, speziell der Schaltlogik, wird hier vorausgesetzt. Funktionstabelle In einer Funktionstabelle wird jeder Kombination von Eingangswerten einer Schaltfunktion ein bestimmter Funktionswert zugeordnet (siehe Abbildung 3). Manchmal spricht man hier auch von Wahrheitstafel. Dieser Begriff ist von der Aussagenlogik übernommen, wo die 1 mit der Aussage „wahr“ und die 0 mit der Aussage „falsch“ identifiziert wird. Abbildung 3: Funktionstabelle Boolesche Gleichung Die Darstellung als Funktionstabelle wird bei einer größeren Anzahl von Schaltungseingängen zu mühselig: Schon bei 6 Eingängen besitzt die Tabelle 64 Zeilen. Bei einer Booleschen Gleichung wird eine Schaltfunktion durch einen Booleschen Ausdruck beschrieben, was neben dem geringeren Schreibaufwand den entscheidenden Vorteil hat, daß zur Vereinfachung bzw. Minimierung die Rechenregeln der Booleschen Algebra verwendet werden können. Für diese Vereinfachung bringt man den gegebenen Ausdruck zunächst in eine eindeutige Normalform, welche sich am einfachsten mit Hilfe der Funktionstabelle erklären läßt: Entweder werden alle Einsstellen der Schaltfunktion durch die sogenannte Kanonisch Disjunktive Normalform (ADN, Ausgezeichnete Disjunktive Normalform) als Disjunktion (ODER) von Konjunktionen (UND), oder alle Nullstellen der Schaltfunktion durch die sogenannte Kanonisch Konjunktive Normalform (AKN, Ausgezeichnete Konjunktive Normalform) als Konjunktion von Disjunktionen dargestellt (siehe Abbildung 4). Die durch Disjunktion verknüpften Terme der ADN werden als Minterme, die durch Konjunktion verknüpften Terme der AKN als Maxterme bezeichnet. Abbildung 4: ADN und AKN Anmerkung: Eine allgemeine Disjunktion von Konjunktionen wird auch als Disjunktive Normalform (DNF), eine allgemeine Konjunktion von Disjunktionen als Konjunktive Normalform (KNF) bezeichnet. Nach der Vereinfachung einer kanonischen Normalform darf man bei der ADN nur noch von DNF, bei der AKN nur noch von KNF sprechen. Ich verwende im folgenden nur noch die allgemeinen Bezeichnungen DNF und KNF. Grafische Notationen Neben Tabellen und Booleschen Gleichungen besteht auch die Möglichkeit der grafischen Darstellung von Schaltfunktionen durch sogenannte Karnaugh-VeithDiagramme (kurz KV-Diagramme) oder Hyperwürfel (siehe Abbildung 5 und Abbildung 6). Abbildung 5: KV-Diagramm und Hyperwürfel für drei Variablen Abbildung 6: KV-Diagramm und Hyperwürfel für vier Variablen (Bemerkung: Der Ursprung des Hyperwürfels befindet sich hier an der Stelle „0“; die Variable d wird auf dem großen, äußeren Würfel bzw. Quader abgetragen) In die Felder eines KV-Diagramms werden die Minterme einer Schaltfunktion als Einsen eingetragen. Im KV-Diagramm benachbarte Felder unterscheiden sich in genau einer Koordinate. Felder am Rand besitzen genau soviele Nachbarfelder, wie Zellen in der Mitte: Dazu muß man sich das Diagramm zyklisch über die Ränder hinweg geschlossen denken (in Abbildung 5 und Abbildung 6 durch die gestrichelten Linien angedeutet). Die Beschriftung am Rand des Diagramms gibt an, für welche Felder ein Schaltungseingang bzw. eine Variable einen positiven oder negierten Wert annimmt. Beim Hyperwürfel werden die Minterme einer Schaltfunktion an den Ecken abgetragen, ein Koordinatensystem definiert den Wert jeder Ecke. In Abbildung 5 und Abbildung 6 sollte die Verbindung zwischen Boolescher Gleichung, KV-Diagramm und Hyperwürfel deutlich werden. Die acht klein dargestellten Zahlen ermöglichen die Verbindung der Felder des KV-Diagramms mit den entsprechenden Ecken des Hyperwürfels: Man kann sich ein KV-Diagramm offensichtlich auch als „aufgeklappten“ Hyperwürfel vorstellen. Sowohl KV-Diagramm als auch Hyperwürfel lassen sich prinzipiell um beliebig viele Schaltungseingänge bzw. Variablen erweitern, diese Erweiterbarkeit wird jedoch durch die damit verbundene Unübersichtlichkeit der Darstellung begrenzt (siehe dazu Kapitel ). 1.4.2 Weitere Begriffe Die durch Disjunktion miteinander verknüpften Terme der DNF werden auch als Produktterme bezeichnet. Da eine Boolesche Gleichung genau dann wahr ist bzw. den Wert „1“ annimmt, wenn mindestens ein Produktterm der DNF wahr ist bzw. den Wert „1“ annimmt, d.h. diese Produktterme die Schaltfunktion implizieren, bezeichnet man diese Produktterme auch als Implikanten. Ziel der Logikminimierung ist die Reduzierung der Anzahl Implikanten, die zur Spezifikation einer Schaltfunktion notwendig sind. Jede Implikantenmenge, die eine Schaltfunktion vollständig spezifiziert, wird als Überdeckung dieser Schaltfunktion bezeichnet, da sie alle Minterme der zugehörigen Booleschen Gleichung über- bzw. abdeckt. Ein Implikant einer Überdeckung, der als einziges einen oder mehrere Minterme überdeckt, wird auch als essentiell bezeichnet. Durch Regeln der Booleschen Algebra lassen sich Implikanten so zusammenfassen, daß wenige, größere Implikanten entstehen. Die Angabe „groß“ bezieht sich hierbei nicht auf die Größe eines geschriebenen Produktterms (diese wird kleiner), sondern auf die Anzahl Minterme, die ein Produktterm überdeckt. Dies läßt sich am einfachsten anhand der Größe der sogenannten Schleifen im KV-Diagramm bzw. der Würfeldarstellung nachvollziehen. Diese Schleifen entsprechen einer grafischen Darstellung der Zusammenfassung von Implikanten (siehe Abbildung 7 und Abbildung 8). Das Zusammenfassen von Implikanten läßt sich als Vergrößerung eines der beteiligten Implikanten auffassen, d.h. ein Implikant wird so vergrößert, daß er einen, oder sogar mehrere andere Implikanten überdeckt. Die zugehörige Schleife wird dabei größer, der geschriebene Produktterm dagegen kleiner. Abbildung 7: Zusammenfassung von Implikanten im KV-Diagramm Abbildung 8: Zusammenfassung von Implikanten im Hyperwürfel Überdeckte Implikanten sind zur Spezifikation einer Schaltfunktion nicht mehr notwendig, man bezeichnet sie als redundant und entfernt sie aus der Überdeckungsmenge. Kann ein Implikant nicht weiter vergrößert werden, so wird er als Primimplikant bezeichnet. Ziel der Logikminimierung ist also das Auffinden einer minimalen Anzahl von Primimplikanten, die zur Überdeckung einer Schaltfunktion notwendig ist. 1.4.3Positional Cube Notation Zur rechnerinternen Verarbeitung von Schaltfunktionen sind die gängigen Notationen eher ungeeignet. Hier verwendet man effizientere Datenstrukturen, wie z.B. die sogenannte Positional Cube Notation, die auch im ESPRESSO-Algorithmus benutzt wird. In der Positional Cube Notation wird ein Produktterm binär codiert und so als Vektor aus Nullen und Einsen repräsentiert. Diesen Vektor erhält man, indem man alle Literale des Produktterms einzeln codiert und die Ergebnisse aneinanderfügt. Die folgende Abbildung zeigt in der linken Tabelle die Codierung eines Literals und in der rechten Tabelle die dementsprechende Codierung einer Reihe von Produkttermen (DC = don’t-care-Wert). Jeder Produktterm wird als Zeilenvektor repräsentiert, so daß die ganze Schaltfunktion als Matrix repräsentiert werden kann: Abbildung 9: Positional Cube Codierung Die fehlende Literal-Codierung "00" würde man nach diesem System so interpretieren, daß die entsprechende Variable einen ungültigen Wert annimmt. Ein Implikant, der so eine Variable enthielt, wäre ungültig und müßte aus der die Schaltfunktion spezifizierenden Implikantenmenge entfernt werden. Für die Codierung wird "00" nicht benötigt. Mit Hilfe dieser Codierung lassen sich Operationen auf Implikanten effizient als einfache Matrizen-Operationen realisieren. 1.5Logikentwurf Der Ansatzpunkt für eine Logikminimierung ist die Abstraktionsebene des Entwurfs, auf der eine Schaltung durch logische Gatter realisiert wird. Die Beschreibung einer Schaltung auf dieser Gatterebene bezeichnet man als Logikentwurf. Ausgangspunkt der Gatterebene ist die Beschreibung des Verhaltens einer Schaltung, z.B. in Form einer Funktionstabelle oder Booleschen Gleichung. Diese Beschreibung läßt sich direkt in eine strukturelle Beschreibung in Form von logischen Gattern übertragen. In der Regel ist diese Gatterstruktur jedoch nicht optimal, so daß vor der Realisierung dieser Struktur durch Transistoren und Verbindungsleitungen eine Logikminimierung durchzuführen ist (siehe Abbildung 10). Abbildung 10: Schaltnetz vor und nach der Minimierung Beim manuellen Logikentwurf wird die Logikminimierung entweder mittels Axiomen und Sätzen der Booleschen Algebra, oder grafisch mit KV-Diagrammen oder Hyperwürfeln durchgeführt. Beim automatisierten Logikentwurf, den man auch als Logiksynthese bezeichnet, übernimmt eine spezielle Logiksynthese-Software die Logikminimierung. Es genügt die Eingabe einer Schaltungsspezifikation mittels einer geeigneten Eingabesprache. Vor allem bei der Minimierung großer Schaltungen ist eine Rechnerunterstützung nicht mehr wegzudenken, da die grafischen Notationen hier unbrauchbar werden. 1.6Minimierungsalgorithmen Man unterscheidet zwischen exakten und heuristischen Minimierungsalgorithmen. Exakte Algorithmen haben ihren Ursprung in in den 50er Jahren stattgefundenen Arbeiten zu Logikdesign von W.V. Quine [Quine 52] und E.J. McCluskey [McCluskey 56]. Beim klassischen Quine-McCluskey-Algorithmus werden zunächst alle möglichen Primimplikanten einer Schaltfunktion berechnet. Aus dieser Menge wird im zweiten Schritt eine minimale Teilmenge ermittelt, die die Schaltfunktion vollständig überdeckt. Auf diese Weise lassen sich auch größere Probleme lösen, die mittels grafischer Verfahren nicht mehr übersichtlich darstellbar wären. Der Quine-McCluskey-Algorithmus war ursprünglich ein tabellarisches Verfahren für das Minimieren von Hand, eignete sich aber aufgrund seiner eindeutigen Formulierung sehr gut für die computergestützte Logikminimierung. Dadurch ließ er sich auch auf Probleme anwenden, denen man von Hand nicht mehr mächtig wurde. Leider steigt bei Quine-McCluskey und anderen exakten Verfahren der Bedarf an Speicherplatz und Rechenzeit im schlimmsten Fall exponentiell mit der Anzahl der Schaltungseingänge. In den frühen 70er Jahren stieß man mit den durch die LSI realisierbaren Schaltungskomplexitäten (mehr als 30 Ein- und Ausgänge) an die Grenzen der klassischen, exakten Minimierungstechniken, so daß man sich neuen Techniken zuwandte. Der Quine-McCluskey-Algorithmus wurde dennoch stetig durch immer neue, effizientere Implementierungen drastisch verbessert, so daß er heute sogar für Design-Probleme realistischer Größe anwendbar geworden ist [Rudell 87][Dagenais 86][Coudert 92] [McGeer 93]. Nichtsdestominder bleibt sein Aufwand im schlimmsten Fall exponentiell. Eine Technik, der man sich in den frühen 70er Jahren zuwandte, war die heuristische Logikminimierung. Darunter versteht man die direkte Generierung einer Lösung mittels bestimmter Taktiken, Strategien, Regeln, sogenannter Heuristiken. Heuristiken entstehen aus Experimenten und Erfahrungen und liefern mit hoher Wahrscheinlichkeit (je nach Qualität der Heuristik) eine gute wenn nicht sogar die beste Lösung. Heuristiken entscheiden bei der Logikminimierung z.B., in welcher Reihenfolge welche Implikanten zusammengefaßt werden sollten, um eine möglichst gute Lösung zu erreichen. Da bei der heuristischen Minimierung eine Lösung auf direktem Weg berechnet wird, d.h. ohne Umweg über alle Primimplikanten, lassen sich Speicherplatzbedarf und Rechenzeit reduzieren. Da der Lösungsweg jedoch durch Heuristiken bestimmt wird, die nur mit einer gewissen Wahrscheinlichkeit die richtigen Entscheidungen treffen und so in Spezialfällen „versagen“ können, gibt es keine Garantie dafür, daß die erreichte Lösung die bestmögliche ist. Die Abweichung von der bestmöglichen Lösung ist jedoch im Verhältnis zur Größe der Lösung und vor allem zur Rechenzeitersparnis vernachlässigbar klein. Ein frühes Beispiel für einen heuristischen Algorithmus zur Logikminimierung ist der in den 70er Jahren von IBM entwickelte MINI-Algorithmus [Hong 74], der für die meisten Probleme der damaligen Zeit eine sehr gute Lösung in akzeptabler Rechenzeit lieferte. Es folgte mit dem PRESTO-Algorithmus [Brown 81] Anfang der 80er Jahre ein ähnlich gutes Verfahren. Der bekannteste Algorithmus, der seit Anfang der 80er Jahre, als sich mit der nächsten, VLSI-Integrationsstufe die Komplexität Integrierter Schaltungen noch weiter erhöhte, auch in kommerziellen Logiksynthese-Werkzeugen eingesetzt wird (z.B. in [ISDATA 97]), ist der von IBM und der University of California at Berkeley entwickelte ESPRESSO-Algorithmus. Er ist Thema der zu dieser Diplomarbeit gehörenden Lernsoftware. Die auf der nächsten Seite folgende Tabelle 3 zeigt für sechs Beispiele die Ergebnisse eines exakten sowie eines heuristischen Verfahrens [vereinfacht aus Eschermann 93]. Die Ergebnisse wurden mit Hilfe des Programms espresso [OCT 90] erzielt, welches sowohl die heuristische Minimierung durch den ESPRESSOAlgorithmus, als auch die exakte Minimierung mittels einer effizienten Implementierung des Quine-McCluskey-Algorithmus (in der Literatur oft als ESPRESSOEXACT bezeichnet) ermöglicht. Als Platform diente ein SPARC-Arbeitsplatzrechner mit 12.5 MIPS. Anzahl EingabeTerme 87 167 305 1848 1459 1227 Ausgabe (heuristisch minimiert) 22 120 197 690 336 1088 CPU-Zeit (sec) 3 7 61 225 123 710 Ausgabe (exakt minimiert) 22 117 ? ? 334 ? CPU-Zeit (sec) 4 14 >100000 >100000 2530 >100000 Tabelle 3: Vergleich heuristischer und exakter Logikminimierung Die linke Spalte der Tabelle zeigt jeweils die Anzahl Eingabeterme. Die jeweils nächsten zwei Spalten zeigen das Ergebnis des heuristischen und des exakten Verfahrens sowie die benötigte Rechenzeit. Man erkennt, daß das heuristische Verfahren mit steigender Problemgröße bei der Rechenzeit weitaus besser abschneidet. Die Fragezeichen beim exakten Verfahren bedeuten, daß die Berechnung hier nach einer Rechenzeit von 100000 Sekunden (also mehr als 27 Stunden) ohne Ergebnis abgebrochen wurde. Für diese Beispiele benötigte das heuristische Verfahren dagegen lediglich einige Minuten. Man erkennt außerdem, daß die Lösung des heuristischen Verfahrens nicht garantiert minimal ist. Im Verhältnis zur Gesamtgröße der Lösung und besonders zur Rechenzeitersparnis ist diese Abweichung jedoch vernachlässigbar klein. Oder anders ausgedrückt: Ob nun 2 Gatter mehr oder weniger benötigt werden, fällt hier einfach nicht mehr ins Gewicht. 1.7ESPRESSO Der bekannteste heuristische Algorithmus zur Logikminimierung, der seit den 80er Jahren auch in kommerziellen Logiksynthese-Werkzeugen eingesetzt wird (z.B. in [ISDATA 97]), ist der ESPRESSO-Algorithmus. Dieser wurde Anfang der 80er Jahre von IBM und der University of California at Berkeley entwickelt und ist Thema der im Rahmen dieser Diplomarbeit entwickelten Lernsoftware. Bevor die Konzepte dieses Algorithmus vorgestellt werden, zunächst ein kurzer Überblick über die verschiedenen Versionen von ESPRESSO, die in der Literatur unterschieden werden: • Bei ESPRESSO-I [Brayton 82] handelte es sich um eine anfängliche Testumgebung, in der die im Jahre 1981 bekanntesten heuristischen Strategien des MINI- und des PRESTO-Algorithmus, sowie einige neu entwickelte Ideen miteinander verglichen werden konnten. • Die Ergebnisse der Tests wurden 1982 in einem eigenständigen Algorithmus zusammengefaßt: ESPRESSO-II [Brayton 84], der zunächst in APL1 implementiert wurde. • 1984 implementierte Richard Rudell, ein Absolvent der University of California at Berkeley, eine Version in C: ESPRESSO-IIC. • Für vergleichende Testzwecke wurde auf Grundlage der ESPRESSO-IIC Implementierung eine effiziente Implementierung des Quine-McCluskey-Algorithmus realisiert: ESPRESSO-EXACT. • 1986 wurde ESPRESSO-IIC so modifiziert, daß neben binären Schaltfunktionen nun auch eine mehrwertige Logik unterstützt wurde: ESPRESSO-MV [Rudell 87]. Dieser Algorithmus hat heute die binäre Version ersetzt, da er selbst für binäre Fälle effizienter arbeitet. Meistens wird jedoch immer noch von ESPRESSO-II gesprochen, falls nur binäre Logik betrachtet wird. Auf der Grundlage von ESPRESSO-MV wurde eine neue ESPRESSO-EXACT-Version für mehrwertige Logik realisiert. • ESPRESSO-MV und ESPRESSO-EXACT wurden in dem Program espresso zusammengefaßt [OCT 90]. Die im Rahmen dieser Diplomarbeit entwickelte Lernsoftware beschäftigt sich mit den allen Versionen zugrundeliegenden Prinzipien des ESPRESSO-Algorithmus für binäre Logik, also sozusagen mit ESPRESSO-II, jedoch ohne Betrachtung irgendwelcher Implementierungsdetails. Aus diesem Grund wird die allgemeine Bezeichnung „ESPRESSO“ verwendet. Im folgenden wird der Ablauf des ESPRESSO-Algorithmus kurz vorgestellt. Da der Algorithmus relativ komplex ist, würde eine detailliertere Beschreibung den Rahmen 1 Auszug aus dem Informatik-Duden [INF 93]: „APL (Abk. für ‚A Programming Language‘): Bezeichnung für eine Anfang der 60er Jahre entwickelte Programmiersprache, die sich durch eine mathematisch orientierte, sehr knapp gefaßte Notation auszeichnet. [...] Sie wird von Ingenieuren geschätzt, da man relativ komplexe Sachverhalte kurz formulieren und ‚mal rasch‘ durchrechnen kann. Die interpretative Verarbeitung führt jedoch zu sehr hohen Rechenzeiten. [...]“. dieser Ausarbeitung sprengen. Aus diesem Grund möchte ich für Details auf die entwickelte Lernsoftware verweisen. Als Eingabe erhält ESPRESSO eine Menge von Implikanten. Diese Menge wird als erste „Lösung“ (wenn auch eine wahrscheinlich recht schlechte Lösung) initialisiert und iterativ immer weiter verbessert, d.h. die Anzahl Implikanten wird verringert, bis keine Verbesserung mehr erreicht werden kann. Dieser Vorgang wird als iterative Verbesserungsstrategie bezeichnet. Da der ESPRESSO-Algorithmus, wie gesagt, relativ komplex ist, faßt man seine Schritte und Phasen in sogenannten Operatoren zusammen. Der Ablauf des Algorithmus kann so als Anwendung von Operatoren in einer bestimmten Reihenfolge auf bestimmte Eingabedaten verstanden werden. Heuristische Minimierer lassen sich allgemein auf Basis ihrer Operatoren und deren Anwendungsreihenfolge charakterisieren. Die frühen heuristischen Minimierer MINI [Hong 74] und PRESTO [Brown 81] bestanden aus drei bzw. einem Operator, ESPRESSO verwendet insgesamt sechs. Abbildung 11 illustriert die Anwendungsreihenfolge dieser Operatoren in Form eines Flußdiagramms. Folgende Funktionen werden durch die einzelnen Operatoren realisiert: • COMPLEMENT berechnet das Komplement der die Schaltfunktion spezifizierenden Implikantenmenge. Dieses wird vom EXPAND-Operator benötigt. Abbildung 11: ESPRESSO • EXPAND versucht, die vorhandenen Implikanten in einer geeigneten Reihenfolge zu vergrößern, so daß jeweils möglichst viele andere Implikanten überdeckt werden (engl. to expand: (sich) vergrößern). Überdeckte Implikanten werden gelöscht. Abbildung 12 zeigt beispielhaft das Zusammenfassen zweier Implikanten, was, wie schon erwähnt, auch als Vergrößerung eines der beiden Implikanten interpretiert werden kann. Abbildung 12: EXPAND • EXPAND löscht nur die Implikanten, die direkt von einem anderen Implikanten überdeckt werden. Es gibt jedoch eventuell noch solche, die von zwei oder mehr Implikanten gemeinsam überdeckt werden, und somit redundant sind (siehe Abbildung 13). IRREDUNDANT versucht, die größtmögliche Anzahl redundanter Implikanten zu entfernen. Abbildung 13: IRREDUNDANT An dieser Stelle des Flußdiagramms bzw. des Algorithmus entspricht die aktuelle Implikantenmenge schon einer möglichen Endlösung, d.h. jeder Implikant läßt sich weder weiter vergrößern noch in dieser Form aus der Lösung entfernen. Da die Lösung jedoch heuristisch ermittelt wurde, existiert möglicherweise eine andere, bessere Lösung. Diese wird im folgenden zu ermitteln versucht. • ESSENTIALS bestimmt alle Implikanten, die in jeder möglichen Lösung enthalten sein müssen, da sie als einzige einen oder mehrere Minterme überdecken. Diese Implikanten werden geeignet gekennzeichnet, so daß die Menge der in folgenden Durchläufen der Iterationsschleife zu berücksichtigenden Implikanten verkleinert werden kann, was bei größeren Problemen eine effizientere Iteration ermöglicht. Die folgende Abbildung 14 zeigt beispielhaft alle Lösungen einer Schaltfunktion (in diesem Fall zwei). Die dunkel markierten Implikanten sind essentiell, da sie offensichtlich in jeder Lösung enthalten sind. Abbildung 14: ESSENTIALS • Um eine möglicherweise bessere Lösung zu finden, muß die derzeitige lokale Lösung „verlassen“ werden, d.h. die Implikanten müssen geeignet verkleinert werden, so daß sie eventuell in eine neue Richtung wieder vergrößert werden können. REDUCE löst geeignete Zusammenfassungen auf, ohne dabei jedoch die Anzahl Implikanten zu erhöhen (siehe Abbildung 15). Dadurch soll vermieden werden, am Ende eine möglicherweise schlechtere Lösung, als vorher zu erhalten. Ziel von REDUCE ist eine Verringerung der Anzahl Implikanten in einem der Folgeschritte des Algorithmus (engl. to reduce: verringern). Nach REDUCE können die Operatoren EXPAND und IRREDUNDANT wieder angewandt werden, um eine neue mögliche lokale Lösung zu ermitteln. Diese wird mit der vorherigen Lösung verglichen. Konnte eine Verbesserung erreicht werden, erfolgt eine erneute Verbesserungsiteration, indem zurück zum REDUCE-Operator verzweigt wird. Konnte keine Verbesserung erreicht werden, so liegt dies eventuell daran, daß die verwendeten Heuristiken, nach denen z.B. die Reihenfolge bestimmt wird, in der Implikanten verkleinert bzw. vergrößert werden, „falsche“ bzw. ungünstige Entscheidungen getroffen haben. Abbildung 15 illustriert beispielhaft eine REDUCE-EXPAND Abfolge. Abbildung 15: REDUCE-EXPAND Abfolge • LAST_GASP repräsentiert die Durchführung einer weiteren, vollständigen Verbesserungsiteration unter Verwendung anderer Heuristiken als in der Hauptiterationsschleife (engl. last gasp: "zum letzten Mal nach Luft schnappen"). Falls die vorherigen Heuristiken sich in einer Art "Sackgasse" befunden haben, so besteht eine hohe Wahrscheinlichkeit dafür, daß diese Sackgasse durch die Verwendung anderer Heuristiken aufgelöst werden kann. Oder anders formuliert: Die Wahrscheinlichkeit, daß zwei verschiedene Heuristiken beide an derselben Stelle scheitern, ist sehr klein. Falls also doch eine weitere Verbesserung der Lösung möglich ist, so wird sie mit hoher Wahrscheinlichkeit im LAST_GASP-Schritt gefunden. Im Fall einer Verbesserung durch den LAST_GASP-Operator besteht wieder die Möglichkeit weiterer Verbesserungen durch die eigentliche Iterationsschleife, d.h. es wird an ihren Anfang zurückverzweigt. Konnte immer noch keine Verbesserung zur vorherigen Lösung erreicht werden, so handelt es sich bei dieser sehr wahrscheinlich um die bestmögliche bzw. eine annähernd bestmögliche, so daß kein erneuter Verbesserungversuch mehr unternommen wird. Durch LAST_GASP kommen zwei unterschiedliche Mengen von Heuristiken zum Einsatz. Nur bei Problemen, bei denen beide Mengen „versagen“, wird ESPRESSO nicht die bestmögliche Lösung liefern. In der Praxis kommt dies nur bei verhältnismäßig großen Problemen vor, bei denen sich dann die jeweils erzielte Lösung vernachlässigbar wenig von der bestmöglichen Lösung unterscheidet. Die schon auf Seite 20 vorgestellte Tabelle 3 vergleicht einige Lösungen samt benötigter Rechenzeit mit den Lösungen eines exakten Logikminimierungsverfahrens. Abschließend sei noch kurz auf den Namen „ESPRESSO“ eingegangen. Hinweise für diese Namensgebung gibt es z.B. im Vorwort der von den Autoren des ESPRESSO-Algorithmus als Buch verfaßten Dokumentation [Brayton 84]: „It is hoped that the strength and speed of our minimizer warrant its Italian name, which denotes both express delivery and a special-brewed black coffee“ und „Finally we thank our families for their kind support during the years devoted to this effort, and give a special thank you to ‚our Italian wife‘ whose pizza and espresso were an inspiration for this book.“.