Eine Boolesche Schaltung in TCS ist im Grunde eine DAG, die aus And, Or, Not-Gattern besteht, und mit der Funktion "Funktionsvollständigkeit" können sie alle möglichen Funktionen berechnen. Dies ist zB das Grundprinzip einer ALU .
Herausforderung: Erstellen Sie eine Schaltung, um zu bestimmen, ob eine 8-stellige Zahl durch 3 teilbar ist, und visualisieren Sie Ihr Ergebnis irgendwie (dh in irgendeiner Art von Bild).
Das Beurteilungskriterium für Wähler basiert darauf, ob der Code zum Erzeugen der Schaltung gut auf Zahlen beliebiger Größe verallgemeinert wird und ob die algorithmisch erstellte Visualisierung kompakt / ausgewogen, aber dennoch für den Menschen lesbar ist (dh eine Visualisierung von Hand ist nicht zulässig). dh die Visualisierung ist nur für n = 8, aber der Code funktioniert idealerweise für alle 'n'. der siegreiche Beitrag wird nur von den Besten bewertet.
Etwas ähnliche Frage: Erstellen Sie eine Multiplikationsmaschine mit NAND-Logikgattern
gate-golf
? Dieses Tag ist nicht vorhanden. Hinweis für Teilnehmer: Bitte geben Sie an, welche Sprache / welches Visualisierungstool Sie verwenden. Wenn jemand anderes einen PLZ-Kommentar eingeben möchte. Andernfalls wird Winner Tonite akzeptieren. Vielen Dank an die Befragten, bisher lief das "BTE" besser als erwartet!Antworten:
Das Diagramm enthält 3 Boolesche Werte auf jeder Ebene i. Sie repräsentieren die Tatsache, dass die höherwertigen i-Bits der Zahl gleich 0, 1 oder 2 mod 3 sind. Auf jeder Ebene berechnen wir die nächsten drei Bits basierend auf den vorherigen drei Bits und dem nächsten Eingabebit.
Hier ist der Python-Code, der das Diagramm generiert hat. Ändern Sie einfach N, um eine andere Anzahl von Bits zu erhalten, oder K, um einen anderen Modul zu erhalten. Führen Sie die Ausgabe des Python-Programms über dot aus , um das Image zu generieren.
quelle
Tiefe: 7 (logarithmisch), 18x AND, 6x OR, 7x XOR, 31 Gatter (linear)
Lassen Sie mich die Ziffernsumme in Basis vier, Modulo drei berechnen:
Schaltung in Logisim gezeichnet
Verallgemeinerung, formal (hoffentlich etwas lesbar):
jetzt auf englisch:
Wenn die Zahl mehr als zwei Bits enthält, nehmen Sie zwei niedrigste Bitpaare und addieren Sie sie mit Modulo 3, hängen Sie das Ergebnis an die Rückseite der Zahl an und geben Sie dann zurück, wenn das letzte Paar Null mit Modulo 3 ist. Wenn eine ungerade Zahl vorliegt Anzahl der Bits in der Zahl, fügen Sie ein zusätzliches Nullbit oben hinzu und polieren Sie dann mit konstanter Werteausbreitung.
Das Anhängen an die Rückseite anstatt an die Vorderseite stellt sicher, dass der Additionsbaum ein ausgeglichener Baum und keine verknüpfte Liste ist. Dies sichert wiederum die logarithmische Tiefe der Anzahl der Bits: fünf Gatter und drei Ebenen für die Paarlöschung und ein zusätzliches Gatter am Ende.
Wenn eine ungefähre Planarität gewünscht wird, übergeben Sie das obere Paar natürlich unverändert an die nächste Ebene, anstatt es nach vorne zu wickeln. Dies ist jedoch einfacher gesagt als implementiert (auch im Pseudocode). Wenn die Anzahl der Bits in einer Zahl eine Zweierpotenz ist (wie es in jedem modernen Computersystem ab März 2014 der Fall ist), treten jedoch keine Einzelpaare auf.
Wenn der Layouter die Lokalität beibehält / eine Minimierung der Routenlänge durchführt, sollte die Schaltung lesbar bleiben.
Dieser Ruby-Code generiert ein Schaltbild für eine beliebige Anzahl von Bits (sogar eines). Zum Drucken in Logisim öffnen und als Bild exportieren:
Auf die Aufforderung hin, eine Ausgabe für 32 Bit zu erstellen, generiert mein Layouter diese. Zugegebenermaßen ist es für sehr breite Eingaben nicht sehr kompakt:
quelle
2 × 24 NICHT, 2 × 10 + 5 UND, 2 × 2 + 5 ODER, 2 × 2 NOR
Das skaliert total nicht. Wie überhaupt nicht. Vielleicht versuche ich es zu verbessern.
Ich habe dies für Zahlen bis zu 30 getestet und es hat gut funktioniert.
Diese 2 großen Schaltkreise zählen die Anzahl der aktiven Eingänge:
Ist der Unterschied dieser Zahlen
0
oder ist3
die Zahl durch teilbar3
. Die untere rechte Schaltung im Grunde ordnet jede gültige Kombination (4,4
,4,1
,3,3
,3,0
,2, 2
,1, 1
,0, 0
) in eine oder.Der kleine Kreis in der Mitte ist eine LED, die an ist, wenn die Zahl durch 3 teilbar ist, und ansonsten aus ist.
quelle