Un circuit booléen dans TCS est fondamentalement un DAG composé de portes And, Or, Not, et par ce qui est connu comme "complétude fonctionnelle", ils peuvent calculer toutes les fonctions possibles. c'est par exemple le principe de base d'une ALU .
Défi: créer un circuit pour déterminer si un nombre à 8 chiffres binaires est divisible par 3 et visualiser en quelque sorte votre résultat (c'est-à-dire dans une sorte d'image)
Les critères de jugement pour les votants sont basés sur le fait que le code pour générer le circuit se généralise bien à des nombres de taille arbitraires, et si la visualisation créée par algorithme est compacte / équilibrée mais néanmoins lisible par l'homme (c'est-à-dire que la visualisation à la main n'est pas autorisée). c'est-à-dire que la visualisation est uniquement pour n = 8 mais le code fonctionnera idéalement pour tous les «n». l'entrée gagnante est juste votée en haut.
Question un peu similaire: construire une machine à multiplier à l'aide de portes logiques NAND
gate-golf
? cette balise est inexistante. note aux participants: veuillez indiquer la langue / l'outil de visualisation que vous utilisez. si quelqu'un d'autre veut entrer un commentaire plz. sinon acceptera le gagnant tonite. Merci beaucoup aux répondants jusqu'à présent, cela s'est avéré "BTE" mieux que prévu!Réponses:
Le graphique maintient 3 booléens à chaque niveau i. Ils représentent le fait que les i bits de poids fort du nombre sont égaux à 0, 1 ou 2 mod 3. À chaque niveau, nous calculons les trois bits suivants sur la base des trois bits précédents et du bit d'entrée suivant.
Voici le code python qui a généré le graphique. Modifiez simplement N pour obtenir un nombre différent de bits, ou K pour obtenir un module différent. Exécutez la sortie du programme python via dot pour générer l'image.
la source
Profondeur: 7 (logarithmique), 18x ET, 6x OU, 7x XOR, 31 portes (linéaire)
Permettez-moi de calculer la somme des chiffres en base quatre, modulo trois:
circuit tracé dans Logisim
Généralisation, formellement (je l'espère quelque peu lisible):
maintenant en anglais:
Bien qu'il y ait plus de deux bits dans le nombre, prenez les deux paires de bits les plus basses et additionnez-les modulo 3, puis ajoutez le résultat à l'arrière du nombre, puis retournez si la dernière paire est zéro modulo 3. S'il y a un impair nombre de bits dans le nombre, ajoutez un bit zéro supplémentaire en haut, puis polissez avec une propagation de valeur constante.
L'ajout à l'arrière plutôt qu'à l'avant garantit que l'arbre d'addition est un arbre équilibré plutôt qu'une liste liée. Ceci, à son tour, garantit une profondeur logarithmique du nombre de bits: cinq portes et trois niveaux pour l'annulation de paires, et une porte supplémentaire à la fin.
Bien sûr, si une planarité approximative est souhaitée, passez la paire supérieure non modifiée à la couche suivante au lieu de l'envelopper à l'avant. Cependant, c'est plus facile à dire qu'à implémenter (même en pseudocode). Si le nombre de bits d'un nombre est une puissance de deux (comme c'est le cas dans tout système informatique moderne à partir de mars 2014), aucune paire isolée ne se produira cependant.
Si le planificateur préserve la localité / effectue une minimisation de la longueur de l'itinéraire, il doit garder le circuit lisible.
Ce code Ruby générera un schéma de circuit pour n'importe quel nombre de bits (même un). Pour imprimer, ouvrir dans Logisim et exporter en tant qu'image:
enfin, lorsqu'on lui a demandé de créer une sortie pour 32 bits, mon layouter génère cela. Certes, ce n'est pas très compact pour des entrées très larges:
la source
2 × 24 NON, 2 × 10 + 5 ET, 2 × 2 + 5 OU, 2 × 2 NOR
Cela ne change absolument pas. Comme pas du tout. J'essaierai peut-être de l'améliorer.
J'ai testé cela pour des nombres allant jusqu'à 30 et cela a bien fonctionné.
Ces 2 gros circuits comptent le nombre d'entrées actives:
Si la différence de ces nombres est
0
ou3
le nombre est divisible par3
. Le circuit inférieur droit des cartes essentiellement chaque combinaison valide (4,4
,4,1
,3,3
,3,0
,2, 2
,1, 1
,0, 0
) dans un ou.Le petit cercle au milieu est une LED qui est allumée si le nombre est divisible par 3 et éteinte sinon.
la source