Rechnerstrukturen Michael Engel und Peter Marwedel TU Dortmund, Fakultät für Informatik SS 2013 Hinweis: Folien a. d. Basis von Materialien von Gernot Fink und Thomas Jansen Boole. Fkt. 18. April 2013 1 Boole. Fkt. Boolesche Funktionen und Schaltnetze Repräsentationen boolescher Funktionen (Wiederholung) Normalformen boolescher Funktionen (Wiederholung) Repräsentation boolescher Funktionen mit OBDDs Synthese von OBDDs für boolesche Funktionen Schaltnetze Repräsentationen boolescher Funktionen Definition 4 Seien n, m ∈ N. Eine Funktion f : B n → B m heißt boolesche Funktion. Notation B n = Menge aller n-stelligen Tupel über B Beispiel B 2 = {(0, 0), (0, 1), (1, 0), (1, 1)} Anzahl boolescher Funktionen boolesche Funktion f : B n → B m als Wertetabelle darstellbar mit |B n | = 2n Zeilen und |B m | = 2m Möglichkeiten je Zeile ⇒ 2m 2n Beispiel Boole. Fkt. n = 2m·2 boolesche Funktionen f : B n → B m 2 21·2 = 24 = 16 boolesche Funktionen f : B 2 → B Alle booleschen Funktionen f : B 2 → B 0 0 0 0 0 0 0 0 0 0 x y f1 f2 f3 f4 f5 f6 f7 f8 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 Nullfkt. AND 0 ∧ Proj. x Proj. XOR OR y ⊕ ∨ x y f9 f10 f11 f12 f13 f14 f15 f16 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 NOR Äquiv. Negation Negation Impl. NAND Einsfkt. ⇔ ¬y ¬x ⇒ Verwenden im Weiteren ∧ (Konjunktion), ∨ (Disjunktion), ¯ (Negation) Boole. Fkt. 1 Darstellung boolescher Funktionen gerade gesehen x 0 0 1 1 y 0 1 0 1 Wertetabelle (Orientierung meistens wie hier) f7 0 1 1 0 bei fester Reihenfolge f7 : (0, 1, 1, 0) Boole. Fkt. Wertevektor Index und Minterm Index 0 1 2 3 x 0 0 1 1 y 0 1 0 1 f7 0 1 1 0 nicht einschlägig einschlägig einschlägig nicht einschlägig Definition Die boolesche Funktion, für die nur der Index i einschlägig ist, heißt Minterm zum Index i . Ein Minterm ist nur mit Negationen und Konjunktionen darstellbar: ( 0 xj xj = 1 xj ˆ [negierte] Variable) und dann Konjunktion all dieser Literale (= Boole. Fkt. Normalformen ◮ ◮ Definition 8 Die Darstellung von f als Disjunktion all ihrer Minterme zu einschlägigen Indizes heißt disjunktive Normalform (DNF). Die Darstellung von f als XOR-Verknüpfung all ihrer Minterme zu einschlägigen Indizes heißt Ringsummen-Normalform (RNF). Anmerkung Normalformen sind eindeutig. Index x y 0 0 0 Beispiel 0 1 1 2 1 0 1 1 3 DNF von f7 x y ∨ x y Boole. Fkt. f7 0 1 1 0 Minterm xy xy xy xy RNF von f7 xy ⊕xy Funktionale Vollständigkeit Beobachtung jede boolesche Funktion f : B n → B nur mittels Konjunktion, Disjunktion und Negation darstellbar (z. B. durch ihre DNF) Definition 5 Eine Menge F von booleschen Funktionen heißt funktional vollständig, wenn sich jede boolesche Funktion durch Einsetzen und Komposition von Funktionen aus F darstellen lässt. Satz 6 {∧, ∨, ¬} ist funktional vollständig. Boole. Fkt. Darstellungen boolescher Funktionen ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ ◮ Wozu stellt man boolesche Funktionen dar? Realisierung Verifikation Fehleranalyse Synthese ... Wo stellt man boolesche Funktionen dar? auf dem Papier im Computer Probleme Wertetabelle, Wertevektor immer groß Normalformen oft groß Normalformen unterstützen gewünschte Operationen kaum Wunsch Boole. Fkt. andere Repräsentation Eine Datenstruktur für boolesche Funktionen Ziel f : B n → B darstellen Wünsche ◮ zu einer Belegung x1 , x2 , . . . , xn schnell den Funktionswert f (x1 , x2 , . . . , xn ) ausrechnen können ◮ Funktionen schnell auf Gleichheit testen können ◮ Funktionen schnell manipulieren (z. B. eine Variable konstant setzen) können ◮ schnell eine Null-Eingabe/eine Eins-Eingabe finden können ◮ Funktionen möglichst klein repräsentieren ◮ ... Ordered Binary Decision Diagrams Boole. Fkt. OBDDs erster Schritt dann ◮ ◮ ◮ ◮ ◮ ◮ Festlegen einer Variablenordnung π (z. B. π = (x3 , x1 , x2 , x4 )) x4 1 oder Baue πOBDD aus Knoten 1 x3 x2 und Kanten nach folgenden Regeln: Knoten mit Variablen, 0 oder 1 markiert Kanten mit 0 oder 1 markiert Variablen-Knoten mit je einer ausgehenden 0- und 1-Kante Konstanten-Knoten ohne ausgehende Kante genau ein Knoten ohne eingehende Kante Kanten zwischen Variablenknoten beachten π Boole. Fkt. πOBDD – Ein Beispiel Variablenordnung π = (x1 , x2 , x3 ) Beispiel Auswertung f (1, 0, 1) x1 = 1, x2 = 0, x3 = 1 f (1, 0, 1) = 1 x1 0 1 x2 x2 0 1 x3 Boole. Fkt. 0 x3 1 x3 x3 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 πOBDD-Größe gleichartige Senken verschmelzen x1 0 1 x2 x2 0 1 x3 1 x3 0 Boole. Fkt. 0 0 1 1 x3 0 x3 0 1 1 0 1 πOBDD-Größe gleichartige Knoten verschmelzen x1 0 1 x2 x2 0 1 x3 1 x3 0 Boole. Fkt. 0 0 1 1 x3 0 0 1 1 πOBDD-Größe Knoten ohne Einfluss eliminieren x1 0 1 x2 x2 0 1 x3 1 1 x3 0 Boole. Fkt. 0 0 1 0 1 πOBDD-Größe Knoten ohne Einfluss eliminieren x1 0 1 x2 0 1 x3 1 x3 0 Boole. Fkt. 0 1 0 1 πOBDD-Größe Knoten ohne Einfluss eliminieren x1 0 1 x2 0 Größe minimal 1 x3 1 0 Boole. Fkt. 0 1 Alternative Darstellung eines πOBDDs x1 x2 x3 Boole. Fkt. 0 1 OBDD-Reduzierung Satz 9 Die erschöpfende Anwendung der ◮ Verschmelzungsregel Knoten mit gleicher Markierung und gleichen ” Nachfolgern können verschmolzen werden“ und ◮ Eliminationsregel Ein Knoten mit gleichem Null- und ” Einsnachfolger kann entfernt werden“ in beliebiger Reihenfolge führt zum reduzierten πOBDD. reduziert = minimale Größe und eindeutig Boole. Fkt. Erzeugung von OBDDs Wie kommt man zu einem πOBDD? für f : B n → B? Kommt darauf an, wie f gegeben ist. . . Welche Formate kennen wir? ◮ Funktionstabelle ◮ Wertevektor ◮ boolescher Ausdruck ◮ Normalformen ◮ informale Beschreibung ◮ OBDD ◮ ... Boole. Fkt. Erzeugung von OBDDs Man will nicht irgendein πOBDD, man will das reduzierte πOBDD. Welchen Weg kennen wir, das zu bekommen? 1. Erstelle vollständigen binären Baum über den Variablen, schreibe passende Funktionswerte an die Senken. 2. Reduziere. Ist das ein vernünftiges Vorgehen? Nur, wenn vollständiger Binärbaum nicht wesentlich größer als Eingabe und reduziertes πOBDD! Boole. Fkt. πOBDD aus vollständigem Binärbaum Variablenordnung π = (x1 , x2 , x3 ) x1 0 1 x2 x2 0 1 x3 Boole. Fkt. 0 x3 1 x3 x3 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 Größe von Repräsentationen boolescher Funktionen Wie groß ist ein πOBDD für f , das vollständiger Binärbaum ist? i -te Ebene 2i −1 Knoten n−1 n P i P 2 = 2n − 1 + Senken 2i −1 = Senken + Senken + Beobachtung also i =1 i =0 Für welche Eingabeformate ist das also akzeptabel? sicher nur für Wertetabelle und Wertevektor also Vorgehen fast immer nicht akzeptabel Erkenntnis Boole. Fkt. Wir brauchen eine Alternative. Schrittweise OBDD-Konstruktion Idee baue πOBDD schrittweise aus einfachsten“ πOBDDs zusammen ” 0 klar πOBDD für Nullfunktion 1 klar πOBDD für Einsfunktion 0 klar πOBDD für xi 0 xi 1 1 klar πOBDD für ¬f aus πOBDD für f durch Invertierung der Senkenmarkierungen Boole. Fkt. OBDD-Synthese πOBDD G1 für f1 : B n → B πOBDD G2 für f2 : B n → B πOBDD G für f1 ⊗ f2 für beliebige boolesche Funktion ⊗ : B 2 → B Wichtig Idee Boole. Fkt. gleiche Variablenordnung π Durchlaufe beide πOBDDs parallel. Ein einfaches Beispiel x4 1 x4 1 0 0 x1 2 0 0 3 x4 ∨ x4 x1 1 x1 2 1 1 0 1 4 0 3 x4 x1 1 0 1 boolesche Verknüpfung ⊕ x4 (1,1) x1 (2,2) 1 Variablenordnung x4 , x2 , x1 , x3 Boole. Fkt. 0 1 4 0 (3,3) 1 (4,3) (x4 ∨ x4 x1 ) ⊕ (x4 x1 ) = x4 πOBDD-Synthese πOBDD G1 für f1 : B n → B πOBDD G2 für f2 : B n → B πOBDD G für f1 ⊗ f2 für beliebige boolesche Funktion ⊗ : B 2 → B G1 hat Knoten v1 , v2 , . . . , vs1 . G2 hat Knoten w1 , w2 , . . . , ws2 . Wir starten in Wurzeln v1 und w1 . Mit dem aktuellen Knotenpaar machen wir einen Synthese-Schritt. Ergebnis des Synthese-Schritts: 1 Knoten des Ergebnis-πOBDD. Boole. Fkt. Ein Synthese-Schritt aktuelle Knoten vi , wj vi hat Markierung mi ∈ {x1 , x2 , . . . , xn , 0, 1} wj hat Markierung mj ∈ {x1 , x2 , . . . , xn , 0, 1} Falls mi ∈ / {0, 1} vi ,0 ist Nullnachfolger von vi vi ,1 ist Einsnachfolger von vi Falls mj ∈ / {0, 1} wj,0 ist Nullnachfolger von wj wj,1 ist Einsnachfolger von wj Wir unterscheiden mehrere Fälle nach den Markierungen mi und mj . Boole. Fkt. 1. Fall: gleiche Variable mi = mj = xk Erzeuge Knoten (vi , wj ) mit Markierung xk . Nullnachfolger der von Synthese-Schritt(vi ,0 , wj,0 ) erzeugte Knoten Einsnachfolger der von Synthese-Schritt(vi ,1, wj,1 ) erzeugte Knoten Boole. Fkt. 2. Fall: verschiedene Variable mi = xk , mj = xk ′ , xk vor xk ′ Erzeuge Knoten (vi , wj ) mit Markierung xk . Nullnachfolger der von Synthese-Schritt(vi ,0 , wj ) erzeugte Knoten Einsnachfolger der von Synthese-Schritt(vi ,1, wj ) erzeugte Knoten Boole. Fkt. 3. Fall: verschiedene Variable mi = xk , mj = xk ′ , xk hinter xk ′ Erzeuge Knoten (vi , wj ) mit Markierung xk ′ . Nullnachfolger der von Synthese-Schritt(vi , wj,0 ) erzeugte Knoten Einsnachfolger der von Synthese-Schritt(vi , wj,1 ) erzeugte Knoten Boole. Fkt. 4. Fall: eine Variable, eine Senke mi = xk , mj ∈ {0, 1} Idee Konstante liegen in der Variablenordnung ganz hinten Erzeuge Knoten (vi , wj ) mit Markierung xk . Nullnachfolger der von Synthese-Schritt(vi ,0 , wj ) erzeugte Knoten Einsnachfolger der von Synthese-Schritt(vi ,1, wj ) erzeugte Knoten Boole. Fkt. 5. Fall: eine Variable, eine Senke mi ∈ {0, 1}, mj = xk Erzeuge Knoten (vi , wj ) mit Markierung xk . Nullnachfolger der von Synthese-Schritt(vi , wj,0 ) erzeugte Knoten Einsnachfolger der von Synthese-Schritt(vi , wj,1 ) erzeugte Knoten Boole. Fkt. 6. Fall: zwei Senken mi ∈ {0, 1}, mj ∈ {0, 1} Erzeuge mit mi ⊗ mj markierte Senke. Zusammenfassung zum Merken 1. Erzeuge Knoten mit weiter vorne liegender“ Markierung. ” 2. Wenn beide Knoten mit gleicher Variabler markiert, aus beiden Knoten fortschreiten. 3. Bei ungleicher Variablenmarkierung, nur aus weiter vorne ” liegenden“ Knoten fortschreiten, im anderen Knoten warten. 4. Abbruch, wenn in beiden Knoten Senken erreicht. Boole. Fkt. Noch ein Beispiel 0 x1 (1,1) 1 x2 (2,1) 0 x1 1 0 2 1 0 1 3 0 2 x1 Variablenordnung x1 , x2 boolesche Verknüpfung ⊕ Boole. Fkt. x2 1 0 0 1 1 1 3 x2 1 x2 (3,1) 0 (2,2) 1 (3,2) 0 (2,3) x1 ⊕ x2 (3,3) Größenzuwachs bei Synthese Wie groß wird das neue πOBDD? Beobachtung also für je zwei Knoten höchstens ein neuer Knoten aus πOBDDs mit s1 und s2 Knoten neues πOBDD mit ≤ s1 · s2 Knoten Beobachtungen ◮ Ergebnis-πOBDD in der Regel nicht reduziert ◮ Größe s1 · s2 manchmal erforderlich (ohne Senken) Boole. Fkt. Operationen auf OBDDs Erinnerung OBDDs unterstützen viele wichtige Operationen √ 1. Reduzierung √ √ 2. Synthese 3. Auswertung 4. Konstantsetzung xi = c √ OBDD durchlaufen Vorgänger jedes xi -Knotens auf c-Nachfolger des xi -Knotens umsetzen 5. Gleichheitstest √ Voraussetzung gleiche Variablenordnung π beide reduzierte πOBDDs ab der Quelle parallel durchlaufen bei ungleicher Markierung ungleich rekursiv für Null- und Einsnachfolger Boole. Fkt. Operationen auf OBDDs (Fortsetzung) Erinnerung OBDDs unterstützen viele wichtige Operationen 6. Null-/Einseingabe finden √ mit OBDD-Durchlauf Vorgänger-Zeiger berechnen von passender Senke Aufstieg bis zur Quelle, dabei Belegung merken 7. Null-/Einseingaben zählen √ Beobachtung über Quelle laufen alle 2n Eingaben Beobachtung jede Knoten halbiert Anzahl Eingaben und leitet Hälften jeweils über 0- und 1-Nachfolger OBDD von der Quelle durchlaufen an jedem Knoten Anzahl Eingaben notieren bei mehrfach erreichten Knoten Anzahlen addieren Summe an der passenden Senke ablesen (für reduziertes πOBDD) Boole. Fkt. Schaltnetze bis jetzt Diskussion (theoretischer) Grundlagen Wo bleibt die Hardware? kommt jetzt Wunsch klar aber immer noch abstrakt Realisierung boolescher Funktionen in Hardware brauchen Realisierung einer funktional-vollständigen Menge boolescher Funktionen Erinnerung Realisierung von NAND reicht aus +V xy Beobachtung x y Boole. Fkt. realisiert NAND(x, y ) Gatter Realisierung mit Transistoren . . . falsche Ebene! Grundlage hier einfache logische Bausteine (Gatter) Bausteine für Negation, Konjunktion, Disjunktion, . . . Spielregeln ◮ Eingänge mit Variablen oder Konstanten belegt ◮ nur Verbindungen von Ausgängen zu Eingängen ◮ keine Kreise Ergebnis heißt Schaltnetz Boole. Fkt. Symbole für Gatter (1) Funktion DIN 40700 y =x x y y = x1 ∧ x2 ∧ x3 x1 x2 x3 y y = x1 ∧ x2 ∧ x3 x1 x2 x3 y Boole. Fkt. DIN EN 60617 IEEE x 1 y x y x1 x2 x3 & y x1 x2 x3 y x1 x2 x3 & y x1 x2 x3 y Symbole für Gatter (2) Funktion DIN 40700 y = x1 ∨ x2 ∨ x3 x1 x2 x3 y y = x1 ∨ x2 ∨ x3 x1 x2 x3 y y = x1 ⊕ x2 x1 y x2 y = x1 x2 ∨ x1 x2 Boole. Fkt. IEEE x1 x2 x3 >1 y x1 x2 x3 y x1 x2 x3 >1 y x1 x2 x3 y =1 y x1 x1 y y x2 x2 x1 x2 DIN EN 60617 x1 x1 y y x2 x2 Schaltnetz-Bewertung Und jetzt beliebige Schaltnetze entwerfen? mindestens relevant Größe und Geschwindigkeit ◮ Schaltnetzgröße (= Anzahl der Gatter) wegen Kosten, Stromverbrauch, Verlustleistung, Zuverlässigkeit, . . . ◮ Schaltnetztiefe (= Länge längster Weg Eingang wegen Schaltgeschwindigkeit ◮ Fan-In (= max. Anzahl eingehender Kanten) wegen Realisierungsaufwand ◮ Fan-Out (= max. Anzahl ausgehender Kanten) wegen Realisierungsaufwand ◮ . . . (z. B. Anzahl Gattertypen, Testbarkeit, Verifizierbarkeit) Boole. Fkt. Ausgang) Was wir schon wissen Jede boolesche Funktion kann mit einem {∧, ∨, ¬}- bzw. einem {⊕, ∧, ¬}-Schaltnetz der Tiefe 3 realisiert werden. Beweis DNF, KNF oder RNF direkt umsetzen Probleme ◮ Fan-In des tiefsten Gatters kann extrem groß sein ◮ Größe des Schaltnetzes oft inakzeptabel Boole. Fkt. Beispiel: DNF fbsp : B 3 → B, Wertevektor (1, 0, 0, 0, 1, 1, 1, 1) f (x1 , x2 , x3 ) = x1 x2 x3 ∨ x1 x2 x3 ∨ x1 x2 x3 ∨ x1 x2 x3 ∨ x1 x2 x3 x1 1 & & x2 1 & & & x3 Boole. Fkt. 1 >1 f bsp Beispiel: RNF fbsp : B 3 → B, Wertevektor (1, 0, 0, 0, 1, 1, 1, 1) f (x1 , x2 , x3 ) = x1 x2 x3 ⊕ x1 x2 x3 ⊕ x1 x2 x3 ⊕ x1 x2 x3 ⊕ x1 x2 x3 x1 1 & & x2 1 & & & x3 Boole. Fkt. 1 =1 f bsp Beispiel: KNF fbsp : B 3 → B, Wertevektor (1, 0, 0, 0, 1, 1, 1, 1) f (x1 , x2 , x3 ) = (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ) x1 >1 x2 1 >1 x3 1 >1 Boole. Fkt. & f bsp Multiplexer eine weitere Beispielfunktion . . . aber eine in der Praxis sehr wichtige diesmal! MUXd y1 , y2 , . . . , yd , x0 , x1 , . . . , x2d −1 = x(y1 y2 ··· yd )2 Beispiel y1 y2 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 Boole. Fkt. y3 0 1 0 1 0 1 0 1 MUX3 (y1 , y2 , y3 , x0 , x1 , . . . , x7 ) x0 x1 x2 x3 x4 x5 x6 x7 Multiplexer Warum ist MUX in der Praxis wichtig? direkte Speicheradressierung OBDD-Realisierung Welche Variablenordnung π? wohl sinnvoll Adressvariablen zuerst denn Wir müssen uns sonst alle Datenvariablen merken! Boole. Fkt. OBDD-Realisierung MUX3 Variablenordnung π = (y1 , y2 , y3 , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 ) y1 0 1 y2 0 y2 1 0 y3 0 x0 y3 1 x1 0 y3 1 x2 0 x3 0 1 y3 1 x4 jeweils xi realisieren Boole. Fkt. 1 x5 xi 0 0 1 1 0 x6 1 x7 Einfluss von π auf OBDD-Größe Beispiel MUXd gesehen Variablenordnung π = (y1 , y2 , . . . , yd , x0 , x1 , . . . , x2d −1 ) Größe des reduzierten πOBDDs? oben unten vollständiger Binärbaum über y1 , y2 , . . . , yd 20 + 21 + · · · + 2d−1 = 2d − 1 Knoten je ein xi -Knoten und zwei Senken 2d + 2 Knoten zusammen Boole. Fkt. 2d − 1 + 2d + 2 = 2d+1 + 1 Knoten Einfluss von π auf OBDD-Größe Beispiel MUXd gesehen Variablenordnung π = (y1 , y2 , . . . , yd , x0 , x1 , . . . , x2d −1 ) Größe des reduzierten πOBDD 2d+1 + 1 Betrachte Variablenordnung π = (x0 , x1 , . . . , x2d −1 , y1 , y2 , . . . , yd ) Größe des reduzierten πOBDDs? Behauptung Beweis Boole. Fkt. d ∀x 6= x ′ ∈ {0, 1}2 : nach Lesen von x bzw. x ′ verschiedene Knoten erreicht durch Widerspruch Widerspruchsbeweis zur OBDD-Größe d ∀x 6= x ′ ∈ {0, 1}2 : nach Lesen von x bzw. x ′ verschiedene Knoten erreicht Behauptung Annahme Betrachte Betrachte d für x 6= x ′ ∈ {0, 1}2 gleiche Knoten v erreicht i = min{j | xj 6= xj′ } y1 , y2 , . . . , yd mit (y1 y2 · · · yd )2 = i Beobachtung MUXd (y1 , y2 , . . . , yd , x) = xi 6=xi′ = MUXd (y1 , y2 , . . . , yd , x ′ ) aber OBDD berechnet gleichen Wert, da gleicher Knoten erreicht also minimales OBDD für π = (x0 , x1 , . . . , x2d −1 , y1 , y2 , . . . , yd ) d hat Größe mindestens 22 − 1 (Binärbaum d. Tiefe 2d ) min. OBDD-Größe π = (d, x) min. OBDD-Größe π = (x, d) 9 ≥ 15 33 ≥ 65 535 513 ≥ 1,1579 · 1077 d 2 4 8 Boole. Fkt. Schaltnetz für MUX3 x0 & x1 & x2 & x3 & x4 & >1 x5 & x6 & x7 Boole. Fkt. & 1 1 1 y1 y2 y3 MUX3