Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.47.0-wmf.7 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Event Event talk Modèle:DicoPhilo 10 30508 767907 767704 2026-06-17T05:28:26Z PandaMystique 119061 767907 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ {{#if:{{{lecture|}}}| <div style="text-align: right; margin-top: -0.8em; margin-bottom: 1em; color: #777;"> <small>{{#invoke:Lecture|pages}} pages, {{#invoke:Lecture|temps}}</small> </div> }}</div> <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> dqay0g0ylov02gvmjuc8m8h3i2kv9yr 767908 767907 2026-06-17T05:32:06Z PandaMystique 119061 767908 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ {{#if:{{{lecture|}}}| <div style="text-align: center; margin-top: -0.8em; margin-bottom: 1em; color: #777;"> <small>{{#invoke:Lecture|pages|page={{FULLPAGENAME}}}} pages, {{#invoke:Lecture|temps|page={{FULLPAGENAME}}}}</small> </div> }}</div> <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> p0kmdkjn5x9ssfm0ai7fg3n6t82ngv1 767909 767908 2026-06-17T05:32:45Z PandaMystique 119061 767909 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ {{#if:{{{lecture|}}}| <div style="text-align: right; margin-top: -0.8em; margin-bottom: 1em; color: #777;"> <small>{{#invoke:Lecture|pages|page={{FULLPAGENAME}}}} pages, {{#invoke:Lecture|temps|page={{FULLPAGENAME}}}}</small> </div> }}</div> <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> b3j6hdk9j9j0igt078hxwzcusr8aiee 767911 767909 2026-06-17T05:33:23Z PandaMystique 119061 767911 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ </div>{{#if:{{{lecture|}}}| <div style="text-align: right; margin-top: -0.8em; margin-bottom: 1em; color: #777;"> <small>{{#invoke:Lecture|pages|page={{FULLPAGENAME}}}} pages, {{#invoke:Lecture|temps|page={{FULLPAGENAME}}}}</small> </div> }} <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> arbtycv363ygra7eeeuzeobob55lqlx 767912 767911 2026-06-17T05:35:25Z PandaMystique 119061 767912 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ </div>{{#if:{{{lecture|}}}|<div style="text-align: right; margin-top: -0.8em; margin-bottom: 1em; color: #777;"><small>{{#invoke:Lecture|pages|page={{FULLPAGENAME}}}} pages, {{#invoke:Lecture|temps|page={{FULLPAGENAME}}}}</small></div>}} <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> ly5y63rd50oqt9lrihjsxkq2brmi1bc 767914 767912 2026-06-17T05:36:37Z PandaMystique 119061 767914 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ MODÈLE : DicoPhilo - Barre de navigation alphabétique Usage : {{DicoPhilo|A}} où A est la lettre courante ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #f8f7f5, #eae8e4); border: 1px solid #c9c2b4; border-radius: 6px; padding: 10px 8px; margin-bottom: 1.2em; box-shadow: 0 2px 4px rgba(0,0,0,0.06);"> <table style="width: 100%; border-collapse: separate; border-spacing: 4px; margin: 0 auto;"> <tr> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|A|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|B|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|C|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|D|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|E|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|F|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|G|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|H|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|I|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|J|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|K|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|L|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|M|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|N|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|O|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|P|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Q|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|R|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|S|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|T|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|U|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|V|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|W|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|X|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Y|{{{1}}}}}</td> <td style="text-align:center; width:3.84%;">{{DicoPhilo/Lettre|Z|{{{1}}}}}</td> </tr> </table> </div> <div style="text-align: center; font-size: 1.4em; font-weight: bold; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 2px solid #8b7355; color: #777;">※ {{{1}}} ※ </div>{{#if:{{{lecture|}}}|<div style="text-align: right; margin-top: -0.8em; color: #777;"><small>{{#invoke:Lecture|pages|page={{FULLPAGENAME}}}} pages, {{#invoke:Lecture|temps|page={{FULLPAGENAME}}}}</small></div>}} <noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre]]</noinclude><includeonly>[[Catégorie:Dictionnaire de philosophie (livre)]]</includeonly> <includeonly>{{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}}</includeonly> fevdufktotmr8og9tffsscuhhzvreqv Dictionnaire de philosophie/A (logique) 0 30510 767910 766468 2026-06-17T05:32:54Z PandaMystique 119061 767910 wikitext text/x-wiki {{DicoPhilo|A (logique)|lecture=oui}} '''A''' est le symbole qui représente les '''propositions universelles affirmatives''' dans la logique catégorique, codifiée par la tradition scolastique médiévale à partir des distinctions introduites par Aristote et enseignée jusqu'à la fin du XIX{{e}} siècle. == Structure de la proposition universelle affirmative == Une proposition universelle affirmative prend la forme canonique : ''tous les hommes sont mortels''. Dans cette proposition, ''homme'' est le sujet, et ''mortel'' est l'attribut (ou ''prédicat''), c'est-à-dire ce que l'on dit du sujet. Entre les deux se trouve la copule (''sont''), qui établit le lien logique d'attribution<ref>Pierre Joray, « Syllogisme (A) », dans Maxime Kristanek (dir.), ''l'Encyclopédie philosophique'', 2016, https://encyclo-philo.fr/syllogisme-a</ref>. L'attribut ''mortel'' est affirmé de tous les hommes, c'est-à-dire qu'il est affirmé de manière universelle. Universel signifie ici que l'on considère tous les individus en particulier désignés par le sujet (tel homme, Socrate, etc.), et que l'on dit de chacun de ces individus, sans exception, qu'il possède l'attribut ''mortel''<ref>Henrik Lagerlund (éd.), ''Encyclopedia of Medieval Philosophy. Philosophy between 500 and 1500'', Dordrecht, Springer, 2020, article « Syllogism, Theories of »</ref>. On dit que le sujet a une ''extension universelle'' dans la proposition. == Les quatre types de propositions catégoriques == La proposition de type A constitue l'une des quatre formes de propositions catégoriques, que l'on distingue selon deux critères : la ''quantité'' (universelle ou particulière) et la ''qualité'' (affirmative ou négative)<ref>Henrik Lagerlund (éd.), ''Encyclopedia of Medieval Philosophy'', op. cit.</ref>. Aristote a établi ces distinctions conceptuelles fondamentales, mais la notation alphabétique A, E, I, O n'est pas aristotélicienne. Elle relève de la tradition scolastique médiévale, qui a codifié ces quatre formes en les désignant par les voyelles des mots latins ''AffIrmo'' (« j'affirme ») pour A et I, et ''nEgO'' (« je nie ») pour E et O. Les logiciens du Moyen Âge ont ainsi créé un procédé mnémotechnique à la fois clair et mémorisable<ref>Jean Jolivet, ''Arts du langage et théologie chez Abélard'', Vrin, 1969 ; voir aussi Istvan Bejczy (éd.), ''Companion to Medieval Logic and Philosophical Language'', Brill, 2020</ref>. Les médiévaux exprimaient ces quatre formes par ce distique mnémotechnique : :''Asserit '''A''', negat '''E''', verum generaliter ambo ;''<br/> :''Asserit '''I''', negat '''O''', sed particulariter ambo.'' Ce qui signifie : « A affirme, E nie, tous deux de manière universelle ; I affirme, O nie, tous deux de manière particulière »<ref>Antoine Arnauld et Pierre Nicole, ''[[s:La Logique ou l’Art de penser|La Logique ou l'art de penser]]'', Paris, 1662, 2{{e}} partie, chapitre 3</ref>. Les quatre types se formulent donc ainsi. Une proposition de type '''A''' (universelle affirmative) prend la forme « Tous les S sont P » — par exemple : tous les hommes sont mortels. Une proposition de type '''E''' (universelle négative) prend la forme « Aucun S n'est P » — par exemple : aucun homme n'est immortel. Une proposition de type '''I''' (particulière affirmative) prend la forme « Quelques S sont P » — par exemple : quelques hommes sont sages. Une proposition de type '''O''' (particulière négative) prend la forme « Quelques S ne sont pas P » — par exemple : quelques hommes ne sont pas sages. === Remarque sur l'import existentiel === Quand on dit « Tous les hommes sont mortels », on suppose naturellement qu'il existe effectivement des hommes. C'est ce que les logiciens appellent l'''import existentiel'' : l'affirmation « Tous les S sont P » inclut implicitement l'idée que la classe ''S'' (ici, les hommes) n'est pas vide. Cette hypothèse était évidente aux yeux d'Aristote et des logiciens médiévaux qui l'ont suivi. Or, cette présupposition pose un problème subtil mais important. Imaginez une proposition comme « Toutes les licornes sont blanches ». Dans la logique traditionnelle, cette phrase serait problématique ou fausse, puisque les licornes n'existent pas : on ne peut pas affirmer quelque chose de tous les membres d'une classe qui n'existe pas. Mais dans la logique moderne, inventée aux XIX{{e}} et XX{{e}} siècles, une telle proposition serait considérée comme ''vraie par vacuité'' — c'est-à-dire vraie simplement parce qu'il n'existe aucune licorne pour démentir l'affirmation. Cette différence peut sembler technique, mais elle a des conséquences concrètes. En logique traditionnelle, si je dis « Tous les hommes sont mortels » (proposition A) et « Quelques hommes sont mortels » (proposition I), ces deux affirmations sont étroitement liées : si la première est vraie, la seconde l'est aussi. Les logiciens appellent cette relation une ''subalternation''. Mais en logique moderne, cette relation disparaît : on peut avoir « Toutes les licornes sont blanches » (vrai par vacuité, puisqu'il n'y a pas de licornes) sans pouvoir en déduire « Quelques licornes sont blanches » (faux, puisqu'il n'existe aucune licorne pour être blanche). Voilà pourquoi il faut toujours garder en mémoire que la logique aristotélicienne classique et la logique contemporaine n'interprètent pas la forme « Tous les S sont P » de la même manière. Cela n'affaiblit ni l'une ni l'autre : c'est simplement qu'elles opèrent dans des cadres différents<ref>Terence Parsons, ''Articulating Medieval Logic'', Oxford, Oxford University Press, 2014 ; voir aussi Stephen Read, « Aristotelian Nonchalance: the Insouciance of the Early Aristotelian Logician towards the Principle of Non-Contradiction », ''Mind'', 122:488, 2013, p. 875-914</ref>. == Rôle dans le syllogisme == Les propositions de type A jouent un rôle central dans la théorie du syllogisme. Le mode syllogistique '''Barbara''', qu'Aristote considère comme le syllogisme parfait de la première figure, se compose exclusivement de trois propositions de type A<ref>Aristote, ''[[s:Premiers Analytiques|Premiers Analytiques]]'', I, 4, 25b37-26a2</ref><ref>William Kneale et Martha Kneale, ''The Development of Logic'', Oxford, Clarendon Press, 1962, p. 67-90</ref> : :''Tous les B sont A''<br/> :''Tous les C sont B''<br/> :''Donc, tous les C sont A'' Par exemple : :''Tous les hommes sont mortels''<br/> :''Tous les Grecs sont des hommes''<br/> :''Donc, tous les Grecs sont mortels'' == Extension en logique modale == Aristote n'a pas limité sa logique aux propositions simples du type « Tous les hommes sont mortels ». Il a aussi étudié ce qu'on appelle les ''propositions modales'', c'est-à-dire des énoncés qui ajoutent une notion de ''nécessité'' ou de ''possibilité''. Pour comprendre la différence, comparons : * Proposition simple (ou assertorique) : « Tous les hommes sont mortels » * Proposition modale : « Tous les hommes ''sont nécessairement'' mortels » Dans le second cas, on affirme non seulement que les hommes sont mortels, mais que cette mortalité est ''inévitable'', liée à la nature même des choses. === Où porte la modalité ? === Une question importante se pose : quand je dis « Tout homme est nécessairement mortel », qu'est-ce qui est nécessaire ? Deux interprétations sont possibles. Selon la première lecture, la nécessité porte sur le ''lien d'attribution'' entre le sujet et le prédicat — c'est-à-dire sur le verbe « est ». On dit que c'est une modalité ''de re'', qui signifie « sur la chose ». L'idée est que le fait que les hommes soient mortels est inévitable, inscrit dans leur nature. Selon la seconde lecture, la nécessité porte sur ''l'ensemble de l'énoncé'' : on affirme qu'il est nécessairement vrai que tous les hommes sont mortels. C'est une modalité ''de dicto'', qui signifie « de ce qui est dit ». L'idée est que la ''proposition elle-même'' est nécessairement vraie. Ces deux façons de voir ne donnent pas exactement les mêmes résultats logiques, et les logiciens ont longtemps débattu de celle qu'Aristote avait en tête. === La possibilité : deux sens différents === Aristote s'est aussi demandé ce que signifiait « possible ». Là aussi, il faut être prudent. Quand on dit « Il est possible que les hommes aient des ailes », on peut entendre deux choses : * La ''possibilité bilatérale'' : quelque chose qui pourrait être vrai ''ou'' faux — ce qui n'est ni forcément vrai ni forcément faux. Par exemple, « Il pleuvra demain » est bilatéralement possible : c'est un fait qui dépend des conditions, et aucune loi de la nature ne le détermine d'avance. * La ''possibilité unilatérale'' : quelque chose qui n'est ''pas impossible''— ce qui inclut à la fois ce qui est vrai et ce qui pourrait ne pas l'être. Par exemple, « Deux plus deux égale quatre » est unilatéralement possible, puisqu'il n'est certainement pas impossible (c'est même nécessaire). Mais « Il pleuvra demain » l'est aussi. Pour Aristote et les logiciens médiévaux, cette distinction importait beaucoup, car elle change la façon dont on peut combiner les propositions modales dans un ''syllogisme''. Un syllogisme dont toutes les prémisses sont modales ne fonctionne pas de la même façon selon qu'on utilise la possibilité bilatérale ou la possibilité unilatérale. === Les limites de notre connaissance === Aristote a écrit sur la syllogistique modale il y a plus de deux mille ans, et son texte est parfois difficile à interpréter. Les savants contemporains ne s'accordent pas entièrement sur ce qu'il voulait dire, notamment sur : * La localisation exacte de la modalité : doit-on la placer sur la copule (le verbe « être »), sur toute la phrase, ou ailleurs ? * Le sens précis de la possibilité qu'il avait en tête * La cohérence interne du système : certains ont même demandé si Aristote avait véritablement réussi à construire un système modal complètement cohérent Ces questions restent au cœur de la recherche en histoire de la logique. Ce que nous présentons ici est donc la ''lecture la plus courante'', celle que la plupart des historiens considèrent comme juste, mais il faut savoir que d'autres interprétations existent et sont défendues par d'excellents savants<ref>Clarence Protin, « A Logic for Aristotle's Modal Syllogistic », arXiv:2110.00316, 2021</ref><ref>Marko Malink, ''Aristotle's Modal Syllogistic'', Cambridge, MA et Londres, Harvard University Press, 2013</ref><ref>Pierre Joray, « Syllogisme (A) », dans Maxime Kristanek (dir.), ''l'Encyclopédie philosophique'', 2016, https://encyclo-philo.fr/syllogisme-a</ref>. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources primaires === * '''Aristote''', ''Premiers Analytiques'' (''Analytica Priora''), livres I-II. Traduction française : Jules Tricot, ''Organon III : Les Premiers Analytiques'', Paris, Vrin, collection « Bibliothèque des textes philosophiques », 1936 (réimpr. 1992) ; Michel Crubellier (trad.), ''Premiers Analytiques'', Paris, Flammarion, collection « GF », 2014. * '''Aristote''', ''De l'interprétation'' (''Peri Hermeneias''). Traduction française : Jules Tricot, ''Organon II : De l'interprétation'', Paris, Vrin, 1936. * '''Antoine Arnauld''' et '''Pierre Nicole''', ''La Logique ou l'art de penser'' (dite ''Logique de Port-Royal''), Paris, 1662 (première édition). Éditions modernes : Charles Jourdain (éd.), Paris, Hachette, 1854 ; Pierre Clair et François Girbal (éd.), Paris, Vrin, 1993 ; Dominique Descotes (éd.), Paris, Champion, 2014. === Études === * '''William Kneale''' et '''Martha Kneale''', ''The Development of Logic'', Oxford, Clarendon Press, 1962 (ouvrage de référence sur l'histoire de la logique). * '''Pierre Joray''', « Syllogisme (A) », dans Maxime Kristanek (dir.), ''l'Encyclopédie philosophique'', 2016, en ligne : https://encyclo-philo.fr/syllogisme-a * '''Henrik Lagerlund''' (éd.), ''Encyclopedia of Medieval Philosophy. Philosophy between 500 and 1500'', Dordrecht, Springer, 2020, articles « Aristotle », « Syllogism, Theories of ». * '''Jean Jolivet''', ''Arts du langage et théologie chez Abélard'', Paris, Vrin, 1969 (ouvrage classique sur la logique médiévale et ses procédés mnémotechniques). * '''Istvan Bejczy''' (éd.), ''Companion to Medieval Logic and Philosophical Language'', Brill, 2020 (ressource contemporaine sur la logique scolastique). * '''Marko Malink''', ''Aristotle's Modal Syllogistic'', Cambridge, MA et Londres, Harvard University Press, 2013 (réinterprétation majeure de la syllogistique modale aristotélicienne). * '''Clarence Protin''', « A Logic for Aristotle's Modal Syllogistic », arXiv:2110.00316, 2021 (proposition d'un nouveau système de logique modale pour interpréter la théorie aristotélicienne du syllogisme modal). * '''Terence Parsons''', ''Articulating Medieval Logic'', Oxford, Oxford University Press, 2014 (étude fondamentale sur les présupposés de la logique traditionnelle, notamment l'import existentiel). * '''Stephen Read''', « Aristotle's Theory of the Assertoric Syllogistic », PhilPapers, en ligne : https://philpapers.org/archive/REAATO-4.pdf == Voir aussi == {{MotPhilo|Proposition}}, {{MotPhilo|Syllogisme}}, {{MotPhilo|Carré logique}}, {{MotPhilo|Import existentiel}}. {{Autocat}} lxflgn9bm438t2jl7yxhct1xqxgc1et Dictionnaire de philosophie/C 0 30593 767916 767277 2026-06-17T05:44:32Z PandaMystique 119061 767916 wikitext text/x-wiki {{DicoPhilo|C}} <!-- Grille de contenu --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Carnéade|Carnéade]] :Catégorie :[[Dictionnaire de philosophie/Causalité|Causalité]] :Cause :Caverne (allégorie) :[[Dictionnaire de philosophie/Certitude|Certitude]] :{{MotPhilo|Chamfort}} : ''Chine'' ::— [[Dictionnaire de philosophie/Chine|Pensée chinoise]] ::— [[Dictionnaire de philosophie/Esthétique dans la pensée chinoise|Esthétique dans la pensée chinoise]] :Chose :Civilisation </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :''Clinamen'' :''{{MotPhilo|Cogito}}'' :[[Dictionnaire de philosophie/Concept|Concept]] :[[Dictionnaire de philosophie/Connaissance|Connaissance]] :[[Dictionnaire de philosophie/Conscience|Conscience]] :{{Page|Consensus}} :Contemplation :[[Dictionnaire de philosophie/Contingence|Contingence]] :Contradiction :Contrat :[[Dictionnaire de philosophie/Convention|Convention]] :[[Dictionnaire de philosophie/Courage|Courage]] :{{Page|Criticisme}} </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Croyance|Croyance]] :[[Dictionnaire de philosophie/Culture|Culture]] :Cynisme </div> </div> {{PhiloRecherche}} {{Autocat}} mtze7dep94kpor9slpq7yio43ndp2mw Fonctionnement d'un ordinateur/Les circuits pour l'addition et la soustraction 0 65787 767823 755735 2026-06-16T13:44:53Z Mewtow 31375 /* L'incrémenteur */ 767823 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. L'entrée de retenue entrante est forcément mise à 1, sans quoi l'incrémentation n'a pas lieu. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Quelques incrémenteurs permettent cependant de configurer l'entrée de retenue de l'incrémenteur. Il est ainsi possible de la mettre à 0 ou à 1, ce qui effectue soit : une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ===Les incrémenteurs plus complexes sont rares=== Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> qqc0ay8agdbi8t5oakt6g5acid7whx7 767824 767823 2026-06-16T13:46:59Z Mewtow 31375 /* Les incrémenteurs plus complexes sont rares */ 767824 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. L'entrée de retenue entrante est forcément mise à 1, sans quoi l'incrémentation n'a pas lieu. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Quelques incrémenteurs permettent cependant de configurer l'entrée de retenue de l'incrémenteur. Il est ainsi possible de la mettre à 0 ou à 1, ce qui effectue soit : une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> hju17rm3yhveu1m6p5hxx30zyqa1moo 767825 767824 2026-06-16T13:48:25Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 767825 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> ec6e4lp29s9ntv7w6qiu00euuvledly 767826 767825 2026-06-16T13:48:37Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 767826 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> smcoscg23xqnfqvfobpy6edy51bz899 767828 767826 2026-06-16T14:00:44Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767828 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 6sln626wr55uspx38evwpzgzl465960 767829 767828 2026-06-16T14:16:14Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767829 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Une première solution pour cela est d'utiliser la technique dite du '''''carry skip'''''. L'idée est que la retenue d'un paquet de deux bits est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. Le calcul de la retenue sortante est un simple ET logique entre la retenue entrante et les deux bits d'opérande. Le calcul des bits du résultat se fait normalement, en enchainant deux demi-additionneurs et en retirant les logiques superflues. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2|Incrémenteur ''carry skip'' 2 bits]] Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> aswv65bxpf7qe9q0ymbmmgmuo52jw0p 767830 767829 2026-06-16T14:16:27Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767830 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Une première solution pour cela est d'utiliser la technique dite du '''''carry skip'''''. L'idée est que la retenue d'un paquet de deux bits est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. Le calcul de la retenue sortante est un simple ET logique entre la retenue entrante et les deux bits d'opérande. Le calcul des bits du résultat se fait normalement, en enchainant deux demi-additionneurs et en retirant les logiques superflues. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Un exemple est l'incrémenteur utilisé sur le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 769qil2qqxm23gdecn7at0j9b7xbv9a 767831 767830 2026-06-16T14:17:21Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767831 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Une première solution pour cela est d'utiliser la technique dite du '''''carry skip'''''. L'idée est que la retenue d'un paquet de deux bits est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. Le calcul de la retenue sortante est un simple ET logique entre la retenue entrante et les deux bits d'opérande. Le calcul des bits du résultat se fait normalement, en enchainant deux demi-additionneurs et en retirant les logiques superflues. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> ihjab0pksjk9zzsqocxdoqrwk6zxz6s 767832 767831 2026-06-16T14:25:54Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767832 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. La retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. Le calcul de la retenue sortante est un simple ET logique entre la retenue entrante et les deux bits d'opérande. Le calcul des bits du résultat se fait normalement, en enchainant deux demi-additionneurs et en retirant les logiques superflues. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> pc0ai4xsbfvud0kf0jxdftl0rpcksz2 767833 767832 2026-06-16T14:28:31Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767833 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs optimisés=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. La retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. Il existe cependant des processeurs qui utilisaient des incrémenteurs complexes, avec anticipation de retenues, voir du ''carry skip''. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 828t1v01dp1w5hzqzz2btq5mo5r7mne 767834 767833 2026-06-16T14:32:54Z Mewtow 31375 /* Les incrémenteurs optimisés */ 767834 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. La retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. Pour résumer, ce circuit ne paye pas de mine, mais il était largement suffisant sur les premiers microprocesseurs, qui géraient des opérandes de 8 bits. Ces processeurs étaient très peu puissants, et fonctionnaient à une fréquence très faible. Ainsi, ils n'avaient pas besoin d'utiliser de circuits plus complexes pour incrémenter un nombre, et se contentaient d'un incrémenteur à propagation de retenues. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> rq7ymo8lt94dfgtpk0nktds6xdkqnnq 767835 767834 2026-06-16T14:33:09Z Mewtow 31375 /* L'incrémenteur de l'Intel 8085 */ 767835 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. La retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 2ma275bt314ujtz265wowj1kojtdihi 767836 767835 2026-06-16T14:42:04Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767836 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Pour le calcul des deux bits du résultat, les choses sont plus compliquées. Les équations logiques ne donnent pas un résultat satisfaisant et la solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. Avec eux, la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> dzevesms4lqhwwqjogz951mzl8z8meh 767837 767836 2026-06-16T14:52:43Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767837 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Pour le calcul des deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip'''''. Avec eux, la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés de deux sous-circuits : un qui calcule les deux bits du résultat, un autre qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> p72vdb2z43c7v9mghu0rfcocjjayrdy 767838 767837 2026-06-16T14:53:59Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767838 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Pour le calcul des deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit comme ci-dessous [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> ikk3xpn71343lasceqnjsakedai8t3b 767839 767838 2026-06-16T14:55:55Z Mewtow 31375 /* L'incrémenteur de l'Intel 8085 */ 767839 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Pour le calcul des deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ===L'incrémenteur de l'Intel 8085=== Une solution alternative a été utilisée par le processeur Intel 8085. Pour comprendre comment il optimisait l'incrémentation de deux bits, faisons un rappel. Un demi-additionneur usuel est construit avec une porte ET et une porte XOR. Les deux sont construites avec des transistors. Il se trouve qu'avec la technologie CMOS utilisée actuellement, les portes logiques les plus simples sont les portes NAND et NOR. Les portes ET sont en réalité fabriquées en combinant une porte NAND avec une porte NON. En sachant cela, un demi-additionneur est construit comme ceci : [[File:Demi-additionneur en CMOS.png|centre|vignette|upright=1.5|Demi-additionneur en CMOS, les portes coloriées en jaunes sont construites avec un seul transistor CMOS/TTL.]] Regardons ce que cela donne quand on enchaine deux demi-additionneurs l'un à la suite de l'autre. [[File:Brique de base de l'incrémenteur du 8085.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085]] Les ingénieurs ont réussit à se débarrasser de la porte NON, pour une colonne sur deux. Les trois portes en jaune dans le schéma précédent sont fusionnées, de manière à donner une porte NOR couplée à une porte NON. Le résultat est que la propagation de la retenue est plus rapide. Au lieu de passer par une porte NAND et une porte NON à chaque colonne, il traverse une seule porte : une porte NAND pour les colonnes paires, une porte NOR pour les colonnes impaires. Mine de rien, cette optimisation économisait des portes logiques et rendait le circuit deux fois plus rapide. [[File:Brique de base de l'incrémenteur du 8085, version transistor.png|centre|vignette|upright=2|Brique de base de l'incrémenteur du 8085 - les portes en jaune sont faites avec un seul transistor]] : On peut optimiser le tout en fusionnant la porte XOR avec la porte NON pour le calcul de la somme, la porte XOR étant une porte composite. Mais nous n'en parlerons pas plus que ça ici. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> pxvk3khg42ru2bs3gvu72ww17revyax 767840 767839 2026-06-16T14:59:56Z Mewtow 31375 /* L'incrémenteur de l'Intel 8085 */ Retrait d'explications techniquement fausses : il y a de nombreuses inversions implicites liées au fonctionnement des retenues sur cet incrémenteu, le circuit n'est pas bonr. 767840 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Le reste du circuit calcule les deux bits du résultat, et se construit autrement. Pour le calcul des deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> hiovi9soe6cn9y30ois6mixx0auyil4 767842 767840 2026-06-16T15:02:10Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767842 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Pour cela, on peut écrire sa table de vérité et utiliser les techniques vues dans les chapitres précédents. Son fonctionnement est très simple. Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. Par contre, si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 8uj0f72bmubt5cwc0xyru3n97h0iv0j 767845 767842 2026-06-16T18:04:16Z Mewtow 31375 /* Les incrémenteurs carry skip */ 767845 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, seux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. Il suffit de modifier les additionneurs complets pour qu'ils supportent la soustraction. Concrètement, la seule différence est la présence des deux portes NON dans le schéma précédent : ils sont absents sur un additionneur complet. Une modification simple remplace ces deux portes NON par deux inverseurs commandable. Cependant, il y a une meilleure manière de faire, qu'on va détailler dans ce qui suit. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 2enjgj3ejrgt809ed7v5wi57f39n1qj 767846 767845 2026-06-16T18:26:01Z Mewtow 31375 /* Le soustracteur pour opérandes entiers */ 767846 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, deux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Vous l'aurez sans doute remarqué, mais le demi-soustracteur ressemble beaucoup au demi-additionneur. La seule différence est une porte NON ajoutée au bon endroit dans le demi-soustracteur. {| |[[File:Half-adder.svg|vignette|Demi-additionneur]] |[[File:Half Subtractor Vektor.svg|vignette|upright=1.3|Demi-soustracteur]] |} La conséquence est qu'il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. L'idée est de remplacer la porte NON du demi-soustracteur par un inverseur commandable. Si on envoie un zéro sur l'entrée de commande, l'inverseur commandable se comportera comme une porte OUI. Le circuit sera alors identique à un demi-additionneur. Si on envoie un 1 sur l'entrée de commande, l'inverseur commandable se comportera comme une porte NON. le circuit sera alors un demi-soustracteur. Il faut faire cela pour chaque demi-soustracteur, ce qui donne ceci pour un soustracteur complet. le résultat est alors appelé un '''additionneur-soustracteur complet'''. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 3a44zlnix8xaxonk6h01osmggart5m8 767847 767846 2026-06-16T18:28:51Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 767847 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, deux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Vous l'aurez sans doute remarqué, mais le demi-soustracteur ressemble beaucoup au demi-additionneur. La seule différence est une porte NON ajoutée au bon endroit dans le demi-soustracteur. {| |[[File:Half-adder.svg|vignette|Demi-additionneur]] |[[File:Half Subtractor Vektor.svg|vignette|upright=1.3|Demi-soustracteur]] |} La conséquence est qu'il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. L'idée est de remplacer la porte NON du demi-soustracteur par un inverseur commandable. Si on envoie un zéro sur l'entrée de commande, l'inverseur commandable se comportera comme une porte OUI. Le circuit sera alors identique à un demi-additionneur. Si on envoie un 1 sur l'entrée de commande, l'inverseur commandable se comportera comme une porte NON. le circuit sera alors un demi-soustracteur. Il faut faire cela pour chaque demi-soustracteur, ce qui donne ceci pour un soustracteur complet. le résultat est alors appelé un '''additionneur-soustracteur complet'''. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. Un '''circuit décrémenteur''' est fabriqué sur le même principe, mais en remplaçant les demi-additionneurs par des demi-soustracteurs. Il est aussi possible de remplacer les demi-additionneurs par des circuits qui font à la fois l'addition et la soustraction, vus plus haut. Le résultat est un circuit qui peut incrémenter ou décrémenter un opérande. Le circuit a alors deux signaux de commande, pour le configurer : un pour savoir s'il faut incrémenter ou décrémenter, un autre pour injecter un 1 dans la colonne de poids faible. Le premier signal est envoyé à tous les demi-additionneur/soustracteur, le second est envoyé uniquement sur la colonne de poids faible. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> m427nrhm8irb20svgxo65ubr2rowaad 767848 767847 2026-06-16T18:34:22Z Mewtow 31375 /* L'incrémenteur à propagation de retenue */ 767848 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, deux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Vous l'aurez sans doute remarqué, mais le demi-soustracteur ressemble beaucoup au demi-additionneur. La seule différence est une porte NON ajoutée au bon endroit dans le demi-soustracteur. {| |[[File:Half-adder.svg|vignette|Demi-additionneur]] |[[File:Half Subtractor Vektor.svg|vignette|upright=1.3|Demi-soustracteur]] |} La conséquence est qu'il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. L'idée est de remplacer la porte NON du demi-soustracteur par un inverseur commandable. Si on envoie un zéro sur l'entrée de commande, l'inverseur commandable se comportera comme une porte OUI. Le circuit sera alors identique à un demi-additionneur. Si on envoie un 1 sur l'entrée de commande, l'inverseur commandable se comportera comme une porte NON. le circuit sera alors un demi-soustracteur. Il faut faire cela pour chaque demi-soustracteur, ce qui donne ceci pour un soustracteur complet. le résultat est alors appelé un '''additionneur-soustracteur complet'''. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== L''''incrémenteur''' est un circuit capable d'incrémenter un nombre. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. Un '''circuit décrémenteur''' est fabriqué sur le même principe, mais en remplaçant les demi-additionneurs par des demi-soustracteurs. Il est aussi possible de remplacer les demi-additionneurs par des circuits qui font à la fois l'addition et la soustraction, vus plus haut. Le résultat est un circuit qui peut incrémenter ou décrémenter un opérande. Le circuit a alors deux signaux de commande, pour le configurer : un pour savoir s'il faut incrémenter ou décrémenter, un autre pour injecter un 1 dans la colonne de poids faible. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> lj5wid2kdc7wpglz2wg14bu1amlkqpv 767849 767848 2026-06-16T18:37:38Z Mewtow 31375 /* L'incrémenteur */ 767849 wikitext text/x-wiki Dans ce chapitre, nous allons voir les circuits capables de faire une addition ou une soustraction, ainsi que quelques circuits spécialisés. Précisons cependant que les fabricants de processeurs travaillent d'arrache-pied pour trouver des moyens de rendre ces circuits de calcul plus rapides et plus économes en énergie. Autant vous dire que les circuits que vous allez voir sont vraiment des circuits qui font pâle figure comparé à ce que l'on peut trouver dans un vrai processeur commercial ! ==Les circuits pour additionner 2 ou 3 bits== L'addition se fait en binaire de la même manière qu'en décimal. On additionne les chiffres/bits colonne par colonne, une éventuelle retenue est propagée à la colonne d'à côté. La soustraction fonctionne sur le même principe, sur le même modèle qu'en décimal. [[File:Binary Addition Demonstration.svg|centre|vignette|Exemple d'addition en binaire.]] En clair, additionner deux nombres demande d'additionner 2 bits et une retenue sur chaque colonne, et de propager les retenues d'une colonne à l'autre. La propagation des retenues est quelque chose de simple en apparence, mais qui est sujet à des optimisations extraordinairement nombreuses. Aussi, pour simplifier l'exposition, nous allons voir comment gérer une colonne avant de voir comment sont propagées les retenues. En effet, tout additionneur est composé d'additionneurs plus simples, capables d'additionner deux ou trois bits suivant la situation. Ceux-ci gèrent ce qui se passe sur une colonne. ===Le demi-additionneur et l'additionneur complet=== Un additionneur deux bits implémente la table d'addition, qui est très simple en binaire. Jugez plutôt : * 0 + 0 = 0, retenue = 0 ; * 0 + 1 = 1, retenue = 0 ; * 1 + 0 = 1, retenue = 0 ; * 1 + 1 = 0, retenue = 1. Un circuit capable d'additionner deux bits est donc simple à construire avec les techniques vues dans les premiers chapitres. On voit immédiatement que la colonne des retenues donne une porte ET, alors que celle du bit de somme est calculé par un XOR. Le circuit obtenu est appelé un '''demi-additionneur'''. {| class="flexible" |[[File:1-bit half-adder.svg|class=transparent|centre|Demi-addtionneur.]] |[[File:Half-adder.svg|centre|class=transparent|Circuit d'un demi-addtionneur.]] |} [[File:Full Adder Block.svg|vignette|upright=1|class=transparent|Additionneur complet.]] Si on effectue une addition en colonne, on doit additionner les deux bits sur la colonne, mais aussi additionner une éventuelle retenue. Il faut donc créer un circuit qui additionne trois bits : deux bits de données, plus une retenue. Il fournit en sortie deux bits : un bit de somme et une retenue sortante. Ce circuit qui additionne trois bits est appelé un '''additionneur complet'''. Voici sa table de vérité : {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- ||0||0||0|| ||0||0 |- ||0||0||1|| ||0||1 |- ||0||1||0|| ||0||1 |- ||0||1||1|| ||1||0 |- ||1||0||0|| ||0||1 |- ||1||0||1|| ||1||0 |- ||1||1||0|| ||1||0 |- ||1||1||1|| ||1||1 |} Il est possible d'utiliser un tableau de Karnaugh pour traduire la table de vérité, mais elle donne un résultat légèrement sous-optimal. D'autres méthodes donnent des résultats plus compréhensibles. Nous allons les détailler dans ce qui suit. ===L'additionneur complet conçu avec deux demi-additionneurs=== La solution plus simple consiste à enchaîner deux demi-additionneurs : un qui additionne les deux bits de données, et un second qui additionne la retenue au résultat. La retenue finale se calcule en combinant les sorties de retenue des deux demi-additionneurs, avec une porte OU. Pour vous en convaincre, établissez la table de vérité de ce circuit, vous verrez que ça marche. {| class="flexible" |[[File:Full Adder Modules.svg|class=transparent|Composition d'un additionneur complet. On voit bien que celui-ci est composé de deux demi-additionneurs, en rouge et en bleu, auxquels on a ajouté une porte OU pour calculer la retenue finale.]] |[[File:Full-adder.svg|300px|class=transparent|Circuit d'un additionneur complet.]] |} Le circuit de calcul de la retenue peut être remplacé par une '''porte à majorité''', mais cette possibilité n'est presque jamais utilisée, on lui préfère le circuit à trois portes logiques. [[File:Additionneur crée avec une porte à majorité.png|centre|vignette|upright=2|Additionneur crée avec une porte à majorité]] Les autres implémentations de l'additionneur complet que nous allons voir sont des dérivés de ce circuit, auquel on a appliqué quelques simplifications. Les simplifications portent surtout sur le circuit de calcul de la retenue. En effet, le calcul de la retenue doit absolument être le plus rapide possible,vu que la propagation des retenues est le point limitant pour les performances d'un additionneur. ===L'additionneur complet basé sur la propagation et la génération de retenue=== Le circuit précédent est basé sur deux additions 2-bits successives : une première pour additionner deux bits d'opérande, une seconde pour additionner la retenue. Mais il existe une autre façon de faire l'addition, qui est terriblement importante pour la suite du cours. L'idée est de regarder ce que vaut la retenue sortante, en fonction de la retenue entrante. Pour cela, reprenons la table de vérité de l'additionneur complet. Dans la majorité des cas, la retenue sortante est égale à la retenue entrante. On dit que la retenue entrante est propagée sur la sortie de retenue. Cependant, il y a aussi deux cas où la retenue n'est pas propagée : celui où la retenue sortante est forcée à 1, et celui où elle est forcée à 0. Dans le premier cas, l'addition donne une retenue à 1, quelle que soit la retenue envoyée en entrée (sous-entendu, même si celle-ci vaut 0). On dit que la retenue sortante est générée. Dans le cas inverse, la retenue sortante est forcée à 0, peu importe la retenue entrante. On dit que la retenue entrante est absorbée. Il y a cependant une petite ambiguïté à dire que la retenue a été propagée, absorbée ou générée. En effet, prenons le cas où la retenue sortante et entrantes valent toutes deux 0 : est-ce que la retenue a été propagée ou bien absorbée, ou les deux ? Idem quand les deux retenues sont à 1. Il y a un choix arbitraire à faire dans ce genre de cas, pour la plupart des lignes de la table de vérité. Cependant, il y a un choix bien précis qui est supérieur aux autres, et c'est celui qui est présenté dans le tableau suivant. Les lignes rouge correspondent à une retenue propagée, celles en bleu à une retenue absorbée, celle en vert à une retenue générée. {|class="wikitable" |- ! Retenue entrante !! Opérande 1 !! Opérande 2 !! !! Retenue sortante !! Bit de somme |- class="f_bleu" ||0||0||0|| ||0||0 |- class="f_rouge" ||0||0||1|| ||0||1 |- class="f_rouge" ||0||1||0|| ||0||1 |- class="f_vert" ||0||1||1|| ||1||0 |- class="f_bleu" ||1||0||0|| ||0||1 |- class="f_rouge" ||1||0||1|| ||1||0 |- class="f_rouge" ||1||1||0|| ||1||0 |- class="f_vert" ||1||1||1|| ||1||1 |} Avec ce choix, on peut déterminer si la retenue est propagée, absorbée ou générée, sans tenir compte de la retenue elle-même. On peut déterminer dans quel cas on est seulement en regardant les bits d'opérandes nommés A et B. * La retenue est propagée si les deux bits d'opérande sont différents. * La retenue est générée si les deux bits d'opérande sont à 1. * La retenue est absorbée si les deux bits d'opérande sont à 0. L'additionneur que nous allons voir détermine si la retenue est propagée, absorbée ou générée, et calcule la retenue sortante en fonction de ça. Il génère deux bits, nommés P et G : P pour ''Propagate'', G pour ''Generate''. Le bit P indique que la retenue entrante doit être propagée ou non : il est mis à 1 pour propager la retenue entrante, à 0 si elle ne doit pas être propagée. Le bit G indique si une retenue a été générée ou non : 1 si une retenue générée, 0 sinon. Une retenue est considérée comme absorbée si elle n'est pas ni propagée ni générée, pas besoin d'un troisième bit pour gérer ce cas. Pour rappel, la retenue est propagée si les deux bits sont différents, n'est pas propagée s'ils sont identiques. Déterminer si deux bits sont identiques ou différents est le comportement d'une banale porte XOR. Le bit P est donc généré par une simple porte XOR. Quant au bit G, il est à 1 si les deux bits d'opérandes sont à 1, ce qui correspond à une porte ET. Il existe des pseudo-additionneurs qui ne calculent pas la retenue sortante et fournissent à la place les signaux P et G, en plus du résultat. Un tel additionneur est appelé un '''additionneur P/G''' (P/G pour propagation/génération). Ils sont très utiles pour créer des additionneurs dits "à anticipation de retenue", comme on le verra dans la suite du chapitre. {| class="flexible" | [[File:FulladderPG.png|Additionneur P/G : entrées et sorties.]] | [[File:Partial Full-Adder.svg|class=transparent|Additionneur P/G : circuit de génération des signaux P et G.]] |} Pour créer un additionneur complet avec cette méthode, il faut ajouter un circuit qui calcule la retenue sortante à partir des bits P et G. La retenue finale vaut 1 soit quand la retenue est générée, soit quand la retenue d'entrée vaut 1 et qu'elle est propagée. La traduction en équation logique; puis en circuits, donne un circuit strictement identique à celui basé sur deux demi-additionneurs... Vous remarquerez que les signaux P et G sont calculés par le premier demi-additionneur. [[File:Additionneur complet avec propagation et génération de retenue.png|class=transparent|centre|vignette|upright=2|Additionneur complet avec propagation et génération de retenue.]] Une méthode alternative donne cependant un circuit différent. Le circuit en question choisit entre les deux situations : soit il propage la retenue, soit il calcule la retenue adéquate. Propager une retenue demande de connecter l'entrée de retenue sur la sortie de retenue. Mais cela ne doit être fait que si les conditions sont réunies, que si la retenue est belle et bien propagée. Si ce n'est pas le cas, il faut connecter la sortie de retenue à un circuit qui calcule la retenue adéquate. Pour cela, on utilise un multiplexeur, commandé par le bit P. [[File:Additionneur crée avec un multiplexeur.png|centre|vignette|upright=2|Additionneur crée avec un multiplexeur]] Quand la retenue entrante n'est pas propagée, la retenue sortante vaut 1 si une retenue est générée, 0 sinon. Le circuit qui calcule la retenue doit donc fournir un 0 si les bits d'opérande valent tous les deux 0, un 1 s'ils valent tous les deux 1. Mais si la retenue est propagée, la retenue calculée peut prendre n'importe quelle valeur, vu que le multiplexeur ne choisira pas sa sortie. Suivant quelles valeurs on prend dans ce cas, le circuit obtenu sera différent. Si on suppose que le circuit fournit un 0 si la retenue est propagée, alors la retenue calculée indique une retenue est générée ou non : on peut alors réutiliser le bit G ! Le tout donne alors ce circuit : [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Le circuit semble utiliser plus de portes logiques que nécessaires. Cependant, tout dépend de l'implémentation du multiplexeur. En réalité, nous verrons dans quelques chapitres qu'il est possible d'implémenter un multiplexeur avec seulement 6 transistors. L'implémentation utilise des portes à transmission, mais nous en reparlerons dans le chapitre sur les transistors, quand nous verrons les additionneurs à ''Manchester Carry Chain''. Au passage, une variante de ce circuit a été utilisée dans le processeur processeur 8086 d'Intel, comme on le verra dans le chapitre suivant. ===L'additionneur complet basé sur une modification de la retenue sortante=== Dans les circuits précédents, la retenue sortante et le bit du résultat sont calculés séparément, même si quelques portes logiques sont partagées entre les deux. L'unité de calcul de l'Intel 4004 et de l'Intel 8008 faisaient autrement : le bit du résultat était calculé à partir de la retenue sortante. En effet, le bit du résultat est l'inverse de la retenue sortante, sauf dans deux cas : les trois bits d'entrée sont à 0, où ils sont tous à 1. Dans ces deux cas, le bit du résultat vaut 0, quelle que soit la retenue sortante. L'implémentation de cette idée en circuit est assez simple. Au circuit de calcul de la retenue sortante, il faut ajouter un circuit qui vérifie si tous les bits opérande valent 0, un autre s'ils valent tous 1. Le premier est une simple porte ET, l'autre une porte NOR. Ensuite, on combine le résultat des trois circuits précédents pour obtenir le résultat final. Si un seul des trois circuits a sa sortie à 1, alors la sortie finale doit être à 0. Elle est à 1 sinon. C'est donc une porte NOR qu'il faut utiliser. Notons qu'on peut encore optimiser le circuit en fusionnant les deux portes NOR entre elles, mais c'est là un détail. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] À ce stade, vous êtes certainement étonné qu'un tel circuit ait existé. Il utilise beaucoup de portes logiques, a une profondeur logique supérieure : il n'a rien d'avantageux. Sauf qu'il était utilisé sur d'anciens processeurs, qui utilisaient la technologie dite TTL, différente de la technologie CMOS des transistors modernes. Et avec la technologie TTL, il est possible de fusionner plusieurs portes logiques ET et NOR en une seule porte logique ET/OU/NON ! Un additionneur complet construit ainsi ne prenait que deux portes logiques : une pour le calcul de la retenue sortante, une autre pour le reste du circuit. ==L'addition non signée== Voyons maintenant un circuit capable d'additionner deux nombres entiers: l''''additionneur'''. Dans la version qu'on va voir, ce circuit manipulera des nombres strictement positifs. L'addition des nombres codés en complètement à deux sera vu dans une section ultérieure. ===L'additionneur série=== Il est possible d'additionner deux nombres bit par bit,colonne par colonne, avec un additionneur complet. Cela demande de coupler un additionneur complet avec plusieurs registres à décalages. Les opérandes sont placées chacune dans un registre à décalage, afin de passer d'un bit au suivant, d'une colonne à la suivante, à chaque cycle. Même chose pour le résultat, qui a sont propre registre à décalage. La retenue de l'addition est stockée dans une bascule de 1 bit, en attente du prochain cycle d'horloge. Un tel additionneur est appelé un '''additionneur série'''. [[File:Additionneur série.jpg|centre|vignette|upright=2.5|Additionneur série.]] L'additionneur série a été utilisé sur d'anciens prototypes dans les années 50-60, et quelques ordinateurs commerciaux très rares. ===L'additionneur à propagation de retenue=== L'additionneur à propagation de retenue pose l'addition comme en décimal, en additionnant les bits colonne par colonne avec une éventuelle retenue. Évidemment, on commence par les bits les plus à droite, comme en décimal. Il suffit ainsi de câbler des additionneurs complets les uns à la suite des autres. Notons la présence de la retenue sortante, qui est utilisée pour détecter les débordements d'entier, ainsi que pour d'autres opérations. Le bit de retenue final est souvent stocké dans un registre spécial du processeur (généralement appelé ''carry flag''). [[File:Ripplecarryadder.png|centre|vignette|upright=2.5|Additionneur à propagation de retenue.]] Notez aussi, sur le schéma précédent, la présence de l’entrée de retenue <math>\text{R}_\text{Entrée}</math> sur l'additionneur. L'additionneur le plus à droite est bien un additionneur complet, et non un demi-additionneur,c e qui fait qui l'additionneur a une entrée de retenue. Tous les additionneurs ont une entrée de retenue de ce type. Elle est très utile pour l'implémentation de certaines opérations comme l'inversion de signe, la soustraction, l'incrémentation, etc. Certains processeurs sont capables de faire une opération appelée ADC, ADDC ou autre nom signifiant ''Addition with Carry'', qui permet de faire le calcul A + B + Retenue (la retenue en question est la retenue sortante de l'addition précédente, stockée dans le registre ''carry flag''). Son utilité principale est de permettre des additions d'entiers plus grands que ceux supportés par le processeur. Par exemple, cela permet de faire des additions d'entiers 32 bits sur un processeur 16 bits. [[File:Adder Network 3 Bit Sum Delay 003.svg|vignette|upright=0.5|Propagation de retenue dans l'additionneur.]] L'avantage est qu'il utilise très peu de portes logiques et est assez économe en transistors, ce qui fait qu'il était utilisé sur certains processeurs 8 et 16 bits assez anciens. Bien que très simple, cet additionneur est cependant peu performant. Le temps de calcul est proportionnel à la taille des opérandes. Par exemple, additionner deux nombres de 32 bits prendra deux fois plus de temps que l'addition de deux nombres de 16 bits. La raison est que le calcul des retenues s'effectue en série, l'une après l'autre. En effet, chaque additionneur doit attendre que la retenue de l'addition précédente soit disponible pour donner son résultat. Les retenues doivent se propager à travers le circuit, du premier additionneur jusqu'au dernier. L'addition étant une opération fréquente, il vaut mieux utiliser d'autres méthodes d'addition, plus rapides. Pour cela, les autres additionneurs utilisent diverses optimisations : calculer les retenues en parallèle, éliminer certaines opérations inutiles quand c'est possible, accélérer le calcul de la retenue avec des techniques d'anticipation de retenue, etc. Mais ces optimisations demandent d'utiliser plus de circuits, quitte à gagner quelque peu en rapidité. Si on met de côté les additionneurs de type ''Manchester carry chain'', qu'on ne peut pas encore expliquer à ce stade du cours, il existe plusieurs solutions, qui donnent respectivement les additionneurs à saut de retenue, à sélection de retenue, et à anticipation de retenue. Nous allons les voir dans les sections suivantes. ===Les accélérations de la propagation de retenue=== [[File:Full-adder-4bits-serial-CEI.svg|vignette|upright=0.5|Additionneur 4 bits, un bloc.]] Dans cette section, nous allons voir quelques additionneurs qui visent à accélérer la propagation de la retenue, mais en gardant la base de l'additionneur de propagation de retenue. Avant de poursuivre, partons du principe que l'additionneur est conçu en assemblant des additionneurs à plus simples, qui additionnent environ 4 à 5 bits, parfois plus, parfois moins. Ces additionneurs simples seront nommés ''blocs'' dans ce qui suit, et l'un d'entre eux est illustré ci-contre. Chaque bloc prend en entrée un morceau des deux opérandes à additionner, mais aussi une retenue d'entrée. Il fournit en sortie un résultat codé sur 4/5 bits, mais aussi une retenue sortante. Dans un bloc, la retenue sortante est plus ou moins calculée à part du résultat. L'enjeu est de calculer la retenue sortante d'un bloc rapidement, plus rapidement qu'un additionneur à propagation de retenue. Le calcul du résultat n'a pas besoin d'être accéléré, on garde des additionneurs à propagation de retenue. En enchaînant plusieurs blocs les uns à la suite des autres, la retenue sortante d'un bloc est connectée sur l'entrée de retenue du bloc suivant, la retenue est propagée d'un bloc au suivant. Les blocs sont tous identiques dans le cas le plus simple, mais il est possible d'utiliser des blocs de taille variable. Par exemple, le premier bloc peut avoir des opérandes de 6 bits, le second des opérandes de 7 bits, etc. Faire ainsi permet de gagner un petit peu en performances, si la taille de chaque bloc est bien choisie. La raison est une question de temps de propagation des retenues. La retenue met plus de temps à se propager à travers 8 blocs qu'à travers 4, ce qui prend plus de temps qu'à travers 2 blocs, etc. En tenir compte fait que la taille des blocs tend à augmenter ou diminuer quand on se rapproche des bits de poids fort. ====Le calcul parallèle de la retenue==== [[File:4008 Functional Diagram.svg|vignette|upright=1|4008 Functional Diagram]] L'optimisation la plus évidente est de calculer la retenue sortante en parallèle de l'addition. Chaque bloc contient, à côté d'un additionneur proprement dit, un circuit qui calcule la retenue sortante. Il existe de nombreuses manières de calculer la retenue sortante. La plus simple consiste à établir la table de vérité de l'entrée de retenue et d'utiliser les techniques du chapitre sur les circuits combinatoires. Cela marche si les blocs sont de petite taille, mais elle devient difficile si le bloc a des opérandes de 2/3 bits ou plus. Mais des techniques alternatives existent. Un exemple est celui de l'additionneur CMOS 4008, un additionneur de 4 bit. Il est intéressant de voir comment fonctionne ce circuit. Aussi, voici son implémentation. Le circuit est décomposé en trois sections. Une première couche de demi-additionneurs, le circuit de calcul de la retenue sortante, le reste du circuit qui calcule l'addition en propageant les retenues. Le circuit de calcul de la retenue sortante prend les résultats des demi-additionneurs, et les utilise pour calculer la retenue sortante. C'est là une constante de tous les circuits qui vont suivre. [[File:CMOS 4008, circuit découpé en sections.png|centre|vignette|upright=1.5|CMOS 4008, circuit découpé en sections]] Le point important à comprendre est que les demi-additionneurs génèrent les signaux P et G, qui disent si l'additionneur propage ou génère une retenue. Ces signaux sont alors combinés pour déterminer la retenue sortante. La méthode de combinaison des signaux P et G dépend fortement de l'additionneur utilisé. La méthode utilisée sur le 4008 utilise à la fois les signaux P et G, ce qui fait que c'est un hybride entre un additionneur à propagation de retenue, et un additionneur à anticipation de retenue qui sera vu dans la suite du chapitre. Mais il existe des techniques alternatives pour calculer la retenue sortante. ====L'additionneur à saut de retenue==== L''''additionneur à saut de retenue''' (''carry-skip adder'') est un additionneur dont le temps de calcul est variable. Le calcul prendra quelques cycles d'horloges avec certains opérandes, tandis qu'il sera aussi long qu'avec un additionneur à propagation de retenue avec d'autres. Il n'améliore pas le pire des cas, dans lequel la retenue doit être propagée du début à la fin, du bit de poids faible au bit de poids fort. Mais dans les autres cas, le circuit détecte quand le résultat de l'addition est disponible, quand la retenue a fini de se propager. Il permet d'avoir le résultat en avance, plutôt que d'attendre suffisamment pour couvrir le pire des cas. L'additionneur à saut de retenue est lui aussi composé de blocs qui additionnent 4/5 bits. Il peut, sous certaines conditions, sauter complètement la propagation de la retenue dans le bloc. L'idée est de calculer si un bloc génère une retenue sortante, ou si la retenue entrante est simplement propagée. Dans le second cas, le bloc ne fait que recopier la retenue entrante sur la sortie de retenue. La propagation de retenue entre blocs est alors skippée (mais elle a quand même lieu). Si une retenue est générée dans le bloc, on envoie cette retenue sur la retenue sortante. Le choix entre les deux est le fait d'un multiplexeur. [[File:Carry skip adder, principe de base.png|centre|vignette|upright=2.5|Carry skip adder : principe de base]] Toute la difficulté est de savoir comment commander le multiplexeur. Pour cela, on doit savoir si le circuit propage une retenue ou non. Le bloc propage une retenue si chaque additionneur complet propage la retenue. Les additionneurs complets doivent donc fournir le résultat, mais aussi indiquer s'ils propagent la retenue d'entrée ou non. Le signal de commande du multiplexeur est généré assez simplement : il vaut 1 si tous les additionneurs complets du bloc propagent la retenue précédente. C'est donc un vulgaire ET entre tous ces signaux. [[File:Additionneur à saut de retenue.png|centre|vignette|upright=2.5|Calcul de la commande du MUX.]] L'additionneur à saut de retenue est construit en assemblant plusieurs blocs de ce type. [[File:BCSAdder16Bit.svg|centre|vignette|upright=3|Additionneur à saut de retenue.]] ====L'additionneur à sélection de retenue==== L''''additionneur à sélection de retenue''' utilise aussi des blocs, comme les additionneurs précédents. L'addition se fait en deux versions : une avec la retenue du bloc précédent valant zéro, et une autre version avec la retenue du bloc précédent valant 1. Il suffira alors de choisir le bon résultat avec un multiplexeur, une fois cette retenue connue. On gagne ainsi du temps en calculant à l'avance les valeurs de certains bits du résultat, sans connaître la valeur de la retenue. Petit détail : sur certains additionneurs à sélection de retenue, les blocs de base n'ont pas la même taille. Cela permet de tenir compte des temps de propagation des retenues entre les blocs. [[File:Additionneur à sélection de retenue.png|centre|vignette|upright=1|Additionneur à sélection de retenue avec seulement deux blocs.]] Dans les exemples du dessus, chaque sous-additionneur étaient des additionneurs à propagation de retenue. Mais ce n'est pas une obligation, et tout autre type d’additionneur peut être utilisé. Par exemple, on peut faire en sorte que les sous-additionneurs soient eux-mêmes des additionneurs à sélection de retenue, et poursuivre ainsi de suite, récursivement. On obtient alors un '''additionneur à somme conditionnelle''', plus rapide que l'additionneur à sélection de retenue, mais qui utilise beaucoup plus de portes logiques. ===Les additionneurs à anticipation de retenue=== Les '''additionneurs à anticipation de retenue''' accélèrent le calcul des retenues en les calculant sans les propager. Au lieu de calculer les retenues une par une, ils calculent toutes les retenues en parallèle, à partir de la valeur de tout ou partie des bits précédents. Une fois les retenues pré-calculées, il suffit de les additionner avec les deux bits adéquats, pour obtenir le résultat. [[File:Cla4bits.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Ces additionneurs sont composés de deux parties : * un circuit qui pré-calcule la valeur de la retenue d'un étage ; * et d'un circuit qui additionne les deux bits et la retenue pré-calculée : il s'agit d'une couche d'additionneurs complets simplifiés, qui ne fournissent pas de retenue. [[File:Additionneur à anticipation de retenue.png|centre|vignette|upright=2.5|Additionneur à anticipation de retenue.]] Le circuit qui détermine la valeur de la retenue est lui-même composé de deux grandes parties, qui ont chacune leur utilité. La première partie réutilise des additionneurs qui donnent les signaux de propagation et génération de retenue. L'additionneur commence donc à prendre forme, et est composé de trois parties : * un circuit qui crée les signaux P et G ; * un circuit qui déduit la retenue à partir des signaux P et G adéquats ; * et une couche d'additionneurs qui additionnent chacun deux bits et une retenue. [[File:Circuit complet d'un additionneur à anticipation de retenue.png|centre|vignette|upright=2|Circuit complet d'un additionneur à anticipation de retenue.]] Il ne nous reste plus qu'à voir comment fabriquer le circuit qui reste. Pour cela, il faut remarquer que la retenue est égale : * à 1 si l'addition des deux bits génère une retenue ; * à 1 si l'addition des deux bits propage une retenue ; * à zéro sinon. Ainsi, l'addition des bits de rangs i va produire une retenue Ci, qui est égale à Gi+(Pi·Ci−1). Si on utilisait cette formule sans trop réfléchir, on retomberait sur un additionneur à propagation de retenue inutilement compliqué. L'astuce des additionneurs à anticipation de retenue consiste à remplacer le terme Ci−1 par sa valeur calculée avant. Par exemple, je prends un additionneur 4 bits. Je dispose de deux nombres A et B, contenant chacun 4 bits : A3, A2, A1, et A0 pour le nombre A, et B3, B2, B1, et B0 pour le nombre B. Si j'effectue les remplacements, j'obtiens les formules suivantes : * C1 = G0 + ( P0 · C0 ) ; * C2 = G1 + ( P1 · G0 ) + ( P1 · P0 · C0 ) ; * C3 = G2 + ( P2 · G1 ) + ( P2 · P1 · G0 ) + ( P2 · P1 · P0 · C0 ) ; * C4 = G3 + ( P3 · G2 ) + ( P3 · P2 · G1 ) + ( P3 · P2 · P1 · G0 ) + ( P3 · P2 · P1 · P0 · C0 ). Ces formules nous permettent de déduire la valeur d'une retenue directement : il reste alors à créer un circuit qui implémente ces formules, et le tour est joué. On peut même simplifier le tout en fusionnant les deux couches d'additionneurs. [[File:4-bit carry lookahead adder.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 4 bits.]] Ces additionneurs sont plus rapides que les additionneurs à propagation de retenue. Ceci dit, utiliser un additionneur à anticipation de retenue sur des nombres très grands (16/32bits) utiliserait trop de portes logiques. Pour éviter tout problème, nos additionneurs à anticipation de retenue sont souvent découpés en blocs, avec soit une anticipation de retenue entre les blocs et une propagation de retenue dans les blocs, soit l'inverse. [[File:64-bit lookahead carry unit.svg|centre|vignette|upright=2|Additionneur à anticipation de retenue de 64 bits.]] ===L'additionneur à calcul parallèle de préfixes=== Les '''additionneurs à calcul parallèle de préfixes''' sont des additionneurs à anticipation de retenue améliorés pour gagner en performances. Les additionneurs à anticipation de retenue générent des signaux ''propagate'' et ''generate'' pour un bit, sous-entedu 1 bit par opérande. L'optimisation apportée est de générer des signaux ''propagate'' et ''generate'' pour un bit, mais aussi pour des groupes de 2, 3, 4, ..., N bits. Par exemple, il est possible de générer un signal ''P 0 vers 7'', qui précise si la retenue de la seconde colonne est propagée jusqu'à la 7ème colonne ou non. Un autre exemple est un signal de génération qui indique si les colonnes 4 à 7 génèrent une retenue ou non. En clair, les signaux P et G ont maintenant un intervalle, qui précise de quelle colonne vers quelle colonne se fait la propagation, ou entre quelles colonnes se fait la génération. De plus, les signaux pour un intervalle peuvent se calculer en combinant les signaux pour des intervalles plus restreints. Par exemple, pour calculer P pour les colonnes 0 à 10 peuvent se calculer à partir des deux signaux P des colonnes 0-4 et 5-10. Néanmoins, il y a plusieurs manières pour subdiviser les intervalles en intervalles plus petits et combiner le tout. Et elles donnent chacune des additionneurs différent, comme l'additionneur de Ladner-Fisher, l'additionneur de Brent-Kung, l'additionneur de Kogge-Stone, ou tout design hybride. Ils ont des caractéristiques différentes. L'additionneur de Brent-Kung est le plus lent de tous les additionneurs cités, mais c'est celui qui utilise le moins de portes logiques. Les autres ont des performances un peu plus variables, mais utilisent plus de portes logiques. {| |[[File:Additionneur de Kogge-Stone.jpg|vignette|Additionneur de Kogge-Stone.]] |[[File:Additionneur de Ladner-Fisher.jpg|vignette|Additionneur de Ladner-Fisher.]] |} [[File:4bitKoggeStone.svg|vignette|upright=1.5|Additionneur de Kogge-Stone pour 4 bits.]] L'additionneur Kogge-Stone est illustré ci-contre. Il est composé de plusieurs couches de portes logiques. La toute première calcule les signaux P et G pour chaque colonne, comme le ferait un additionneur à anticipation de retenue. Il s'agit de la couche en rouge dans le schéma ci-dessous. Les circuits en jaune combinent ces signaux de manière à calculer les signaux P et G pour plusieurs colonnes. En vert, les circuits calculent la retenue finale. Voici le circuit pour 8 bits : [[File:Kogge-stone-8-bit.png|centre|vignette|upright=2|Additionneur de Kogge-Stone pour 8 bits.]] ==L'addition signée et la soustraction== Après avoir vu l'addition, il est logique de passer à la soustraction, les deux opérations étant très proches. Si on sait câbler une addition entre entiers positifs, câbler une soustraction n'est pas très compliqué. De plus, la soustraction permet de faire des additions de nombres signés. ===Le soustracteur pour opérandes entiers=== Pour soustraire deux nombres entiers, on peut adapter l'algorithme de soustraction utilisé en décimal, celui que vous avez appris à l'école. Celui-ci ressemble fortement à l'algorithme d'addition : on soustrait les bits de même poids, et on propage éventuellement une retenue sur la colonne suivante. À la différence de l'addition, la retenue est soustraite, et non ajoutée. La table de soustraction nous dit quel est le résultat de la soustraction de deux bits. La voici : * 0 - 0 = 0 ; * 0 - 1 = 1 et une retenue ; * 1 - 0 = 1 ; * 1 - 1 = 0. [[File:Algebra1 05 fig014.svg|centre|vignette|Soustraction en binaire, avec les retenues en rouge.]] La table de soustraction peut servir de table de vérité pour construire un circuit qui soustrait deux bits. Celui-ci est appelé un '''demi-soustracteur'''. Il ressemble beaucoup à un demi-additionneur, les différences se résumant à une porte NON ajoutée pour le calcul de la retenue. [[File:Half Subtractor Vektor.svg|centre|vignette|Demi-soustracteur.]] Comme pour l'additionneur, deux demi-soustracteurs peuvent être combinés pour donner un '''soustracteur complet'''. Le calcul de la retenue se fait en combinant les deux retenues des demi-soustracteurs avec une porte OU. Les soustracteurs complets sont utilisés pour créer des soustracteurs à propagation de retenue ou tout autre circuit soustracteur, sur le même modèle que les additionneurs. [[File:FullSubtractor.svg|centre|vignette|upright=2|Soustracteur complet.]] Vous l'aurez sans doute remarqué, mais le demi-soustracteur ressemble beaucoup au demi-additionneur. La seule différence est une porte NON ajoutée au bon endroit dans le demi-soustracteur. {| |[[File:Half-adder.svg|vignette|Demi-additionneur]] |[[File:Half Subtractor Vektor.svg|vignette|upright=1.3|Demi-soustracteur]] |} La conséquence est qu'il est possible de créer un circuit capable de faire à la fois des additions et des soustractions. L'idée est de remplacer la porte NON du demi-soustracteur par un inverseur commandable. Si on envoie un zéro sur l'entrée de commande, l'inverseur commandable se comportera comme une porte OUI. Le circuit sera alors identique à un demi-additionneur. Si on envoie un 1 sur l'entrée de commande, l'inverseur commandable se comportera comme une porte NON. le circuit sera alors un demi-soustracteur. Il faut faire cela pour chaque demi-soustracteur, ce qui donne ceci pour un soustracteur complet. le résultat est alors appelé un '''additionneur-soustracteur complet'''. [[File:Additionneur-soustracteur complet.png|centre|vignette|upright=2|Additionneur-soustracteur complet]] ===L'additionneur-soustracteur pour opérandes codées en complément à deux=== Étudions le cas de la soustraction en complément à deux, dans l'objectif de créer un circuit soustracteur. Vous savez sûrement que a−b et a+(−b) sont deux expressions équivalentes. Et en complément à deux, − b = not(b) + 1. Dit autrement, a − b = a + not(b) + 1. On pourrait se dire qu'il faut deux additionneurs pour faire le calcul, mais la majorité des additionneurs possède une entrée de retenue pour incrémenter le résultat de l'addition. Un soustracteur en complément à deux est donc simplement composé d'un additionneur et d'un inverseur. [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Soustracteur en complément à deux.]] Il est possible de créer un circuit capable d'effectuer soit une addition, soit une soustraction : il suffit de remplacer l'inverseur par un inverseur commandable, qui peut être désactivé. On a vu comment créer un tel inverseur commandable dans le chapitre sur les circuits combinatoires. On peut remarquer que l'entrée de retenue et l'entrée de commande de l'inverseur sont activées en même temps : on peut fusionner les deux signaux en un seul. [[File:Additionneur-soustracteur en complément à deux.png|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux.]] Une implémentation alternative est la suivante. Elle remplace l'inverseur commandable par un multiplexeur. [[File:4-bit ripple carry adder-subtracter.svg|centre|vignette|upright=2|Additionneur-soustracteur en complément à deux, version alternative.]] ===L'additionneur-soustracteur pour opérandes codées en signe-magnitude=== Passons maintenant aux nombres codés en signe-valeur absolue, les deux opérandes étant notées A et B. Suivant les signes des deux opérandes, on a quatre cas possibles : A + B, A − B (B négatif), −A + B (A négatif) et −A − B (A et B négatifs). Une astuce est que le circuit n'a besoin que de calculer A + B et A − B : il peut les inverser pour obtenir − A − B ou B − A. A + B et A − B peuvent se calculer avec un additionneur-soustracteur, reste à corriger le résultat. Il suffit de lui ajouter un inverseur commandable pour obtenir le circuit d'addition finale. [[File:Additionneur en signe-valeur absolue.png|centre|vignette|upright=2|Additionneur en signe-valeur absolue.]] Toute la difficulté tient dans le calcul du bit de signe du résultat, quand interviennent des soustractions. Autant l'addition de deux nombres de même signe (A + B et −A − B) ne pose aucun problème, autant les soustractions posent problème (A − B et −A + B). Suivant que <math>A<B</math> ou que <math>A>B</math>, le signe du résultat ne sera pas le même. Déterminer le signe du résultat se fait en regardant les bits de débordement d'entier, comme on le verra plus bas. ===L'additionneur-soustracteur pour opérandes codées en représentation par excès=== Passons maintenant aux nombres codés en représentation par excès. On pourrait croire que ces nombres s'additionnent comme des nombres non-signés, mais ce serait oublier la présence du biais, qui pose problème. Dans les cas de nombres signés gérés avec un biais, voyons ce que donne l'addition de deux nombres : : <math>( n_1 + biais ) + ( n_2 + biais ) = n_1 + n_2 + 2 \times biais</math> Or, le résultat correct serait : : <math>n_1 + n_2 + biais</math> En effectuant l'addition telle quelle, le biais est compté deux fois. On doit donc le soustraire après l'addition pour obtenir le résultat correct. Même chose pour la soustraction qui donne ceci : : <math>(n_1 + biais) - (n_2 + biais) = n_1 - n_2</math> Or, le résultat correct serait : : <math> ( n_1 - n_2 ) + biais </math> Il faut rajouter le biais pour obtenir l'exposant correct. On a donc besoin de deux additionneurs/soustracteurs : un pour additionner/soustraire les représentations binaires des opérandes, et un autre pour ajouter/retirer le biais en trop/manquant. ==L'additionneur BCD== Maintenant, voyons un additionneur qui additionne deux entiers au format BCD. Pour cela, nous allons devoir passer par deux étapes. La première est de créer un circuit capable d'additionneur deux chiffres BCD. Ensuite, nous allons voir comment enchaîner ces circuits pour créer un additionneur BCD complet. ===L'additionneur BCD qui fait l'opération chiffre par chiffre=== Nous allons commencer par voir un additionneur qui additionne deux chiffres en BCD, une sorte d'équivalent BCD de l'additionneur complet. Il fournit un résultat sur 4 bits et une retenue qui est mise à 1 si le résultat dépasse 10 (la limite d'un chiffre BCD). Les deux opérandes sont des chiffres BCD codés sur 4 bits et sont additionnés en binaire par un additionneur des plus normaux, similaire à ceux vus plus haut. Le résultat est alors un entier codé en binaire, sur 5 bits, qu'on corrige/convertit pour obtenir un chiffre BCD et une retenue sortante. Pour corriger le résultat, une idée intuitive serait de prendre le résultat et de faire une division par 10. Le quotient donne la retenue, alors que le reste est le résultat, le chiffre BCD. Mais un circuit diviseur par 10 utilise beaucoup de portes logiques, ce qui ne vaut pas le coup. Une autre méthode détecte si le résultat est égal ou supérieur à 10, ce qui correspond à un "débordement" (on dépasse les limites d'un chiffre BCD). Si le résultat est plus petit que 10, il n'y a rien à faire : le résultat est bon et la retenue est de zéro. Par contre, si le résultat vaut 10 ou plus, il faut corriger le résultat et générer une retenue à 1. Il faut donc ajouter un circuit qui détecte si le résultat est supérieur à 9, qui calcule directement la retenue. Ce circuit peut se fabriquer simplement à partir de sa table de vérité, ou en utilisant les techniques que nous verrons dans un chapitre ultérieur sur les comparateurs. La solution la plus simple est clairement d'utiliser la table de vérité, ce qui est très simple, assez pour être laissé en exercice au lecteur. Pour comprendre comment corriger le résultat, établissons une table de vérité qui associe le résultat et le résultat corrigé. L'entrée vaut au minimum 10 et au maximum 9 + 9 = 18. On considère la sortie comme un tout, la retenue étant un 5ème bit, le bit de poids fort. {|class="wikitable" |- ! colspan="5" | Entrée ! ! rowspan="10" | ! Retenue ! Résultat corrigé (sans retenue) ! interprétation de la sortie en binaire (retenue inclue) |- | 0 || 1 || 0 || 1 || 0 | (10) | 1 || 0000 | (16) |- | 0 || 1 || 0 || 1 || 1 | (11) | 1 || 0001 | (17) |- | 0 || 1 || 1 || 0 || 0 | (12) | 1 || 0010 | (18) |- | 0 || 1 || 1 || 0 || 1 | (13) | 1 || 0011 | (19) |- | 0 || 1 || 1 || 1 || 0 | (14) | 1 || 0100 | (20) |- | 0 || 1 || 1 || 1 || 1 | (15) | 1 || 0101 | (21) |- | 1 || 0 || 0 || 0 || 0 | (16) | 1 || 0110 | (22) |- | 1 || 0 || 0 || 0 || 1 | (17) | 1 || 0111 | (23) |- | 1 || 0 || 0 || 1 || 0 | (18) | 1 || 1000 | (24) |} En analysant le tableau, on voit que pour corriger le résultat, il suffit d'ajouter 6. La raison est que le résultat déborde d'un nibble à 16 en binaire, mais à 10 en décimal : il suffit d'ajouter la différence entre les deux, à savoir 6, et le débordement binaire fait son travail. Donc, la correction après une addition est très simple : si le résultat dépasse 9, on ajoute 6. On peut maintenant implémenter l'additionneur BCD, en combinant le comparateur avec 10, le circuit de correction, et l'additionneur. La première solution calcule deux versions du résultat : la version corrigée, la version normale. Le choix entre les deux est réalisée par un multiplexeur, commandé par le comparateur. [[File:Additionneur BCD.png|centre|vignette|upright=1.5|Additionneur BCD]] L'autre solution utilise un circuit commandable qui soit additionne 6, soit ne fait rien. Le choix entre les deux est commandé par le bit calculé par le comparateur. [[File:Additionneur BCD, seconde version.png|centre|vignette|upright=1.5|Additionneur BCD, seconde version.]] Une version alternative du circuit précédent est la suivante. Il contient deux additionneurs : un pour additionner les deux chiffres BCD, un autre pour additionner 6 si besoin. Le résultat du comparateur est directement utilisé pour générer l'opérande du second additionneur : 0 ou 6. Le circuit est simple à concevoir, mais gaspille beaucoup de circuit. Idéalement, il vaudrait mieux utiliser un circuit combinatoire d'addition avec une constante. [[File:Adder 4 Bit BCD.svg|centre|vignette|upright=2|Additionneur BCD, circuit complet.]] Pour obtenir un additionneur BCD complet, il suffit d’enchaîner les additionneurs précédents, comme on le ferait avec les additionneurs complets dans un additionneur à propagation de retenue. Au final, l'additionneur BCD est beaucoup plus compliqué qu'un additionneur normal, car il rajoute un comparateur ">9", un petit additionneur pour ajouter 6 et éventuellement d'autres circuits. De plus, il est difficile d'appliquer les optimisations disponibles sur les additionneurs non-BCD. Notamment, les circuits d'anticipation de retenue sont totalement à refaire et le résultat est relativement compliqué. C'est ce qui explique pourquoi le BCD a progressivement été abandonné au profit du binaire simple. La soustraction en BCD se fait comme en binaire : le nombre à soustraire est remplacé par son complément, le circuit additionne le complément et l'autre opérande, le débordement d'entier fait que le résultat marche. Sauf qu'ici, le complément est un complément à 9. Il se calcule chiffre par chiffre : chaque chiffre est remplacé par (9 - le chiffre en question). ===L'additionneur BCD par ajustement décimal=== L'additionneur BCD précédent effectuait son travail chiffre BCD par chiffre BCD, mais il existe des additionneurs BCD qui font autrement. Sur les premiers processeurs x86, il n'y avait pas d'opération d'addition BCD proprement dit, seulement une addition binaire normale de 8, 16 ou 32 bits. Par contre, elle était secondée par une opération dite d''''ajustement décimal''' qui transformait un nombre binaire en nombre codé en BCD. L'opération d'ajustement décimal prenait un opérande de 8 bits codé en binaire et fournissait un résultat de la même taille, c'est à dire deux chiffres BCD. Effectuer une addition BCD demandait donc de faire deux opérations à la suite : une addition binaire simple, suivie par l'opération d'ajustement décimal. Cela permettait de gérer des nombres entiers en binaire usuel et des entiers BCD sans avoir deux instructions d'addition séparées pour les deux, sans compter que cela simplifiait aussi les circuits d'addition. L'ajustement décimal s'effectue en ajoutant une constante bien précise à l'opérande à convertir en BCD. L'idée est que la constante est découpée en morceaux de 4 bits, correspondant chacun à un chiffre BCD de l'opérande, chaque morceau contenant soit un 0, soit 6. Cela permet d'ajouter soit 0, soit 6, à chaque chiffre BCD, et donc de le corriger. La propagation des retenues d'un chiffre à l'autre est effectuée automatiquement par l'addition binaire de la constante. L'opération d'ajustement décimal calcule automatiquement la constante. Elle découpe l'opérande en ''nibbles'', vérifie si chaque ''nibble'' est supérieur ou égal à 10, puis détermine la valeur de chaque ''nibble'' de la constante finale. Par exemple, si je prends l'opérande 1001 1110, le ''nibble'' de poids faible déborde, alors que celui de poids fort non. La constante sera donc 0000 0110 : 0x06. Inversement, si le ''nibble'' de poids fort déborde et pas celui de poids faible, la constante sera alors 0x60. Et la constante est de 0x66 si les deux ''nibbles'' débordent, de 0x00 si aucun ne déborde. Le circuit d’ajustement décimal est donc composé de trois étapes : deux étapes pour calculer la constante, et un circuit d'addition pour additionner cette constante au nombre de départ. La première étape découpe l'opérande en morceaux de 4 bits, en chiffres BCD, et vérifie si chacun d'entre eux vaut 10 ou plus. La seconde étape prend les résultats de la première étape, et les combine pour calculer la constante. Enfin, on trouve l'addition finale, qui était réalisée par un circuit d'addition utilisé à la fois pour l'ajustement décimal et l'addition binaire. La différence entre une addition normale et une opération d'ajustement décimal tient dans le fait que les deux premières étapes sont désactivées dans une addition normale. [[File:Additionneur BCD parallèle.png|centre|vignette|upright=1.5|Additionneur BCD parallèle]] ===L'additionneur biquinaire=== Les entiers BCD ne sont qu'un des encodages hybrides entre décimal et binaire. L'encodage biquinaire est l'un d'entre eux et nous allons faire un rappel rapide à ce sujet. Pour simplifier, un chiffre encodé en biquinaire est composé de deux parties : un bit, couplé à une partie quinaire encodée en représentation ''one-hot''. La partie quinaire encode un nombre allant de 0 à 4, ce qui prend 5 bits (0, 1, 2, 3 et 4). Le bit indique s'il faut ou non ajouter 5 à la valeur encodée par la partie quinaire. Ainsi, on peut coder tous les nombres de 0 à 9. Additionner deux nombres de biquinaire demande donc d'additionner deux parties quinaires encodées en ''one-hot'' et d'additionner deux bits. Mais attention : il faut tenir compte de la retenue de l'addition des parties quinaires. Et idéalement, il faut aussi tenir compte d'une retenue entrante, provenant de l'addition de la colonne de chiffres précédente. Toute la difficulté vient de la création de l'additionneur ''one-hot''. Heureusement, vu qu'il n'y a que 4-5 bits à additionner, il est souvent fabriqué à partir de sa table de vérité. [[File:Additionneur bi-quinaire.png|centre|vignette|upright=2|Additionneur bi-quinaire]] Un avantage du biquinaire est que le calcul du complément à 9 est très simple. Il faut pour cela : inverser la partie binaire avec une porte NON, puis inverser l'ordre des bits de la partie quinaire. Concrètement, le bit de poids faible devient le bit de poids fort, et ainsi de suite. Par exemple, une partie quinaire 01000 devient 00010, 10000 devient 00001, 00100 ne change pas, etc. Le tout peut se calculer avec une porte NON et 5 multiplexeurs. ===L'additionneur BCD avec calculs intermédiaires en biquinaire=== L'ordinateur IBM 1401, un ancien ''mainframe'' des années 60, utilisait un additionneur BCD un peu particulier. Les nombres étaient encodés en BCD dans la mémoire de l'ordinateur, mais les circuits de calcul utilisaient la représentation biquinaire. Lors d'un calcul, le processeur de l'ordinateur traduisait les chiffres BCD en représentation biquinaire, faisait une addition en biquinaire, avant de traduire le résultat en BCD normal. Pour être précis, l'IBM 1401 utilisait une variante du biquinaire. L'encodage biquinaire de l'IBM 1401 est le suivant : la partie binaire disait si le chiffre était pair ou non, la partie quinaire encodait les valeurs 0, 2, 4, 6 et 8. Le chiffre se calculait en additionnant la partie binaire (0 ou 1) au nombre pair encodé par la partie quinaire. Si l'IBM 1401 utilisait cette variante du biquinaire, c'est car elle donnait des circuits de conversion BCD-biquinaire plus économes en portes logiques et plus rapides. La partie binaire est le bit de poids faible du chiffre BCD, la partie biquinaire est calculée par un simple décodeur qui prend en entrée le chiffre BCD, amputé de son bit de poids faible. La traduction inverse demande d'utiliser un encodeur, à la place du décodeur. Par contre, le circuit d'addition biquinaire était plus compliqué du fait de la gestion des retenues. L'addition des parties binaires et quinaires se faisait en parallèle, dans deux additionneurs séparés. Cependant, l'addition des parties binaire fournit une retenue, qu'il faut prendre en compte. Pour cela, l'IBM 1401 disposait d'un troisième additionneur qui fournissait le résultat final, encodé en biquinaire. [[File:Additionneur bi-quinaire de l'IBM 1401.png|centre|vignette|upright=2|Additionneur biquinaire de l'IBM 1401]] Une implémentation moderne demanderait d'utiliser des portes ET combinées à des portes OU, le circuit pouvant être construit simplement à partir de sa table de vérité. Sur l'IBM 1401, le circuit était cependant différent, en raison de l'utilisation de OU câblés, des croisements de fils qui fonctionnent comme des portes OU, que nous n'avons pas encore vu pour le moment, mais qui seront détaillés dans quelques chapitres. Les OU câblés étaient utilisés pour simplifier le design du circuit, mais demandaient des portes logiques spécifiques, ce qui collait avec le fait que ce ''mainframe'' utilisait des transistors en Germanium. L'implémentation exacte est décrite dans cet article de blog, mais je ne recommande sa lecture qu'à ceux qui savent ce qu'est un OU câblé : * [https://www.righto.com/2015/10/qui-binary-arithmetic-how-1960s-ibm.html Qui-binary arithmetic: how a 1960s IBM mainframe does math]. ==L'incrémenteur== Le circuit '''incrémenteur''' est conçu pour incrémenter un nombre entier. De tels circuits étaient très utilisés sur les premiers processeurs 8 bits, comme le Z-80, le 6502, les premiers processeurs x86 comme le 8008, le 8086, le 8085, et bien d'autres. Il s'agit de circuits assez simples, bien plus simples que les additionneurs. Ils peuvent reprendre les optimisations présentes dans les additionneurs, comme l'anticipation de retenue ou le ''carry skip'', mais ces techniques sont bien plus simples à utiliser avec un incrémenteur. Il existe aussi des ''circuits décrémenteurs'', qui décrémentent une opérande, ainsi que des ''circuits incrémenteur-décrémenteur'', qui peuvent incrémenter ou décrémenter, selon comment on les configure. Je ne vais pas détailler ces circuits plus que ça, car de tels circuits sont assez rares, comparé à un circuit incrémenteur simple. ===L'incrémenteur à propagation de retenue=== Le circuit incrémenteur se construit sur la même base qu'un additionneur, qu'on simplifie. L'opération effectuée est la suivante : <math>a_7</math> <math>a_6</math> <math>a_5</math> <math>a_4</math> <math>a_3</math> <math>a_2</math> <math>a_1</math> <math>a_0</math> + 0 0 0 0 0 0 0 1 ------------------------------ Le calcul alors très simple : il suffit d'additionner 1 au bit de poids faible, sur la colonne la plus à droite, et propager les retenues pour les autres colonnes. En clair, on n'additionne que deux bits à chaque colonne : un 1 sur celle tout à droite, la retenue de la colonne précédente pour les autres. En clair : un incrémenteur est un additionneur normal, dont on a remplacé les additionneurs complets par des demi-additionneurs. Le 1 le plus à droite est injecté sur l'entrée de retenue entrante de l'additionneur. Et cela marche avec tous les types d'additionneurs, que ce soit des additionneurs à propagation de retenue, à anticipation de retenue, etc. Un '''incrémenteur à propagation de retenue''' est donc constitué de demi-additionneurs enchaînés les uns à la suite des autres. Le circuit incrémenteur basique est équivalent à un additionneur à propagation de retenue, mais où on aurait remplacé tous les additionneurs complets par des demi-additionneurs. [[File:Circuit incrémenteur.png|centre|vignette|upright=3|Circuit incrémenteur.]] Maintenant, regardons le demi-additionneur le plus à droite, celui pour le bit de poids faible. Son entrée de retenue entrante est mise à 1 pour faire l'incrémentation. Quelques incrémenteurs permettent de configurer cette entrée de retenue à 0 ou à 1, ce qui effectue : soit une opération identité (l'opérande est recopié sur la sortie), soit une incrémentation. Un tel circuit est nommé un '''incrémenteur commandable'''. Nous aurons à utiliser une fois ou deux de tels incrémenteurs commandables dans la suite du cours. ===Les incrémenteurs ''carry skip''=== Il est possible d'optimiser un incrémenteur, sur le même modèle que les additionneurs vus plus haut. Une optimisation intéressante est de faire l'incrémentation, non pas bit par bit, mais par paquets de deux bits. Un circuit incrémente des paquets de deux bits, et propage la retenue entre paquets de deux bits. Le circuit incrémenteur est donc composé en enchainant non pas des demi-additionneurs, mais des '''incrémenteurs 2 bits''' qui incrémentent une opérande de deux bits. [[File:Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits.png|centre|vignette|upright=2.5|Circuit incrémenteur optimisé, faisant l'incrémentation par paquet de deux bits]] Reste à concevoir l'incrémenteur 2 bits. Une solution part de deux demi-additionneurs et effectue quelques simplifications au niveau des transistors et des portes logiques. Par exemple, l'Intel 8085 a utilisé un circuit optimisé, fabriqué avec des portes NAND et NOR. La raison est qu'avec les technologies de transistors CMOS actuelles, les portes NAND et NOR utilisent moins de transistors que les portes ET et OU. Et cette possibilité a été utilisé pour effectuer des simplifications assez mineures, mais toujours bonnes à prendre. Mais nous ne pouvons pas en parler ici. Une solution bien plus simple part de sa table de vérité. Elle nous dit que : * Si la retenue entrante vaut 0, il recopie les deux bits d'opérande sur sa sortie, les deux bits ne sont pas incrémentés. * Si la retenue entrante vaut 1, les deux bits d'opérande sont incrémentés. {|class="wikitable" |- ! Opérande !! Retenue entrante !! !! Retenue sortante !! Résultat |- | 00 || 0 || || 0 || 00 |- | 01 || 0 || || 0 || 01 |- | 10 || 0 || || 0 || 10 |- | 11 || 0 || || 0 || 11 |- | colspan="5" | |- | 00 || 1 || || 0 || 01 |- | 01 || 1 || || 0 || 10 |- | 10 || 1 || || 0 || 11 |- | 11 || 1 || || 1 || 00 |} On voit que la retenue sortante ne vaut 1 que dans un seul cas : les deux bits d'opérande valent 1, la retenue entrante vaut 1. Elle se calcule alors avec une porte ET à trois entrées. Pour les deux bits du résultat, les équations logiques ne donnent pas un résultat satisfaisant. La solution la plus simple est d'utiliser deux demi-additionneurs et de retirer les portes logiques superflues. Le résultat est alors un '''incrémenteur 2 bits ''carry skip''''', où la retenue sortante est calculée séparément du reste. Concrètement, les incrémenteurs 2 bits sont composés d'un circuit qui calcule les deux bits du résultat, et d'un circuit qui calcule la retenue sortante. [[File:Incrémenteur carry skip 2 bits.png|centre|vignette|upright=2.5|Incrémenteur ''carry skip'' 2 bits]] Quelques processeurs utilisaient l'anticipation de retenues. Par exemple, le processeur Z-80 de Zilog utilisait un incrémenteur pour des nombres de 16 bits, ce qui demandait des performances assez élevées. Et cet incrémenteur utilisait à la fois anticipation de retenues et ''carry skip''. Pour ceux qui veulent en savoir plus sur cet incrémenteur, voici un lien sur le sujet : * [https://www.righto.com/2013/11/the-z-80s-16-bit-incrementdecrement.html The Z-80's 16-bit increment/decrement circuit reverse engineered]. ==Les débordements d'entier lors d'une addition/soustraction== Les instructions arithmétiques manipulent des entiers codés sur un nombre fixe de bits, qui ne peuvent prendre leurs valeurs que dans un intervalle. Pour les nombres positifs, un ordinateur qui code ses entiers sur n bits pourra coder tous les entiers allant de 0 à <math>2^n -1</math>. Pour les nombres négatifs, l'intervalle est différent et dépend de la représentation utilisée. Dans le cas général, l'ordinateur peut coder les valeurs comprises de <math>N_\text{min}</math> à <math>N_\text{max}</math>. Si le résultat d'un calcul sort de cet intervalle, il ne peut pas être représenté par l'ordinateur et il se produit ce qu'on appelle un '''débordement d'entier'''. La '''valeur haute de débordement''' désigne la première valeur qui est trop grande pour être représentée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 0 et 7, la valeur haute de débordement est égale à 8. On peut aussi définir la '''valeur basse de débordement''', qui est la première valeur trop petite pour être codée par l'ordinateur. Par exemple, pour un ordinateur qui peut coder tous les nombres entre 8 et 250, la valeur basse de débordement est égale à 7. Pour les nombres entiers, la valeur haute de débordement vaut <math>N_\text{max} + 1</math> , alors que la valeur basse vaut <math>N_\text{min} - 1</math> (avec <math>N_\text{max}</math> et <math>N_\text{min}</math> respectivement la plus grande et la plus petite valeur codable par l'ordinateur). ===La correction des débordements d'entier : l'arithmétique saturée=== Quand un débordement d'entier survient, tous les circuits de calcul ne procèdent pas de la même manière. Dans les grandes lignes, il y a deux réactions possibles : soit on corrige automatiquement le résultat du débordement, soit on ne fait rien et on se contente de détecter le débordement. Si le débordement n'est pas corrigé automatiquement, le circuit ne conserve que les bits de poids faibles du résultat. Les bits en trop sont simplement ignorés. On dit qu'on utilise l''''arithmétique modulaire'''. Le problème avec ce genre d'arithmétique, c'est qu'une opération entre deux grands nombres peut donner un résultat très petit. Par exemple, si je dispose de registres 4 bits et que je souhaite faire l'addition 1111 + 0010 (ce qui donne 15 + 2), le résultat est censé être 10001 (17), ce qui est un résultat plus grand que la taille d'un registre. En conservant les 4 bits de poids faible, j’obtiens 0001 (1). En clair, un résultat très grand est transformé en un résultat très petit. Cela peut poser problèmes si on travaille uniquement avec des nombres positifs, mais c'est aussi utilisé pour coder des nombres en complément à deux. D'autres circuits utilisent ce qu'on appelle l''''arithmétique saturée''' : si un calcul génère un débordement, on arrondi le résultat au plus grand entier supporté par le circuit. Les circuits capables de calculer en arithmétique saturée sont un peu plus complexes, vu qu'il faut rajouter des circuits pour corriger le résultat en cas de débordement. Il suffit généralement de rajouter un ''circuit de saturation'', qui prend en entrée le résultat et le corrige en cas de débordement. Ce circuit de saturation met la valeur maximale en sortie si un débordement survient, mais se contente de recopier le résultat du calcul sur sa sortie s'il n'y a pas de débordement. Typiquement, il est composé d'une couche de multiplexeurs, qui sélectionnent quelle valeur mettre sur la sortie : soit le résultat du calcul, soit le plus grand nombre entier géré par le processeur, soit le plus petit (pour les nombres négatifs/soustractions). L'arithmétique saturée est utilisée pour les additions et soustractions, mais c'est plus rare pour les multiplications/divisions. Une des raisons est que le résultat d'une addition/soustraction prend un bit de plus que le résultat, là où les multiplications doublent le nombre de bits. Quand une addition déborde, le résultat réel est proche de la valeur maximale codable. mais quand une multiplication déborde, le résultat peut parfois valoir 200 à 60000 fois plus que la valeur maximale codable. Les calculs avec une valeur saturée/corrigée sont donc crédibles pour une suite d'additions, mais pas pour une suite de multiplications. ===La détection des débordements entiers=== Quand un débordement d'entier a eu lieu, il vaut mieux que l'additionneur prévienne ! Pour cela, l'additionneur a une '''sortie de débordement''', parfois nommée ''Overflow'', dont la valeur indique si l'addition a généré un débordement d'entier ou non. Reste que détecter un débordement ne se fait pas de la même manière selon que l'on parle d'un additionneur non-signé ou signé. Pour les additionneur non-signés, l'additionneur calcule un bit de plus que ce qui est supporté par l'ordinateur. Par exemple, un additionneur 32 bits fournit un résultat sur 33 bits, un débordement d'entier a lieu quand le 33ème bit est à 1. Précisément, la sortie de débordement n'est autre que la retenue finale, celle fournie par le dernier additionneur complet. Le seul type de débordement possible est un débordement par le haut, où le résultat dépasse la valeur maximale. Avec l'arithmétique saturée, le circuit de saturation consiste en une seule couche de multiplexeurs, voire en un circuit de mise à la valeur maximale tel que vu dans le chapitre sur les opérations bits à bits. [[File:Gestion des débordements d'entiers.png|centre|vignette|upright=2.5|Gestion des débordements d'entiers lors d'une addition non-signée.]] Pour les additionneurs non-signés, la gestion des débordements d'entiers dépend fortement de la représentation signée. Nous allons étudier le cas du complément à deux. Si vous vous rappelez le chapitre 1, les calculs sur des nombres en complètement à deux utilisent les règles de l'arithmétique modulaire, c'est une condition nécessaire. À priori, on peut penser que dans ces conditions, les débordements d'entiers sont une chose parfaitement normale, qui nous permet d'avoir des résultats corrects. Néanmoins, certains débordements d'entiers peuvent survenir malgré tout et produire des bugs assez ennuyeux. Si l'on tient en compte les règles du complément à deux, on sait que le bit de poids fort (le plus à gauche) permet de déterminer si le nombre est positif ou négatif : il indique le signe du nombre. Tout se passe comme si les entiers en complément à deux étaient codés sur un bit de moins, et avaient leur longueur amputé du bit de poids fort. Si le résultat d'un calcul écrase le bit de poids fort, il y a un débordement d'entiers. Il existe une règle simple qui permet de détecter ces débordements d'entiers. L'addition de deux nombres positifs ne peut pas être un nombre négatif. Si on additionne deux nombres dont le bit de signe est à 0 et que le bit de signe du résultat est à 1, on est en face d'un débordement d'entiers. Même chose pour deux nombres négatifs : le résultat de l'addition ne peut pas être positif. On peut résumer cela en une phrase : si deux nombres de même signe sont ajoutés, un débordement a lieu quand le bit du signe du résultat a le signe opposé. Modifier les circuits d'au-dessus pour qu'ils détectent les débordements en complément à deux est simple comme bonjour : il suffit créer un petit circuit combinatoire qui prenne en entrée les bits de signe des opérandes et du résultat, et qui fasse le calcul de l'indicateur de débordements. Si l'on rédige sa table de vérité, on doit se retrouver avec la table suivante : {|class="wikitable" |- !Entrées !Sortie |- |000||0 |- |001||1 |- |010||0 |- |011||0 |- |100||0 |- |101||0 |- |110||1 |- |111||0 |} L'équation de ce circuit est la suivante, avec <math>S_a</math> et <math>S_b</math> les signes des deux opérandes, et <math>C_i</math> la retenue de la colonne précédente : : <math> ( S_a . S_b . \overline{C_i} ) + ( \overline{S_a} . \overline{S_b} . C_i )</math> En simplifiant, on obtient alors : : <math>( S_a . S_b ) \oplus C_i</math> Or, il se trouve que <math>S_a . S_b</math> est tout simplement la retenue en sortie du dernier additionneur, que nous noterons <math>C_o</math>. On trouve donc : : <math>C_o \oplus C_i</math> Il suffit donc de faire un XOR entre la dernière retenue et la précédente pour obtenir le bit de débordement. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de décalage et de rotation | prevText=Les circuits de décalage et de rotation | next=Les circuits de comparaison | nextText=Les circuits de comparaison }} </noinclude> 5m6c6fd7egv6mrpzto0m98xgh6w1iok Fonctionnement d'un ordinateur/Les circuits de calcul logique et bit à bit 0 69516 767853 749268 2026-06-16T19:28:25Z Mewtow 31375 767853 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. Je précise bien : avec une porte OU, pas une porte NOR comme le ferait un vrai comparateur avec zéro. [[File:Circuit qui sélectionne un bit et teste sa valeur.png|centre|vignette|upright=2|Circuit qui sélectionne un bit et teste sa valeur]] ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. Les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer, erreur que nous ne ferons pas. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 7 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> jm8hymy2th8l620kkr47xacb1utly5k 767854 767853 2026-06-16T19:29:23Z Mewtow 31375 /* Le test d'un bit dans un opérande entier */ 767854 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. Je précise bien : avec une porte OU, pas une porte NOR comme le ferait un vrai comparateur avec zéro. [[File:Circuit qui sélectionne un bit et teste sa valeur.png|centre|vignette|upright=2|Circuit qui sélectionne un bit et teste sa valeur]] ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. Les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer, erreur que nous ne ferons pas. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 7 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> o1pbgl3cr04bjagnm6dh54xd28w45ef 767855 767854 2026-06-16T19:33:57Z Mewtow 31375 /* Le test d'un bit dans un opérande entier */ 767855 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations de manipulation de bits''', des opérations qui manipulent les bits d'un opérande. La différence avec les opérations bit à bit est que les bits de colonnes différentes peuvent être combinés entre eux pour fournir leur résultat, elles peuvent les faire changer de place, en supprimer, en ajouter, etc. Mais cela deviendra plus compréhensible en voyant quelques exemples d'opérations de ce genre. ==Le test d'un bit dans un opérande entier== Une opération assez courante teste si un bit précis vaut 0 ou 1, dans une opérande. Par exemple, si je prends l'opérande 0001 1010 (codée sur 8 bits). Je peux tester si le cinquième bit en partant de la droite vaut 1, ou s'il vaut zéro. Ici, le bit vaut 1. En logiciel, le programmeur implémente cette opération en utilisant un masque. L'idée est que l'on masque les bits non-sélectionnés, puis on analyse le résultat. En l’occurrence, le masque sélectionne le bit voulu et mets les autres à zéro. Le résultat est alors comparé avec zéro, pour savoir quelle est la valeur du bit sélectionné. Si le résultat vaut zéro, alors le bit sélectionné vaut zéro. S'il est différent de zéro, alors le bit sélectionné vaut 1. [[File:Masques 2.png|centre|vignette|upright=2.5|Masques pour tester un bit.]] Mais en matériel, on dispose d'un circuit qui fait cela naturellement : le multiplexeur ! Sélectionner un bit dans une opérande est la raison d'être d'un multiplexeur. Il suffit de lui envoyer la position du bit voulu, et voilà ! On récupère le bit sélectionné. Reste alors à le comparer avec la valeur voulue. Si on veut tester si le bit vaut 1, il n'y a rien à faire : le bit testé est lui-même le résultat de la comparaison. Mais si on veut tester si le bit vaut zéro, il faut alors inverser le résultat : le résultat doit valoir 1 si le bit vaut zéro et inversement. En clair, il suffit de combiner un multiplexeur avec un inverseur commandable. : Au passage, intérieurement, un multiplexeur fait la même chose que logiciel. Il contient un décodeur pour générer le masque, applique le masque avec une couche de portes ET, puis compare le résultat avec zéro avec une porte OU. ==L'opération de ''population count''== L'opération de '''''population count''''' compte le nombre de bits à 1 d'un opérande entier. Elle est très utilisée quand on manipule des tableaux de bits, pour le codage/décodage vidéo/audio, pour crypter/décrypter des données, etc. Les réseaux de neurones artificiels, notamment ceux utilisés dans l'intelligence artificielle, font aussi usage de cette opération. Elle est aussi très courante dans les algorithmes de correction d'erreur, utilisés dans les transmissions réseaux ou dans certaines mémoires. Les autres livres d'architecture des ordinateurs parlent de l'opération elle-même, mais pas des circuits pour la calculer, erreur que nous ne ferons pas. ===Le circuit de ''population count'' : les compteurs parallèles=== La ''population count'' est un cas particulier d'addition multiopérande, où chaque opérande fait 1 bit. En effet, pour calculer la ''population count'' d'un opérande de N bits, il faut additionner ces N bits entre eux. Et les techniques vues dans le chapitre sur l'addition multiopérande marchent aussi pour la ''population count''. La technique la plus simple est celle dite du diviser pour régner. L'idée est que si on découpe l'opérande en deux, la ''population count'' est la somme des ''population count'' de chaque partie. Par exemple, pour calculer la ''population count'' d'un entier 32 bits (4 octets), on peut additionner les ''population count'' des 4 octets de l'opérande. Pour cela, il faut fabriquer des circuits capables d'additionner entre 2 et 7 bits, appelés des ''parallel counters'', terme que nous traduirons par '''compteurs parallèles'''. [[File:POPCOUNT avec un additionneur multiopérande.png|centre|vignette|upright=2|Circuit de calcul de population count.]] Il se trouve que nous avons déjà vu des compteurs parallèles dans les chapitres précédents. Les additionneurs complets sont des compteurs parallèles 3 bits, les demi-additionneurs sont des compteurs parallèle 2 bits. Pour rappel, le premier additionne trois bits, alors que le second additionne deux bits. Dans ce qui suit, nous allons utiliser les abréviations suivantes : FA (''Full-Adder) pour additionneur complet, HA (''Half-Adder) pour demi-additionneur. Le calcul de la ''population count'' peut donc utiliser des FA comme compteurs parallèles. Un tel additionneur regroupe les bits de l'opérande par triplets et additionne chaque triplet avec un FA. S'il reste une paire de bits isolées après avoir formé les triplets, elle est additionnée avec un HA. Les FA/HA calcule des ''population count'' intermédiaires codées sur 2 bits, qui sont ensuite additionnées par l'additionneur multi-opérande. Le circuit ne paye pas de mine, mais c'est un circuit de ce style qui a été utilisé sur le processeur ARM1, un des tout premier CPU ARM, prévu pour les premiers iPhones. [[File:POPCNT circuit.png|centre|vignette|upright=2|Illustration de la première couche du circuit de POPCNT.]] Le circuit précédent additionne un grand nombre de résultat intermédiaires codées sur 2 bits. L'idéal serait pourtant l'inverse : moins d'opérandes à additionner, mais celles-ci sont plus longues. Pour cela, il faut remplacer les FA par des compteurs parallèles qui fournissent des résultats codés sur 4, 5, 6, 7 bits, parfois plus. Intuitivement, on se dit qu'il faudrait découper les opérandes en groupes de 4, 8, 16 bits, ou toute autre puissance de deux. Sauf que ce n'est pas l'idéal. Par exemple, avec un résultat de 3 bits, on peut coder les valeurs de 0 à 7, ce qui fait 7 bits. Sur 4 bits, cela permet de gérer 15 bits, pas plus. Sur 5 bits, cela permet de gérer 63 bits d'entrée. À chaque fois, il nous manque un bit pour avoir un groupe bien rond de 4, 8, 16 bits. La raison est qu'il faut encoder le zéro pour le résultat. Les compteurs parallèles peuvent être construits comme n'importe quel circuit combinatoire, à partir de la table de vérité. Mais ils peuvent aussi être construits en combinant des compteurs parallèles plus petits avec un additionneur. Il s'agit de l'implémentation la plus simple, la moins optimisée, la plus gourmande en portes logiques. Heureusement, des simplifications sont possibles, comme on le verra dans la suite du chapitre. [[File:Population count avec des compteurs parallèles.png|centre|vignette|upright=2|Population count avec des compteurs parallèles]] ===Les compteurs parallèles de moins de 8 bits=== Dans cette section, nous allons voir comment créer des compteurs parallèles en utilisant des FA/HA, couplés à un additionneur. Nous simpliferons ces circuits par la suite. Le premier exemple intéressant est le '''compteur parallèle 4 bits''', qui prend 4 bits d'opérande et fournit un résultat de 3 bits. Premièrement, il additionne les bits d'opérande deux par deux, avec deux HA/ Les deux résultats de 2 bits sont ensuite additionnés avec un additionneur 2 bits. Le circuit final est le suivant : [[File:Compteur parallèle de 4 bits, fabriqué avec des HA et FA.png|centre|vignette|upright=2.5|Compteur parallèle de 4 bits, fabriqué avec des HA et FA]] Pour les compteurs parallèles de plus de 4 bits, il devient intéressant d'additionner les bits par groupes de 3, par triplet. Les bits d'un triplet sont additionnés avec un FA, ce qui donne un résultat sur deux bits. Le compteur parallèle 5 bits est construit sur le même modèle. Il calcule la ''population count'' d'une paire de bit et d'un triplet de bit, et additionne le tout avec un additionneur 2 bits. [[File:Compteur parallele 5 bits, naïf.png|centre|vignette|upright=2|Compteur parallele 5 bits, naïf]] Pour un compteur de 6 bits, la première couche ne contient que des FA, tout en conservant l'additionneur 2 bits. [[File:Compteur parallele 4bits.png|centre|vignette|upright=2|Compteur parallèle 6 bits]] Dans l'exemple précédent, il est intéressant d'ajouter un 7ème bit d'opérande, pour profiter de l'entrée de retenue de l'additionneur. En effet, tous les additionneurs dignes de ce nom disposent d'une entrée de retenue, utilisée pour l'incrémentation ou d'autres opérations. Elle permet d'ajouter un bit en plus, sur la colonne des bits de poids faible. Et bien on peut rajouter un 7ème bit sur cette entrée. Et dans le cas général, au lieu d'additionner des triplets de bits, on peut rajouter un bit en plus. [[File:Compteur parallel 7bits.png|centre|vignette|upright=2|Compteur parallèle 7 bits]] ===Les simplifications liées aux demi-additionneurs=== Les compteurs vus plus haut peuvent être simplifiés, afin de faire des économies de portes logiques. Les compteurs parallèle de 6 et 7 bits ne peuvent pas se simplifier facilement, mais ceux de 4 et 5 bits le peuvent. Les simplifications sont liés au fait que ces deux circuits intégrent des paires de HA en série, à savoir que le second prend l'entrée du premier. Et à une porte logique près, ces deux HA en série forment un FA. Pour le compteur parallèle 5 bits, la simplification donne le circuit suivant. Le circuit originel avait deux HA et deux FA, cette version simplifié élimine un HA, ce qui fait une petite économie de circuits. Avec cette simplification, on perd l'organisation en deux couches : une couche de FA/HA qui calcule la ''population count'' de paires/triplets de bits, suivi par un additionneur 2 bits. Mais le seul désavantage est que le circuit est moins simple à expliquer, ce qui est juste un petit défaut. [[File:Circuit de calcul de PCOUNT de 5 bits.png|centre|vignette|upright=2|Circuit de calcul de PCOUNT de 5 bits]] Pour le compteur parallèle 4 bits, une implémentation alternative donne le circuit suivant. Le circuit incorpore un FA et deux HA, contre 4 HA avec le circuit de base. Sachant qu'un FA contient 2 HA et une porte logique, le circuit n'économise pas de portes logiques. Notez que ce circuit peut être interprété comme un FA couplé à un additionneur. Précisément, il additionne trois bits, puis décide d'incrémenter le résultat ou non suivant la valeur du quatrième bit. Le circuit est donc composé d'un FA suivi par un incrémenteur commandable (son entrée de retenue est configurable). [[File:Compteur parallèle de 4 bits, version alternative.png|centre|vignette|upright=2|Compteur parallèle de 4 bits, version alternative]] ===Les ''adders compressors'' : fusionner des additionneurs complets=== Nous venons de voir une simplification assez basique, à savoir fusionner plusieurs HA en un seul FA. Mais est-ce qu'il existe un équivalent pour les FA ? A savoir un circuit qui fusionne plusieurs FA en un seul circuit amélioré ? intuitivement, on se dit que non, car un tel circuit serait tout sauf intuitif pour ce qui est des retenues. Sauf que la réponse est oui, il existe des circuits qui fusionnent plusieurs FA entre eux et fournit exactement les mêmes sorties que les FA fusionnés. De tels circuits sont appelés des '''''adder compressors'''''. Les ''adder compressors'' sont utilisés dans le cadre de l'addition multiopérande en général, pas seulement pour le calcul de la ''population count''. Ils sont surtout utilisés dans les additionneurs multiopérandes en arbre. Les arbres de Wallace ou de Dadda peuvent être modifiés de manière à fusionner des FA d'une même couche, en les remplaçant par des ''adder compressors''. Mais la construction de l'arbre d'additionneur est alors beaucoup plus complexe, ce qui explique pourquoi je n'en ai pas parlé dans le chapitre sur l'addition multiopérande. Les ''adder compressors'' fournissent le bit de poids faible du résultat et les différentes retenues des additions intermédiaires fournies par les FA fusionnés. Par exemple, prenons le compteur parallèle de 5 bits, composé de deux FA placés l'un à la suite de l'autre, avec un HA qui additionne les deux retenues produites par les deux FA. Les deux FA peuvent être remplacés par un mal-nommé ''adder compressor'' 4:2, qui prend 5 bit d'opérande et fournit les trois mêmes sorties que les deux FA : le bit de poids faible du résultat final, les deux retenues des additions intermédiaires. Les retenues doivent être combinées ensemble par des circuits à part, pour obtenir un compteur parallèle. Dans le cadre de l'addition multiopérande, les retenues sont simplement propagées à la colonne suivante, elles sont envoyées en entrée d'un autre ''adder compressor''. [[File:Simplification d'un compteur parallèle 5 bits avec un adder compressor.png|centre|vignette|upright=2|Simplification d'un compteur parallèle 5 bits avec un adder compressor.]] L'avantage est que le calcul du bit de somme est simplifié. Le mieux est de partir de l'exemple avec un compteur parallèle 5 bits, avec ses deux FA en série. Voici ce que l'on obtient en enchainant deux FA, au niveau des XOR : [[File:Adder compressor 4-2.png|centre|vignette|upright=2|Adder compressor 4-2]] Le schéma montre que l'on a quatre portes XOR placées en série, ce qui est tout sauf idéal. Mieux vaut essayer de les mettre en parallèle, pour gagner un petit peu en rapidité. Il est par exemple possible d'améliorer le circuit précédent pour passer de 4 portes en série à seulement 3, ce qui est légèrement plus rapide. [[File:Adder compressor 4-2 optimisé.png|centre|vignette|upright=2|Adder compressor 4-2 optimisé]] En clair, la fusion des FA permet de réorganiser la chaine de portes XOR qui calcule le bit de somme. Les portes XOR doivent idéalement former un arbre équilibré, de manière à réduire le nombre de portes XOR à traverser. Un ''adder compressor'' utilise l'arbre des portes XOR idéal, mais calcule les retenues par groupes de 3 bits. [[File:Addition des bits de somme.png|centre|vignette|upright=2|Addition des bits de somme avec des HA : arbre équilibré]] ==Les opérations FFS, FFZ, CTO et CLO== Dans cette section, nous allons aborder plusieurs opérations fortement liées entre elles, illustrées dans le schéma ci-dessous. Elles sont très courantes sur la plupart des ordinateurs, surtout dans les ordinateurs embarqués. Beaucoup d'ordinateurs, comme les anciens mac avec des processeurs type Power PC et les processeurs MIPS ou RISC ont des instructions pour effectuer ces opérations. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "les 0 de poids faible" et quelques autres du même genre. Quand nous parlerons du 0 de poids faible, nous voudrons parler du premier 0 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0011 1011, le 0 de poids faible est le troisième bit en partant de la droite. Quand nous parlerons du 1 de poids faible, c'est la même chose, mais pour le premier bit à 1. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant aux expressions "le 1 de poids fort" et "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Par contre, les expressions "LES 1 de poids faible" ou "LES 0 de poids faible" ne parlent pas de la même chose. Quand nous voudrons parler des 1 de poids faible, au pluriel, nous voulons dire : tous les bits situés avant le 0 de poids faible. Par exemple, prenons le nombre 0011 0011 : les 1 de poids faible correspondent ici aux deux premiers bits en partant de la droite. Même chose quand on parle des zéros de poids faible au pluriel. Quant aux expressions "les 1 de poids fort" ou "les 0 de poids fort" elles sont identiques aux précédentes, sauf qu'on parcourt le nombre à partir de sa gauche. Les opérations que nous allons voir sont au nombre de 8 et elles s'expliquent facilement avec le schéma ci-dessous. [[File:Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.png|centre|upright=2.0|vignette|Opérations Find First Set ; Find First Zero ; Find Highest Set (le logarithme binaire) ; Find Highest Zero ; Count Leading Zeros ; Count Trailing Zeros ; Count Leading Ones et Count Trailing Ones.]] Les quatre opération suivantes donnent la position des 0/1 de poids faible/fort : * L'opération '''''Find First Set''''', donne la position du 1 de poids faible. * L'opération '''''Find highest set''''' donne la position du 1 de poids fort. * L'opération '''''Find First Zero''''' donne la position du 0 de poids faible (le plus à droite). * L'opération '''''Find Highest Zero''''' donne la position du 0 de poids fort (le plus à gauche). Elles ont des opérations corolaires qui elles, comptent le nombre de 0/1 avant ou après des 0/1 de poids fort/faible. * L'opération '''''Count Trailing Zeros''''' compte les zéros situés à droite du 1 de poids faible. * L'opération '''''Count Leading Zeros''''' compte les zéros à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' compte les 1 situés à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' compte les 1 situés à droite du 0 de poids faible. Dans toutes ces opérations, les bits sont numérotés, leur numéro étant appelé leur position ou leur indice. La position d'un bit est donc donnée par ce numéro. Ces opérations varient selon la méthode utilisée pour numéroter les bits. On peut commencer à compter les bits à partir de 0, le 0 étant le numéro du bit de poids faible. Mais on peut aussi compter à partir de 1, le bit de poids faible étant celui de numéro 1. Ces deux conventions ne sont pas équivalentes. Si on choisit la première convention, certaines opérations sont équivalentes. Par exemple, les opérations ''Count Trailing Zeros'' et ''Find First Set'' donnent toutes les deux le même résultat. Avec la première convention, pour un nombre codé sur <math>n</math> bits, on a : : <math>\text{fhs} + \text{clz(n)} = n - 1</math> : <math>\text{fhz} + \text{clo(n)} = n - 1</math> : <math>\text{ffs} = \text{ctz(n)}</math> : <math>\text{ffz} = \text{cto(n)}</math> On voit que certaines opérations sont équivalentes, ce qui nous arrange bien. Il y a deux classes d'opérations : celles à gauche dans les équations précédentes, celles à droite. Les premiers donnent la position du 0/1 de poids faible/fort, celles qui comptent des 0/1 de poids faibles/fort. Et les deux classes s'implémentent par des circuits très différents. ===L'implémentation avec un encodeur à priorité=== La première implémentation implémente les quatre calculs suivants : * le ''Find First Set'', abréviée FFS ; * le ''Find Highest set'', abrévié FHS ; * le ''Find First Zero'', abréviée FFZ ; * le ''Find highest Zero'', abrévié FHZ. Implémenter chaque opération peut se faire avec un encodeur à priorité. Pour les quatre opérations précédentes, il existe un encodeur à priorité qui s'en charge. Par exemple, on peut utiliser un encodeur à priorité qui donne la position du 1 de poids fort, c’est-à-dire qui réalise l'opération ''Find Highest Set''. Il existe aussi un autre encodeur à priorité qui lui donne la position du 1 de poids faible, ce qui correspond à l'opération ''Find First Set''. Il existe aussi un encodeur qui donne la position du zéro de poids faible (''Find First Zero'') et un autre qui donne celle du zéro de poids fort (''Find highest Zero''). Mais utiliser quatre encodeurs différents n'est pas l'idéal. Il est en effet possible de faire avec un seul encodeur. L'idée est qu'un encodeur à priorité est composé d'un encodeur normal, couplé à un circuit de priorité qui sélectionne le 0/1 de poids fort/faible. L'idée est de rendre ce circuit configurable, de manière à choisir l'opération voulue parmi les 4 précédentes. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité]] Une autre méthode utilise un inverseur commandable. En, effet, les opérations FHS et FHZ peuvent se déduire l'une de l'autre, en inversant le nombre passé en entrée : les 0 de poids fort deviennent alors des 1 de poids fort, et vice-versa. Idem pour les opérations FFS et FFZ. En inversant l'entrée, le 1 de poids faible deviendra le 0 de poids faible et inversement. Inverser les bits de l'entrée se fait avec un inverseur commandable. [[File:Circuit qui effectue les opérations FHS, FFS, CLZ et autres.png|centre|vignette|upright=2|Circuit qui effectue les opérations FHS, FFS, CLZ et autres.]] ===L'implémentation avec la ''population count''=== Maintenant, voyons comment implémenter les quatre opérations suivantes. Il s'agit des opérations qui comptent les 0 ou 1 de poids faible, et ceux de poids fort. * L'opération '''''Count Trailing Zeros''''' donne le nombre de zéros situés à droite de ce 1 de poids faible. * L'opération '''''Count Leading Zeros''''' donne nombre de zéros situés à gauche du 1 de poids fort. * L'opération '''''Count Trailing Ones''''' donnent le nombre de 1 à gauche du 0 de poids fort. * L'opération '''''Count Leading Ones''''' donne le nombre de 1 à droite du 0 de poids faible. Les quatre opérations listées plus haut comptent un certain nombre de 0 ou 1. Compter des 1 ressemble beaucoup à ce que fait le circuit de ''population count''. La différence est qu'ici, seuls certains bits sont à prendre en compte : ceux situés à droite/gauche d'un 0/1 de poids faible/fort. Or, nous avons déjà un outil pour ignorer certains bits : l'usage de masques avec des opérations bit à bit. L'idée est alors de générer un masque qui indique la position des 0/1 de poids faible/fort. Chaque bit du masque est associé au bit à la même place dans l'opérande, celui de même poids. Un bit du masque à 1 indique que le bit est à prendre en compte, alors qu'un bit à 0 indique un bit à ignorer. Par exemple, prenons le cas où on veut compter le nombre de ''Trailing Zeros'', à savoir les 0 de poids faible, ceux situés à droite du premier 1 rencontré en lisant l'opérande de droite à gauche. La première étape génère un nombre qui a un 1 à la place de chaque ''Trailing Zero'', et un 0 ailleurs. {|class="wikitable" |- ! Opérande | 0010 1101 1001 1000 0000 |- ! Masque | 0000 0000 0000 0111 1111 |} Une fois le masque voulu obtenu, on compte le nombre de 1 dans le masque généré. En clair, on calcule sa ''population count''. Le résultat donne le nombre voulu. Le circuit qui génère le masque a une implémentation similaire à celle utilisée par un encodeur à priorité. Avec un encodeur à priorité qui calcul l'opération ''Find First Set'', le circuit met à 0 les bits qui suivent le 1 de poids fort. Avec l'opération ''Count Leading Zero'', le circuit fait la même chose, sauf que les bits sont mis à 1. Le circuit est construit de la même manière, comme illustré ci-dessous. Il s'agit de l'implémentation la plus simple, composée de briques qui mettent à 0/1 un bit de l'opérande, qui sont enchainés les uns à la suite des autres. [[File:L'implémentation de l'opération CLZ avec la population count.png|centre|vignette|upright=2|L'implémentation de l'opération CLZ avec la population count]] Le circuit précédent met à 1 un bit à la fois. Une amélioration serait d'en traiter plusieurs à la fois. Par exemple, on peut imaginer un circuit qui traite des groupes de 4/5 bits. Pour chaque groupe, un circuit détecte les 1 de poids fort et met les bits suivants à 1. Le circuit peut se concevoir simplement avec un tableau de Karnaugh. Évidemment, pour enchainer plusieurs circuits, il faut gérer le cas où un 1 de poids fort a été détecté dans un groupe précédent et mettre toutes les sorties à 1 cas échéant, avec un circuit de mise à 111111 qu'on a déjà vu. [[File:Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT.png|centre|vignette|upright=2|Implémentation optimisée de l'opération CLZ basée sur la POPCOUNT]] Une version améliorée de cette technique a apparemment été utilisée par Intel dans certains de ces processeurs, le brevet "Combined set bit count and detector logic" détaille l'implémentation d'une technique similaire. ==Les circuits générateurs/vérificateurs d'ECC== Au tout début de ce cours, nous avions vu les codes ECC, qui détectent ou corrigent des corruptions de données. Si un bit est altéré, ils permettent de détecter que le bit en question a été inversé, et peuvent éventuellement le corriger pour retrouver la donnée initiale. Les deux codes ECC les plus connus sont le bit de parité et les codes de Hamming. Et ils sont très liés à la ''population count''. Dans ce qui suit, nous allons voir des circuits qui calculent soit un bit de parité, soit le code de Hamming d'un nombre. ===Le générateur de bit de parité=== Pour rappel, le bit de parité permet de détecter qu'un bit a été inversé, à savoir qu'il est passé de 1 à 0 ou inversement. Pour cela, on ajoute un bit de parité aux données à sécuriser, afin que le nombre de bits à 1 soit pair, bit de parité inclus. En clair, le bit de parité vaut 0 si la donnée a un nombre de bits à 1 pair, il vaut 1 si ce nombre est impair. Dans cette section, nous allons voir un circuit qui calcule le bit de parité d'un opérande. [[File:Circuit de parité.PNG|vignette|Circuit de parité]] Intuitivement, on se dit qu'il faut compter les 1 dans l'opérande, avant de calculer sa parité et d'en déduire le bit de parité. Le bit de parité est donc le bit de poids faible de la ''population count''. Le bit de parité se calcule donc en additionnant les bits de l'opérande, mais sans tenir compte des bits de poids fort, sans tenir compte des retenues, en ne conservant que le bit de somme. Lors de l'addition de deux bits, ce bit de somme est calculé en faisant un XOR entre les deux bits à additionner. Pour N bits, il suffit d'enchainer N-1 portes XOR. Avec cette logique, on peut créer un '''générateur de parité parallèle''', un circuit qui calcule le bit de parité d'un opérande, en faisant un XOR entre tous ses bits. En réfléchissant, on devine qu'on peut structurer les portes XOR comme illustré ci-contre. Le circuit précédent calcule le bit de parité d'un opérande. Pour ce qui est de vérifier si une donnée est corrompue, rien de plus simple : il suffit de générer le bit de parité de la donnée seule, et de le comparer avec le bit de parité stocké dans la donnée avec la porte logique adaptée. Le circuit qui génère un bit de parité et celui qui vérifie si le bit de parité est valide sont donc très similaires. ===Le générateur/''checker'' d'ECC=== [[File:Hamming(7,4).svg|vignette|Hamming(7,4)]] Les codes de Hamming calculent plusieurs bits de parité, qui sont chacun calculés en prenant en compte certains bits de l'opérande. Par exemple, le code de Hamming de type 7,4 prend des données sur 4 bits, et leur ajoute 3 bits de parité, ce qui fait en tout 7 bits : c'est de là que vient le nom de 7-4-3 du code. Chaque bit de parité se calcule à partir de 3 bits du nombre. Le schéma ci-contre indique quels sont les bits de données utilisés pour calculer un bit de parité : les bits de parité sont notés p, les bits de données d. L'implémentation matérielle est donc très simple : un circuit qui génère un code de Hamming est composé de plusieurs circuits de génération de parité, idem pour un circuit qui vérifie le code de Hamming d'un opérande. Étudions par exemple le circuit suivant, conçu pour le code 7-4-3. Il vérifie si les 4 bits de données sont valides, à savoir si les trois bits d'ECC collent bien aux données associées. Si les deux valeurs correspondent, il n'y a pas d'erreur. Mais si les bits ne correspondent pas, alors on sait quel bit est erroné en regardant quel bit d'ECC est invalide. Le circuit corrige alors le bit erroné. En premier lieu, le circuit calcule le code de Hamming des 4 bits de données, avec une première couche de portes XOR. Le résultat est alors comparé avec les trois bits d'ECC présents dans l'opérande, par un comparateur d'égalité, lui-même construit avec des portes XOR. Le tout est suivi par un circuit de correction d'erreur. Une couche de portes ET/NON sélectionne le bit à corriger. Elle génère un masque de 4 bits qui indique quel bit inverser : celui dont le bit du masque est à 1. La dernière couche de portes XOR prend ce masque et l'applique aux 4 bits de données, ce qui inverse le bit adéquat. [[File:HammingCircuit.png|centre|vignette|upright=2|Circuit de vérification d'un code de Hamming 7,4.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits pour la multiplication et la division | prevText=Les circuits pour la multiplication et la division | next=Les circuits de calcul flottant | nextText=Les circuits de calcul flottant }} </noinclude> ndf1jluzpgikah319bdrhjd2mwjkepw Fonctionnement d'un ordinateur/Les circuits de sélection 0 70056 767851 746960 2026-06-16T19:19:46Z Mewtow 31375 /* Les multiplexeurs à plus de deux entrées */ 767851 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, on peut ruser. Ce qui a été fait pour les multiplexeurs peut aussi s'adapter aux démultiplexeurs : il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. [[File:Circuit qui sélectionne un bit et teste sa valeur.png|centre|vignette|upright=2|Circuit qui sélectionne un bit et teste sa valeur]] Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur : la génération du masque est donc le fait d'un décodeur. L'entrée de commande du multiplexeur correspond à l'entrée du décodeur. Pour mettre à zéro les entrées non-sélectionnées, on utilise le circuit de mise à zéro basé sur une couche de portes ET. La comparaison avec zéro se fait avec une simple porte OU à plusieurs entrées. Vu que toutes les entrées non-sélectionnées sont à zéro, la sortie de la porte OU aura la même valeur que l'entrée sélectionnée. Le résultat est le suivant : [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] Une solution alternative est de concevoir un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> 01wbo6ik0hlrya4ttabm8hb0pc2duqn 767872 767851 2026-06-16T20:49:16Z Mewtow 31375 /* Les multiplexeurs à plus de deux entrées */ 767872 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, on peut ruser. Ce qui a été fait pour les multiplexeurs peut aussi s'adapter aux démultiplexeurs : il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur : la génération du masque est donc le fait d'un décodeur. L'entrée de commande du multiplexeur correspond à l'entrée du décodeur. Pour mettre à zéro les entrées non-sélectionnées, on utilise le circuit de mise à zéro basé sur une couche de portes ET. La comparaison avec zéro se fait avec une simple porte OU à plusieurs entrées. Vu que toutes les entrées non-sélectionnées sont à zéro, la sortie de la porte OU aura la même valeur que l'entrée sélectionnée. Le résultat est le suivant : [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] Une solution alternative est de concevoir un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> cbusgt9fq70jehkbu7lawtqi38tb1ef 767873 767872 2026-06-16T20:49:48Z Mewtow 31375 /* Les multiplexeurs à plus de deux entrées */ 767873 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, on peut ruser. Ce qui a été fait pour les multiplexeurs peut aussi s'adapter aux démultiplexeurs : il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur. L'entrée de commande du multiplexeur correspond à l'entrée du décodeur. Pour mettre à zéro les entrées non-sélectionnées, on utilise le circuit de mise à zéro basé sur une couche de portes ET. [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] Une solution alternative est de concevoir un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> ibds9g49awum6563ogu1pbtqzx15cn4 767874 767873 2026-06-16T20:50:42Z Mewtow 31375 /* Les multiplexeurs à plus de deux entrées */ 767874 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, on peut ruser. Ce qui a été fait pour les multiplexeurs peut aussi s'adapter aux démultiplexeurs : il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur. [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] Une solution alternative est de concevoir un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> rapkqk8e3737iz86g6etfrzx2glay99 767884 767874 2026-06-17T00:19:35Z Mewtow 31375 /* Les démultiplexeurs à plus de deux sorties */ 767884 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur. [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] Une solution alternative est de concevoir un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> k1gils9dyyb92k71jg9fl7lvum5uwf1 767885 767884 2026-06-17T00:20:46Z Mewtow 31375 /* Les multiplexeurs à plus de deux entrées */ 767885 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment fabriquer des circuits relativement généraux. Il est maintenant temps de voir quelques circuits relativement simples, très utilisés. Ces circuits simples sont utilisés pour construire des circuits plus complexes, comme des processeurs, des mémoires, et bien d'autres. Les prochains chapitres vont se concentrer exclusivement sur ces circuits simples, mais courants. Nous allons donner quelques exemples de circuits assez fréquents dans un ordinateur et voir comment construire ceux-ci avec des portes logiques. Dans ce chapitre, nous allons nous concentrer sur quelques circuits, que j'ai décidé de regrouper sous le nom de '''circuits de sélection'''. Les circuits que nous allons présenter sont utilisés dans les mémoires, ainsi que dans certains circuits de calcul. Il est important de bien mémoriser ces circuits, ainsi que la procédure pour les concevoir : nous en aurons besoin dans la suite du cours. Ils sont au nombre de quatre : le décodeur, l'encodeur, le multiplexeur et le démultiplexeur. ==Le décodeur== [[File:DECODER 3 vers 8.png|vignette|Décodeur à 3 entrées et 8 sorties.]] Le premier circuit que nous allons voir est le '''décodeur''', un composant qui contient un grand nombre d'entrées et de sorties, avec des sorties qui sont numérotées. Un décodeur possède une entrée sur laquelle on envoie un nombre codé <math>N</math> bits et <math>2^N</math> sorties de 1 bit. Par exemple, un décodeur avec une entrée de 2 bits aura 4 sorties, un décodeur avec une entrée de 3 bits aura 8 sorties, un décodeur avec une entrée de 8 bits aura 256 sorties, etc. Généralement, on précise le nombre de bits d'entrée et de sortie comme suit : on parle d'un décodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 3 vers 8 pour un décodeur à 3 bits d'entrée et 8 de sortie, de décodeur 4 vers 16, etc. Le fonctionnement d'un décodeur est très simple : il prend sur son entrée un nombre entier x codé en binaire, puis il positionne à 1 la sortie numérotée x et met à zéro toutes les autres sorties. Par exemple, si on envoie la valeur 6 sur ses entrées, il mettra la sortie numéro 6 à 1 et les autres à zéro. Pour résumer, un décodeur est un circuit : * avec une entrée de <math>N</math> bits ; * avec <math>2^N</math> sorties de 1 bit ; * où les sorties sont numérotées en partant de zéro ; * où on ne peut sélectionner qu'une seule sortie à la fois : une seule sortie devra être placée à 1, et toutes les autres à zéro ; * et où deux nombres d'entrée différents devront sélectionner des sorties différentes : la sortie de notre contrôleur qui sera mise à 1 sera différente pour deux nombres différents placés sur son entrée. Une autre manière d'expliquer leur fonctionnement est qu'il traduisent un nombre encodé en binaire vers la représentation ''one-hot''. Pour rappel, sur cette dernière, le nombre N est encodé en mettant le énième bit à 1, les autres sont à 0. Le bit de poids faible compte pour le zéro. Les décodeurs sont très utilisés, au point que faire la liste de leurs utilisations serait bien trop long. Par contre, on peut d'or et déjà prévenir que les décodeurs sont utilisés dans toutes les mémoires RAM et ROM, présentes dans tout ordinateur. La RAM de votre ordinateur contient un ou plusieurs décodeurs, idem pour la mémoire caché intégrée dans le processeur, etc. C'est donc un circuit absolument primordial à étudier, qui reviendra souvent dans ce cours. ===La table de vérité d'un décodeur=== Au vu de ce qui vient d'être dit, on peut facilement écrire la table de vérité d'un décodeur. Pour l'exemple, prenons un décodeur 2 vers 4, pour simplifier la table de vérité. Voici sa table de vérité complète, c’est-à-dire qui contient toutes les sorties regroupées : {|class="wikitable" |- ! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || || 1 || 0 || 0 || 0 |- | 0 || 1 || || 0 || 1 || 0 || 0 |- | 1 || 0 || || 0 || 0 || 1 || 0 |- | 1 || 1 || || 0 || 0 || 0 || 1 |} Vous remarquerez que la table de vérité est assez spéciale. Les seuls bits à 1 sont sur la diagonale. Et cela ne vaut pas que dans l'exemple choisit, mais cela se généralise pour tous les décodeurs. Sur chaque ligne, il n'y a qu'un seul bit à 1, ce qui traduit le fait qu'une entrée ne met qu'une seule sortie est à 1 et met les autres à 0. Si on traduit la table de vérité sous la forme d'équations logiques et de circuit, on obtient ceci : [[File:Decoder Example.svg|centre|vignette|upright=2|Equations logiques et circuit d'un décodeur 2 vers 4.]] Il y a des choses intéressantes à remarquer sur les équations logiques. Pour rappel, l'équation logique d'une sortie est composée, dans le cas général, soit d'un minterm unique, soit d'un OU entre plusieurs minterms. Chaque minterm est l'équation d'un circuit qui compare l'entrée à un nombre bien précis et dépendant du minterm. Si on regarde bien, l'équation de chaque sortie correspond à un minterm et à rien d'autre, il n'y a pas de OU entre plusieurs minterms. Les minterms sont de plus différents pour chaque sortie et on ne trouve pas deux sorties avec le même minterm. Enfin, chaque minterm possible est présent : X bits d'entrée nous donnent 2^X entrées différentes possibles, donc 2^X minterms possibles. Et il se trouve que tous ces minterms possibles sont représentés dans un décodeur, ils ont tous leur sortie associée. C'est une autre manière de définir un décodeur : toutes ses sorties codent un minterm, deux sorties différentes ont des minterms différents et tous les minterms possibles sur n bits sont représentés. Ces informations vont nous être utiles pour la suite. En effet, grâce à elles, nous allons en déduire une méthode générale pour fabriquer un décodeur, peu importe son nombre de bits d'entrée et de sortie. Mais elles permettent aussi de montrer que l'on peut créer n'importe quel circuit combinatoire quelconque à partir d'un décodeur et de quelques portes logiques. Dans ce qui suit, on suppose que le circuit combinatoire en question a une entrée de n bits et une seule sortie de 1 bit. Pour rappel, ce genre de circuit se conçoit en utilisant une table de vérité qu'on traduit en équations logiques, puis en circuits. Le circuit obtenu est alors soit un simple minterm, soit un OU entre plusieurs minterms. Or, le décodeur contient tous les minterms possibles pour une entrée de n bits, avec un minterm par sortie. Il suffit donc de prendre une porte OU et de la connecter aux minterms/sorties adéquats. [[File:Conception d'un circuit combinatoire quelconque à partir d'un décodeur.jpg|centre|vignette|upright=2|Conception d'un circuit combinatoire quelconque à partir d'un décodeur.]] Fabriquer un circuit combinatoire avec un décodeur gaspille pas mal de portes logiques. En effet, le décodeur fournit tous les minterms possibles, alors que seule une minorité est réellement utilisée pour fabriquer le circuit combinatoire. Les minterms en trop correspondent à des paquets de portes NON et ET reliées entre elles, qui ne servent à rien. De plus, les minterms ne sont pas simplifiés. On ne peut pas utiliser les techniques vues dans les chapitres précédents pour simplifier les minterms et réduire le nombre de portes logiques utilisées. Le décodeur reste tel qu'il est, avec l'ensemble des minterms non-simplifiés. Mais la simplicité de conception du circuit reste un avantage dans certaines situations. Notamment, les circuits avec plusieurs bits de sortie sont faciles à fabriquer, notamment si les sorties partagent des minterms (si un minterm est présent dans l'équation de plusieurs sorties différentes, l'usage d'un décodeur permet de facilement factoriser celui-ci). Ceci étant dit, passons à la conception d'un décodeur avec des portes logiques. ===L'intérieur d'un décodeur=== On vient de voir que chaque sortie d'un décodeur correspond à son propre minterm, et que tous les minterms possibles sont représentés. Rappelons que chaque minterm est associé à un circuit qui compare l'entrée à une constante X, X dépendant du minterm. En combinant ces deux informations, on devine qu'un décodeur est simplement composé de comparateurs avec une constante que de minterms/sorties. Par exemple, si je prends un décodeur 7 vers 128, cela veut dire qu'on peut envoyer en entrée un nombre codé entre 0 et 127 et que chaque nombre aura son propre minterm associé : il y aura un minterm qui vérifie si l'entrée vaut 0, un autre vérifie si elle vaut 1, un autre qui vérifie si elle vaut 2, ... , un minterm qui vérifie si l'entrée vaut 126, et enfin un minterm qui vérifie si l'entrée vaut 127. Pour reformuler d'une manière bien plus simple, on peut voir les choses comme suit. Si l'entrée du décodeur vaut N, la sortie mise à 1 est la sortie N. Bref, déduire quand mettre à 1 la sortie N est facile : il suffit de comparer l'entrée avec N. Si l'adresse vaut N, on envoie un 1 sur la sortie, et on envoie un zéro sinon. Pour cela, j'ai donc besoin d'un comparateur pour chaque sortie, et le tour est joué. Précisons cependant que cette méthode gaspille beaucoup de circuits et qu'il y a une certaine redondance. En effet, les comparateurs ont souvent des portions de circuits qui sont identiques et ne diffèrent parfois que ce quelques portes logiques. En utilisant des comparateurs séparés, ces portions de circuits sont dupliquées, alors qu'il serait judicieux de partager. [[File:Internals of decoder.png|centre|vignette|upright=1.5|Exemple d'un décodeur à 8 sorties.]] Comme autre méthode, plus économe en circuits, on peut créer un décodeur en assemblant plusieurs décodeurs plus simples, nommés sous-décodeurs. Ces sous-décodeurs sont des décodeurs normaux, auxquels on a ajouté une entrée RAZ, qui permet de mettre à zéro toutes les sorties : si on met un 0 sur cette entrée, toutes les sorties passent à 0, alors que le décodeur fonctionne normalement sinon. Construire un décodeur demande suffisamment de sous-décodeurs pour combler toutes les sorties. Si on utilise des sous-décodeurs à n entrées, ceux-ci prendront en entrée les n bits de poids faible de l'entrée du décodeur que l'on souhaite construire (le décodeur final). Dans ces conditions, les n décodeurs auront une de leurs sorties à 1. Pour que le décodeur final se comporte comme il faut, il faut désactiver tous les sous-décodeurs, sauf un avec l'entrée RAZ. Pour commander les n bits RAZ des sous-décodeurs, il suffit d'utiliser un décodeur qui est commandé par les bits de poids fort du décodeur final. [[File:Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.jpg|centre|vignette|upright=1.5|Décodeur 3 vers 8 conçu à partir de décodeurs 2 vers 4.]] ==Le démultiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Un démultiplexeur a plusieurs sorties et une seule entrée. Les sorties sont numérotées de 0 à la valeur maximale. Il permet de sélectionner une sortie et de recopier l'entrée dessus, les autres sorties sont mises à 0. Pour séléctionner la sortie, le démultiplexeur possède une entrée de commande, sur laquelle on envoie le numéro de la sortie de destination. Comme le nom l'indique, le démultiplexeur fait l'exact inverse du multiplexeur, que nous verrons plus bas. ===Le démultiplexeur à deux sorties=== Le démultiplexeur le plus simple est le démultiplexeur à deux sorties. Il possède une entrée de donnée, une entrée de commande et deux sorties, toutes de 1 bit. Suivant la valeur du bit sur l'entrée de commande, il recopie le bit d'entrée, soit sur la première sortie, soit sur la seconde. Les deux sorties sont numérotées respectivement 0 et 1. [[File:Demultiplexer.png|centre|vignette|upright=1.5|Démultiplexeur à 2 sorties.]] On peut le concevoir facilement en partant de sa table de vérité. {|class="wikitable" |- ! Entrée de commande ''Select'' ! Entrée de donnée ''Input'' ! ! Sortie 1 ! Sortie 0 |- | 0 || 0 || || 0 || 0 |- |- | 0 || 1 || || 0 || 1 |- |- | 1 || 0 || || 0 || 0 |- |- | 1 || 1 || || 1 || 0 |- |} Le circuit obtenu est le suivant : [[File:2to4demux.svg|centre|vignette|upright=2|Démultiplexeur à deux sorties.]] ===Les démultiplexeurs à plus de deux sorties=== Il est parfaitement possible de créer des démultiplexeurs en utilisant les méthodes du chapitre sur les circuits combinatoires, comme ma méthode des ''minterms'' ou les tableaux de Karnaugh. On obtient alors un démultiplexeur assez simple, composé de deux couches de portes logiques : une couche de portes NON et une couche de portes ET à plusieurs entrées. [[File:Demux.PNG|centre|vignette|upright=1.5|Démultiplexeur fabriqué avec une table de vérité.]] Mais cette méthode n'est pas pratique, car elle utilise beaucoup de portes logiques et que les portes logiques avec beaucoup d'entrées sont difficiles à fabriquer. Pour contourner ces problèmes, il est possible de créer des démultiplexeurs en assemblant des démultiplexeurs 1 vers 2. Évidemment, le même principe s'applique à des démultiplexeurs plus complexes : il suffit de rajouter des couches. [[File:Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.jpg|centre|vignette|upright=1.5|Circuit d'un démultiplexeur à 4 sorties, conçu à partir de démultiplexeurs à 2 sorties.]] Un démultiplexeur peut aussi se fabriquer en utilisant un décodeur et quelques portes ET. Pour comprendre pourquoi, regardons la table de vérité d'un démultiplexeur à quatre sorties. Si vous éliminez le cas où l'entrée de donnée ''Input'' vaut 0, et que vous tenez compte uniquement des entrées de commande, vous retombez sur la table de vérité d'un décodeur. Cela correspond aux cases en rouge. {|class="wikitable" |- ! Input !! E0 !! E1 !! !! S0 !! S1 !! S2 !! S3 |- | 0 || 0 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 0 || || 0 || 0 || 0 || 0 |- | 0 || 1 || 1 || || 0 || 0 || 0 || 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 || || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |} En réalité, Le fonctionnement d'un démultiplexeur peut se résumer comme suit : soit l'entrée ''Input'' est à 1 et il fonctionne comme un décodeur dont l'entrée est l'entrée de commande, soit l'entrée ''Input'' vaut 0 et sa sortie est mise à 0. On devine donc qu'il faut combiner un décodeur avec le circuit de mise à zéro vu dans le chapitre précédent. On devine rapidement que l'entrée ''Input'' commande la mise à zéro de la sortie, ce qui donne le circuit suivant : [[File:Démultiplexeur conçu à partir d'un décodeur.jpg|centre|vignette|upright=1.5|Démultiplexeur conçu à partir d'un décodeur.]] ==Le multiplexeur== Les décodeurs ont des cousins : les multiplexeurs et les démultiplexeurs. Les multiplexeurs sont des composants qui possèdent un nombre variable d'entrées, mais une seule sortie. Un multiplexeur permet de sélectionner une entrée et de recopier son contenu sur sa sortie, les entrées non-sélectionnées étant ignorées. Sélectionner l'entrée à recopier sur la sortie se fait en configurant une entrée de commande du multiplexeur. Les entrées sont numérotées de 0 à la valeur maximale. Configurer l'entrée de commande demande juste d'envoyer le numéro de l'entrée sélectionnée dessus. [[File:4-to-1 multiplexer.svg|centre|vignette|Multiplexeur à 4 entrées.]] Les multiplexeurs sont très utilisés et on en retrouve partout : dans les mémoires RAM, dans les processeurs, dans les circuits de calcul, dans les circuits pour communiquer avec les périphériques, et j'en passe. Il s'agit d'un composant très utilisé, qu'il est primordial de bien comprendre avant de passer à la suite du cours. ===Le multiplexeur à deux entrées=== Le multiplexeur le plus simple est le multiplexeur à deux entrées et une sortie. Il est facile de le construire avec des portes logiques, dans les implémentations les plus simples. Sachez toutefois que les multiplexeurs utilisés dans les ordinateurs récents ne sont pas forcément fabriqués avec des portes logiques, mais qu'on peut aussi les fabriquer directement avec des transistors. [[File:Multiplexeur à deux entrées - symbole.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - symbole.]] Pour commencer, établissons sa table de vérité. On va supposer qu'un 0 sur l'entrée de commande sélectionne l'entrée a. La table de vérité devrait être la suivante : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||0||0||0 |- |0||0||1||0 |- |0||1||0||1 |- |0||1||1||1 |- |1||0||0||0 |- |1||0||1||1 |- |1||1||0||0 |- |1||1||1||1 |} Sélectionnons les lignes qui mettent la sortie à 1 : {|class="wikitable" |- !Entrée de commande !Entrée a !Entrée b !Sortie |- |0||1||0||1 |- |0||1||1||1 |- |1||0||1||1 |- |1||1||1||1 |} On sait maintenant quels comparateurs avec une constante utiliser. On peut, écrire l'équation logique du circuit. La première ligne donne l'équation suivante : <math>\overline{E_c} . a . \overline{b}</math>, la seconde donne l'équation <math>\overline{E_c} . a . b</math> , la troisième l'équation <math>E_c . \overline{a} . b</math> et la quatrième l'équation <math>E_c . a . b</math>. L'équation finale obtenue est donc : : <math>(\overline{E_c} . a . \overline{b}) + (\overline{E_c} . a . b) + (E_c . \overline{a} . b) + E_c . a . b</math> L'équation précédente est assez compliquée, mais il y a moyen de la simplifier assez radicalement. Pour cela, nous allons utiliser les règles de l’algèbre de Boole. Pour commencer, nous allons factoriser <math>(\overline{E_c}</math> et <math>E_c</math> : : <math> \left[ \overline{E_c} .[ (a . \overline{b}) + (a . b)] \right] + \left[ E_c . [(\overline{a} . b) + (a . b)] \right] </math> Ensuite, factorisons <math>a</math> dans le premier terme et <math>b</math> dans le second : : <math> \left[ \overline{E_c} . a . (\overline{b} + b) \right] + \left[ E_c . b . (\overline{a} + a) \right]</math> Les termes <math>\overline{b} + b</math> et <math>\overline{a} + a</math> valent 1 : : <math> \left[ \overline{E_c} . a . 1 \right] + \left[ E_c . b . 1 \right]</math> On sait que <math>a . 1 = a</math>, ce qui fait que l'équation simplifiée est la suivante : : <math>(\overline{E_c} . a) + (E_c . b)</math> Le circuit qui correspond est : [[File:Multiplexeur à deux entrées - circuit.png|centre|vignette|upright=1.5|Multiplexeur à deux entrées - circuit.]] ===Les multiplexeurs à plus de deux entrées=== Il est possible de concevoir un multiplexeur quelconque à partir de sa table de vérité. Le résultat est alors un circuit composé d'une porte OU à plusieurs entrées, de plusieurs portes ET, et de quelques portes NON. Un exemple est illustré ci-dessous. Vous remarquerez cependant que ce circuit a un défaut : la porte OU finale a beaucoup d'entrées, ce qui pose de nombreux problèmes techniques. Il est difficile de concevoir des portes logiques avec un très grand nombre d'entrées. Aussi, les applications à haute performance demandent d'utiliser d'autres solutions. [[File:Mux2.png|centre|vignette|upright=1.5|Multiplexeur conçu à partir de sa table de vérité.]] Une solution alternative conçoit un multiplexeur à plus de deux entrées en combinant des multiplexeurs plus simples. Par exemple, en prenant deux multiplexeurs plus simples, et en ajoutant un multiplexeur 2 vers 1 sur leurs sorties respectives. Le multiplexeur final se contente de sélectionner une sortie parmi les deux sorties des multiplexeurs précédents, qui ont déjà effectué une sorte de présélection. [[File:Multiplexeur conçu à partir de multiplexeurs plus simples.jpg|centre|vignette|upright=1.5|Multiplexeur conçu à partir de multiplexeurs plus simples.]] Il existe toutefois une manière bien plus simple pour créer un multiplexeur, qui utilise des opérations de masquage. L'idée est qu'un multiplexeur sélectionne un bit bien précis dans l'opérande. L'idée est de masquer les bits non-sélectionnés, puis de regarder le résultat après masquage. Par défaut, les bits non-sélectionnés sont mis à 0. Le résultat après masquage dépend de la valeur du bit sélectionné : * Si le bit sélectionné vaut 0, alors tous les bits après masquage sont à zéro. * Si le bit sélectionné vaut 1, alors seul un bit du résultat après masquage est à 1. Pour savoir si au moins un bit du résultat vaut 1, l'idée est d'utiliser une porte OU. Si tous les bits sont à 0, la porte OU donnera un zéro. Sinon, elle sortira un 1. La sortie du multiplexeur s'obtient donc en faisant un OU logique entre tous les bits du résultat après masquage. Le circuit au complet est donc composé d'un circuit de masquage, d'un circuit qui génère le masque, et d'une porte OU. Le circuit qui génère le masque transforme le numéro du bit en un masque adéquat. Si le numéro du bit est de N, le masque a son énième bit à 1, les autres à 0. Pour le dire autrement, il convertit le numéro du bit en sa représentation ''one-hot''. Et ce n'est ni plus ni moins que ce que fait un décodeur ! La génération du masque est donc le fait d'un décodeur. [[File:Multiplexeur 2 vers 4 conçu à partir d'un décodeur.png|centre|vignette|upright=2|Multiplexeur 2 vers 4 conçu à partir d'un décodeur]] ==L'encodeur== [[File:8 to 3 simple encoder IEC symbol.svg|vignette|upright=0.5|Encodeur à 8 entrées (et 3 sorties).]] Il existe un circuit qui fait exactement l'inverse du décodeur : c'est l''''encodeur'''. Là où les décodeurs ont une entrée de <math>N</math> bits et <math>2^N</math> sorties de 1 bit, l'encodeur a à l'inverse <math>2^N</math> entrées de 1 bit avec une sortie de <math>N</math> bits. Par exemple, un encodeur avec une entrée de 4 bits aura 2 sorties, un décodeur avec une entrée de 8 bits aura 3 sorties, un décodeur avec une entrée de 256 bits aura 8 sorties, etc. Comme pour les décodeurs, on parle d'un encodeur X vers Y pour X bits d'entrée et Y de sortie. Ce qui fait qu'on peut parler de décodeur 8 vers 3 pour un décodeur à 8 bits d'entrée et 3 de sortie, de décodeur 16 vers 4, etc. [[File:Encoder block diagram.jpg|centre|vignette|upright=1.5|Entrées et sorties d'un encodeur.]] De plus, contrairement au décodeur, ce sont les entrées qui sont numérotées de 0 à N et non les sorties. Dans ce qui suit, on va supposer qu'une seule des entrées est à 1. Il existe des encodeurs capables de traiter le cas où plusieurs bits d'entrée sont à 1, qui sont appelés des encodeurs à priorité, mais nous les laissons pour le chapitre suivant. Le chapitre suivant sera totalement dédié aux encodeurs à priorité, aussi nous préférons nous focaliser sur le cas d'un encodeur simple, capable de traiter uniquement le cas où une seule entrée est à 1. En sortie, l'encodeur donne le numéro de l'entrée qui est à 1. Par exemple, si l'entrée numéro 5 est à 1 et les autres à 0, alors l'encodeur envoie un 5 sur sa sortie. Une autre manière d'expliquer son fonctionnement est la suivant : un encodeur traduit un nombre codé en représentation ''one-hot'' vers du binaire normal. L'utilité d'un encodeur n'est pas très évidente à ce moment du cours, mais nous pouvons déjà dire qu'ils seront utiles dans certaines formes de mémoires RAM appelées des mémoires associatives, qui sont utilisées dans des routeurs, switchs et autre matériel réseau. La majorité des mémoires caches de nos ordinateurs sont de ce type, bien que leur implémentation exacte ne fasse pas usage d'un encodeur. Une autre utilisation est la transformation d'un nombre codé en représentation ''one-hot'' vers du binaire normal, chose marginalement utile. ===L'encodeur 4 vers 2=== Prenons l'exemple d'un encodeur à 4 entrées et 2 sorties. Écrivons sa table de vérité. D'après la description du circuit, on devrait trouver ceci : {|class="wikitable" |+ Table de vérité d'un encodeur 4 vers 2 |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 |- | 0 || 0 || 0 || 1 || || 0 || 0 |- | 0 || 0 || 1 || 0 || || 0 || 1 |- | 0 || 1 || 0 || 0 || || 1 || 0 |- | 1 || 0 || 0 || 0 || || 1 || 1 |} Vous voyez que la table de vérité est incomplète. En effet, l'encodeur fonctionne tant qu'une seule de ses entrées est à 1. L'encodeur dit alors quelle est la sortie à 1, mais cela suppose que les autres soient à 0. Si plusieurs entrées sont à 1, le comportement de l'encodeur est potentiellement erroné. En effet, il donnera un résultat incorrect sur certaines entrées. Mais passons cela sous silence et ne tenons compte que de la table de vérité partielle précédente. On peut traduire cette table de vérité en circuit logique. On obtient alors les équations suivantes : : <math>S1 = E3 + E2</math> : <math>S0 = E3 + E1</math> Le tout donne le circuit suivant : [[File:A Simple 4-2 encoder using or gate.jpg|centre|vignette|upright=1.5|Exemple d'encodeur à 4 entrées et 2 sorties.]] ===Les encodeurs à plus de deux sorties=== Il est possible de créer un encodeur complexe en combinant plusieurs encodeurs simples. C'est un peu la même chose qu'avec les décodeurs, pour lesquels on peut créer un décodeur 8 vers 256 à base de deux décodeurs 7 vers 128, ou de quatre décodeurs 6 vers 64. L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Pour comprendre l'idée, prenons la table de vérité d'un encodeur 8 vers 3; donnée dans le tableau ci-dessous. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 0 || 0 || 0 || 1 || 0 || || 0 || 0 || 1 |- | 0 || 0 || 0 || 0 || 0 || 1 || 0 || 0 || || 0 || 1 || 0 |- | 0 || 0 || 0 || 0 || 1 || 0 || 0 || 0 || || 0 || 1 || 1 |- | 0 || 0 || 0 || 1 || 0 || 0 || 0 || 0 || || 1 || 0 || 0 |- | 0 || 0 || 1 || 0 || 0 || 0 || 0 || 0 || || 1 || 0 || 1 |- | 0 || 1 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 0 |- | 1 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || || 1 || 1 || 1 |} En regardant bien, vous verrez que vous pouvez trouver la table de vérité d'un encodeur 4 vers 2 en deux exemplaires, indiquées en rouge. {|class="wikitable" |+ Table de vérité d'un encodeur 8 vers 3 |- ! E7 !! E6 !! E5 !! E4 !! E3 !! E2 !! E1 !! E0 !! !! S2 !! S1 !! S0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | 0 || 0 || 0 || 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 |- | bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 |- | bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || bgcolor="#FF0000" | 0 || 0 || 0 || 0 || 0 || | 1 || bgcolor="#FF0000" | 1 || bgcolor="#FF0000" | 1 |} On voit que les deux bits de poids faibles correspondent à la sortie de l'encodeur activé par l'entrée. Si le premier encodeur est activé, c'est lui qui fournit les bits de poids faibles. Inversement, si c'est le second encodeur qui a un résultat non-nul, c'est lui qui fournit les bits de poids faible. Notons que seul un des deux encodeurs a une sortie non-nulle à la fois : soit le premier a une sortie non-nulle, soit c'est le second, mais c'est impossible que ce soit les deux en même temps. Cela permet de déduire quelle opération permet de mixer les deux résultats : un simple OU logique suffit. Car, pour rappel, 0 OU X donne X, quelque que soit le X en question. Les bits de poids faible du résultat se calculent en faisant un OU entre les deux résultats des encodeurs. Ensuite, il faut déterminer comment fixer le bit de poids fort du résultat. Il vaut 0 si le premier encodeur a une entrée non-nulle, et 1 si c'est le premier encodeur qui a une entrée non-nulle. Pour cela, il suffit de vérifier si les bits de poids forts, associés au premier encodeur, contiennent un 1. Si c'est le cas, alors on met la troisième sortie à 1. [[File:Encodeur fabriqué à partir d'encodeurs plus petits.png|centre|vignette|upright=2|Encodeur fabriqué à partir d'encodeurs plus petits.]] Notons que cette procédure, à savoir faire un OU entre les sorties de deux encodeurs simples, puis faire un OU pour calculer le troisième bit, marche pour tout encodeur de taille quelconque. À vrai dire, le circuit obtenu plus haut d'un encodeur 4 vers 2 est conçu ainsi, mais en combinant deux encodeurs 2 vers 1. La procédure consiste à ajouter trois portes OU à deux encodeurs. Mais ceux-ci sont eux-même composés de portes OU associées à des encodeurs plus petits, et ainsi de suite. On peut poursuivre ainsi jusqu’à tomber sur des encodeurs 4 vers 2, qui sont eux-mêmes composés de deux portes OU. Au final, on se retrouve avec un circuit conçu uniquement à partir de portes OU. Notons qu'il est possible de simplifier le circuit obtenu avec la procédure en fusionnant des portes OU. Si on simplifie vraiment au maximum, le circuit consiste alors en une porte OU à plusieurs entrées par sortie, chacune étant connectée à certaines entrées bien précises. Pour un encodeur 8 vers 3, la simplification du circuit devrait donner ceci : [[File:8-3 Encoder.gif|centre|vignette|upright=1.5|Encodeur 8 vers 3.]] ==L'encodeur à priorité== L''''encodeur à priorité''' est un dérivé du circuit encodeur, vu dans la section précédente. La différence ne se situe pas dans le nombre d'entrée ou de sortie, ni même dans son interface extérieure. Comme pour l'encodeur normal, l'encodeur à priorité possède <math>2^N</math> entrées numérotées de 0 à <math>2^N - 1</math> et N sorties. Une autre manière plus intuitive de le dire est qu'il possède N entrées et <math>\log_2{N}</math> sorties. Pas de changement de ce point de vue. La différence entre encodeur simple et encodeur à priorité tient dans leur fonctionnement, dans le calcul qu'ils font. Avec un encodeur normal, on a supposé que seul un bit d'entrée pouvait être à 1, les autres étant systématiquement à 0. Si cette condition est naturellement remplie dans certains cas d’utilisation, ce n'est pas le cas dans d'autres. L'encodeur à priorité est un encodeur amélioré dans le sens où il donne un résultat valide même quand plusieurs bits d'entrée sont à 1. Il donne donc un résultat pour n'importe quel nombre passé en entrée. Mais avant de passer aux explications, un peu de terminologie utile. Dans ce qui suit, nous aurons à utiliser des expressions du type "le 1 de poids faible", "le 1 de poids fort" et quelques autres du même genre. Quand nous parlerons du 1 de poids faible, nous voudrons parler du premier 1 que l'on croise dans un nombre en partant de sa droite. Par exemple, dans le nombre 0110 1000, le 1 de poids faible est le quatrième bit. Quant au "1 de poids fort", c'est le premier 1 que l'on croise quand on parcourt le nombre à partir de sa gauche. Dans le cas le plus fréquent, l'encodeur à priorité prend en entrée un nombre et donne la position du 1 de poids fort. Mais dans d'autres cas, l'encodeur à priorité donne la position du 1 de poids faible. Il existe des équivalents, mais qui trouvent cette fois-ci les zéros de poids fort/faible, mais nous n'en parlerons pas dans ce chapitre. ===L'encodeur à priorité conçu à partir de sa table de vérité=== Il est possible de concevoir l'encodeur à priorité à partir de sa table de vérité, mais les méthodes des minterms ou des maxterms ne donnent pas de très bons résultats. Notons que ces encodeurs ont souvent une nouvelle entrée notée V, qui indique si la sortie est valide, et qui indique qu'au moins une entrée est à 1. Elle vaut 1 si au moins une entrée est à 1, 0 si toutes les entrées sont à 0. À titre d'exemple, la table de vérité d'un encodeur à priorité 4 vers 2 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. {|class="wikitable" |- ! E3 !! E2 !! E1 !! E0 !! !! S1 !! S0 !! V |- | 0 || 0 || 0 || 0 || || 0 || 0 || 0 |- | 0 || 0 || 0 || 1 || || 0 || 0 || 1 |- | 0 || 0 || 1 || X || || 0 || 1 || 1 |- | 0 || 1 || X || X || || 1 || 0 || 1 |- | 1 || X || X || X || || 1 || 1 || 1 |} Les équations logiques obtenues sont donc les suivantes : : <math>V = E3 + E2 + E1 + E0</math> : <math>S0 = E3 + (\overline{E3} . \overline{E2} . E1)</math> : <math>S1 = E3 + ( \overline{E3} . E2 )</math> On voit quelle est la logique de chaque équation. Pour chaque ligne de la table de vérité, il faut vérifier si les bits de poids fort sont à 0, suivi par un 1, les bits de poids faible après le 1 étant oubliées. Pour le bit de validité, il suffit de faire un OU entre toutes les entrées. Les deux dernières équations se simplifient en : : <math>S0 = E3 + (\overline{E2} . E1)</math> : <math>S1 = E3 + E2</math>, Le circuit obtenu est le suivant : [[File:Pr encoder 4x2.png|centre|vignette|upright=1.5|Encodeur à priorité 4 vers 2.]] La table de vérité d'un encodeur à priorité 8 vers 3 est illustré ci-dessous. Le signe X signifie que le bit peut prendre la valeur 0 ou 1 sans que cela change quoique ce soit à l'entrée. [[File:Encoder.JPG|centre|vignette|upright=2|Table de vérité d'un encodeur à priorité 8 vers 3.]] Utiliser la table de vérité a des défauts. Premièrement, ce n'est pas la meilleure des solutions pour des circuits avec un grand nombre d'entrée. Faire cela donne des tables de vérité rapidement importantes, mêmes pour des encodeurs avec peu de sorties. Le circuit final utilise beaucoup de portes logiques comparé aux autres méthodes. Les solutions alternatives que nous allons voir dans ce qui suit permettent de résoudre ces deux problèmes en même temps. ===Les encodeurs à priorité récursifs=== Une première solution consiste à créer un gros encodeur à base d'encodeurs plus petits.L'idée de découper le nombre d'entrée en morceaux séparés, chaque morceau étant traité par un encodeur à priorité distinct des autres. Les résultats des différents encodeurs sont ensuite combinés pour donner le résultat final. Naturellement, il est préférable d'utiliser plusieurs exemplaires d'un même encodeur, c'est à dire que pour une entrée de 256 bits, il vaut mieux utiliser soit deux décodeurs 7 vers 128, soit quatre décodeurs 6 vers 64, etc. La construction est similaire à celle vue dans le chapitre précédent, dans la section sur les encodeurs. La différence est que le OU entre les sorties des encodeurs est remplacé par un multiplexeur. Une version générale est illustrée ci-dessous. On voit que les encodeurs ont une sortie de résultat de X bits notée idx et une sortie de validité notée vld. La sortie de validité finale se calcule en combinant les sorties de validité de chaque encodeur. La sortie est par définition à 1 tant qu'un seul encodeur a une sortie non-nulle, donc quand un seul encodeur a un bit de validité à 1. En clair, c'est un simple OU entre les bits de validité. Reste à déterminer la sortie de donnée, celle qui donne la position du 1 de poids fort. On peut dire que si l'on utilise des encodeurs avec N bits de sortie, alors les N bits de poids faible du résultat seront donnés par le premier encodeur avec une sortie non-nulle. Les résultats de chaque encodeur donnent doncles X bits de poids faible, un seul résultat devant être sélectionné. Le résultat à sélectionner est le premier à avoir un résultat non-nul, donc à avoir un bit de validité à 1. En clair, on peut déterminer quel est le bon encodeur, le bon résultat, en analysant les bits de validité. Mieux : d'après ce qui a été dit, on peut deviner que l'analyse réalisée correspond à trouver la position du premier encodeur à avoir un bit de validité à 1. En clair, c'est l'opération réalisée par un encodeur à priorité lui-même. Tout cela permet de déterminer les N bits de poids faible, amis les autres bits, ceux de poids fort, sont encore à déterminer. Pour cela, on peut remarquer que ceux-ci sont eux-même fournit par l'encodeur à priorité qui commande le MUX. [[File:PE-recursion.svg|centre|vignette|upright=2|Construction d'un encodeur à priorité à partir d'encodeur à priorité plus petits.]] Notons qu'avec cette méthode, il est possible, mais pas très intuitif, de fabriquer un encodeur configurable, capable de se comporter soit comme un encodeur de type ''Find Highest Set'', soit de type ''Find First Set''. L'implémentation la plus simple demande de modifier le circuit qui combine les résultats pour qu'il soit configurable et puisse faire les deux opérations à la demande. ===L'encodeur à priorité avec un circuit d'isolation du 1 de poids fort/faible=== Une autre solution part d'un encodeur normal, auquel on ajoute un circuit qui se charge de sélectionner un seul des bits passé sur son entrée. Le circuit de gestion des priorités a pour fonction de trouver sélectionner un bit et de mettre les autres 1 à 0. Suivant le circuit de priorité considéré, le bit sélectionné est soit le 1 de poids fort, soit le 1 de poids faible. Dans certains cas, le circuit de priorité est configurable et peut trouver l'un ou l'autre suivant ce qu'on lui demande. Dans ce qui va suivre, nous allons partir du principe que l'on souhaite avoir un encodeur qui trouve le 1 de poids fort, sauf indication contraire. [[File:Encodeur à priorité.png|centre|vignette|upright=2|Encodeur à priorité.]] Une méthode assez pratique découpe le circuit de gestion des priorité en petites briques de bases, reliées les unes à la suite des autres. L'idée est que les briques de base sont connectées de manière à propager un signal de mise à zéro. Si une brique détecte un 1, elle envoie un signal aux briques précédentes/suivantes, qui leur dit de mettre leur sortie à zéro. Ce faisant, une fois le premier 1 trouvé, on est certain que les autres bits précédents/suivants sont mis à zéro. Suivant les connexions des briques de base, on peut obtenir soit un encodeur qui effectue l'opération ''Find First Set'', soit encodeur de type ''Find Highest Set'' et réciproquement. En fait, suivant que les briques soient reliées de droite à gauche ou de gauche à droite, on obtiendra l'un ou l'autre de ces deux encodeurs. [[File:Circuit de gestion des priorités.png|centre|vignette|upright=2|Circuit de gestion des priorités.]] Chaque brique de base peut soit recopier le bit en entrée, soit le mettre à zéro. Pour décider quoi faire, elle regarde le signal d'entrée RAZ (''Remise A Zéro''). Si le bit RAZ vaut 1, la sortie est mise à zéro automatiquement. Dans le cas contraire, le bit passé en entrée est recopié. De plus, chaque brique de base doit fournir un signal de remise à zéro RAZ à destination de la brique suivante. Ce signal RAZ de sortie est mis à 1 dans deux cas : soit si le bit d'entrée vaut, soit quand le signal d'entrée RAZ est à 1. Si vous cherchez à la concevoir à partir d'un table de vérité, vous obtiendrez ceci : {| |[[File:Brique de base du circuit de gestion des priorités d'un encodeur à priorité.png|vignette|Brique de base du circuit de gestion des priorités d'un encodeur à priorité.]] |[[File:Circuit de gestion des priorité - Circuit de la brique de base.png|vignette|upright=1.5|Circuit de gestion des priorité - Circuit de la brique de base.]] |} Le circuit complet d'un encodeur à priorité peut être déduit facilement à partir des raisonnements précédents. Après quelques simplifications, on peut obtenir le circuit suivant. On voit qu'on a ajouté une ligne de briques RAZ à l'encodeur 8 vers 3 vu plus haut. [[File:Koder priorytetowy.jpg|centre|vignette|upright=2|Encodeur à priorités]] Le défaut de cette méthode est que le circuit de gestion des priorité est assez lent. Dans le pire des cas, le signal de remise à zéro traverse toutes les briques de base, soit autant qu'il y a de bits d'entrée. Si chaque brique de base met un certain temps, le temps mis pour que le circuit de priorité fasse son travail est proportionnel au nombre de bits de l'entrée. Cela n'a l'air de rien, mais cela peut prendre un temps rédhibitoire pour les circuits de haute performance, destinés à fonctionner à haute fréquence. Pour ces circuits, on préfère que le temps de calcul soit proportionnel au logarithme du nombre de bits d'entrée, un temps proportionnel étant considéré comme trop lent, surtout pour des opérations simples comme celles étudiées ici. Une version légèrement différente de ce circuit est utilisée dans le processeur ARM1, un des tout premiers processeur ARM. L'encodeur à priorité était bidirectionnel, à savoir capable de déterminer soit la place du 1 de poids faible, soit du 1 de poids fort. Pour ceux qui veulent en savoir plus, et qui ont déjà un bagage solide en architecture des ordinateurs, voici un lien à ce sujet : : [https://www.righto.com/2016/01/more-arm1-processor-reverse-engineering.html More ARM1 processor reverse engineering: the priority encoder ] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de masquage | prevText=Les circuits de masquage | next=Les bascules : des mémoires de 1 bit | nextText=Les bascules : des mémoires de 1 bit }} </noinclude> suqv6s60s2jkscsxpigqz4rl4aou4jn Fonctionnement d'un ordinateur/Les circuits de masquage 0 70434 767852 748835 2026-06-16T19:24:08Z Mewtow 31375 /* Les opérations pour tester un bit */ 767852 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations bit à bit''', un ensemble d'opérations qui appliquent une opération binaire sur un ou deux nombres. La plus simple d'entre elle est l'opération NON, aussi appelée opération de complémentation, qui inverse tous les bits d'un nombre. Il s'agit de l'opération la plus simple et nous en avions déjà parlé dans les chapitres précédents. Mais il existe des opérations bit à bit un chouia plus complexes, comme celles qui font un ET/OU/XOR entre deux nombres. Pour être plus précis, elles font un ET/OU/XOR entre les deux bits de même poids. L'exemple du OU bit à bit est illustré ci-dessous, les exemples du ET et du XOR sont similaires. [[File:Binary num bitwise OR.png|centre|vignette|upright=2|Opération OU bit à bit.]] De telles opérations sont appelées bit à bit car elles combinent les bits de même poids de deux opérandes. Par contre, il n'y a pas de calculs entre bits de poids différents, les colonnes sont traitées indépendamment. Elles sont très utilisées en programmation, et tout ordinateur digne de ce nom contient un circuit capable d'effectuer ces opérations. Dans ce chapitre, nous allons voir divers circuits capables d'effectuer des opérations bit à bit, et voir comment les combiner. Les opérations bit à bit classiques peuvent prendre une ou deux opérandes. La plupart en prenant deux comme les opérations ET/OU/XOR, l'opération NON en prend une seule. Les opérations bit à bit sur deux opérandes sont au nombre de 16, ce qui correspond au nombre de portes logiques à deux entrées possibles. Mais ce chiffre de 16 inclut les opérations bit à bit sur une opérande unique, qui sont au nombre de 4. Les opérations bit à bit sur une seule opérande sont plus simples à voir, nous verrons les opérations bit à bit à deux opérandes plus tard. ==Les opérations bit à bit à une opérande== Les opérations bit à bit n'ayant qu'une seule opérande sont au nombre de quatre : * Mettre à zéro l'opérande (porte FALSE). * Mettre à 11111...11111 l'opérande (porte TRUE). * Inverser les bits de l'opérande (porte NON). * Recopier l'opérande (porte OUI). Dans ce qui va suivre, nous allons créer un circuit qui prend en entrée une opérande, un nombre, et applique une des quatre opérations précédente. On peut choisir l'opération voulue grâce à plusieurs bits de commande, idéalement deux. Le circuit est composé à partir de circuits plus simples, au maximum trois : un circuit qui inverse le bit d'entrée à la demande, un autre qui le met à 1, un autre qui le met à 0. Ces trois circuits ont une entrée de commande qui détermine s'il faut faire l'opération, ou si le circuit doit se comporter comme une simple porte OUI, qui recopie sont entrée sur sa sortie et ne fait donc aucune opération. Le circuit recopie le bit d'entrée si cette entrée est à 0, mais il inverse/set/reset le bit d'entrée si elle est à 1. Pour comprendre comment concevoir ces circuits, il faut rappeler les relations suivantes, qui donnent le résultat d'un ET/OU/XOR entre un bit d'opérande noté a et un bit qui vaut 0 ou 1. {|class="wikitable" |- ! ! Opération ! Interprétation du résultat |- ! rowspan="2" | Porte ET | <math>a.0=0</math> | Mise à zéro du bit d'entrée |- | <math>a.1=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte OU | <math>a+1=1</math> | Mise à 1 du bit d'entrée |- | <math>a+0=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte XOR | <math>a \oplus 0=a</math> | Recopie du bit d'entrée |- | <math>a \oplus 1=\overline{a}</math> | Inversion du bit d'entrée |} Pour résumer ce qui va suivre : * Le circuit de mise à 1 commandable est une porte simple OU. * Le circuit d’inversion commandable est une simple porte XOR. * Le circuit de Reset, qui permet de mettre à zéro un bit si besoin, est une porte ET un peu modifiée. ===Le circuit de mise à la valeur maximale=== Dans cette section, nous allons voir un circuit : soit recopie l'entrée sur sa sortie, soit la met à 11111...111. Le choix entre les deux situations est réalisé par une entrée ''Set'' de 1 bit : un 1 sur cette entrée met la sortie à la valeur maximale, un 0 signifie que l'entrée est recopiée en sortie. Ce circuit est utilisé pour gérer les débordements d'entier avec l'arithmétique saturée (revoir le chapitre sur le codage des entiers pour plus d'explications). Le circuit de mise à 111111...111 gére le cas où le calcul déborde, ce qui demande de mettre la sortie à la valeur maximale. Évidemment, le circuit de calcul doit non seulement faire le calcul, mais aussi détecter les débordements d'entiers, afin de fournir le bit pour l'entrée ''Set''. Mais nous verrons cela dans le chapitre sur les circuits de calcul entier. La porte OU est toute indiquée pour cela. La mise à 1 d'un bit d'entrée demande de faire un OU de celui-ci avec un 1, alors que recopier un bit d'entrée demande de faire un OU de celui-ci avec un 0. [[File:Circuit de mise à 1111111...11.png|centre|vignette|upright=2|Circuit de mise à 1111111...11]] ===Le circuit de mise à zéro=== Le circuit de ''Reset'' fait la même chose que le circuit précédent, sauf que sa sortie n'est pas mise à 1111...1111, mais à 0. Le circuit de ''Reset'' prend en entrée un bit de ''Reset'' qui indique s'il faut mettre à zéro l'entrée ou non. Si le signal Reset est à 1, alors on met à zéro le bit d'entrée, mais on le laisse intact sinon. Le tableau ci-dessus nous dit que la porte ET est adaptée : elle recopie le bit d'entrée si le bit de commande vaut 1, et elle le met à 0 si le bit de commande vaut 0. Cependant, rappelons que l'on souhaite que le le circuit fasse un ''Reset'' si le bit de commande est à 1, pas 0, et la porte ET fait l'inverse. Pour corriger cela, on doit ajouter une porte NON. Le tout donne le circuit ci-dessous. [[File:Circuit de mise à zéro d'un bit.png|centre|vignette|upright=2|Circuit de mise à zéro d'un bit]] Un circuit qui met à zéro un nombre est composé de plusieurs circuits ci-dessus, à la différence que la porte NON est potentiellement partagée. Par contre, chaque bit est bien relié à une porte ET. [[File:Circuit de mise à zéro.png|centre|vignette|upright=2|Circuit de mise à zéro]] ===L'inverseur commandable=== L''''inverseur commandable''' est un circuit qui, comme son nom l'indique, inverse les bits d'entrée si un bit de commande nommé ''Invert'' vaut 1. La porte XOR est toute indiquée pour, ce qui fait que le circuit d'inversion commandable est composé d'une couche de portes XOR, chaque porte ayant une entrée connectée au bit de commande. [[File:Inverseur commandable.png|centre|vignette|upright=2|Inverseur commandable par un bit.]] ===Le circuit qui combine les trois précédents=== Voyons maintenant un circuit qui combine les trois circuits précédents. L'implémentation naïve met les trois circuits les uns à la suite des autres, ce qui donne pour chaque bit d'opérande trois portes logiques ET/OU/XOR en série. Le problème est qu'il faut préciser trois bits de commandes, alors qu'on peut en théorie se débrouiller avec seulement 2 bits. Il faut alors ajouter un circuit combinatoire pour calculer les trois bits de commande à partir des deux bits initiaux. [[File:Porte logique universelle de 1 bit, faite avec trois portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec trois portes]] Mais il y a moyen de se passer d'une porte logique ! L'idée est que mettre à 0 et mettre à 1 sont deux opérations inverses l'une de l'autre. Mettre à 1 revient à mettre à 0, puis à inverser le résultat. Et inversement, mettre à 0 revient à mettre à 1 avant d'inverser le tout. Il suffit donc de mettre le circuit d'inversion commandable à la fin du circuit, juste après un circuit de mise à 0 ou de mise à 1, au choix. En faisant comme cela, il ne reste que deux portes logiques, donc deux entrées. En choisissant bien les valeurs sur l'entrée de commande, on peut connecter les entrées de commande directement sur les opérandes des deux portes, sans passer par un circuit combinatoire. [[File:Porte logique universelle de 1 bit, faite avec deux portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec deux portes]] ==Les opérations bit à bit à deux opérandes== Les opérations bit à bit à deux opérandes effectuent un ET, un OU, ou un XOR entre deux opérandes. Ici, le ET/OU/XOR se fait entre deux bits de même poids dans une opérande. Les circuits qui effectuent ces opérations sont assez simples, ils sont composés de portes logiques placées les unes à côté des autres. Il n'y a pas de possibilité de combiner des portes comme c'était le cas dans la section précédente. ===Les opérations de masquage=== Il est intéressant de donner quelques exemples d'utilisation des opérations bit à bit ET/OU/XOR. L'utilité des opérations bit est bit est en effet loin d'être évidente. L'exemple que nous allons prendre est celui des '''opérations de masquage''', très connue des programmeurs bas niveau. Leur but est de modifier certains bits d'un opérande, mais de laisser certains intouchés. Les bits modifiés peuvent être forcés à 1, forcés à 0, ou inversés. Pour cela, on combine l'opérande avec un second opérande, qui est appelée le '''masque'''. Les bits à modifier sont indiqués par le masque : chaque bit du masque indique s'il faut modifier ou laisser intact le bit correspondant dans l'opérande. Le résultat dépend de l'opération entre masque et opérande, les trois opérations utilisées étant un ET, un OU ou un XOR. Faire un ET entre l'opérande et le masque va mettre certains bits de l’opérande à 0. Les bits mis à 0 sont ceux où le bit du masque correspondant est à 0, tandis que les autres sont recopiés tels quels. La même chose a lieu avec l'opération OU, sauf que cette fois-ci, certains bits de l'opérande sont mis à 1. Les bits mis à 1 sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masques 1.png|centre|vignette|upright=2.5|Masques 1]] Dans le cas d'un XOR, les bits sont inversés. Les bits inversés sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masquage des n bits de poids faible.png|centre|vignette|upright=2|Masquage des n bits de poids faible]] Pour donner un exemple d'utilisation, parlons des droits d'accès à un fichier. Ceux-ci sont regroupés dans une suite de bits : un des bits indique s'il est accessible en écriture, un autre pour les accès en lecture, un autre s'il est exécutable, etc. Bref, modifier les droits en écriture de ce fichier demande de modifier le bit associé à 1 ou à 0, sans toucher aux autres. Cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisie. Un autre cas typique est celui où un développeur compacte plusieurs données dans un seul entier. Par exemple, prenons le cas d'une date, exprimée sous la forme jour/mois/année. Un développeur normal stockera cette date dans trois entiers : un pour le jour, un pour le mois, et un pour la date. Mais un programmeur plus pointilleux sera capable d'utiliser un seul entier pour stocker le jour, le mois et l'année. Pour cela, il raisonnera comme suit : * un mois comporte maximum 31 jours : on doit donc encoder tous les nombres compris entre 1 et 31, ce qui peut se faire en 5 bits ; * une année comporte 12 mois, ce qui tient dans 4 bits ; * et enfin, en supposant que l'on doive gérer les années depuis la naissance de Jésus jusqu'à l'année 2047, 11 bits peuvent suffire. Dans ces conditions, notre développeur décidera d'utiliser un entier de 32 bits pour le stockage des dates : * les 5 bits de poids forts serviront à stocker le jour ; * les 4 bits suivants stockeront le mois ; * et les bits qui restent stockeront l'année. Le développeur qui souhaite modifier le jour ou le mois d'une date devra modifier une partie des bits, tout en laissant les autres intacts. Encore une fois, cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisi. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Nous allons aussi voir la même chose, mais pour les portes logiques de 1 bit. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits combinatoires | prevText=Les circuits combinatoires | next=Les circuits de sélection | nextText=Les circuits de sélection }} {{autocat}} tm36npktq20iuxdv1l2txokq8o6y1oz 767856 767852 2026-06-16T19:35:38Z Mewtow 31375 /* Les opérations de masquage */ 767856 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations bit à bit''', un ensemble d'opérations qui appliquent une opération binaire sur un ou deux nombres. La plus simple d'entre elle est l'opération NON, aussi appelée opération de complémentation, qui inverse tous les bits d'un nombre. Il s'agit de l'opération la plus simple et nous en avions déjà parlé dans les chapitres précédents. Mais il existe des opérations bit à bit un chouia plus complexes, comme celles qui font un ET/OU/XOR entre deux nombres. Pour être plus précis, elles font un ET/OU/XOR entre les deux bits de même poids. L'exemple du OU bit à bit est illustré ci-dessous, les exemples du ET et du XOR sont similaires. [[File:Binary num bitwise OR.png|centre|vignette|upright=2|Opération OU bit à bit.]] De telles opérations sont appelées bit à bit car elles combinent les bits de même poids de deux opérandes. Par contre, il n'y a pas de calculs entre bits de poids différents, les colonnes sont traitées indépendamment. Elles sont très utilisées en programmation, et tout ordinateur digne de ce nom contient un circuit capable d'effectuer ces opérations. Dans ce chapitre, nous allons voir divers circuits capables d'effectuer des opérations bit à bit, et voir comment les combiner. Les opérations bit à bit classiques peuvent prendre une ou deux opérandes. La plupart en prenant deux comme les opérations ET/OU/XOR, l'opération NON en prend une seule. Les opérations bit à bit sur deux opérandes sont au nombre de 16, ce qui correspond au nombre de portes logiques à deux entrées possibles. Mais ce chiffre de 16 inclut les opérations bit à bit sur une opérande unique, qui sont au nombre de 4. Les opérations bit à bit sur une seule opérande sont plus simples à voir, nous verrons les opérations bit à bit à deux opérandes plus tard. ==Les opérations bit à bit à une opérande== Les opérations bit à bit n'ayant qu'une seule opérande sont au nombre de quatre : * Mettre à zéro l'opérande (porte FALSE). * Mettre à 11111...11111 l'opérande (porte TRUE). * Inverser les bits de l'opérande (porte NON). * Recopier l'opérande (porte OUI). Dans ce qui va suivre, nous allons créer un circuit qui prend en entrée une opérande, un nombre, et applique une des quatre opérations précédente. On peut choisir l'opération voulue grâce à plusieurs bits de commande, idéalement deux. Le circuit est composé à partir de circuits plus simples, au maximum trois : un circuit qui inverse le bit d'entrée à la demande, un autre qui le met à 1, un autre qui le met à 0. Ces trois circuits ont une entrée de commande qui détermine s'il faut faire l'opération, ou si le circuit doit se comporter comme une simple porte OUI, qui recopie sont entrée sur sa sortie et ne fait donc aucune opération. Le circuit recopie le bit d'entrée si cette entrée est à 0, mais il inverse/set/reset le bit d'entrée si elle est à 1. Pour comprendre comment concevoir ces circuits, il faut rappeler les relations suivantes, qui donnent le résultat d'un ET/OU/XOR entre un bit d'opérande noté a et un bit qui vaut 0 ou 1. {|class="wikitable" |- ! ! Opération ! Interprétation du résultat |- ! rowspan="2" | Porte ET | <math>a.0=0</math> | Mise à zéro du bit d'entrée |- | <math>a.1=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte OU | <math>a+1=1</math> | Mise à 1 du bit d'entrée |- | <math>a+0=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte XOR | <math>a \oplus 0=a</math> | Recopie du bit d'entrée |- | <math>a \oplus 1=\overline{a}</math> | Inversion du bit d'entrée |} Pour résumer ce qui va suivre : * Le circuit de mise à 1 commandable est une porte simple OU. * Le circuit d’inversion commandable est une simple porte XOR. * Le circuit de Reset, qui permet de mettre à zéro un bit si besoin, est une porte ET un peu modifiée. ===Le circuit de mise à la valeur maximale=== Dans cette section, nous allons voir un circuit : soit recopie l'entrée sur sa sortie, soit la met à 11111...111. Le choix entre les deux situations est réalisé par une entrée ''Set'' de 1 bit : un 1 sur cette entrée met la sortie à la valeur maximale, un 0 signifie que l'entrée est recopiée en sortie. Ce circuit est utilisé pour gérer les débordements d'entier avec l'arithmétique saturée (revoir le chapitre sur le codage des entiers pour plus d'explications). Le circuit de mise à 111111...111 gére le cas où le calcul déborde, ce qui demande de mettre la sortie à la valeur maximale. Évidemment, le circuit de calcul doit non seulement faire le calcul, mais aussi détecter les débordements d'entiers, afin de fournir le bit pour l'entrée ''Set''. Mais nous verrons cela dans le chapitre sur les circuits de calcul entier. La porte OU est toute indiquée pour cela. La mise à 1 d'un bit d'entrée demande de faire un OU de celui-ci avec un 1, alors que recopier un bit d'entrée demande de faire un OU de celui-ci avec un 0. [[File:Circuit de mise à 1111111...11.png|centre|vignette|upright=2|Circuit de mise à 1111111...11]] ===Le circuit de mise à zéro=== Le circuit de ''Reset'' fait la même chose que le circuit précédent, sauf que sa sortie n'est pas mise à 1111...1111, mais à 0. Le circuit de ''Reset'' prend en entrée un bit de ''Reset'' qui indique s'il faut mettre à zéro l'entrée ou non. Si le signal Reset est à 1, alors on met à zéro le bit d'entrée, mais on le laisse intact sinon. Le tableau ci-dessus nous dit que la porte ET est adaptée : elle recopie le bit d'entrée si le bit de commande vaut 1, et elle le met à 0 si le bit de commande vaut 0. Cependant, rappelons que l'on souhaite que le le circuit fasse un ''Reset'' si le bit de commande est à 1, pas 0, et la porte ET fait l'inverse. Pour corriger cela, on doit ajouter une porte NON. Le tout donne le circuit ci-dessous. [[File:Circuit de mise à zéro d'un bit.png|centre|vignette|upright=2|Circuit de mise à zéro d'un bit]] Un circuit qui met à zéro un nombre est composé de plusieurs circuits ci-dessus, à la différence que la porte NON est potentiellement partagée. Par contre, chaque bit est bien relié à une porte ET. [[File:Circuit de mise à zéro.png|centre|vignette|upright=2|Circuit de mise à zéro]] ===L'inverseur commandable=== L''''inverseur commandable''' est un circuit qui, comme son nom l'indique, inverse les bits d'entrée si un bit de commande nommé ''Invert'' vaut 1. La porte XOR est toute indiquée pour, ce qui fait que le circuit d'inversion commandable est composé d'une couche de portes XOR, chaque porte ayant une entrée connectée au bit de commande. [[File:Inverseur commandable.png|centre|vignette|upright=2|Inverseur commandable par un bit.]] ===Le circuit qui combine les trois précédents=== Voyons maintenant un circuit qui combine les trois circuits précédents. L'implémentation naïve met les trois circuits les uns à la suite des autres, ce qui donne pour chaque bit d'opérande trois portes logiques ET/OU/XOR en série. Le problème est qu'il faut préciser trois bits de commandes, alors qu'on peut en théorie se débrouiller avec seulement 2 bits. Il faut alors ajouter un circuit combinatoire pour calculer les trois bits de commande à partir des deux bits initiaux. [[File:Porte logique universelle de 1 bit, faite avec trois portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec trois portes]] Mais il y a moyen de se passer d'une porte logique ! L'idée est que mettre à 0 et mettre à 1 sont deux opérations inverses l'une de l'autre. Mettre à 1 revient à mettre à 0, puis à inverser le résultat. Et inversement, mettre à 0 revient à mettre à 1 avant d'inverser le tout. Il suffit donc de mettre le circuit d'inversion commandable à la fin du circuit, juste après un circuit de mise à 0 ou de mise à 1, au choix. En faisant comme cela, il ne reste que deux portes logiques, donc deux entrées. En choisissant bien les valeurs sur l'entrée de commande, on peut connecter les entrées de commande directement sur les opérandes des deux portes, sans passer par un circuit combinatoire. [[File:Porte logique universelle de 1 bit, faite avec deux portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec deux portes]] ==Les opérations bit à bit à deux opérandes== Les opérations bit à bit à deux opérandes effectuent un ET, un OU, ou un XOR entre deux opérandes. Ici, le ET/OU/XOR se fait entre deux bits de même poids dans une opérande. Les circuits qui effectuent ces opérations sont assez simples, ils sont composés de portes logiques placées les unes à côté des autres. Il n'y a pas de possibilité de combiner des portes comme c'était le cas dans la section précédente. ===Les opérations de masquage=== Il est intéressant de donner quelques exemples d'utilisation des opérations bit à bit ET/OU/XOR. L'utilité des opérations bit est bit est en effet loin d'être évidente. L'exemple que nous allons prendre est celui des '''opérations de masquage''', très connue des programmeurs bas niveau. Leur but est de modifier certains bits d'un opérande, mais de laisser certains intouchés. Les bits modifiés peuvent être forcés à 1, forcés à 0, ou inversés. Pour cela, on combine l'opérande avec un second opérande, qui est appelée le '''masque'''. Les bits à modifier sont indiqués par le masque : chaque bit du masque indique s'il faut modifier ou laisser intact le bit correspondant dans l'opérande. Le résultat dépend de l'opération entre masque et opérande, les trois opérations utilisées étant un ET, un OU ou un XOR. Faire un ET entre l'opérande et le masque va mettre certains bits de l’opérande à 0. Les bits mis à 0 sont ceux où le bit du masque correspondant est à 0, tandis que les autres sont recopiés tels quels. La même chose a lieu avec l'opération OU, sauf que cette fois-ci, certains bits de l'opérande sont mis à 1. Les bits mis à 1 sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masques 1.png|centre|vignette|upright=2.5|Masques 1]] Dans le cas d'un XOR, les bits sont inversés. Les bits inversés sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masquage des n bits de poids faible.png|centre|vignette|upright=2|Masquage des n bits de poids faible]] ===Un exemple d'utilisation des opérations de masquage=== Pour donner un exemple d'utilisation, parlons des droits d'accès à un fichier. Ceux-ci sont regroupés dans une suite de bits : un des bits indique s'il est accessible en écriture, un autre pour les accès en lecture, un autre s'il est exécutable, etc. Bref, modifier les droits en écriture de ce fichier demande de modifier le bit associé à 1 ou à 0, sans toucher aux autres. Cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisie. Un autre cas typique est celui où un développeur compacte plusieurs données dans un seul entier. Par exemple, prenons le cas d'une date, exprimée sous la forme jour/mois/année. Un développeur normal stockera cette date dans trois entiers : un pour le jour, un pour le mois, et un pour la date. Mais un programmeur plus pointilleux sera capable d'utiliser un seul entier pour stocker le jour, le mois et l'année. Pour cela, il raisonnera comme suit : * un mois comporte maximum 31 jours : on doit donc encoder tous les nombres compris entre 1 et 31, ce qui peut se faire en 5 bits ; * une année comporte 12 mois, ce qui tient dans 4 bits ; * et enfin, en supposant que l'on doive gérer les années depuis la naissance de Jésus jusqu'à l'année 2047, 11 bits peuvent suffire. Dans ces conditions, notre développeur décidera d'utiliser un entier de 32 bits pour le stockage des dates : * les 5 bits de poids forts serviront à stocker le jour ; * les 4 bits suivants stockeront le mois ; * et les bits qui restent stockeront l'année. Le développeur qui souhaite modifier le jour ou le mois d'une date devra modifier une partie des bits, tout en laissant les autres intacts. Encore une fois, cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisi. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Nous allons aussi voir la même chose, mais pour les portes logiques de 1 bit. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits combinatoires | prevText=Les circuits combinatoires | next=Les circuits de sélection | nextText=Les circuits de sélection }} {{autocat}} bbwnm573fwsc66mwq1s3vjns7xqi8dl 767858 767856 2026-06-16T19:59:15Z Mewtow 31375 /* Les portes logiques universelles à deux entrées */ 767858 wikitext text/x-wiki Dans ce chapitre, nous allons voir les '''opérations bit à bit''', un ensemble d'opérations qui appliquent une opération binaire sur un ou deux nombres. La plus simple d'entre elle est l'opération NON, aussi appelée opération de complémentation, qui inverse tous les bits d'un nombre. Il s'agit de l'opération la plus simple et nous en avions déjà parlé dans les chapitres précédents. Mais il existe des opérations bit à bit un chouia plus complexes, comme celles qui font un ET/OU/XOR entre deux nombres. Pour être plus précis, elles font un ET/OU/XOR entre les deux bits de même poids. L'exemple du OU bit à bit est illustré ci-dessous, les exemples du ET et du XOR sont similaires. [[File:Binary num bitwise OR.png|centre|vignette|upright=2|Opération OU bit à bit.]] De telles opérations sont appelées bit à bit car elles combinent les bits de même poids de deux opérandes. Par contre, il n'y a pas de calculs entre bits de poids différents, les colonnes sont traitées indépendamment. Elles sont très utilisées en programmation, et tout ordinateur digne de ce nom contient un circuit capable d'effectuer ces opérations. Dans ce chapitre, nous allons voir divers circuits capables d'effectuer des opérations bit à bit, et voir comment les combiner. Les opérations bit à bit classiques peuvent prendre une ou deux opérandes. La plupart en prenant deux comme les opérations ET/OU/XOR, l'opération NON en prend une seule. Les opérations bit à bit sur deux opérandes sont au nombre de 16, ce qui correspond au nombre de portes logiques à deux entrées possibles. Mais ce chiffre de 16 inclut les opérations bit à bit sur une opérande unique, qui sont au nombre de 4. Les opérations bit à bit sur une seule opérande sont plus simples à voir, nous verrons les opérations bit à bit à deux opérandes plus tard. ==Les opérations bit à bit à une opérande== Les opérations bit à bit n'ayant qu'une seule opérande sont au nombre de quatre : * Mettre à zéro l'opérande (porte FALSE). * Mettre à 11111...11111 l'opérande (porte TRUE). * Inverser les bits de l'opérande (porte NON). * Recopier l'opérande (porte OUI). Dans ce qui va suivre, nous allons créer un circuit qui prend en entrée une opérande, un nombre, et applique une des quatre opérations précédente. On peut choisir l'opération voulue grâce à plusieurs bits de commande, idéalement deux. Le circuit est composé à partir de circuits plus simples, au maximum trois : un circuit qui inverse le bit d'entrée à la demande, un autre qui le met à 1, un autre qui le met à 0. Ces trois circuits ont une entrée de commande qui détermine s'il faut faire l'opération, ou si le circuit doit se comporter comme une simple porte OUI, qui recopie sont entrée sur sa sortie et ne fait donc aucune opération. Le circuit recopie le bit d'entrée si cette entrée est à 0, mais il inverse/set/reset le bit d'entrée si elle est à 1. Pour comprendre comment concevoir ces circuits, il faut rappeler les relations suivantes, qui donnent le résultat d'un ET/OU/XOR entre un bit d'opérande noté a et un bit qui vaut 0 ou 1. {|class="wikitable" |- ! ! Opération ! Interprétation du résultat |- ! rowspan="2" | Porte ET | <math>a.0=0</math> | Mise à zéro du bit d'entrée |- | <math>a.1=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte OU | <math>a+1=1</math> | Mise à 1 du bit d'entrée |- | <math>a+0=a</math> | Recopie du bit d'entrée |- ! rowspan="2" | Porte XOR | <math>a \oplus 0=a</math> | Recopie du bit d'entrée |- | <math>a \oplus 1=\overline{a}</math> | Inversion du bit d'entrée |} Pour résumer ce qui va suivre : * Le circuit de mise à 1 commandable est une porte simple OU. * Le circuit d’inversion commandable est une simple porte XOR. * Le circuit de Reset, qui permet de mettre à zéro un bit si besoin, est une porte ET un peu modifiée. ===Le circuit de mise à la valeur maximale=== Dans cette section, nous allons voir un circuit : soit recopie l'entrée sur sa sortie, soit la met à 11111...111. Le choix entre les deux situations est réalisé par une entrée ''Set'' de 1 bit : un 1 sur cette entrée met la sortie à la valeur maximale, un 0 signifie que l'entrée est recopiée en sortie. Ce circuit est utilisé pour gérer les débordements d'entier avec l'arithmétique saturée (revoir le chapitre sur le codage des entiers pour plus d'explications). Le circuit de mise à 111111...111 gére le cas où le calcul déborde, ce qui demande de mettre la sortie à la valeur maximale. Évidemment, le circuit de calcul doit non seulement faire le calcul, mais aussi détecter les débordements d'entiers, afin de fournir le bit pour l'entrée ''Set''. Mais nous verrons cela dans le chapitre sur les circuits de calcul entier. La porte OU est toute indiquée pour cela. La mise à 1 d'un bit d'entrée demande de faire un OU de celui-ci avec un 1, alors que recopier un bit d'entrée demande de faire un OU de celui-ci avec un 0. [[File:Circuit de mise à 1111111...11.png|centre|vignette|upright=2|Circuit de mise à 1111111...11]] ===Le circuit de mise à zéro=== Le circuit de ''Reset'' fait la même chose que le circuit précédent, sauf que sa sortie n'est pas mise à 1111...1111, mais à 0. Le circuit de ''Reset'' prend en entrée un bit de ''Reset'' qui indique s'il faut mettre à zéro l'entrée ou non. Si le signal Reset est à 1, alors on met à zéro le bit d'entrée, mais on le laisse intact sinon. Le tableau ci-dessus nous dit que la porte ET est adaptée : elle recopie le bit d'entrée si le bit de commande vaut 1, et elle le met à 0 si le bit de commande vaut 0. Cependant, rappelons que l'on souhaite que le le circuit fasse un ''Reset'' si le bit de commande est à 1, pas 0, et la porte ET fait l'inverse. Pour corriger cela, on doit ajouter une porte NON. Le tout donne le circuit ci-dessous. [[File:Circuit de mise à zéro d'un bit.png|centre|vignette|upright=2|Circuit de mise à zéro d'un bit]] Un circuit qui met à zéro un nombre est composé de plusieurs circuits ci-dessus, à la différence que la porte NON est potentiellement partagée. Par contre, chaque bit est bien relié à une porte ET. [[File:Circuit de mise à zéro.png|centre|vignette|upright=2|Circuit de mise à zéro]] ===L'inverseur commandable=== L''''inverseur commandable''' est un circuit qui, comme son nom l'indique, inverse les bits d'entrée si un bit de commande nommé ''Invert'' vaut 1. La porte XOR est toute indiquée pour, ce qui fait que le circuit d'inversion commandable est composé d'une couche de portes XOR, chaque porte ayant une entrée connectée au bit de commande. [[File:Inverseur commandable.png|centre|vignette|upright=2|Inverseur commandable par un bit.]] ===Le circuit qui combine les trois précédents=== Voyons maintenant un circuit qui combine les trois circuits précédents. L'implémentation naïve met les trois circuits les uns à la suite des autres, ce qui donne pour chaque bit d'opérande trois portes logiques ET/OU/XOR en série. Le problème est qu'il faut préciser trois bits de commandes, alors qu'on peut en théorie se débrouiller avec seulement 2 bits. Il faut alors ajouter un circuit combinatoire pour calculer les trois bits de commande à partir des deux bits initiaux. [[File:Porte logique universelle de 1 bit, faite avec trois portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec trois portes]] Mais il y a moyen de se passer d'une porte logique ! L'idée est que mettre à 0 et mettre à 1 sont deux opérations inverses l'une de l'autre. Mettre à 1 revient à mettre à 0, puis à inverser le résultat. Et inversement, mettre à 0 revient à mettre à 1 avant d'inverser le tout. Il suffit donc de mettre le circuit d'inversion commandable à la fin du circuit, juste après un circuit de mise à 0 ou de mise à 1, au choix. En faisant comme cela, il ne reste que deux portes logiques, donc deux entrées. En choisissant bien les valeurs sur l'entrée de commande, on peut connecter les entrées de commande directement sur les opérandes des deux portes, sans passer par un circuit combinatoire. [[File:Porte logique universelle de 1 bit, faite avec deux portes.png|centre|vignette|upright=2|Porte logique universelle de 1 bit, faite avec deux portes]] ==Les opérations bit à bit à deux opérandes== Les opérations bit à bit à deux opérandes effectuent un ET, un OU, ou un XOR entre deux opérandes. Ici, le ET/OU/XOR se fait entre deux bits de même poids dans une opérande. Les circuits qui effectuent ces opérations sont assez simples, ils sont composés de portes logiques placées les unes à côté des autres. Il n'y a pas de possibilité de combiner des portes comme c'était le cas dans la section précédente. ===Les opérations de masquage=== Il est intéressant de donner quelques exemples d'utilisation des opérations bit à bit ET/OU/XOR. L'utilité des opérations bit est bit est en effet loin d'être évidente. L'exemple que nous allons prendre est celui des '''opérations de masquage''', très connue des programmeurs bas niveau. Leur but est de modifier certains bits d'un opérande, mais de laisser certains intouchés. Les bits modifiés peuvent être forcés à 1, forcés à 0, ou inversés. Pour cela, on combine l'opérande avec un second opérande, qui est appelée le '''masque'''. Les bits à modifier sont indiqués par le masque : chaque bit du masque indique s'il faut modifier ou laisser intact le bit correspondant dans l'opérande. Le résultat dépend de l'opération entre masque et opérande, les trois opérations utilisées étant un ET, un OU ou un XOR. Faire un ET entre l'opérande et le masque va mettre certains bits de l’opérande à 0. Les bits mis à 0 sont ceux où le bit du masque correspondant est à 0, tandis que les autres sont recopiés tels quels. La même chose a lieu avec l'opération OU, sauf que cette fois-ci, certains bits de l'opérande sont mis à 1. Les bits mis à 1 sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masques 1.png|centre|vignette|upright=2.5|Masques 1]] Dans le cas d'un XOR, les bits sont inversés. Les bits inversés sont ceux pour lesquels le bit du masque correspondant est un 1. [[File:Masquage des n bits de poids faible.png|centre|vignette|upright=2|Masquage des n bits de poids faible]] ===Un exemple d'utilisation des opérations de masquage=== Pour donner un exemple d'utilisation, parlons des droits d'accès à un fichier. Ceux-ci sont regroupés dans une suite de bits : un des bits indique s'il est accessible en écriture, un autre pour les accès en lecture, un autre s'il est exécutable, etc. Bref, modifier les droits en écriture de ce fichier demande de modifier le bit associé à 1 ou à 0, sans toucher aux autres. Cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisie. Un autre cas typique est celui où un développeur compacte plusieurs données dans un seul entier. Par exemple, prenons le cas d'une date, exprimée sous la forme jour/mois/année. Un développeur normal stockera cette date dans trois entiers : un pour le jour, un pour le mois, et un pour la date. Mais un programmeur plus pointilleux sera capable d'utiliser un seul entier pour stocker le jour, le mois et l'année. Pour cela, il raisonnera comme suit : * un mois comporte maximum 31 jours : on doit donc encoder tous les nombres compris entre 1 et 31, ce qui peut se faire en 5 bits ; * une année comporte 12 mois, ce qui tient dans 4 bits ; * et enfin, en supposant que l'on doive gérer les années depuis la naissance de Jésus jusqu'à l'année 2047, 11 bits peuvent suffire. Dans ces conditions, notre développeur décidera d'utiliser un entier de 32 bits pour le stockage des dates : * les 5 bits de poids forts serviront à stocker le jour ; * les 4 bits suivants stockeront le mois ; * et les bits qui restent stockeront l'année. Le développeur qui souhaite modifier le jour ou le mois d'une date devra modifier une partie des bits, tout en laissant les autres intacts. Encore une fois, cela peut se faire facilement en utilisant une instruction bit à bit avec un masque bien choisi. {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits combinatoires | prevText=Les circuits combinatoires | next=Les circuits de sélection | nextText=Les circuits de sélection }} {{autocat}} 6knd3x0k9vxaprdey9dbqr5kznqajkd Python pour le calcul scientifique/Éléments de programmation 0 72883 767922 767818 2026-06-17T08:51:44Z Cdang 1202 /* Substitution de variables */ end="\r" 767922 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…). On peut « mélanger » les types en les séparant par des virgules, par exemple <syntaxhighlight lang="python"> print("La longueur vaut : ", longueur, " mm.") </syntaxhighlight> ou bien <syntaxhighlight lang="python"> print("Essai de mélange ", 1, True, 10.0, " insensé.") </syntaxhighlight> Mais si l'on veut faire ça de manière harmonieuse, on a intérêt à tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> Si vous voulez passer un argument directement au script Python, vous pouvez utiliser le module <code>sys</code>. L'argument est alors contenu dans la variable <code>sys.argv[1]</code> ; la variable <code>sys.argv[0]</code> contient le nom du scirpt lui-même. Par exemple <syntaxhighlight lang="python"> import sys print("Script : ", sys.argv[0]) print("Entrée : ", sys.argv[1]) </syntaxhighlight> Si vous exécutez le script depuis une console (fenêtre de commande), le nom du fichier de script étant <code>monscript.py</code> : <syntaxhighlight lang="text"> $ python monscript.py blabla Script : monscript.py Entrée : blabla $_ </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ratio()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.is_integer()</code> : indique si le nombre est un entier (<code>true</code> dans ce cas-là, <code>False</code> sinon) ; * <code>''float''.from_number(''x'')</code> : transforme le nombre ''x'' en un réel (permet de convertir un entier en réel) ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal ; * <code>''float''.fromhex(''c'')</code> : transforme une chaîne de caractères, correspondant à l'écriture d'un nombre en hexadécimal, en un nombre réel correspondant. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. On aurait pu aussi écrire <code>print(10.0.hex())</code>. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} : {{lien web | url = https://docs.python.org/3/library/string.html | titre = <code>string</code> — Common string operations | site = Python Documentation | consulté le = 2026-06-05 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. Chaque caractère possède un code ''({{lang|en|code point}})'' définit par la norme Unicode ''({{lang|en|Unicode code point}})''. Pour afficher le caractère correspondant à un code, on utilise <code>chr()</code>. Pour afficher le code correspondant à un caractère, on utilise <code>ord()</code> <syntaxhighlight lang="python"> print(ord("a")) # 97 print(hex(ord("a"))) # 0x61 print(chr(97)) # a print(chr(0x61)) # a </syntaxhighlight> ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour un nombre en notaiton scientifique (exponentielle), on utilise <code>.''n''e</code>. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %", end="\r") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne, ou bien <code>-1</code> si la sous-chaîne est absente ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = barre = html.unescape("&#x2588;" * fait + "&middot;" * (largeur - fait)) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète donc une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == === Généralités === Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur, c'est-à-dire qui permettent la saisie d'informations, l'exécution d'actions et l'affichage d'informations. L'interface se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. === Avec Tk === Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> [[Fichier:Organisation interface Tk Python.svg|vignette|upright=2|Organisation des ''widgets''.]] '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} {{voir |{{lien web |url=https://docs.python.org/3/library/tkinter.ttk.html |titre=tkinter.ttk — Tk themed widgets |site=docs.python.org |consulté le=2026-06-11}} }} {{voir |{{lien web |url=https://matplotlib.org/stable/gallery/user_interfaces/embedding_in_tk_sgskip.html |titre=How to embed Matplotlib charts in Tkinter GUI? |site=Matplotlib.org |date=2025-07-15 |consulté le=2026-06-11}} }} === Avec PyQt === Le module PyQt (prononcer \ˈpaɪ.kjut\) permet d'utiliser la bibliothèque Qt dévelopée par Riverbank Computing. Il permet notamment de créer des interfaces graphiques. La communication entre objets Qt se fait par une mécanismes de « signal/emplacement » ''({{lang|en|signal/slot}})''. Un emplacement ''({{lang|en|slot}})'' est une fonction ''({{lang|en|callable}})'' ; un signal est un attribut d'un objet. Si l'attribut signal est défini pour l'emplacement, alors on dit que l'emplacement est relié à un signal. Par exemple, un objet <code>QPushButton</code> dispose du signal <code>clicked</code> qui est émis lorsque l'on clique dessus ; on peut ainsi faire exécuter un emplacement (fonction appelable) <code>action()</code> lorsque l'on clique sur le bouton par le biais du signal <code>clicked</code> : <syntaxhighlight lang="python"> from PyQt5.QtWidgets import QPushButton bouton = QPushButton("Appuies-moi dessus") button.clicked.connect(action()) </syntaxhighlight> {{voir|{{lien web |url=https://www.riverbankcomputing.com/static/Docs/PyQt6/ |titre=Reference guide PyQt6 |site=Riverbank Computing|consulté le=2026-0604}} }} {{...}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">.read()</code> et <code lang="python">.write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte <code>monfichier.txt</code> pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définition en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Concernant les séparateurs particuliers : * si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> ; * si le séparateur est un nombre arbitraire d'espaces et/ou de tabulation, on ne définit aucun séparateur : <code lang="python">contenu = [item.split() for item in contenu]</code>. Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> Par défaut, la fonction <code>pd.read_csv()</code> considère que le séparateur est une virgule, et la commande <code>pd.read_table()</code> que c'est une tabulation. On peut définir le séparateur avec le paramètre <code>sep</code> : <syntaxhighlight lang="python"> donnees = pd.read_csv("tableau.csv", sep=";") </syntaxhighlight> On peut utiliser les séparateurs spéciaux : * <code>\t</code> : tabulation ; * <code>\s+</code> : nombre arbitraire d'espaces. On peut par ailleurs utiliser les paramètres suivants : * <code>dialect</code> : syntaxe du fichier, par exemple <code>dialect = "excel"</code> ; * <code>nrows</code> (entier) : nombre de lignes lues ; * <code>skiprows</code> (entier) : nombre de lignes sautées (non lues) en début de fichier ; * <code>header</code> (entier) : numéro de ligne utilisé pour l'en-tête, par exemple <code>header = 0</code> pour la première ligne ; * <code>skip_blank_lines</code> (booléen) : si la valeur est vraie (<code>True</code>), ne lit pas les lignes vide ; sinon, met une valeur <code>nan</code>. Par exemple : <syntaxhighlight lang="python"> donnees1 = pd.read_csv("tableau.csv", nrows=1, sep="\s+").to_numpy() donnees2 = pd.read_csv("tableau.csv", skiprows=3, sep="\s+").to_numpy() </syntaxhighlight> {{voir|{{lien web |url=https://pandas.pydata.org/docs/user_guide/io.html |titre=IO tools (text, CSV, HDF5, …) |site=Pandas |consulté le=2026-05-06}} }} == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Recommandations == Les recommandations de programmation sont générales et ne sont en grande partie pas spécifiques à Python. {{voir|[[Découvrir_Scilab/Programmation#Recommandations]]}} == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 7t9lyowfletz0g1n15g7vmves1gv6yu 767923 767922 2026-06-17T08:57:17Z Cdang 1202 /* Entrées et sorties */ paramètres de print 767923 wikitext text/x-wiki Rappel : les programmes commencent par : <syntaxhighlight lang="python"> #!/usr/bin/python3 import numpy as np import matplotlib.pyplot as plt </syntaxhighlight> == Entrées et sorties == Pour permettre à l'utilisateur ou à l'utilisatrice d'entrer une valeur, nous utilisons la fonction <code lang="python">input()</code> comme évoqué précédemment (chapitre ''[[../Premiers programmes|Premiers programmes]]''), avec la syntaxe <code lang="python">''variable'' = input(''texte'')</code>. Notez que la valeur renvoyée par <code lang="python">input()</code> est une chaîne de caractères. Si vous voulez autre chose, typiquement un nombre, il faut convertir cette chaîne. Par exemple, nous demandons ici d'entrer une longueur sous la forme d'une valeur numérique : <syntaxhighlight lang="python"> longueurDefaut = 10.0 texteDemandeLongueur = f"Veuillez entrer la longueur en millimètres (valeur par défaut {longueurDefaut} mm) : " longueur = input(texteDemandeLongueur) if longueur=="": longueur=longueurDefaut else: longueur=float(longueur) print(longueur) </syntaxhighlight> {{voir|https://docs.python.org/3/library/functions.html#input}} Pour afficher un texte, on utilise la fonction <code lang="python">print()</code>, également présentée dans le chapitre ''[[../Premiers programmes|Premiers programmes]]'', avec la syntaxe <code lang="python">print(''texte'')</code>. Le texte à afficher peut être de n'importe quel type (entier, réel en virgule flottante, booléen, chaîne de caractères…). On peut « mélanger » les types en les séparant par des virgules, par exemple <syntaxhighlight lang="python"> print("La longueur vaut : ", longueur, " mm.") </syntaxhighlight> ou bien <syntaxhighlight lang="python"> print("Essai de mélange ", 1, True, 10.0, " insensé.") </syntaxhighlight> Mais si l'on veut faire ça de manière harmonieuse, on a intérêt à tout convertir en chaînes de caractères, avec la fonction <code lang="python">str()</code>, et concaténer les chaînes avec <code lang="python">+</code>. Par exemple : <syntaxhighlight lang="python"> print("La longueur vaut : "+str(longueur)+" mm.") </syntaxhighlight> Nous pouvons aussi utiliser une « chaîne “f” » ''({{lang|en|f-string}})'' : on met un le <code lang="python">f</code> devant le guillemet ouvrant et dans la chaîne, on met un champ sous la forme <code lang="python">{''nomDeVariable''}</code>. L'exemple ci-dessus devient alors : <syntaxhighlight lang="python"> print(f"La longueur vaut : {longueur} mm.") </syntaxhighlight> Les chaînes « f » sont détaillées dans la section ''[[#Chaînes de caractères|Chaînes de caractères]]'' ci-dessous. Si l'on veut introduire un retour à la ligne dans la chaîne, on utilise les caractères <code lang="python">\n</code> (contre-oblique suivie de la lettre N minuscule). Par exemple <syntaxhighlight lang="python"> print("Ceci est un texte\navec un retour à la ligne.") </syntaxhighlight> La commande <code>print()</code> admet les paramètres suivants (nous indiquons la valeur par défaut= : * <code>end = "\n"</code> : détermine la fin de ligne ; on peut mettre <code>end = ""</code> si l'on ne veut pas de retour de ligne, ou bien <code>end = "\r"</code> ''({{lang|en|return}})'' si l'on veut revenir au début de la ligne pou repasser par-dessus ; * <code>sep = " "</code> : séparateur des différents objets. {{voir|https://docs.python.org/3/library/functions.html#print}} Si vous voulez passer un argument directement au script Python, vous pouvez utiliser le module <code>sys</code>. L'argument est alors contenu dans la variable <code>sys.argv[1]</code> ; la variable <code>sys.argv[0]</code> contient le nom du scirpt lui-même. Par exemple <syntaxhighlight lang="python"> import sys print("Script : ", sys.argv[0]) print("Entrée : ", sys.argv[1]) </syntaxhighlight> Si vous exécutez le script depuis une console (fenêtre de commande), le nom du fichier de script étant <code>monscript.py</code> : <syntaxhighlight lang="text"> $ python monscript.py blabla Script : monscript.py Entrée : blabla $_ </syntaxhighlight> == Types de variables == === Généralités === Python définit « tout seul » le type de la variable : « <code>3</code> » sera un entier ''({{lang|en|integer}})'', « <code>3.0</code> » sera un réel à virgule flottante ''({{lang|en|float}})'', « <code>"3"</code> » sera une chaîne de caractères ''({{lang|en|string}})''. On peut connaître le type d'une variable avec la fonction <code>type()</code>. On peut tester certaines valeurs, avec le module <code>NumPy</code> : * <code>np.isnan(x)</code> indique si les valeurs de ''x'' sont des NaN ''({{lang|en|not a number}})'' ; si ''x'' est une matrice, le résultat est une matrice de booléens, l'élément [''i'', ''j''] est <code>True</code> si <code>x[i, j]</code> est un NaN ; * <code>np.isinf(x)</code> indique si les valeurs de ''x'' sont ±∞ ; si ''x'' est une matrice, le résultat est une matrice booléenne de même dimension. On peut forcer un type : * <code>int(x)</code> : transforme la valeur ''x'' en nombre entier ; * <code>long(x)</code> : " en entier long (précision illimitée) ; * <code>float(x)</code> : " en nombre réel à virgule flottante ; * <code>str(x)</code> : " en chaîne de caractères ; * <code>complex(Re, Im)</code> : crée le nombre complexe ''Re'' + ''Im''·j, j désignant la racine carrée de –1 ; * <code>list()</code> : crée une liste ; * <code>tuple()</code> : crée un n-uplet. Par exemple <syntaxhighlight lang="python"> type(3) # <class 'int'> type(float(3)) # <class 'float'> complex(1, 1) == 1 + 1j # True list("blabla") # ['b', 'l', 'a', 'b', 'l', 'a'] </syntaxhighlight> Python distingue plusieurs genres de types : * Un itérable est un objet dont on peut extraire les éléments un par un ; ce sont les objets pour lesquels on peut écrire <code> for i in ''iterable'':</code>. Il s'agit essentiellement des listes, n-uplets, chaînes de caractères, ensembles, dictionnaires et fichiers. * Un modifiable ''({{lang|en|mutable}})'' est un objet que l'on peut modifier ; par exemple une liste est modifiable — on peut changer la valeur d'un élément, en ajouter ou en enlever un — mais les n-uplets non, pas plus qu'une chaîne de caractères ou un nombre. * Un identifiable (''{{lang|en|hashable}}'', le ''{{lang|en|hashage}}'' étant une signature caractéristique d'un objet) : objet possédant un identifiant unique. Un objet identifiable est toujours non-modifiable ''({{lang|en|unmutable}})''. === Types numériques === ==== Entiers ==== Nous pouvons définir les entiers au format octal ou hexadécimal : il faut débuter le nombre par respectivement <code>0o</code> (le chiffre zéro et la lettre o) et <code>0x</code> (le chiffre zéro et la lettre x). À l'inverse, la fonction <code>hex()</code> renvoie une chaîne correspondant à l'écriture d'un entier au format hexadécimal, et <code>oct()</code> renvoie la chaîne correspondant à l'éciture en octal. Par exemple : <syntaxhighlight lang="python"> print(0o10, ";", 0x10) # 8 ; 16 print(hex(20)) # 0x14 </syntaxhighlight> ==== Réels ==== Les réels disposent de fonctions spécifiques appelées « méthodes ». Une méthode est une fonction spécifique à un type d'objets. Étant conçue ''ad hoc'', elle est souvent plus économe en ressource et en temps qu'une fonction générique. Pour appliquer la méthode <code>meth()</code> à la variable <code>x</code>, on écrit : <code>x.meth()</code>. Nous avons déjà présenté la méthode <code>''float''.as_integer_ratio()</code> qui donne la fraction réduite égale à la valeur du nombre. Les réels disposent de plusieurs autres méthodes : * <code>''float''.is_integer()</code> : indique si le nombre est un entier (<code>true</code> dans ce cas-là, <code>False</code> sinon) ; * <code>''float''.from_number(''x'')</code> : transforme le nombre ''x'' en un réel (permet de convertir un entier en réel) ; * <code>''float''.hex()</code> : renvoie une chaîne de caractères correspondant à l'écriture du nombre en hexadécimal ; * <code>''float''.fromhex(''c'')</code> : transforme une chaîne de caractères, correspondant à l'écriture d'un nombre en hexadécimal, en un nombre réel correspondant. Par exemple : <syntaxhighlight lang="python"> a = 20. print(a.hex()) # 0x1.4000000000000p+4 print(10..hex()) # 0x1.4000000000000p+3 </syntaxhighlight> Dans le deuxième exemple, nous appliquons la méthode <code>''float''.hex()</code> directement au nombre <code>10.</code> ; le point est obligatoire car sinon, c'est un entier, pour lequel la méthode n'est pas définie. On aurait pu aussi écrire <code>print(10.0.hex())</code>. Notez que la ''méthode'' <code>''float''.hex()</code> est différentes de la ''fonction'' <code>hex()</code> : la première concerne les réels, la seconde les entiers. ==== Complexes ==== Nous avons déjà mentionné la méthode <code>''complex''.conjugate()</code> qui donne le conjugué du nombre. Un nombre complexe dispose de deux attributs : * <code>''complex''.real</code> : sa partie réelle ; * <code> ''complex''.imag</code> : sa partie imaginaire. Par exemple : <syntaxhighlight lang = "python"> a = 5+2j print(a.conjugate(), ";", a.real, ";", a.imag) # (5-2j) ; 5.0 ; 2.0 </syntaxhighlight> === Chaînes de caractères === ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/inputoutput.html | titre = 7. Input and Output | site = Python Documentation | consulté le = 2019-04-06 }} : {{lien web | url = https://docs.python.org/3/library/string.html | titre = <code>string</code> — Common string operations | site = Python Documentation | consulté le = 2026-06-05 }} ==== Généralités ==== Il existe en fait trois manières de définir une chaîne de caractères : * avec des guillemets simples ou doubles comme vu précédemment : <code>"…"</code> ou bien <code>'…'</code> ; * avec trois guillemets doubles : <code>"""…"""</code> : cela permet d'avoir une chaîne de caractères s'étendant sur plusieurs lignes, les retours de ligne étant pris en compte ; c'est utilisé en particulier pour la description des fonctions (''{{lang|en|docstrings}}'', voir ci-après) ; * avec des guillemets précédés d'un « r », <code>r"…"</code> ou <code>r'…'</code> : cela permet d'interpréter les barres de fraction inverses « \ » comme un caractère « normal » et non comme un caractère d'échappement (voir ci-après) ; cela est utile lorsque l'on utilise les possibilités LaTeX dans le tracé de graphiques (voir plus loin) ; * avec des guillemets précédés d'un « f », <code>f"…"</code> ou <code>f'…'</code> : cela permet d'utiliser des variables formatées (voir ci-après). Une chaîne de caractères n'est pas modifiable. Si l'on veut remplacer un caractère, l'insérer ou le supprimer, il faut transformer la chaîne en liste, avec la commande <code>list()</code>, puis rassembler la liste en la joignant ''({{lang|en|join}})'' à une chaîne vide : <syntaxhighlight lang="python"> chaine = "blabla" chaineList = list(chaine) chaineList[2] = "c" chaine = "".join(chaineList) print(chaine) # blcbla </syntaxhighlight> Dans une chaîne simple <code>"…"</code> ou <code>'…'</code>, on peut introduire un retour à la ligne avec <code>\n</code>. Chaque caractère possède un code ''({{lang|en|code point}})'' définit par la norme Unicode ''({{lang|en|Unicode code point}})''. Pour afficher le caractère correspondant à un code, on utilise <code>chr()</code>. Pour afficher le code correspondant à un caractère, on utilise <code>ord()</code> <syntaxhighlight lang="python"> print(ord("a")) # 97 print(hex(ord("a"))) # 0x61 print(chr(97)) # a print(chr(0x61)) # a </syntaxhighlight> ==== Substitution de variables ==== Lorsque l'on veut utiliser des variables, on fait précéder les guillemets d'un « f » et l'on écrit les noms de vrariables entre accolades. Par exemple : <syntaxhighlight lang="python"> monde = "world" chaine = f"Hello {monde}!" print(chaine) # Hello world! </syntaxhighlight> On peut indiquer la taille de la chaîne générée à partir de la variable sous la forme <code>{nomVariable:taille}</code>, la taille étant un entier. Par exemple : <syntaxhighlight lang="python"> chiffre1 = 1 nom1 = "un" chiffre2 = 2 nom2 = "deux" chaine = f"{nom1:5} : {chiffre1:5d}\n{nom2:5} : {chiffre2:5d}" print(chaine) # un : 1 # deux : 2 </syntaxhighlight> Vous remarquez que l'on ajoute un « d » pour les entiers décimaux, et que les nombres sont alignés à droite. Si le nombre est un nombre réal à virgule flottante ''({{lang|en|float}})'', on peut indiquer le nombre de décimales sous la forme <code>.''n''f</code> : <syntaxhighlight lang="python"> chaine = f"{np.pi:.5f}" print(chaine) # 3.15169 </syntaxhighlight> Avec la syntaxe <code>''m''.''n''f</code>, on indique également que la totalité du nombre doit occuper ''m'' caractères. Pour un nombre en notaiton scientifique (exponentielle), on utilise <code>.''n''e</code>. Pour convertir un nombre en caractère Unicode correspondant, on utilise la lettre c : <syntaxhighlight lang="python"> nompi = 0x03c0 # Caractère Unicode π : U+03C0 chaine = f"{nompi:c} = {np.pi:.5f}" print(chaine) # π = 3.14159 </syntaxhighlight> La classe ''str'' dispose également de la méthode <code>.format()</code>. On indique un n-uplet de chaînes (ou de nombres) à la méthode et l'on met des accolades dans la chaîne principale ; les accolades sont remplacées dans l'ordre des chaînes de la méthode. On peut changer l'ordre en indiquant quelle valeur utiliser dans quelle accolade. Par exemple : <syntaxhighlight lang="python"> chaine1 = "On compte {} puis {}".format(1, 2) chaine2 = "On compte {0} puis {1}. Mais à rebours, on compte {1} puis {0}.".format("un", "deux") print(chaine1, "\n", chaine2) # On compte 1 puis 2 # On compte un puis deux. Mais à rebours, on compte deux puis un. </syntaxhighlight> L'utilisation du caractère pourcent « % » permet d'utiliser la mise en forme <code>sprintf()</code> du langage C : <syntaxhighlight lang="python"> chaine = "π = %.5f" % np.pi print(chaine) # π = 3.14159 </syntaxhighlight> ; Exemple <nowiki>:</nowikI> barre de progression : Voici une fonction affichant une barre de progression, pour la ''i''-ème étape d'un processus ayant ''n'' étapes (pour la notion de fonction, voir la section ci-après ''[[#Fonction|Fonction]]''). : NB : nous avons utilisé les codes Unicode pour l'exemple, mais on peut évidemment copier le caractère, par exemple depuis une table Unicode ou une page Web<ref>Pour le point médian : ''{{W|Table des caractères Unicode/U0080}}'' ou ''{{W|Point médian}}''. Pour le pavé : ''{{W|Table des caractères Unicode/U2580}}''.</ref>, et le coller dans le code, comme nous l'avons fait dans le commentaire. <syntaxhighlight lang="Python"> def barre_progression(i, n, largeur=40): """ Affiche une barre de progression Entrées : — i : étape en cours, entier ; — n : nombre d'étapes à réaliser, entier ; — largeur : nombre de caractères total de la barre, entier. Sortie : affichage de la barre de progression. """ taux = i/n fait = int(largeur * taux) barre = f"{0x2588:c}" * fait + f"{0x00b7:c}" * (largeur - fait) # U+2588 : pavé "█" ; U+00B7 : point médian "·" print(f"Progression | {barre} | {100*taux:3.1f} %", end="\r") barre_progression(25, 100) # Progression | ██████████······························ | 25.0 % </syntaxhighlight> ==== Méthodes des chaînes ==== Le type ''str'' dispose d'un certain nombre de méthodes. Nous avons déjà vu les méthodes <code>''str''.join()</code> et <code>''str''.format()</code>, en voici quelques autres : * <code>''str''.capitalize()</code> : met le premier caractère en capitale (majuscule) et les autres en minuscule ; * <code>''str''.lower()</code> : met tout en minuscules ''({{lang|en|lowercase}})'' ; * <code>''str''.upper()</code> : met tout en capitales ''({{lang|en|lowercase}})'' ; * <code>''str''.center(''n'')</code> : met la chaîne au centre d'une chaîne de longueur ''n'', en complétant avec des espaces ; on peut compléter avec d'autres caractères avec <code>''str''.center(''n'', ''c'')</code>, par exemple <code>"a".center(7, ".")</code> donne <code>"....a...."</code> ; * <code>''str''.ljust(''n'', ''c'')</code> et <code>''str''.rjust(''n'', ''c'')</code> : comme <code>.center()</code> mais la chaîne est respectivement alignée au fer à gauche ''({{lang|en|left}})'' et à droite ''({{lang|en|right}})'' ; * <code>''str''.isdigit()</code> : booléen vrai si tous les caractères sont des nombres ; * <code>''str''.find(''sous-chaine'')</code>, <code>''str''.rfind(''sous-chaine'')</code> : indique respectivement le premier emplacement et le dernier emplacement de la sous-chaîne dans la chaîne, ou bien <code>-1</code> si la sous-chaîne est absente ; * <code>''str''.partition(''séparateur'')</code> : retourne un triplet avec la portion de chaîne avant le séparateur, le séparateur puis la portion de chaîne après le séparateur ; * <code>''str''.replace(''ancien'', ''nouveau'')</code> : remplace la chaîne ''ancien'' par la chaîne ''nouveau'' dans la chaîne ; * <code>''str''.split(''séparateur'')</code> : découpe la chaîne au niveau des séparateurs et renvoie une liste. ==== Autres fonctions ==== La fonction <code>chr()</code> transforme un code Unicode en caractère. Par exemple, <code>chr(97)</code> donne <code>"a"</code> et <code>chr(0x03c0)</code> donne <code>"π"</code>. Si on veut créer une liste de caractères qui se suivent, on peut par exemple utiliser : <syntaxhighlight lang="python"> [chr(x) for x in range(97, 102)] # ['a', 'b', 'c', 'd', 'e'] </syntaxhighlight> Si on veut créer une liste de nombres sous la forme de chaînes de caractères, on peut utiliser la commande <code>str()</code> vue ci-dessus. Par exemple : <syntaxhighlight lang="python"> [str(x) for x in range(1, 6)] # ['1', '2', '3', '4', '5'] </syntaxhighlight> Pour la syntaxe, voir ci-dessous la section [[#Définition en compréhension|''Définition en compréhension'']]. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = chr(0x2588) * fait + chr(0x00b7) * (largeur - fait) # U+2588 : bloc ; U+00B7 : point médian </syntaxhighlight> Rappel : le module <code>html</code> permet d'utiliser les entités HTML : <syntaxhighlight lang="python"> import html … print(html.entities.html5["alpha;"]+html.entities.html5["middot;"]) # α· </syntaxhighlight> L'entité HTML <code>&xxx;</code> s'obtient par <code>html.entities.html5["xxx;"]</code>, donc en enlevant la perluète ; mais cela ne fonctionne pas avec les codes Unicode. Pour cela, on peut utiliser la commande <code>html.unescape()</code>. Ainsi, dans l'exemple de la barre de progression ci-dessus, on peut utiliser la solution suivante pour constituer la barre : <syntaxhighlight lang="python"> barre = html.unescape("&#x2588;") * fait + html.entities.html5["middot;"] * (largeur - fait) # U+2588 : bloc ; middot : point médian </syntaxhighlight> ou bien <syntaxhighlight lang="python"> barre = barre = html.unescape("&#x2588;" * fait + "&middot;" * (largeur - fait)) # U+2588 : bloc ; middot : point médian </syntaxhighlight> La commande <code>html.unescape()</code> interprète donc une chaîne complète, par exemple <syntaxhighlight lang="python"> print(html.unescape("L'esperluette est le caractère &laquo;&nbsp;&amp;&nbsp;&raquo;.")) # L'esperluette est le caractère « & ». </syntaxhighlight> == Manipulation de listes == Les listes sont une structure de données fondamentale en Python. ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/datastructures.html | langue = en | titre = 5. Data structures | site = Python documentation | consulté le = 2019-03-16 }} === Copie d'une liste === Contrairement à d'autres types, lorsque vos écrivez <code>b = a</code> avec des listes, vous ne créez pas une copie de la variable <code>a</code>, vous créez un ''alias'' : l'objet <code>b</code> est un autre nom de l'objet <code>a</code>. En particulier, si vous modifiez <code>b</code>, vous modifiez en fait <code>a</code>. Par exemple : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a b[2] = 5 print(a, b) # [1, 2, 5, 4] [1, 2, 5, 4] </syntaxhighlight> Si l'on veut créer une copie de <code>a</code>, il faut utiliser <code>a[:]</code> ou bien <code>a.copy()</code> : <syntaxhighlight lang="python"> a = [1, 2, 3, 4] b = a[:] c = a.copy() b[2] = 5 c[2] = 6 print(a, b, c) # [1, 2, 3, 4] [1, 2, 5, 4] [1, 2, 6, 4] </syntaxhighlight> === Méthodes de listes === Pour modifier une liste, vous disposez des méthodes suivantes : * <code>a.append(x)</code> : ajoute l'élément <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.extend(x)</code> : ajoute la liste <code>x</code> à la fin de la liste <code>a</code> ; * <code>a.append(i, x)</code> : aoute l'élément <code>x</code> ''avant'' l'interstice ''i'' de la liste <code>a</code> ; * <code> x = a.pop(i)</code> : enlève l'élément ''i'' de la liste <code>a</code> et le met dans la variable <code>x</code> ; <code> x = a.pop()</code> enlève le dernier élément de la liste ; * <code>a.clear()</code> : vide la liste <code>a</code> ; * <code>a.sort()</code> : trie la liste par ordre croissant ; * <code>a.sort(reverse = True)</code> : trie par ordre décroissant ; * <code>a.reverse()</code> : inverse l'ordre de <code>a</code>. Pour supprimer l'élément à l'indice ''i'', au lieu d'utiliser <code>a.pop(i)</code>, on peut aussi utiliser <syntaxhighlight lang="python"> del(a[i]) </syntaxhighlight> Pour trier une liste, on peut aussi utiliser la fonction <code>sorted()</code>, ce qui permet par exemple de conserver la liste originale, non triée : <code>b = sorted(a)</code>. La fonction <code>sorted()</code> fonctionne avec tous les objets « itérables » comme par exemple une chaîne de caractères : <syntaxhighlight lang="python"> a = "ahjbfk" print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 'k'] </syntaxhighlight> Pour mettre en évidence la performance de la méthode <code>''list''.sort()</code> par rapport à la fonction générique <code>sorted()</code> : <syntaxhighlight lang="python"> import numpy as np import time a = np.random.rand(int(1e7)) t1 = time.perf_counter() b = sorted(a) # Fonction générique t2 = time.perf_counter() a.sort() # Méthode spécifique t3 = time.perf_counter() print("Sorted :", t2-t1, " s ; .sort :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # Sorted : 14.2... s ; .sort : 1.1... s ; rapport : 12.6... </syntaxhighlight> Par rapport à une valeur donnée : * <code>a.remove(x)</code> : retire la première occurrence de la valeur <code>x</code> de la liste <code>a</code> ; * <code>a.index(x)</code> : indique l'indice où se trouve la première occurrence de la valeur <code>x</code> ; * <code>a.count(x)</code> : indique le nombre de fois que l'on trouve la valeur <code>x</code> dans la liste <code>a</code>. === Définition en compréhension === La [[w:fr:Liste en compréhension|définition en compréhension]] ''({{lang|en|list comprehension}})'' est une méthode permettant de construire des listes en indiquant simplement des axiomes, des consignes de filtrage. Cette méthode est élégante car proche de la notation mathématique et compacte, mais c'est une méthode itérative donc lente par rapport à une méthode vectorisée fournie par le module NumPy. Par exemple, pour créer la liste des carrés des nombres entiers entre 0 et 9, il suffit d'écrire <syntaxhighlight lang="python"> carre = [x**2 for x in range(10)] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x^2 | x \in [0 ; 9] \}</math>. Si l'on veut la liste des nombres strictement inférieurs à 20 dont le carré est supérieur à 10, on peut écrire : <syntaxhighlight lang="python"> X = [x for x in range(20) if x**2 > 10] </syntaxhighlight> ce qui se rapproche de la notation d'ensemble <math>\{x | x \in [0 ; 19], x^2 > 10 \}</math>. Pour mettre en évidence la performance du calcul vectorisé par rapport à la méthode itérative : <syntaxhighlight lang="python"> import time import numpy as np n = int(1e7) # taille de la liste t1 = time.perf_counter() carre = [x**2 for x in range(n)] # Définition en compréhension t2 = time.perf_counter() carre2 = np.arange(n)**2 # Calcul vectorisé t3 = time.perf_counter() print("En compréhension : ", t2-t1, "s ; vectorisé :", t3-t2, "s ; rapport :", (t2-t1)/(t3-t2)) # En compréhension : 4.515... s ; vectorisé : 0.156... s ; rapport : 28.982... </syntaxhighlight> == Structure d'un programme == Un programme est simplement une suite d'instructions. Dans les environnements Unix BSD, un programme Python peut être considéré comme un script c'est-à-dire qu'il suffit de taper son nom dans l'invite de commande ''({{lang|en|shell}})'' sans avoir à invoquer <code>python</code>. Le programme doit alors commencer par un en-tête normalisé surnommé ''{{lang|en|[[wikt:shebang|shebang]]}}'' : <syntaxhighlight lang="python"> #!/usr/bin/env python3 </syntaxhighlight> Ce ''{{lang|en|shebang}}'' est inutile avec Jupyter. L'en-tête peut également contenir la description de l'encodage du fichier texte, typiquement : <syntaxhighlight lang="python"> # coding: utf-8 </syntaxhighlight> Le codage UTF-8 est le codage par défaut pour Python 3, il est donc inutile de l'indiquer. Les commentaires sont introduits par le croisillon <code>#</code>. On peut grouper une suite d'instructions dans un bloc. Un bloc d'instructions commence par deux-points « <code>:</code> » et est identé, c'est-à-dire qu'il a une marge constituée de quatre espaces — on peut aussi utiliser une tabulation mais il ne faut pas mélanger les deux méthodes ; les tabulations sont déconseillées, il vaut mieux utiliser quatre espaces<ref>{{lien web | url = https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces | titre = Tabs or Spaces? | site = Python documentation | consulté le = 2019-03-14 }}</ref>. Pour terminer le bloc, il suffit simplement de revenir en début de ligne ; contrairement à d'autres langages, il n'y a pas de commende de fin ''({{lang|en|end}})'', c'est l'indentation qui définit le bloc. : # début du bloc ''instruction 1'' ''instruction 2'' … ''dernière instruction du bloc'' ''instruction hors bloc'' Par exemple, une exécution conditionnelle <code>if</code> ou une boucle <code>for</code> exécute un bloc d'instruction. Si l'on a besoin d'un bloc d'instruction qui « ne fait rien », on utilise l'instruction <code>pass</code>. == Structures de contrôle == '''Boucle itérative''' La boucle itérative s'écrit : <syntaxhighlight lang="python"> for <variable> in <itérable>: <bloc d’instructions> </syntaxhighlight> Si l'on veut que la variable prenne ''n'' valeurs de 0 à ''n'' – 1, on utilise l'instruction <code>range()</code> : <syntaxhighlight lang="python"> for i in range(5): print(i) print("Fin de la boucle") </syntaxhighlight> <code>[▶]</code> 0 1 2 3 4 Fin de la boucle En fait, la commande <code>range()</code> extrait des valeurs de l'ensemble des nombres entiers ; on peut ainsi utiliser le découpage en tranches, par exemple <code>range(2, 5)</code>pour avoir la « liste » <code>[2, 3, 4]</code>. Notez que <code>range()</code> ne crée pas à proprement parler une liste, cela crée un objet de type ''« {{lang|en|range}} »'' (plage, intervalle) ; pour avoir une liste, il faut écrire <code>list(range(n))</code>. Dans une boucle, la commande <code>continue()</code> saute la fin du bloc d'instruction et passe à la valeur suivante de la boucle. La commande <code>break()</code> interrompt la boucle et passe à la suite. '''Exécution conditionnelle''' L'exécution conditionnelle s'écrit : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> </syntaxhighlight> On peut utiliser les commandes <code>elif</code> ''(else if'') et <code>else</code> : <syntaxhighlight lang="python"> if <booléen>: <bloc d’instructions> elif <booléen>: <bloc d’instructions> else: <bloc d’instructions> </syntaxhighlight> Notez que le test d'une condition est gourmand en ressources. S'il s'agit de savoir si l'on effectue une opération mathématique simple ou pas, on peut remplacer le test par une multiplication par un booléen (<code>True</code> vaut 1, <code>False</code> vaut 0). Par exemple, plutôt que d'écrire <syntaxhighlight lang="python"> if a > 0: b = b - c </syntaxhighlight> mieux vaut écrire : <syntaxhighlight lang="python"> b = b - (a > 0)*c </syntaxhighlight> '''Boucle antéconditionnée''' La boucle antéconditionnée s'écrit : <syntaxhighlight lang="python"> while <booléen>: <bloc d’instructions> </syntaxhighlight> Cette boucle peut contenir des instructions <code>continue()</code> et <code>break()</code>. == Fonction == La déclaration d'une fonction utilise la commande <code>def</code>. La fonction est un bloc d'instructions. Si elle doit renvoyer des valeurs, on utilise la commande <code>return</code>. Par exemple <syntaxhighlight lang="python"> def nombres(n): """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo a = nombres(3) print(a) </syntaxhighlight> La fonction commence par une chaîne de caractères qui la décrit. Cette chaîne peut être récupérée automatiquement par certains logiciels pour faire une documentation automatique. Si la description prend plusieurs lignes, elle commence et finit par trois double-guillemets <code>"""…"""</code> ; en fait, par convention, même si cela n'est pas obligatoire, les descriptions sont toutes encadrées de trois double-guillemets. Cette description est appelée ''{{lang|en|docstring (documentation string)}}''. Pour récupérer les ''{{lang|en|docstrings}}'' : <syntaxhighlight lang="python"> def foo(): """Cette fonction ne fait rien""" pass print(foo.__doc__) # Cette fonction ne fait rien </syntaxhighlight> L'instruction <code>input()</code> permet à l'utilisateur de saisir une valeur. La valeur est retournée sous la forme d'une chaîne de caractères qui est ensuite convertie en nombre réel avec l'instruction <code>float()</code>. On peut définir une valeur par défaut en l'indiquant dans l'en-tête de la définition de la fonction, de la manière suivante : <syntaxhighlight lang="python"> def nombres(n=1): # valeur par défaut : 1 """But : Entrer plusieurs nombres Entrée : n, entier : quantité de nombre à saisir. Sortie : foo : liste de n réels. """ # description de la fonction foo = [] # initialisation for i in range(n): foo = foo+[float(input("Entrez un nombre"))] return foo </syntaxhighlight> Si le paramètre à initialiser est de type modifiable ''({{lang|en|mutable}})'', comme par exemple une liste, il faut procéder comme suit : <syntaxhighlight lang="python"> def fooFonction(fooListe=None): # valeur par défaut : n'existe pas """Description""" if fooListe = None: fooListe = [] # initialisation <suite des instructions> </syntaxhighlight> Par défaut, les variables sont locales. On peut rendre une variable globale avec l'instruction <code>global</code> ''à l'intérieur de la fonction'', avant l'utilisation de la variable. Par exemple : <syntaxhighlight lang="python"> a = 1 b = 1 def toto(): """Test de variable globale. Entrée : aucune. Sortie : aucune.""" global a a = 2 b = 2 toto() print("a =", a, "; b =", b) # a = 2 ; b = 1 </syntaxhighlight> Pour être plus précis : si une variable n'est pas assignée dans une fonction, alors Python va chercher une variable du même nom à l'extérieur de la fonction. Mais à partir du moment où la variable est assignée dans la fonction, elle devient locale ''sauf'' si l'on a utilisé l'instruction <code>global</code>. Si l'on s'attend à un nombre indéfini d'arguments, on utilise la notion d'empaquetage/dépaquetage ''({{lang|en|packing/unpacking}})''<ref>{{lien web | url = https://deusyss.developpez.com/tutoriels/Python/args_kwargs/ | titre = Introduction à *args et **kwargs | consulté le = 2019-03-09 | site = Developpez.com }}.</ref>. L'empaquetage consiste à mettre les arguments dans un n-uplet, le dépaquetage consiste à développer un n-uplet en plusieurs variables. Cela se fait en mettant un astérisque ''({{lang|en|splat}})'' « <code>*</code> » devant le nom de la variable. Par convention, on utilise le nom de variable <code>*args</code> mais cela n'est pas obligatoire. <syntaxhighlight lang="python"> def concatenation(*args): """Concatène des chaînes de caractères Entrée : *args, n-uplet de chaînes de caractères. Sortie : resultat, chaîne de caractères.""" resultat = "" for i in args: resultat = resultat + i return resultat concatenation("a", "foo", "toto") # 'afoototo' </syntaxhighlight> À l'inverse, si une fonction doit recevoir plusieurs paramètres, on peut à la place lui transmettre une liste à dépaqueter : <syntaxhighlight lang="python"> def addition(a, b): """Ajoute deux nombres Entrées : — a : réel ; — b : réel. Sortie : a+b, réel""" return a+b arg = (1, 2) addition(*arg) # 3 </syntaxhighlight> On peut aussi empaqueter/dépaqueter un dictionnaire, on utilise pour cela deux astérisques « <code>**</code> ». Par convention, on utilise le nom <code>**kwargs</code> sans que cela soit obligatoire. L'instruction <code>lambda</code> permet de créer de petites fonctions ne contenant pas de boucle ni de branchement conditionnel. Cependant, si la déclaration est courte et compacte, le code n'est pas toujours facilement lisible ; l'utilisation de cette instruction n'est pas recommandée. Par exemple l'expression <syntaxhighlight lang="python"> f = lambda x: 2*x </syntaxhighlight> est la même chose que <syntaxhighlight lang="python"> def f(x): """Calcule le double. Entrée : x, réel. Sortie : 2*x, réel.""" return 2*x </syntaxhighlight> {{note|L'instruction <code>eval()</code> exécute une chaîne de caractères, c'est-à-dire traite une chaîne de caractères comme si c'étaient des instructions données à Python. Cette instruction est à éviter pour deux raisons : # Un utilisateur malveillant pourrait entrer du code malveillant dans la chaîne de caractères. # L'exécution est lente puisque Python doit compiler la chaîne à la volée. Cette instruction peut en général être remplacée par une autre instruction. }} == Gestion des erreurs == Dans un bloc d'instructions, on peut utiliser la structure <code>try:… except:</code>. Le bloc après <code>try</code> est exécuté ; si une erreur se déclare dans ce bloc, alors le bloc <code>except</code> s'exécute. Par exemple <syntaxhighlight lang="python"> try: 1/0 # Génère une erreur except: print("Division par zéro") # Cette instruction est donc exécutée </syntaxhighlight> On peut compléter avec <code>else:</code> et <code>finally:</code> : <syntaxhighlight lang="python"> try: <code à exécuter> except: <s’exécute en cas d’erreur> else: <s’exécute s’il n’y a pas d’erreur> finally: <s’exécute dans tous les cas> </syntaxhighlight> On peut séparer les différents types d'erreur : <syntaxhighlight lang="python"> try: <code à exécuter> except ValueError: print("Valeur erronée") except TypeError: print("Type erroné") </syntaxhighlight> Les types d'erreur les plus courants sont : * <code>NameError</code> : le nom de variable n'existe pas ; * <code>TypeError</code> : la valeur n'est pas du bon type ; * <code>ValueError</code> : la valeur n'est pas compatible avec ce qui est attendu ; * <code>RuntimeError</code> : type d'erreur général. On peut aussi créer ses propres erreurs : si une situation erronée survient, on peut « lever » une exception avec <code>raise</code>. Par exemple <syntaxhighlight lang="python"> if a < 0: raise ValueError("La valeur doit être positive") </syntaxhighlight> ; Ressources * {{lien web | url = https://docs.python.org/3/tutorial/errors.html | titre = Errors and exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} * {{lien web | url = https://docs.python.org/3/library/exceptions.html | titre = Built-in Exceptions | lang = en | site = Python documentation | consulté le = 2019-03-12 }} == Exercices == === Calcul du PGCD et du PPCM par l'algorithme d'Euclide === {{loupe|w:Algorithme d'Euclide}} Écrire un programme Python qui demande deux nombres entiers et affiche leurs PGCD et PPCM. Le programme utilisera l'algorithme d'Euclide. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """Programme : euclide.py Auteur : User:cdang date : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : calcule le PGCD et le PPCM de deux nombres entiers. Entrée ------ au clavier, saisie de deux nombres entiers. Sorties ------- à l'écran, affichage du PGCD et du PPCM. """ # *************** # *************** # ** Fonctions ** # *************** # *************** def euclide(): """Calcule le PGCD et le PPCM avec l'algorithme d'Elclide Entrée ------ Aucune, la saisie des paramètres fait partie de la fonction Sortie ------ affichage du PGCD et du PPCM """ print("***** Algorithme d'Euclide *****\n") a0 = int(input("Premier nombre entier : a = ")) b0 = int(input("Second nombre entier : b = ")) a = a0 b = b0 r = a%b # initialisation while (r != 0) : # algorithme d'Euclide a = b b = r r = a%b # affichage des résultats print("PGCD(", a0, ", ", b0, ") = ", b) print("PPCM(", a0, ", ", b0, ") = ", a0*b0//b) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* euclide() </syntaxhighlight> On peut simplifier la boucle centrale : <syntaxhighlight lang="python"> while b: # s'exécute tant que b n'est pas 0 a, b = b, a % b # affectation de liste à liste return a </syntaxhighlight> {{boîte déroulante fin}} Notez que le module NumPy propose l'instruction <code>gcd()</code> : <syntaxhighlight lang="python"> import numpy … print(numpy.gcd(a, b)) </syntaxhighlight> === Tours de Hanoï === {{loupe|w:Tours de Hanoï}} Écrire un programme Python qui demande le nombre ''n'' de plateaux et affiche les manipulations nécessaires pour déplacer la pile d'un emplacement à un autre. Le programme utilisera l'algorithme récursif. {{boîte déroulante début|solution}} <syntaxhighlight lang="python"> """nom : hanoi.py auteur : User:cdang date de création : 2019-02-19 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : aucun ---------------------------------------------------------------------------- Objectif : résout le problème des tours de Hanoï Entrées ------- trois chaînes de caractères (nom des piliers) Sorties ------- une chaîne de caractères (liste des opérations) """ # *************** # *************** # ** Fonctions ** # *************** # *************** def hanoi(a, b, c, n): """Résout le problème des tours de Hanoï de manière récursive But : déplace la pile de n disques du piler a au pilier b Entrées ------- a, b c : chaînes de 1 caractère, référence des emplacements ; n : entier, nombre de disques sur l'emplacement a Sorties ------- operations : chaînes de caractères décrivant les opérations """" if n>1: operations = hanoi(a, c, b, n-1) operations = operations+a+"→"+b+" ; " operations = operations+hanoi(c, b, a, n-1) else: operations = a+"→"+b+" ; " return operations # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* resultat = hanoi("1", "2", "3", 3) print(resultat) </syntaxhighlight> {{boîte déroulante fin}} === Lancer de rayons === [[Fichier:Lentille hemispherique perspective.svg|vignette|Lentille hémisphérique.]] Considérons une lentille hémisphérique de rayon R faite d’un verre d’indice de réfraction ''n''. Nous plaçons une source ponctuelle à une distance ''d'' du dioptre plan, sur l’axe optique. Tracer des rayons partant de la source et traversant la lentille. {{clear}} {{Boîte déroulante/début |titre=Analyse d’optique géométrique}} [[Fichier:Lentille hemispherique analyse geometrique.svg|vignette|Analyse géométrique du problème.]] Il s’agit d’un problème ayant une symétrie de révolution par rapport à l’axe optique. Nous pouvons nous réduire à un problème plan en nous plaçant dans un plan contenant l’axe optique ; l’axe optique est encore un axe de symétrie orthogonale, nous pouvons donc nous contenter d'étudier un demi-plan. Pour simplifier, nous plaçons le centre du dioptre sphérique à l’origine O du repère. L’axe optique est l’axe ''x'' et l'axe perpendiculaire, vertical sur la figure, c’est l’axe ''y''. Les coordonnées de la source sont donc (-''d'' ; 0). Le rayon issu de la source et faisant un angle θ avec l’axe ''x'' frappe le dioptre plan à l’altitude ''h''. Nous avons : : ''h'' = ''d'' ⋅ tan θ. L’angle d’incidence vaut θ. D’après la loi de Snell-Descartes, l'angle de réfraction θ<sub>2</sub> vaut : : θ<sub>2</sub> = arcsin((sin θ) / ''n''). Le rayon réfracté passe par le points de coordonnées (0, ''h''). L’équation de la droite est donc : : ''y'' = a ⋅ ''x'' + ''h'' avec : ''a'' = tan θ<sub>2</sub>. L’équation du cercle de centre O et de rayon R est : : ''x''<sup>2</sup> + ''y''<sup>2</sup> = R<sup>2</sup>. Les coordonnées (''x''<sub>M</sub>, ''y''<sub>M</sub>) de l’intersection M du rayon avec le dioptre sphérique vérifient les deux équations. Par substitution, nous obtenons une équation du second degré en ''x'' que nous savons résoudre : : ''x''<sub>M</sub><sup>2</sup> + (''a'' ⋅ ''x''<sub>M</sub> + ''h'')<sup>2</sup> = R<sup>2</sup> : ⇔ (1 + ''a''<sup>2</sup>) ⋅ ''x''<sub>M</sub><sup>2</sup> + 2 ⋅ ''a'' ⋅ ''h'' ⋅ ''x''<sub>M</sub> + ''h''<sup>2</sup> – R<sup>2</sup> = 0. D’après les propriétés du cercle, le rayon est perpendiculaire à la tangente. Le rayon [OM] est donc normal au dioptre en M. Nous pouvons déterminer l’angle d’incidence θ<sub>i</sub> par le produit scalaire : : <math>\begin{pmatrix} 1 \\ a \end{pmatrix} \cdot \begin{pmatrix} x_\mathrm{M} \\ y_\mathrm{M} \end{pmatrix} = \sqrt{1^2 + a^2} \cdot \mathrm{R} \cdot \cos(\theta_\mathrm{i})</math> ce qui nous permet de calculer cet angle : : <math>\theta_\mathrm{i} = \operatorname{arcos} \left ( \frac{x_\mathrm{M} + a \cdot y_\mathrm{M}}{\mathrm{R} \cdot \sqrt{1^2 + a^2} } \right )</math> Comme nous passons vers un milieu d’indice plus faible, il y a un risque de réflexion totale. L’angle limite est : : θ<sub>max</sub> = arcsin(1/''n''). Si l’on a θ<sub>i</sub> &gt; θ<sub>max</sub>, le rayon repart vers l’intérieur. Nous ne traçons pas le rayon car cela nous emmènerait trop loin dans l’analyse. En revanche, si θ<sub>i</sub> ≤ θ<sub>max</sub>, alors nous pouvons appliquer la loi de Snell-Descartes pour avoir l’angle de réfraction θ<sub>e</sub> : : θ<sub>e</sub> = arcsin(''n'' ⋅ sin θ<sub>i</sub>). Pour tracer le rayon sortant, il nous faut l’angle θ<sub>3</sub> par rapport à l’horizontale. L’angle du rayon [OM] par rapport à l’horizontal vaut arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>), nous avons donc : θ<sub>3</sub> = arctan(''y''<sub>M</sub> / ''x''<sub>M</sub>) + θ<sub>e</sub>. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Analyse algorithmique}} '''Structure des données''' Le problème est décrit par trois paramètres : # Le rayon <code>R1</code> de la lentille, en milliètres (réel en virgule flottante). # L’indice du verre, <code>n</code> sans dimension (réel en virgule flottante). L’indice de l’air vaut 1. # La distance de la source au dioptre d’entrée plan, <code>d</code> en millimètres (réel en virgule flottante). Un rayon est caractérisé par quatre paramètres : # L’angle d’émission <code>theta1</code> en radians (réel en virgule flottante). # L’angle de réfraction dans la lentille <code>theta2</code> en radians (réel en virgule flottante). # Les cordonnées <code>M</code> en millimètre (vecteur de dimension 2 <code>([x, y])</code> de réels en virgule flottante) du point d’intersection du rayon avec le dioptre sphérique. # L’angle de réfraction dans l’air après la lentille <code>theta3</code> en radians (réel en virgule flottante). Pour le calcul et le tracé, nous avons besoin des paramètres intermédiaires suivants : * l’altitude ''y'' = <code>h</code> en millimètres (réel en virgule flottante) à laquelle le rayon frappe le dioptre plan d’entrée ; * l’angle d’incidence du rayon avec le dioptre sphérique <code>thetaint</code> en radians (réel en virgule flottante). Les angles sont stockés en radians car c’est l’unité naturelle pour le calcul mais nous affichons les valeurs en degrés. Comme le calcul de conversion est récurrent, nous conservons les facteurs <code>degversrad</code> (conversion des degrés vers les radians, facteur valant π/180, réel en virgule flottante) et <code>radversdeg</code> (conversion des radians vers les degrés, facteur valant 180/π, réel en virgule flottante). '''Fonctions''' Nous avons besoin d’une fonction qui calcule les trois paramètres du rayon <code>(theta2, M, theta3)</code> à partir de l’angle d’émission <code>theta1</code>. Nous appelons cette fonction <code>lanceRayon()</code>. Cette fonction fait appelle à une fonction qui calcule l’angle du rayon réfracté à partir de l’angle du rayon incident <code>theta1</code>, les deux angles étant par rapport à la normale au dioptre au point considéré. Nous appelons cette fonction <code>refrac()</code>. La recherche de l’intersection <code>M</code> du rayon avec le dioptre sphérique nécessite de résoudre une équation du second degré. Nous utilisons pour cela la recherche des racines du polynôme en <code>x</code> avec la fonction <code lang="python">numpy.polynomial.polynomial.polyroots()</code>. D’après la configuration du problème géométrique, si l’on s’assure que le rayon frappe bien la lentille (0 ≤ <code>h</code> ≤ <code>R1</code>) alors nous sommes sûrs que le problème a deux solutions réelles (une positive et une négative) ou, dans le cas dégénéré où <code>h == R1</code>, une valeur unique <code>x == 0</code>. Comme nous recherchons la valeur positive, nous sélectionons la plus grande des deux racines. Pour la gestion de la réflexion interne : dans la fonction <code>refrac()</code>, nous vérifions les conditions de réflexion totale et si elles sont remplies, alors nous générons une erreur (commandes <code lang="python">try… except</code> et <code lang="python">raise ValueError</code>). Cette erreur est propagée à la fonction <code>lanceRayon()</code> : <code>lanceRayon()</code> appelle la fonction <code>refrac()</code> et si cette fonction renvoie une erreur, alors <code>lanceRayon()</code> renvoie également une erreur. Pour trouver l’angle d’émission <code>thetaLimite</code> provoquant la réflexion totale (en radians, réel en virgule flottante), nous effectuons une recherche par dichotomie : * nous partons de l’angle maximum possible, lorsque le rayon frappe le sommet de la lentille, et nous appelons la fonction <code>lanceRayon()</code> ; si cela ne génère pas d’erreur, alors nous pouvons aller jusqu’à cette valeur, la recherche est terminée ; si cela génère une erreur, alors nous divisons la valeur par deux ; * à une étape de la recherche donnée, si <code>lanceRayon()</code> ne génère pas d’erreur avec l’angle testé, alors nous savons que l’angle limite est supérieur à cette valeur ; cette valeur minore donc la valeur recherchée ; si au contraire <code>lanceRayon()</code> génère une erreur, alors c’est que l’angle est trop important, cette valeur majore donc la valeur recherchée ; nous pouvons ainsi resserer l’intervalle de recherche ; * nous nous arrêtons lorsque les valeurs haute et basse sont suffisamment proche. Concrètement : # Nous définissons une variable <code>angleHaut</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus bas connu provoquant la réflexion totale. # Nous définissons une variable <code>angleBas</code> angle en radians, réel en virgule flottante) qui est l’angle d’émission le plus haut connu ne provoquant pas de réflexion totale. Sa valeur initiale est 0. L’angle limite recherché est donc entre <code>angleBas</code> et <code>angleHaut</code>. # Nous définissons l’angle <code>angleTest</code> comme étant la moyenne entre <code>angleBas</code> et <code>angleHaut</code>. Si <code>lanceRayon(angleTest)</code> génère une erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleHaut</code> (puisque c’est une valeur provoquant la réflexion totale et qu’elle est plus basse que la valeur actuelle d’<code>angleHaut</code>). À l’inverse, si <code>lanceRayon(angleTest)</code> ne génère pas d’erreur, alors <code>angleTest</code> est la nouvelle valeur d’<code>angleBas</code> (puisque c’est une valeur ne provoquant pas la réflexion totale et qu’elle est plus haute que la valeur actuelle d’<code>angleBas</code>). # Nous arrêtons la procédure lorsque l’écart entre <code>angleBas</code> et <code>angleHaut</code> est inférieur à {{unité|10|échelle=<sup>–3</sup>|rad}} (valeur arbitraire). La valeur retenue est la valeur finale d’<code>angleBas</code> (puisque l’on veut être sûr qu’il n’y ait pas de réflexion totale). La valeur affichée est la valeur en degrés arrondie au dixième. {{Boîte déroulante/fin}} {{Boîte déroulante/début |titre=Solution}} Nous demandons à l’utilisateur ou à l’utilisatrice les valeurs des paramètres du problème : rayon de la lentille, distance de la source, indice de réfraction du verre. Nous vérifions que les valeurs entrées sont bien des nombres ; si c’est une chaîne vide, alors nous utilisons une valeur par défaut. Nous créons une fonction <code>refrac()</code> qui permet de calculer l’angle réfracté à partir de l’angle d’incidence et des indices de réfraction. S’il y a rélexion totale, alors nous générons une erreur. La fonction <code>lanceRayon()</code> calcule les différents points de passage du rayon. Elle appelle pour cela la fonction <code>refrac()</code>. Si un appel de la commande <code>refrac()</code> génère une erreur, alors nous générons également une erreur. Nous déterminons l’angle d’émision du rayon <code>thetaLimite</code> qui provoque une réflecxion totale. Pour cela, nous créons une fonction <code>rechercheLimite()</code> qui cherche par dichotomie. Nous traçons un rayon tous les 5° jusqu’à la valeur limite. <syntaxhighlight lang="python"> #!/usr/bin/env python3 # coding: utf-8 """nom : lancerRayons.py auteur : User:cdang date de création : 2022-05-06 dates de modification : ---------------------------------------------------------------------------- version de Python : 3 module requis : NumPy, matplotlib ---------------------------------------------------------------------------- Objectif : trace des trajets optique avec une lentille hémisphérique Entrées ------- Le rayon de la lentille, la distance de la source, l’indice de réfraction du verre, trois chaînes de caractères saisies par l’utilisateur·rice et qui sont converties en réels. Sorties ------- La valeur limite de l’angle (réel) et le tracé de plusieurs rayons. """ # ****************************************************** # ****************************************************** # ** Lancer de rayons pour une lentille hémisphérique ** # ****************************************************** # ****************************************************** import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as nppol # ************** # * Constantes * # ************** # Pour la conversion degrés ↔ radians radversdeg = 180/np.pi degversrad = 1/radversdeg # ************* # * Fonctions * # ************* def boucleEntreeNombre(messageSaisie, valeurDefaut): """Permet de s’assurer que l’utilisateur·rice a bien entré un nombre. Entrée : — message à afficher (chaîne de caractères) ; — valeur par défaut (réel à virgule flottante). Sortie : nombre (réel à virgule flottante).""" messageErreur = "Veuillez entrer une valeur numérique (ou vide pour accepter la valeur par défaut).\n" execute = True while execute: strNombre = input(messageSaisie+f" (valeur par défaut {valeurDefaut}) : ") if strNombre == "": nombre = valeurDefaut execute = False else: try: nombre = float(strNombre) except: print(messageErreur) else: execute = False return nombre def initialisation(): """L’utilisateur·rice entre les variables du problème. Entrées : aucune. Sorties : — R1 (mm) : rayon de la lentille ; — d (mm) : distance de la source au dioptre plan ; — n (sans dimension) : indice de réfraction du verre.""" R1 = boucleEntreeNombre("Rayon de la lentille en mm", 20.0) d = boucleEntreeNombre("Distance de la source au dioptre plan en mm", 20.0) n = boucleEntreeNombre("Indice de réfraction (sans dimension)", 1.5) return (R1, d, n) def refrac(n1, n2, theta1): """Calcule l’angle de réfraction theta2 (radians) en fonction — de l’angle d’incidence theta1 (radians); — de l’indice de réfraction n1 du premier milieu ; — de l’indice de réfraction n2 du second milieu.""" reflexionTotale=False rapport=n2/n1 rapportinv=np.reciprocal(rapport) if n1 > n2: thetal = np.arcsin(rapport) # angle limite pour la réflexion totale if theta1 >= thetal: reflexionTotale=True if reflexionTotale: print("Réflexion totale") raise ValueError else: return np.arcsin(rapportinv*np.sin(theta1)) def lanceRayon(n1, n2, d, R, theta1): """Détermine le rayon issu de la source située à une distance d (mm) du bareau et avec une élévation de theta1 (radians), en fonction des indices de réfraction n1 et n2. Les éléments retournés sont : — la hauteur h (mm) à laquelle le rayon frappe le barreau ; — l’angle de réfraction theta2 (radians)) dans le barreau ; — l’angle de réfraction theta3 (radians) à la sortie du barreau — le point M(x, y) (mm) auquel le rayon sort du barreau.""" h = d*np.tan(theta1) if h >= R: print("Le rayon est au-dessus du barreau") raise ValueError else: theta2 = refrac(n1, n2, theta1) a = np.tan(theta2) x = max(nppol.polyroots([h*h - R*R, 2*a*h, 1+a*a])) # recherche de l’intersection du rayon avec le cercle y = a*x + h M = np.array([x, y]) thetaint = np.arccos((x + a*y)/(R*np.sqrt(1 + a*a))) theta3 = np.arctan(y/x) - refrac(n2, n1, thetaint) return (h, theta2, theta3, M) def rechercheLimite(n1, n2, d, R): """Recherche l’angle limite pour la réflexion totale. Entrée : — indice de réfraction des milieux 1 et 2, n1 et n2 ; — distance au barreau, d(mm). Sortie : angle limite theta (radians)""" angleHaut = np.arctan(R/d) angleBas = 0 angleTest = angleHaut try: lanceRayon(n1, n2, d, angleTest, R) except: condition = True # il y a réflexion total en haut de la lentille else: condition = False # il n’y a jamais réflexion totale dans la lentille while condition: #dichotomie angleTest = np.mean([angleHaut, angleBas]) # on ajuste la valeur de test try: lanceRayon(n1, n2, d, R, angleTest) except: angleHaut = angleTest # réflexion totale : on abaisse la valeur maximale else: angleBas = angleTest # pas de réflexion totale : on monte la valeur minimale condition = ((angleHaut - angleBas) >= 0.001) # on a cerné la limite à 0,001 rad près if not condition: angleTest = angleBas return angleTest # *********************** # * Programme principal * # *********************** (R1, d, n) = initialisation() xmax = round(R1 + d) thetaLimite = rechercheLimite(1, n, d, R1) thetaLimiteDeg = thetaLimite*radversdeg print(f"Angle limite pour la réflexion totale : {thetaLimiteDeg:.1f}°.\n") anglesDeg = np.arange(0, thetaLimiteDeg, 5)[1:] # trace un rayon tous les 5° anglesRad = anglesDeg*degversrad nb = len(anglesDeg) h = np.zeros(nb) # initialisation des vecteurs de valeurs theta2 = np.zeros(nb) theta3 = np.zeros(nb) M = np.zeros((nb, 2)) for i in range(nb): (h[i], theta2[i], theta3[i], M[i, :]) = lanceRayon(1, n, d, R1, anglesRad[i]) (h_lim, theta2_lim, theta3_lim, M_lim) = lanceRayon(1, n, d, R1, thetaLimite) # tracé anglesCercle = 0.5*np.pi*(np.linspace(1, 0, 20)) x_cercle = R1*np.cos(anglesCercle) # coordonnées des pints du cercle y_cercle = R1*np.sin(anglesCercle) fig = plt.plot([-d,xmax], [0, 0], "k-.", linewidth="0.5") # tracé de l’axe optique for i in range(nb): plt.plot([-d, 0, M[i, 0], xmax], [0, h[i], M[i, 1], M[i, 1] + (xmax - M[i, 0])*np.tan(theta3[i])], label=f"{anglesDeg[i]:.0f}°") plt.plot([-d, 0, M_lim[0], xmax], [0, h_lim, M_lim[1], M_lim[1] + (xmax - M_lim[0])*np.tan(theta3_lim)], label=f"{0.1*int(np.trunc(10*thetaLimite*radversdeg)):.1f}°") plt.plot(x_cercle, y_cercle, "k", linewidth="0.5") # tracé du cercle plt.plot([0,0], [0, R1], "k", linewidth="0.5") # tracé du premier dioptre #plt.axis("square") plt.gca().set_aspect("equal", adjustable="box") plt.xlabel("x (mm)") plt.ylabel("y (mm)") plt.title("Lentille hémisphérique, lancer de rayons") plt.legend() plt.savefig("lentille_hemispherique_lancer_rayon.svg", format="svg") plt.show() </syntaxhighlight> {{Boîte déroulante/fin}} == Mesurer le temps == Le module <code>time</code> fournit les fonctions suivantes : * <code>time.gmtime()</code> : renvoie la date et l'heure du méridien de Greenwich (''{{lang|en|Greenwich mean time}}'', GMT), sous la forme d'un dictionnaire (année, mois, jour du mois, heure, minute, seconde, jour de la semaine, jour de l'année, heure d'été/hiver), ** jour de la semaine est un entier entre 0 (lundi) et 6 (dimanche), ** jour du mois est un entier entre 1 et 366 ; * <code>time.localtime()</code> : comme le précédent, mais l'heure est l'heure locale ; * <code>time.time()</code> : donne le nombre de seconde qui se sont écoulées depuis le 1er janvier 1970 ; * <code>time.gmtime(n)</code> et <code>time.localtime(n)</code> transforment un nombre de secondes (écoulées depuis le 1er janvier 1970) en une date au format (année, mois, jour, etc.), n-uplet de neuf valeurs ; <code>time.mktime()</code> fait le contraire, il transforme un n-uplet de neuf valeurs (années, mois, jour, etc.) en un nombre de secondes (écoulées depuis le 1er janvier 1970) ; * <code>time.sleep(n)</code> : provoque une pause dans le déroulement du programme de ''n'' secondes ; * <code>time.perf_counter()</code> : indique une date en seconde ; s'utilise pour mesurer la durée d'exécution d'une partie du code, en faisant la différence entre deux relevés. Concernant la date et l'heure sous la forme d'un n-uplet, on peut extraire l'heure de la manière suivante : <syntaxhighlight lang="python"> import time a = time.localtime() print("Il est ", a[3], "h", a[4]) # ou bien print("Il est ", a.tm_hour, "h", a.tm_min) </syntaxhighlight> Pour mesurer la performance d'une portion de code : <syntaxhighlight lang="python"> import time t1 = time.perf_counter() <suite d’instructions> t2 = time.perf_counter() print("Durée d'exécution :", t2-t1 </syntaxhighlight> == Programmation orientée objet == Nous n'allons pas ici faire un cours de programmation orientée objet (POO), nous allons aborder le sujet de manière pragmatique. De manière schématique, un « objet » est une « super-variable ». Cette super-variable peut contenir plusieurs variables, appelées « attributs » ; elle contient en fait un dictionnaire (paires « nom d'attribut : valeur d'attribut »). Elle peut aussi contenir des fonctions spécifiques appelées « méthodes ». De même qu'une variable a un type, un objet fait partie d'une « classe ». La classe est le modèle de l'objet ; en franglais informatique, on dit que l'objet est une instance de la classe. La POO est donc un formalisme : lorsque l'on définit des variables et des fonctions concernant un même type d'objet (au sens commun du terme), on les empaquette dans une classe. Il faut donc d'abord définir la classe, puis attribuer cette classe à un objet (« instancier » la classe). Considérons par exemple que nous voulons travailler sur des [[w:Engrenage|engrenages]] ; pour simplifier, nous nous contentons d'engrenages à dentures droites. Une roue dentée, un pignon, est essentiellement définie par son nombre de dents Z et par son module ''m'' qui correspond à la largeur de dents<ref>ainsi que par son épaisseur ''e'' et le matériau dont elle est faite mais nous allons négliger ces paramètres pour la simplicité de l'étude.</ref>. Nous allons définir trois méthodes : la méthode <code>.diametrePrimitif()</code> qui calcule le diamètre primitif de la roue dentée, <code>.pas()</code> qui calcule la largeur des dents au niveau du cercle primitif et <code>.rapport()</code> qui calcule le rapport de transmission de deux roues engrenées Z<sub>1</sub>/Z<sub>2</sub>. La méthode <code>.rapport()</code> vérifie par ailleurs que les roues ont le même module, condition indispensable pour former un engrenage. Nous définissons la classe ainsi : <syntaxhighlight lang="python"> class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): # instructions lancées lors de la déclaration """Valeurs des attributs""" self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z </syntaxhighlight> Nous remarquons que lorsque nous déclarons les méthodes, le paramètre <code>self</code> correspond à l'objet lui-même. Ainsi, dans la méthode <code>.rapport()</code>, la variable <code>self.Z</code> est le nombre de dents de la roue elle-même et <code>roueDentee.Z</code> est le nombre de dents de la roue passée en paramètre. Pour déclarer les roues, nous écrivons : <syntaxhighlight lang="python"> roue1 = pignon() # attribution de la classe, « instanciation » roue1.Z = 13 # définition des caractéristiques du pignon « roue1 » roue1.m = 2 roue2 = pignon(16, 2) # manière alternative </syntaxhighlight> Nous pouvons alors utiliser les objets de la manière suivante : <syntaxhighlight lang="python"> print(roue1.Z) # 13 print(roue1.diametrePrimitif()) # 26 R = roue1.rapport(roue2) # 0.8125 </syntaxhighlight> La commande <code>dir(a)</code> affiche tous les attributs et méthodes de l'objet <code>a</code>. ; Ressources : {{lien web | url = https://docs.python.org/3/tutorial/classes.html | titre = Classes | site = Python documentation | consulté le = 2019-03-08 }} == Interface graphique avec Tk == === Généralités === Une interface graphique utilisateur (GUI, ''{{lang|en|graphic user interface}}'') est un ensemble de boîtes permettant d'interagir avec l'utilisateur, c'est-à-dire qui permettent la saisie d'informations, l'exécution d'actions et l'affichage d'informations. L'interface se compose d'éléments appelés ''{{lang|en|widgets}}''. Les éléments ''({{lang|en|widgets}})'' classiques sont : * boîte de dialogue ''({{lang|en|dialog box}})'' : fenêtre contenant d'autres éléments ; * étiquette ''({{lang|en|label}})'' : texte affiché ; * liste déroulante ''({{lang|en|drop-down list}})'' : zone permettant le choix d'une option, la liste se déployant lorsque l'on clique sur la zone ; * zone de texte, champ de saisie ''({{lang|en|text box}})'' : zone permettant de taper du texte ; * boîte combinée ''({{lang|en|combo box}})'' : zone de saisie de texte contenant une liste déroulante qui permet de choisir des éléments prédéfinis ; * bouton ''({{lang|en|button}})'' : objet effectuant une action lorsque l'on clique dessus ; * case à cocher ''({{lang|en|checkbox, tickbox}})'' : objet permettant d'activer ou de désactiver une option lorsque l'on clique dessus ; * bouton radio, case d'option ''({{lang|en|radio button}})'' : objet permettant d'activer une option en désactivant les autres options ; une seule option peut être activée à la fois. === Avec Tk === Plusieurs modules permettent de gérer les interfaces graphiques. Nous choisissons ici le module développé sur la bibliothèque Tk qui est une bibliothèque multiplateforme. Pour cela, nous importons le module <code>tkinter</code> ainsi que le module <code>ttk</code>, ce dernier proposant des options plus « modernes » : <syntaxhighlight lang="python"> import tkinter as tk from tkinter import ttk </syntaxhighlight> Voici un programme permettant comme précédemment de calculer le rapport de transmission d'un engrenage. Nous détaillons sa construction ci-après. <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: IUrapport.set(valeurZ2/valeurZ1) except: IUrapport.set("erreur") # ************************* # ************************* # ** Interface graphique ** # ************************* # ************************* # fenetre principale fenetre = tk.Tk() fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> [[Fichier:Organisation interface Tk Python.svg|vignette|upright=2|Organisation des ''widgets''.]] '''Explications''' Nous commençons par définir la boîte de dialogue que nous appelons <code>fenetre</code> ; c'est un objet <code>Tk</code> et nous lui donnons un titre « » : <syntaxhighlight lang="python"> fenetre = tk.Tk() fenetre.title("Rapport de réduction") </syntaxhighlight> Puis, nous définissons un cadre attaché à cette fenêtre et qui va nous permettre « d'accrocher » les autres éléments, ce qui permet de garder une apparence satisfaisante lorsque l'on retaille la fenêtre : <syntaxhighlight lang="python"> cadre = ttk.Frame(fenetre) </syntaxhighlight> Le cadre va comporter six lignes ''({{lang|en|row}})'' et deux colonnes ''({{lang|en|column}})''. Nous allons placer une étiquette ''({{lang|en|label}})'' « z1 » : <code>text="z1"</code>. Cette étiquette se trouve dans une case du cadre, celle de la première colonne et la première ligne : <code>grid(column=1, row=1)</code>. Par rapport à cette case, elle est collée à « l'ouest » (W, ''{{lang|en|west}}'', gauche) de la case : <code>sticky=tk.W</code>. <syntaxhighlight lang="python"> z1_label = ttk.Label(cadre, text="z1") # Création de l'étiquette z1_label.grid(column=1, row=1, sticky=tk.W) # Placement de l'étiquette </syntaxhighlight> Notez que l'on aurait pu écrire directement : <syntaxhighlight lang="python"> ttk.Label(cadre, text="z1").grid(column=1, row=1, sticky=tk.W) </syntaxhighlight> mais le fait de séparer la création de l'élément et son placement facilite la maintenance (recherche d'erreur, évolution du code). Pour tout ce qui est dynamique, c'est-à-dire les zone de saisie des valeurs et l'affichage du résultat, il faut définir des « chaînes variables » ''({{lang|variable strings}})'' : <syntaxhighlight lang="python"> IUz1 = tk.StringVar() </syntaxhighlight> Cette variable est une variable globale à la création. Nous pouvons alors placer la zone de saisie ''({{lang|en|entry}})'' à côté de l'étiquette lui correspondant. Nous nommons la zone de saisie <code>z1_entry</code> : <syntaxhighlight lang="python"> z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) </syntaxhighlight> Nous faisons de même pour les trois autres paramètres de l'engrenage, ''m''<sub>1</sub>, ''z''<sub>2</sub> et ''m''<sub>2</sub>. Le résultat est également une chaîne variable globale. Par rapport à notre mise en page, elle se situe dans la case colonne 2 ligne 5, centrée sur cette case (collé à l'est et à l'ouest) : <syntaxhighlight lang="python"> rapport = tk.StringVar() rapport_dynamique = ttk.Label(cadre, textvariable=rapport) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) </syntaxhighlight> Il nous faut encore définir une fonction de manière classique, nous l'appelons « calcule ». Les variables étant globales, on les utilise directement. On récupère les valeurs avec la méthode <code>get()</code> et nous modifions la valeur avec la méthode <code>set()</code> : <syntaxhighlight lang="python"> def calcule(): valeurZ1 = float(IUz1.get()) valeurZ2 = float(IUz2.get()) IUrapport.set(valeurZ2/valeurZ1) </syntaxhighlight> Cette fonction est déclenchée lorsque l'on clique sur le bouton « Calcul » situé dans la case du cadre ligne 6 colonne 2 : <syntaxhighlight lang="python"> bouton = ttk.Button(cadre, text="Calcul", command=calcule) bouton.grid(column=2, row=6, sticky=tk.W) </syntaxhighlight> ou bien si l'on appuie sur la touche <code>[entrée]</code> du clavier : <syntaxhighlight lang="python"> fenetre.bind("<Return>", calcule) </syntaxhighlight> À tout ceci, nous ajoutons des « gouttières » (marges, ''{{lang|en|paddings}}'') afin d'espacer les éléments. Il faut ensuite « activer » la fenêtre pour qu'elle s'affiche. La méthode est <code>mainloop()</code> (boucle principale) : « boucle » (elle est active en permanence et attend des actions sur ses éléments), <syntaxhighlight lang="python"> fenetre.mainloop() </syntaxhighlight> Nous avons ci-dessus mis la plupart du code en programme principal. Nous pouvons aussi programmer de manière fonctionnelle, en mettant la plupart du code dans des fonctions ; cependant, pour que la fenêtre et les variables dynamiques soient globales à tout le programme, elles doivent être déclarées dans le programme principal. Nous pouvons aussi mêler la programmation orientée objet. {{boîte déroulante début|Calcul du rapport de transmission en programmation fonctionnelle et orientée objet}} <syntaxhighlight lang="python"> # référence : https://tkdocs.com/tutorial/firstexample.html import tkinter as tk from tkinter import ttk # ************* # ************* # ** Classes ** # ************* # ************* class pignon: """roue dentée""" # explication de la classe pi = 3.141592653589793 # pour calculer le pas def __init__(self, Z=13, m=0.06): """Valeurs des attributs""" # instructions lancées lors de la déclaration self.Z = Z # nombre de dents self.m = m # module def diametrePrimitif(self): """Calcule le diamètre primitif""" return self.m*self.Z def pas(self): """Calcule le pas""" return self.pi*self.m def rapport(roueDentee, self): """Calcule le rapport de transmission""" if roueDentee.m != self.m: # gestion de l'erreur raise ValueError("Les pignons doivent avoir le même module") else: return roueDentee.Z/self.Z # ************************ # ************************ # ** Variables globales ** # ************************ # ************************ # fenetre principale fenetre = tk.Tk() # Paramètres du système (variables) IUz1 = tk.StringVar() IUm1 = tk.StringVar() IUz2 = tk.StringVar() IUm2 = tk.StringVar() IUrapport = tk.StringVar() # *************** # *************** # ** Fonctions ** # *************** # *************** def calcule(*args): """Calcule le rapport de transmission d'un engrenage""" try: valeurZ1 = float(IUz1.get()) valeurM1 = float(IUm1.get()) valeurZ2 = float(IUz2.get()) valeurM2 = float(IUm2.get()) if valeurM1 != valeurM2: IUrapport.set("Erreur de module") else: roue1 = pignon(valeurZ1, valeurM1) roue2 = pignon(valeurZ2, valeurM2) IUrapport.set(roue1.rapport(roue2)) except: IUrapport.set("Erreur") # *********************** # * Interface graphique * # *********************** def configureFenetre(): """Configuration de la fenêtre principale""" fenetre.title("Rapport de réduction") # élément (widget) cadre contenant tout le reste cadre = ttk.Frame(fenetre, padding="3 3 12 12") cadre.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S)) # le cadre s'étire si l'on étire la fenêtre fenetre.columnconfigure(0, weight=1) fenetre.rowconfigure(0, weight=1) # Création des zones de saisie z1_entry = ttk.Entry(cadre, width=7, textvariable=IUz1) m1_entry = ttk.Entry(cadre, width=7, textvariable=IUm1) z2_entry = ttk.Entry(cadre, width=7, textvariable=IUz2) m2_entry = ttk.Entry(cadre, width=7, textvariable=IUm2) # Création des étiquettes statiques z1_label = ttk.Label(cadre, text="z1") m1_label = ttk.Label(cadre, text="m1") z2_label = ttk.Label(cadre, text="z2") m2_label = ttk.Label(cadre, text="m2") rapport_statique = ttk.Label(cadre, text="Rapport de transmission : ") # Création de l'étiquette dynamique rapport_dynamique = ttk.Label(cadre, textvariable=IUrapport) # Création du bouton bouton = ttk.Button(cadre, text="Calcul", command=calcule) # Placement des éléments (widgets) z1_label.grid(column=1, row=1, sticky=tk.W) z1_entry.grid(column=2, row=1, sticky=(tk.W, tk.E)) m1_label.grid(column=1, row=2, sticky=tk.W) m1_entry.grid(column=2, row=2, sticky=(tk.W, tk.E)) z2_label.grid(column=1, row=3, sticky=tk.W) z2_entry.grid(column=2, row=3, sticky=(tk.W, tk.E)) m2_label.grid(column=1, row=4, sticky=tk.W) m2_entry.grid(column=2, row=4, sticky=(tk.W, tk.E)) rapport_statique.grid(column=1, row=5, sticky=tk.W) rapport_dynamique.grid(column=2, row=5, sticky=(tk.W, tk.E)) bouton.grid(column=2, row=6, sticky=tk.W) # ajoute une gouttière entre les éléments for enfant in cadre.winfo_children(): enfant.grid_configure(padx=5, pady=5) # Emplacement initial du curseur z1_entry.focus() # effet de la touche [entrée] fenetre.bind("<Return>", calcule) # ************************* # ************************* # ** Programme principal ** # ************************* # ************************* configureFenetre() # Affichage et activation de la fenêtre fenetre.mainloop() </syntaxhighlight> {{boîte déroulante fin}} {{voir |{{lien web |url=https://docs.python.org/3/library/tkinter.ttk.html |titre=tkinter.ttk — Tk themed widgets |site=docs.python.org |consulté le=2026-06-11}} }} {{voir |{{lien web |url=https://matplotlib.org/stable/gallery/user_interfaces/embedding_in_tk_sgskip.html |titre=How to embed Matplotlib charts in Tkinter GUI? |site=Matplotlib.org |date=2025-07-15 |consulté le=2026-06-11}} }} === Avec PyQt === Le module PyQt (prononcer \ˈpaɪ.kjut\) permet d'utiliser la bibliothèque Qt dévelopée par Riverbank Computing. Il permet notamment de créer des interfaces graphiques. La communication entre objets Qt se fait par une mécanismes de « signal/emplacement » ''({{lang|en|signal/slot}})''. Un emplacement ''({{lang|en|slot}})'' est une fonction ''({{lang|en|callable}})'' ; un signal est un attribut d'un objet. Si l'attribut signal est défini pour l'emplacement, alors on dit que l'emplacement est relié à un signal. Par exemple, un objet <code>QPushButton</code> dispose du signal <code>clicked</code> qui est émis lorsque l'on clique dessus ; on peut ainsi faire exécuter un emplacement (fonction appelable) <code>action()</code> lorsque l'on clique sur le bouton par le biais du signal <code>clicked</code> : <syntaxhighlight lang="python"> from PyQt5.QtWidgets import QPushButton bouton = QPushButton("Appuies-moi dessus") button.clicked.connect(action()) </syntaxhighlight> {{voir|{{lien web |url=https://www.riverbankcomputing.com/static/Docs/PyQt6/ |titre=Reference guide PyQt6 |site=Riverbank Computing|consulté le=2026-0604}} }} {{...}} == Annotations == Une annotation est un commentaire qui sert à expliciter un type de variable. La syntaxe est différente des commentaires « classiques » : cela permet d'avoir un affichage différent avec les éditeurs de texte ayant une coloration syntaxique, et ces informations peuvent être récupérées par des logiciels extérieurs pour effectuer une documentation automatique ou bien des vérifications de type. Cependant : * comme les commentaires normaux, ils n'ont aucune influence lors de l'exécution du texte ; en particulier : * rien n'oblige à annoter les variables ; * il est possible d'avoir une variable ayant un type différent de son annotation ; le fait de pouvoir définir et changer le type de variable à la volée est une fonctionnalité fondamentale de Python. La syntaxe pour une annotation est : : nom_de_variable + deux-points + espace + type par exemple : <syntaxhighlight lang="python"> a: int </syntaxhighlight> Notez qu'ici, la variable n'est ''pas'' créée. Pour la créer, il faut lui affecter une valeur. Il est possible de l'affecter après ou bien sur la même ligne avec la syntaxe : : nom_de_variable + deux-points + espace + type + espace + égal + espace + valeur par exemple : <syntaxhighlight lang="python"> a: int a = 5 # est équivalent à a: int = 5 </syntaxhighlight> Même si l'annotation n'a pas d'impact sur l'exécution, le type doit être un type existant sinon cela génère une erreur de syntaxe. Les types classiques sont : : <code>int</code> — <code>float</code> — <code>str</code> — <code>bool</code> — <code>list</code> — <code>tuple</code> — <code>dict</code> Il est également possible de mettre une chaîne de caractères : <syntaxhighlight lang="python"> a: "ce que je veux" = 3.1516 </syntaxhighlight> On peut annoter une fonction. Il est possible d'annoter les variables déclarées au sein de la fonction, mais pas les variables globales (puisqu'elle ne sont pas définie au sein de la fonction). On peut aussi annoter : * les variables passées en paramètre, avec la même syntaxe dans les parenthèses ; * annoter le type de la variable de sortie (retournée) en la faisant précéder de <code>-&gt;</code> : <syntaxhighlight lang="python"> def plusCinq(a: float = 0) -> float: return a + 5 </syntaxhighlight> ; Ressources * {{lien web | url = https://www.python.org/dev/peps/pep-0526/ | titre = PEP 526 -- Syntax for Variable Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} * {{lien web | url = https://www.python.org/dev/peps/pep-3107/ | titre = PEP 3107 -- Function Annotations | site = Python.org | consulté le = 2019-04-05 | lang = en }} == Décorateur == Un décorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée le décorateur. L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même. Pour appliquer une décoration, il faut : # Déclarer le décorateur : une fonction qui s'applique à une autre fonction. # Affecter le décorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction. Par exemple : <syntaxhighlight lang="python"> def decorateur(f): print("Avant la fonction") f() print("après la fonction") @decorateur def afficheFoo(): print("Foo.") afficheFoo # Avant la fonction # Foo. # Après la fonction </syntaxhighlight> Lorsque l'on appelle <code>afficheFoo</code>, on appelle en fait <code>decorateur(afficheFoo)</code>. Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans le décorateur. Par exemple, nous définissons ci-dessous un décorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction : <syntaxhighlight lang="python"> def deuxFois(f): def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # conteneurFonction </syntaxhighlight> Nous voyons que l'application du décorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> : <syntaxhighlight lang="python"> import functools def deuxFois(f): @functools.wraps(f) def conteneurFonction(*args, **kwargs): f(*args, **kwargs) f(*args, **kwargs) return conteneurFonction @deuxFois def plusCinq(a: int = 0): print(a + 5) plusCinq(2) # 7 # 7 print(plusCinq.__name__) # plusCinq </syntaxhighlight> On peut par exemple utiliser un décorateur pour la mémoïsation. La mémoïsation est une méthode consistant à mémoriser les valeurs d'une fonction au fur et à mesure de son utilisation ; ainsi, si l'on veut évaluer la fonction avec les mêmes entrées, on se contente d'aller chercher la valeur enregistrée ce qui est plus rapide. On sacrifie donc la place mémoire au profit de la rapidité. On peut trouver des décorateurs de mémoïsation aux adresses suivantes : * https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize * https://gist.github.com/robcowie/1357800 ; Ressources : {{lien web | url = https://www.python.org/dev/peps/pep-0318/ | titre = PEP 318 -- Decorators for Functions and Methods | site = Python.org | lang = en | consulté le = 2019-04-05 }} == Manipulation de fichiers == === Importer le contenu d'un fichier === Python possède la fonction <code lang="python">open()</code> qui permet d'ouvrir un fichier. Ouvrir signifie qu'il crée un objet de type <code>file</code> qui possède notamment les méthodes <code lang="python">.read()</code> et <code lang="python">.write()</code>. Il peut s'agir d'un objet de type « fichier binaire » ''({{lang|en|binary file}})'' ou « fichier texte » ''({{lang|en|text file}})''. Si par exemple on veut utiliser (et donc lire) le contenu du fichier texte <code>monfichier.txt</code>, on écrit : <syntaxhighlight lang="python"> fichier = open("monfichier.txt", "rt") … fichier.close() </syntaxhighlight> Le paramètre <code>"rt"</code> signifie que nous ouvrons le fichier en lecture ''({{lang|en|read}})'' et qu'il s'agit d'un objet de type fichier texte. Notons deux choses : * en faisant cela, nous ne faisons qu'associer le fichier à un objet Python, nous n'avons pas encore importé les données ; * si nous ouvrons le fichier, il faut le fermer par la suite ; c'est pourquoi nous utilisons la méthode <code lang="python">.close()</code>. Pour éviter d'avoir à fermer le fichier, nous pouvons l'ouvrir au sein d'un contexte : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: … </syntaxhighlight> Notons aussi que la chaîne de caractères indiquant le nom du fichier peut contenir le chemin d'accès au répertoire (dossier), mais sous Microsoft Windows, il faut utiliser des barres de fractions <code>/</code> pour séparer les sous-répertoires au lieu de la barre inversée habituelle, par exemple : <syntaxhighlight lang="python"> chemin = "C:/Temp/monfichier.txt" with open(chemin, "rt") as fichier: … </syntaxhighlight> Pour mettre les données du fichier dans la variable <code>contenu</code>, nous écrivons donc : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() print(contenu) </syntaxhighlight> et si nous ne voulons lire que les <code>n</code> premiers caractères (<code>n</code> étant un entier), nous utilisons <code lang="python">contenu = fichier.read(n)</code>. Cette lecture est séquentielle, c'est-à-dire que si nous appliquons la méthode plusieurs fois, nous reprenons la lecture là où nous l'avons laissée. Si nous voulons lire une ligne, nous utilisons la méthode <code lang="python">.readline()</code>. La lecture ligne par ligne est également séquentielle. Nous pouvons aussi créer une liste dont chaque élément est une ligne du fichier ; nous utilisons alors la méthode <code lang="python">.readlines()</code> (notez le pluriel). Chaque élément de la liste se termine par le caractère de fin de ligne <code lang="python">\n</code>. Pour l'enlever, nous pouvons utiliser la méthode <code lang="python">.rstrip()</code> pour chaque élément de la liste, par exemple. L'exemple complet est alors : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.readlines() contenu = [item.rstrip() for item in contenu] print(contenu) </syntaxhighlight> === Exporter du contenu vers un fichier === Si nous voulons créer un fichier texte <code>monfichier.txt</code> pour y mettre le contenu de la variable <code>texte</code>, alors nous utilisons : <syntaxhighlight lang="python"> with open("monfichier.txt", "wt") as fichier: fichier.write(texte) </syntaxhighlight> Le module principal important pour la manipulation de fichiers est est <code lang="python">os</code>. === Exploiter le contenu d'un fichier texte === Avec un fichier texte, la méthode <code lang="python">.read()</code> crée une variable de type texte. Nous pouvons séparer cette variable en différentes lignes avec la méthode <code lang="python">.splitlines()</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une ligne. Si maintenant une ligne contient plusieurs données séparées par un séparateur commun, par exemple un espace, nous pouvons séparer les données par la méthode <code lang="python">.split(''séparateur'')</code>. Cela crée une liste de chaînes de caractères, chaque chaîne étant une donnée. Si par exemple le fichier est du type CSV ''({{lang|en|comma separated values}}'', valeurs séparées par une virgule), l'exploitation du fichier est : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(",") for item in contenu] </syntaxhighlight> La variable <code>contenu</code> est une liste de listes. Pour avoir la ''n''<sup>e</sup> valeurs de la ''m''<sup>e</sup> ligne, on utilise : <syntaxhighlight lang="python"> contenu[m-1][n-1] </syntaxhighlight> Si l'on veut extraire la ligne ''m'' il suffit d'écrire : <syntaxhighlight lang="python"> contenu[m-1] </syntaxhighlight> mais si l'on veut la colonne ''n'', le plus simple est d'utiliser une définition en compréhension : <syntaxhighlight lang="python"> [ligne[n-1] for ligne in contenu] </syntaxhighlight> Dans certains fichiers CSV, les séparateurs de valeurs ne sont pas des virgules, on peut donc utiliser un autre caractère pour le séparateur. Concernant les séparateurs particuliers : * si le séparateur est une tabulation, on utilise <code lang="python">\t</code> : <code lang="python">contenu = [item.split("\t") for item in contenu]</code> ; * si le séparateur est un nombre arbitraire d'espaces et/ou de tabulation, on ne définit aucun séparateur : <code lang="python">contenu = [item.split() for item in contenu]</code>. Si la première ligne contient les en-têtes des colonnes, on peut l'enlever avec la fonction <code lang="python">del()</code> : <syntaxhighlight lang="python"> with open("monfichier.txt", "rt") as fichier: contenu = fichier.read() contenu = contenu.splitlines() del(contenu[0]) contenu = [item.split(",") for item in contenu] </syntaxhighlight> Certains logiciels créent des fichiers en utilisant le séparateur décimal régional, qui en France est la virgule. Pour remplacer les virgules par des points, on peut utiliser la méthode <code lang="python">.replace()</code>, de préférence ''avant'' de séparer les valeurs : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.replace(",", ".") for item in contenu] # remplace les virgules par des points contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule </syntaxhighlight> en effet, lorsque l'on a séparé les valeurs, on a une liste de liste, il faut alors balayer les sous-listes ce qui prend plus de temps : <syntaxhighlight lang="python"> contenu = contenu.splitlines() contenu = [item.split(";") for item in contenu] # si le séparateur est un point-virgule contenu = [[subitem.replace(",", ".") for subitem in item] for item in contenu] # remplace les virgules par des points </syntaxhighlight> '''Exemple complet''' Supposons que l'on ait un fichier texte de la forme : <syntaxhighlight lang="text"> x y z V 0.0 1.5 3.2 8.657 0.4 1.5 3.2 8.392 0.2 1.5 3.2 8.485 ... </syntaxhighlight> C'est un fichier valeurs V associées à des points de coordonnées ''(x, y, z)'' (un champ V sur l'espace, donc). Nous remarquons que seule la coordonnée ''x'' change : les données concernent la droite (''y'' = 1,5 ; ''z'' = 3,2). Nous remarquons aussi que les valeurs de ''x'' ne sont pas classées par ordre croissant ni décroissant. Nous voulons au final avoir une matrice [[''x''], [V]] triée par ''x'' croissant. Pour cela, nous pouvons faire : <syntaxhighlight lang="python"> with open(nomdefichier, "rt") ad fichier: contenu = fichier.read() contenu = contenu.splitlines() contenu = [item.split(" ") for item in contenu contenu = contenu[1:] # élimine la première ligne x = np.array([float(ligne[0]) for ligne in contenu]) V = np.array([float(ligne[3]) for ligne in contenu]) donnees = np.concatenate((x.reshape(-1, 1), V.reshape(-1, 1)), axis=1) # matrice [[x], [V]] ind = np.argsort(donnees[:, 0]) donnees = donnees[ind, :] # matrice triée plt.plot(donnees[:, 0], donnees[:, 1]) </syntaxhighlight> {{note|Pour le tri, voir [[../Manipulation_de_matrices#Fonctions_et_méthodes_de_base|''Manipulation de matrices'' &gt; ''Fonctions et méthodes de base'']].}} === Cas d'un fichier CSV === Si le fichier CSV ne contient que des valeurs numériques, on peut utiliser : <syntaxhighlight lang="python"> valeurs = np.loadtxt(chemin+nomfic, delimiter=",") # si le séparateur est une virgule </syntaxhighlight> Il existe un module <code lang="python">csv</code> dédié aux fichiers CSV. La manipulation du fichier se fait comme suit : <syntaxhighlight lang="python"> import csv with open(chemin+nomfic, "rt") as fichier: lecteur = csv.reader(fichier, delimiter=",") contenu = [ligne for ligne in lecteur] print(contenu) </syntaxhighlight> === Utilisation de Pandas === Pandas<ref>https://pandas.pydata.org/</ref> est un module gérant les tableaux de données, appelés <em lang="en">data frames</em>. Voici quelques commandes utiles : <syntaxhighlight lang="python"> import numpy as np import pandas as pd M = np.random.rand(10, 10) # crée une matrice NumPy aléatoire de dimension 10 × 10 tableau = pd.DataFrame(M) # transforme la matrice en tableau DataFrame tableau.to_csv("tableau.csv") # enregistre le tableau dans un fichier CSV donnees = pd.read_csv("tableau.csv").to_numpy() # lit le fichier et transforme le tableau DataFrame en matrice NumPy </syntaxhighlight> Par défaut, la fonction <code>pd.read_csv()</code> considère que le séparateur est une virgule, et la commande <code>pd.read_table()</code> que c'est une tabulation. On peut définir le séparateur avec le paramètre <code>sep</code> : <syntaxhighlight lang="python"> donnees = pd.read_csv("tableau.csv", sep=";") </syntaxhighlight> On peut utiliser les séparateurs spéciaux : * <code>\t</code> : tabulation ; * <code>\s+</code> : nombre arbitraire d'espaces. On peut par ailleurs utiliser les paramètres suivants : * <code>dialect</code> : syntaxe du fichier, par exemple <code>dialect = "excel"</code> ; * <code>nrows</code> (entier) : nombre de lignes lues ; * <code>skiprows</code> (entier) : nombre de lignes sautées (non lues) en début de fichier ; * <code>header</code> (entier) : numéro de ligne utilisé pour l'en-tête, par exemple <code>header = 0</code> pour la première ligne ; * <code>skip_blank_lines</code> (booléen) : si la valeur est vraie (<code>True</code>), ne lit pas les lignes vide ; sinon, met une valeur <code>nan</code>. Par exemple : <syntaxhighlight lang="python"> donnees1 = pd.read_csv("tableau.csv", nrows=1, sep="\s+").to_numpy() donnees2 = pd.read_csv("tableau.csv", skiprows=3, sep="\s+").to_numpy() </syntaxhighlight> {{voir|{{lien web |url=https://pandas.pydata.org/docs/user_guide/io.html |titre=IO tools (text, CSV, HDF5, …) |site=Pandas |consulté le=2026-05-06}} }} == Exporter un programme Python == Vous pouvez créer un fichier « Python pur » <code>.py</code>. Pour cela, dans le menu <code>fichier/file</code> de Jupyter, choisir <code>télécharger/download</code> au format <code>.py</code> ; le fichier se trouve alors dans le répertoire de téléchargement du navigateur. == Recommandations == Les recommandations de programmation sont générales et ne sont en grande partie pas spécifiques à Python. {{voir|[[Découvrir_Scilab/Programmation#Recommandations]]}} == Ressources == * {{lien web | url = https://www.python.org/dev/peps/pep-0008/ | titre = PEP 8 -- Style Guide for Python Code | site = Python documentation | consulté le = 2019-03-14 }} == Notes et références == {{références}} ---- [[../Fonctions mathématiques générales|Fonctions mathématiques générales]] &lt; [[../|↑]] &gt; [[../Graphiques|Graphiques]] {{DEFAULTSORT:Elements de programmation}} [[Catégorie:Python pour le calcul scientifique (livre)]] 42dtnu0r4mxus3tf3ph1we1yhkdxfc1 La politique monétaire/L'interaction entre politique budgétaire et création monétaire 0 75262 767841 708391 2026-06-16T15:01:48Z ~2026-35377-53 124021 /* Les différentes politiques de financement d'un stimulus fiscal */ 767841 wikitext text/x-wiki Depuis les années 2008, à la suite de la crise financière, les banques centrales se sont mises à effectuer de l'assouplissement quantitatif (QE) à grande échelle. Beaucoup de commentateurs ont alors accusé ces politiques de monétiser la dette de l'état, sous-entendu de financer directement le déficit. Et l'accusation en question est rapide, pour ne pas dire complètement fausse. En soi, cette confusion n'est pas si stupide : le QE a beaucoup de points communs avec le financement de l'état, mais il s'en démarque cependant par de nombreux points. Dans cette section, nous allons dissiper ces malentendus et expliquer quelles sont les différences fondamentales entre ''hélicoptère money'' (HM), QE et financement normal de l'état. ==Les différentes politiques de financement d'un stimulus fiscal== Dans ce qui va suivre, nous allons supposer que l'état souhaite effectuer une politique de stimulus fiscal. Cela signifie qu'il souhaite baisser les impôts et taxes, ou alors qu'il souhaite verser de l'argent à ses citoyens. Qu'il s'agisse d'une baisse d'impôt ou d'une hausse des dépenses, il s'agit d'un stimulus fiscal, un stimulus budgétaire. Les dépenses peuvent être réparties comme l'état le souhaite : il peut décider d'augmenter le niveau des minimas sociaux, instaurer un revenu universel, faire un plan de relance de l'investissement, fournir des aides aux entreprises : peu importe. Pareil pour les baisses d'impôt, qui peuvent être générales ou ciblées sur une catégorie de la population. La nature exacte du stimulus, et sa mise en œuvre, spécifient qui touchera l'argent du stimulus fiscal. Et les conséquences ne seront donc pas les mêmes. Suivant comment cet argent est mis en circulation, l'effet macroéconomique favorisera certains secteurs, certaines catégories de la population. Certains deviendront plus riches, ou moins pauvres, d'autres pourront y perdre au change, etc. Au niveau macroéconomique, le stimulus peut avoir une influence sur le niveau des prix et la production, qui sera différente selon le secteur économique. Au niveau agrégé, le résultat est soit une augmentation des prix, soit une augmentation de la production, soit un mélange des deux. Les économistes estiment que l'effet sur les prix se manifeste surtout à long terme, bien qu'il puisse se manifester dès le court terme sui le stimulus est trop fort. Pour la production, l'effet est maximal à court terme, mais s'atténue avec le temps. En fait, le stimulus mobilise des capacités de production inutilisées par manque de demande. En stimulant la demande, les entreprises répondent en réutilisant les capacités de production qu'elles avaient mises en sommeil ou qui étaient en pause suite à une crise économique. Mais si le stimulus est trop fort, toutes les capacités de production sont utilisées et la demande en surplus se transforme en inflation. Précisons cependant que si les prix augmentent au niveau global, certains prix vont augmenter plus que d'autres. Et l'effet sur chaque prix dépend de l'endroit où la monnaie est injectée dans l'économie et de la manière dont elle se propage, dont elle circule. Cela s’appelle l''''effet Cantillon'''. Mais ce qui nous importe n'est pas l'effet du stimulus, mais son financement. Il existe plusieurs manières de financer un stimulus, qui se distinguent fortement par leurs effets. Les deux cas les plus simples sont les suivants : soit l'état se finance par le déficit en empruntant sur les marchés, soit la banque centrale finance directement ses dépenses. Plusieurs politiques sont possibles. * Avec la première, l'état emprunte l'argent du stimulus sur les marchés financiers. Cela mobilise de l'épargne existante, qui est remise en circulation par le stimulus. On parle alors de '''financement par l'emprunt'''. * Dans le second cas, l'état emprunte l'argent sur les marchés, mais la banque centrale rachète la dette associée via '''assouplissement quantitatif'''. C'est un cas particulier de financement par l'emprunt où la banque centrale stérilise les effets de l'emprunt. * Les autres méthodes correspondent au cas où la banque centrale intervient pour faciliter le financement du déficit. Elles sont regroupées sous le terme '''hélicoptère monétaire''', ou encore monnaie-hélicoptère - ''helicopter money'' (HM) en anglais. : ''Précisons que le QE peut être utilisé seul, sans emprunt associé, et ne sert pas forcément à financer les dettes de l'état. Par exemple, une banque centrale peut utiliser le QE pour relancer l'économie, sans que l'état n'utilise de relance fiscale de son côté. Mais le cas est quand même rare.'' [[File:Modes de financement d'un stimulus fiscal.png|centre|vignette|upright=3.0|Modes de financement d'un stimulus fiscal.]] ===Les différentes formes d’hélicoptère monétaire=== Il existe plusieurs formes d'hélicoptère monétaire, qui sont considérées comme identiques du fait de leurs caractéristiques fortement semblables et de leurs effets macroéconomiques similaires. Dans les deux premiers cas, la banque centrale crée la monnaie du stimulus et verse celui-ci soit directement à l'état, soit aux ménages. Dans le troisième cas, la banque centrale annule la dette d'état qu'elle détient. S'il faut distinguer versement de la banque centrale à tous les citoyens et versement de la banque centrale à l'état, nous pouvons cependant faire la confusion tant les deux sont similaires du point de vue monétaire. Dans les deux cas, la base monétaire augmente : elle n'est juste pas distribuée aux mêmes agents économiques. Les trois méthodes permettent de financer le déficit de l'état, bien que ce soit par des moyens différents. Dans le cas où la banque centrale verse de l'argent au ménages, le financement est le plus direct possible. L'argent du stimulus fiscal est versé par la banque centrale, sans passer par le moindre intermédiaire. Dans le cas où la banque centrale donne de l'argent au trésor public, le transfert est indirect : la banque centrale donne de l'argent au trésor qui le redistribue aux ménages. Dans le troisième cas, il y a bien financement du déficit, bien qu'il ne soit pas évident. Le gain est lié au fait que l'état n'a pas à rembourser les échéances des dettes annulées. Les mensualités de remboursement et les intérêts disparaissent, ce qui lui fait de l'argent en moins à payer. Et cet argent en moins à payer est autant de déficit en moins et autant d'argent économisé pour l'état. ===L'étude comptable du financement de l'état=== Regardons maintenant ce qui se passe au niveau du bilan comptable de la banque centrale, quand l'état se finance. Suivant la situation, le bilan n'évoluera pas de la même manière. Le Q.E, le financement par l'emprunt et la monnaie-hélicoptère ont des conséquences très différentes. Le financement par l'emprunt n'implique aucune action de la part de la banque centrale, ce qui fait que son bilan reste inchangé. L'assouplissement quantitatif se traduit par l'augmentation des dettes publiques détenues par la banque centrale, donc une augmentation de son actif. Les dettes sont échangées contre des réserves bancaires par la banque centrale. On a donc une augmentation de l'actif (dettes achetées), mais aussi du passif (hausse des réserves), du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\uparrow</math> | Réserves bancaires <math>\uparrow</math> |- | - | - |} Au niveau comptable, les trois politiques d'hélicoptère monétaire entraînent une baisse des fonds propres de la banque centrale et/ou une création monétaire sans contrepartie. * Avec le versement d'argent aux ménages, la base monétaire augmente et l'argent crée est versé aux citoyens. Mais pour respecter l'égalité entre actif et passif, quelque chose doit diminuer. Ce quelque chose, c'est les fonds propres de la banque centrale, son capital. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) <math>\uparrow</math> |- | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec le versement d'argent à l'état, c'est la même chose, sauf que la base monétaire reste la même. L'argent est versé directement sur le compte du trésor et le capital de la banque centrale diminue du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) |- | Compte du trésor <math>\uparrow</math> |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec l'annulation de la dette publique, les choses sont plus compliquées. Les dettes sont présentes à l'actif, qui diminue donc du montant des dettes annulées. En conséquence, le passif diminue et c'est encore une fois le capital de la banque centrale qui encaisse le choc. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\downarrow</math> | Base monétaire (Espèces et réserves) |- | rowspan="2" | Autres actifs | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} ==L'hypothèse de l'équivalence ricardienne== Les trois politiques sont similaires dans le sens où elles injectent de la monnaie dans l'économie. Mais le sort de cette monnaie ne sera pas le même. Tout dépend de la manière dont les agents économiques vont réagir : vont-ils dépenser ou épargner l'argent du stimulus. S'ils l'épargnent, alors le stimulus n'a aucun effet macroéconomique notable. Les dépenses restent les mêmes, l'inflation reste stable, le chômage aussi, le PIB idem, etc. Par contre, si le stimulus augmente la dépense, alors c'est l'inverse : le chômage baisse, l'inflation repart, etc. Évidemment, la banque centrale peut toujours stériliser ces effets si l'inflation dépasse sa cible. Raison pour laquelle les politique de stimulus fiscal sont utilisées quand les stimulus monétaires ne servent plus, quand les taux d'intérêt sont à zéro et ne peuvent plus baisser, soit en trappe à liquidité. ===L'équivalence ricardienne=== Mais pourquoi les agents économiques épargneraient l'argent du stimulus ? Et bien tout dépend de s'ils s'attendent à devoir le rembourser plus tard. L'hypothèse de l''''équivalence ricardienne''' nous dit que les ménages vont anticiper les conséquences du stimulus et réagir en conséquence. Prenons un stimulus financé par l'emprunt. Les ménages vont se rendre compte que l'argent du stimulus est attaché à une dette, qui devra être remboursée plus tard. En conséquence, ils s'attendent à une augmentation des impôts et à une réduction des dépenses dans le futur. Ce faisant, ils épargnent l'argent du stimulus, afin de compenser l'austérité future. Et c'est une solution parfaitement rationnelle (trop, même). Si l'état dépense une somme X maintenant, il devra rembourser la somme <math>X (1+r)^n</math>, avec r le taux d'intérêt réel sur la dette d'état et N le nombre d'années avant remboursement. En plaçant la somme X sur un support rémunéré à r%, les agents pourront rembourser la dette du stimulus. Ce mécanisme est le même dans le cadre du QE : l'argent injecté dans l'économie peut être retiré par la banque centrale de la circulation. Les ménages vont donc conserver cet argent jusqu’à au moment où la banque centrale décidera de le retirer, afin de ne rien perdre. En théorie, c'est complètement différent pour l'HM. L'HM est supposé être une injection permanente de monnaie dans l'économie, qui ne peut pas être retiré de la circulation. En conséquence, les agents économiques n'ont pas besoin d'épargner l'argent du stimulus et le dépensent comme ils le souhaitent. L'équivalence ricardienne n'a donc aucune raison de tenir, rendant l'HM plus efficace que les autres méthodes pour stimuler l'inflation. La différence fondamentale entre QE et HM est donc son caractère '''temporaire/permanent''' : les agents s'attendent à ce que le QE/l'emprunt disparaisse et qu'il soit remboursé d'une manière ou d'une autre, alors que l'HM est permanent et n'est pas censé être remboursé. Plus précisément, c'est le caractère permanent/temporaire perçu par les agents économiques. Si les agents économiques s'attendent à ce que la création monétaire soit permanente, alors ils vont réagir en conséquence et dépenser l'argent du stimulus. Si à l'inverse ils anticipent que la création monétaire sera temporaire, ils vont décider d'épargner et cela annulera l'efficacité du stimulus. Et si l'HM est réellement permanent, rien n'indique que les agents économiques le verront ainsi, pareil pour le QE. Il se peut que les agents économiques anticipent une réaction de la banque centrale qui ne sera pas celle prévue dans les théories. Par exemple, si la banque centrale n'est pas crédible aux yeux des agents, les marchés réagiront différemment au QE. La banque centrale a beau lancer un QE de grande envergure et jurer que celui-ci sera maintenu durant très longtemps, le QE n'aura que peu d'impact si les agents n'y croient pas et épargnent au cas où. ===Une hypothèse respectée pour le Q.E, moins bien pour les autres méthodes de financement=== L'équivalence ricardienne semble fonctionner assez bien pour le QE : l'argent des différents QE a été conservé par les banques, au lieu d'être mis en circulation dans l'économie. Les banques ont échangé leurs obligations d'état contre des réserves bancaires, mais n'ont pas prêtées celles-ci. L'expérience des banques centrales américaines et européennes lors de la crise de 2008 sont assez parlantes : la totalité de l'argent du QE a été épargnée par les banques. La même chose a été observée lors de la crise japonaise de 1990, les politiques d'assouplissement quantitatif ayant fortement augmenté le bilan de la banque centrale. Aux États-Unis, la baisse sur les taux de long terme a été assez importante, de près d'un pour cent, mais les banques n'ont cependant pas décidé d’augmenter le volume de leurs prêts. Les autres pays ont eu une expérience similaire : pas d'augmentation notable du volume de prêts. Et pourtant, force est de constater que l'augmentation de la base monétaire a été très importante dans tous les cas étudiés, allant jusqu’à tripler ou quadrupler la base monétaire. [[File:Monetary Base United States 1959-01-01 2018-08-01.png|centre|vignette|upright=2.0|Évolution de la base monétaire américaine durant les dernières décennies. On voit qu'elle augmente fortement suite aux différents QE de 2008, signe que l'argent du QE a été épargné par les banques sous la forme de réserves bancaires.]] Une explication à cela est qu'elles n'avaient pas de demande de crédit à financer et qu'elles n'avaient pas d'autre choix que de les conserver. Une autre explication est que la rémunération des réserves incitait les banques à conserver leurs réserves. Mais on ne peut pas nier que les banques ont anticipé que le QE est une mesure temporaire. Les banques sont remplies de professionnels qui connaissent la finance et la macroéconomie sur le bout des doigts (en théorie), qui connaissent le caractère temporaire du QE. D'où, en théorie, le fait que les banques ont beaucoup épargné l'argent des différents QE. Bref : le QE permet de financer un stimulus, mais n'est en soi pas spécialement plus inflationniste que l'emprunt direct. L'argent du stimulus fiscal n'est pas complété par une mise en circulation de l'argent du QE. Précisons cependant que l'hypothèse d'équivalence ricardienne tient assez peu pour le financement par l'emprunt. En effet, beaucoup de ménages ne se rendent pas compte que le stimulus fiscal se traduira par des impôts plus élevés dans le futur. Et s'ils s'y attendent, ils ne vont pas forcément épargner l'argent du stimulus et vont quand même préférer le dépenser. Les ménages de la théorie économique néoclassique sont capables d'anticiper un tel phénomène et de réagir en conséquence, rationnels et optimiseurs qu'ils sont. Les agents économiques du monde réel sont cependant très différents. De plus, divers mécanismes empêchent l'équivalence ricardienne de fonctionner à plein. Quelques études estiment qu'à la louche, environ 50% de l'argent d'un stimulus financé par l'emprunt est dépensé et l'autre moitié est épargnée. Notons cependant que le niveau de dette peut avoir son influence et modérer ou accentuer les effets ricardiens. Si l'état est faiblement endetté, les agents économiques ne se préoccupent pas vraiment d'un emprunt supplémentaire et n'agissent pas de manière ricardienne. Mais pour un état fortement endetté, les agents peuvent réagir autrement : un fort niveau de dette signifie soit un défaut futur probable, soit de très forts impôts pour lesquels il vaut mieux se préparer. D'où l'apparition supposée d'un comportement ricardien à de forts niveaux de dette. Pour l'H.M, l'équivalence ricardienne n'est de toute façon pas censée se manifester. Mais on peut quand même estimer qu'une partie de l'argent de l'HM sera épargnée malgré tout. Cette politique n'ayant pas été mise en œuvre dans les pays développés, sous en quelques rares occasions et à petite échelle, on ne sait pas ce qu'il en est dans le monde réel. Mais il serait suspect que l'équivalence ricardienne tienne dans un tel cas de figure. Certes, les agents peuvent anticiper une sorte de remboursement de l'HM, sous la forme d'une politique monétaire stricte dans le futur, mais cela ne change rien tant que la banque centrale respecte sa cible d'inflation. L'HM, sous cette condition, est alors permanent dans le sens où il sert à remettre l'inflation sur les rails, comme cela aurait dû être le cas si la trappe à liquidité n'existait pas. Pour résumer, QE, financement par l'emprunt et HM sont trois politiques qui se placent sur un continuum en termes d'efficacité : le QE est le moins efficace de tous, l'HM est tellement inflationniste qu'il est considéré comme une arme atomique monétaire, alors que le financement par l'emprunt est un intermédiaire. ==Politique monétaire non-conventionnelle, coûts de financement et désendettement== Les politiques monétaires non-conventionnelles et la dette de l'état interagissent fortement. L'assouplissement quantitatif demande de racheter de la dette de l'état, certaines formes d'H.M se basent sur une annulation de la dette d'état au détenue par la banque centrale, et j'en passe. Intuitivement, Q.E et H.M permettent à l'état de monétiser leur dette, de se désendetter sans frais, sans avoir à taxer pour trouver de quoi rembourser. Mais comme on va le voir dans ce qui suit, les choses sont plus compliquées. Nous allons voir comment Q.E et H.M aident l'état à financer sa dette, et voir comment les agents privés se désendettent ou non suite à une politique monétaire non-conventionnelle. Avant de poursuivre, il est intéressant de distinguer les différents coûts liés à un crédit. Quand l'état ou un agent privé emprunte, il doit rembourser deux choses : les intérêts et le principal (la somme empruntée). Cela demande d’acquérir une certaine somme d'argent pour rembourser les intérêts et une autre pour rembourser le principal. La première somme est ce qu'on appelle la '''charge d'intérêt''' et l'autre est la '''charge de principal'''. La somme de la charge d'intérêt et du remboursement du principal donne la charge totale. Faire la distinction est important, car le Q.E et l'H.M n'impliquent pas les mêmes charges. ===L'emprunt sur les marchés : des coûts de financement élevés=== Sans politique monétaire conventionnelle, l'état emprunte sur les marchés à un taux défini par les marchés? Et sur les marchés financiers, l'état se trouve en compétition avec les autres sources d'épargne. Si l'état veut emprunter 100 millions d'euros supplémentaires, alors ces 100 millions vont devoir se faire une place entre les autres obligations d'entreprises et les marchés actions. En clair, la demande d'emprunt total (état + privé) va augmenter de 100 millions d'euros. Mais le stock d'épargne préexistant est fixe, du moins sur le court terme. Les marchés vont donc prendre 100 millions d'euros qui auraient dû atterrir en emprunt privé, pour les rediriger vers l’emprunt public. Pour résumer, l'emprunt public remplacera l'emprunt privé : c'est ce que l'on appelle l''''effet d'éviction'''. Ce faisant, la confrontation demande d'investissement - offre d'épargne va être chamboulée. Si on trace un graphe offre-demande, on voit rapidement que les taux d'intérêt augmentent. L'état doit fournir des taux plus élevés pour attirer les investisseurs. Les autres marchés vont devoir s'adapter et monter eux-mêmes leurs taux au même niveau, ce qui fait que tous les taux augmentent. L'emprunt direct augmente donc les taux d'intérêts, ce qui est un cout direct pour l'état. : ''Précisons cependant qu'il existe des situations où l'effet d'éviction ne se manifeste pas. Cela arrive notamment lors des situations de trappe à liquidité, y compris quand les taux d'intérêt sont à zéro. Dans ce cas, l'état peut emprunter comme il le souhaite sans que les taux d'intérêts augmentent. Cela n’empêche pas la banque centrale de rajouter une couche de QE par-dessus, histoire de baisser encore plus les couts d'emprunt pour l'état, mais cela n'est pas strictement nécessaire.'' ===L'assouplissement quantitatif : une réduction de la charge d'intérêt=== Le financement par QE se base sur un financement sur un financement par l'emprunt, couplé à une politique de QE. Avec QE ou emprunt seul, l'état se finance sur les marchés et mobilise de l'épargne pré-existante et l'effet d'éviction apparaît. Mais le Q.E permet de neutraliser l'effet d'éviction si on le calibre bien. Si l'état veut emprunter 100 millions, la banque centrale place 100 millions sur la table. Les marchés financent l'état à hauteur de 100 millions d'euros, la banque centrale rachète 100 millions d'euros de dettes, puis les marchés réinvestissent les 100 millions dans de l'investissement privé. Si on fait la somme comptable, la demande d'investissement a augmenté autant que l'offre d'épargne. En conséquence, les taux d'intérêt restent les mêmes, ce qui rend la mesure moins coûteuse pour l'état. L'état économise la hausse des taux d'intérêts, qui n'a pas lieu. De plus, rappelons que la dette de l'état acquise lors d'un Q.E est détenue par la banque centrale. L'état doit toujours la rembourser, mais il rembourse sa banque centrale et non des agents privés. Ce qui fait que le versement des intérêts et du principal se fait à la banque centrale. Au niveau comptable, les intérêts sont comptabilisés comme du profit, profit que la banque centrale reverse à l'état sous la forme de revenus de seigneuriage. Par contre, le principal n'est pas du profit et est comptabilisé comme remboursement d'un crédit. Et rappelons que la monnaie est détruite lors du remboursement d'un crédit, le remboursement de la dette d'état à la banque centrale ne faisant pas exception. En clair, la banque centrale détruit la monnaie du remboursement du principal et reverse tout ou partie des intérêts à l'état. L'économie est donc approximativement égale aux intérêts de la dette d'état, modulo quelques subtilités liées à la rémunération des réserves, comme on le verra plus bas. Avec ce qu'on vient de dire, on peut quantifier le gain apporté par le Q.E. Il correspond à l'économie d'intérêts apportée par une hausse de la base monétaire. Si l'état emprunte une somme D et que l'état rachète cette dette lors d'un Q.E, le gain est le suivant : : <math>S = i \times D</math>, avec D la somme empruntée et i le taux d'intérêt sur la dette. L'équation précédente devrait vous dire quelque chose si vous avez lu le chapitre précédent, de même que le raisonnement comme quoi le gain est une économie d'intérêt. Vous l'avez compris, ce gain n'est autre que le revenu de seigneuriage du Q.E. Et par revenu de seigneuriage, on veut dire seigneuriage définit comme le coût d'opportunité de la base monétaire. Mais nous avions vu que l'équation précédente n'est qu'une approximation et que la véritable équation prend aussi en compte la rémunération des réserves. Quand l'état fait du Q.E ou de l'hélicoptère monétaire, il n'a pas à emprunter l'argent créé. Il ne paye pas les intérêts sur une dette inexistante, ce qui fait une économie. En contrepartie, il doit rémunérer les réserves créées par sa politique, ce qui lui impose un cout supplémentaire, qui est souvent inférieur à l'économie sur la dette non-contractée. La véritable économie est donc égale à la différence entre économie d'intérêt sur la dette et rémunération des réserves, qui vaut approximativement : : <math>S = D \times (t_d - t_r)</math>, avec <math>t_r</math> le taux de rémunération des réserves et <math>t_d</math> le taux de la dette d'état. Le taux sur la dette d'état est le taux de long-terme, alors que le taux de rémunération des réserves est un des taux directeur de la banque centrale. On peut alors utiliser la relation : <math>i_{long} = i_{directeur} + p_r</math> entre les deux taux. En combinant avec l'équation précédente, on trouve : : <math>S = D \times p_r</math>, avec <math>p_r</math> la prime de risque de l'état. L'interprétation de cette équation est que le gain du Q.E dépend du risque de non-remboursement de l'état. Après tout, rien d'étonnant à cela, vu que les réserves sont un instrument sans risque, alors que la dette d'état est elle risquée (l'état peut ne pas la rembourser). Le gain pour l'état correspond à l’intérêt que les agents auraient fait payer à l'état pour le risque de non-remboursement de sa dette. De ce point de vue, le Q.E peut être vu assez grossièrement comme un remboursement anticipé de la dette par la banque centrale. Pour les économies développées, qui ont de bonnes chances de rembourser leur dette, l'état est un placement très peu risqué, la prime de risque est donc limité et le gain du Q.E assez faible. Par contre, le Q.E peut être mis en place suite à une récession ou un choc économique majeur, quand les taux sur la dette d'état sont au plafond et que la prime de risque est très élevée. Le Q.E est donc un très bon instrument quand les taux sont à zéro et que la prime de risque est assez élevée. ===La monnaie-hélicoptère : une réduction de la charge de la dette totale=== L'H.M existe sous plusieurs formes, qui ont des impacts différents sur la dette de l'état. Mais quel que soit la forme d'H.M utilisée, l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. De plus, le désendettement de l'état est plus rapide avec l'H.M qu'avec le Q.E, même si les raisons sont différentes selon que l'on annule la dette de l'état, qu'on la monétise ou qu'on donne de l'argent aux citoyens. Dans les deux premiers cas, le déficit de l'état est réduit et celui-ci peut en profiter pour se désendetter, bien que ce ne soit pas systématique. L'état peut profiter de la baisse du déficit non pas pour réduire sa dette, mais pour dépenser plus, ce qu'il faut faire en cas de récession. Mais avec la monnaie-hélicoptère proprement dite, à savoir donner de l'argent aux citoyens, l'effet sur le déficit n'est qu'indirect. Tout au plus, l'état peut donner de l'argent à ses citoyens sans s'endetter, ce qui lui permet d'augmenter ses dépenses sans coût fiscal direct. Voyons en revue les trois cas. Le cas le plus évident est celui où la banque centrale annule tout ou partie de la dette de l'état au bien de la banque centrale. Là, l'état se désendette d'une manière assez radicale, l'état n'ayant plus à payer une partie de sa dette. Cela entraîne une réduction de la charge totale, l'état n'ayant pas à rembourser le principal de la dette annulée, pas plus que les intérêts. On a alors une réduction de la charge d'intérêt et de la charge totale. Précisons que ce cas est très différent d'un simple Q.E. Avec le Q.E, l'état rembourse le principal et les intérêts à la banque centrale, cette dernière détruit ensuite la monnaie utilisée pour rembourser le principal et reverse les intérêts à l'état. Là où le Q.E permet à l'état de réduire sa charge d'intérêt et elle seule, l'H.M par annulation de dette d'état permet une réduction de la charge totale. Le désendettement de l'état est plus rapide avec l'H.M par annulation de dette publique que le Q.E et on devine donc que l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. Précisons cependant que cette annulation n'est pas sans coûts. En effet, l'annulation de la dette impacte négativement le bilan de la banque centrale. Concrètement, son actif et son passif diminuent tous deux, ce qui se répercute sur son capital. Au premier abord, cela n'a rien de bien problématique ni de coûteux, beaucoup de banques centrales ayant un capital négatif (les banques centrales sont d'ailleurs les seules à pouvoir le faire). Par contre, ce capital est généralement reconstitué par la banque centrale, qui va préférer récupérer le capital perdu. Pour cela, il y a deux solutions. * La première est que l'état recapitalise la banque centrale en injectant des fonds, pour faire revenir le capital de la banque centrale dans le positif. Mais cette situation est improbable et est même assez illogique. Pourquoi gagner de l'argent avec l'annulation, si c'est pour en perdre en recapitalisant la banque centrale ? Certes, l'état peut y gagner, à condition que la dette annulée soit supérieure à ce que l'état doit verser pour recapitaliser la banque centrale. Mais cela fait que le gain net pour l'état est fortement diminué. Concrètement, l'état gagne au maximum une somme équivalente au capital de la banque centrale, pas plus. Ensuite, si un état est en difficulté au point qu'il doive appeler sa banque centrale à annuler sa dette, d'où lui viendrait l'argent nécessaire pour recapitaliser sa banque centrale ? Et surtout, s'il a déjà cet argent, pourquoi ne l'utilise-t-il pas tout simplement pour rembourser sa dette en avance, ou racheter sa dette sur les marchés, ce qui reviendrait de fait à une annulation sans intervention de la banque centrale ? * Une autre solution est que la banque centrale se recapitalise avec les revenus de seigneuriage. C'est à dire qu'elle ne les verse pas à l'état et qu'elle les accumule pour faire remonter son capital. Ce faisant, on comprend que l'annulation n'est pas une politique sans coûts. Elle consiste à échanger un flux de revenus futurs contre une grosse somme d'argent immédiate. En théorie, on peut appliquer les formules du chapitre sur le canal des prix d'actifs et montrer que les deux solutions sont équivalentes, compte tenu de taux d'intérêts. Ce qu'on gagne d'un côté, on le perd de l'autre. Du moins, en première approximation et en oubliant que l'argent peut être plus utile maintenant que plus tard, par exemple si l'économie est en pleine récession. Pour le cas où la banque centrale donne de l'argent à l'état pour financer son déficit, l'effet sur la dette de l'état est indirect. Rappelons qu'un déficit budgétaire est généralement financé par l'émission de dette d'état supplémentaire sur les marchés. Le déficit de l'état étant totalement ou partiellement financé, la dette croît moins vite qu'elle n'aurait dû sans H.M. Cela peut aider l'état à faire des économies ou soulager sa pression financière, ce qui peut l'aider à se désendetter ou à garder une dette stable. Pour l'HM au sens strict, à savoir de l'argent donné aux ménages sans contrepartie, l'état ne se désendette pas, mais l'argent donné peut être utilisé par les agents privés pour se désendetter. Le désendettement est possible, mais est réalisé par les ménages, ce qui a des implications macroéconomiques différentes d'un désendettement de l'état. Notons que l'effet de se désendettement privé induit par l'H.M a des effets ambigus sur la masse monétaire. D'un côté, de la monnaie est créée par la banque centrale, de l'autre le désendettement signifie destruction de monnaie lors des remboursements. Au total, la création monétaire est partiellement compensée par la destruction monétaire par les banques, l'ampleur de la compensation dépendant de l'ampleur du désendettement. Si les deux se compensent totalement et que les taux d'intérêt restent les mêmes, la monnaie créé lors de l'HM est retournée à la banque centrale sous la forme de réserves. Mais dans les faits, l'HM a une influence indirecte sur les taux d'intérêts. Le désendettement entraîne une baisse de l'activité de crédit des banques,mais ces dernières réagissent en baissent leurs taux pour relancer le crédit. Elles sont d'autant plus incitées à le faire que le désendettement induit par l'HM réduit la prime de risque des crédits de nombreux emprunteurs, via les divers canaux du crédit qu'on a vu dans les chapitres antérieurs. Et qui baisse de prime de risque dit baisse des taux bancaires et donc relance de l'activité de crédit. Au final, la masse monétaire augmente bel et bien suite à l'HM , sauf situation exceptionnelle. Pour résumer, on peut classer les trois mesures suivant leur cout pour l'état : l'emprunt seul est la plus chère, le financement par QE est moins cher que l'emprunt seul, l'HM a un effet encore mal compris mais qui devrait être plus important que celui du Q.E. ==Les différences pratiques entre H.M et Q.E== Comme dit plus haut, l'assouplissement quantitatif et la monnaie-hélicoptère n'ont pas les mêmes effets en termes de financement. Mais on peut encore creuser ce point et montrer que les deux politiques n'ont pas les mêmes effets macroéconomiques. Si les deux partagent de nombreux points communs, elles ne se transmettent pas tout à fait de la même manière à l'économie réelle. Déjà, la mise en œuvre de l’assouplissement quantitatif est bien plus simple. L'assouplissement quantitatif demande juste de procéder à des opérations d'''open market'', là où la monnaie–hélicoptère au sens strict demande un transfert direct d'argent à l'état ou aux ménages. L'annulation des dettes de l'état au bilan de la banque centrale semble plus simple à mettre en œuvre, bien qu'aucune banque centrale ne l'ai jamais mise en œuvre. Ensuite, l'assouplissement quantitatif est mieux vu par les marchés que la monnaie-hélicoptère. Elle est considérée comme moins inflationniste et surtout, elle ne remet pas en cause l'indépendance des banques centrales. Rappelons que donner gratuitement de l'argent aux agents économiques est apparenté à une mesure fiscale, et est donc du ressort de l'état, non de la banque centrale. Sans compter que certaines mises en œuvre de la monnaie-hélicoptère se basent sur un transfert direct d'argent de la banque centrale vers l'état, ou une annulation partielle de sa dette... Autant dire que mettre en œuvre cette politique ruinerait la crédibilité de la banque centrale, ce qui pourrait faire plus de mal que de bien, du moins sur le long-terme. ==En savoir plus== * [https://www.nbb.be/doc/ts/publications/economicreview/2016/revecoiii2016_h2.pdf Hélicoptère monétaire et relance budgétaire financée par l'emprunt : du pareil au même ?] * [https://voxeu.org/article/helicopter-money-illusion-free-lunch Helicopter money: The illusion of a free lunch] * [https://voxeu.org/article/true-costs-helicopter-money The true costs of helicopter money]. <noinclude> {{NavChapitre | book=La politique monétaire | prev=Le seigneuriage | prevText=Le seigneuriage : la création monétaire au service de l'état | next=L'équation d'Euler de la consommation | nextText=L'équation d'Euler de la consommation }}{{autoCat}} </noinclude> r09lyi50ei281s5iwt16iv58fb8uug5 767843 767841 2026-06-16T15:02:54Z ~2026-35377-53 124021 767843 wikitext text/x-wiki Depuis les années 2008, à la suite de la crise financière, les banques centrales se sont mises à effectuer de l'assouplissement quantitatif (QE) à grande échelle. Beaucoup de commentateurs ont alors accusé ces politiques de monétiser la dette de l'état, sous-entendu de financer directement le déficit. Et l'accusation en question est rapide, pour ne pas dire complètement fausse. En soi, cette confusion n'est pas si stupide : le QE a beaucoup de points communs avec le financement de l'état, mais il s'en démarque cependant par de nombreux points. Dans cette section, nous allons dissiper ces malentendus et expliquer quelles sont les différences fondamentales entre ''hélicoptère money'' (HM), QE et financement normal de l'état. ==Les différentes politiques de financement d'un stimulus fiscal== Dans ce qui va suivre, nous allons supposer que l'état souhaite effectuer une politique de stimulus fiscal. Cela signifie qu'il souhaite baisser les impôts et taxes, ou alors qu'il souhaite verser de l'argent à ses citoyens. Qu'il s'agisse d'une baisse d'impôt ou d'une hausse des dépenses, il s'agit d'un stimulus fiscal, un stimulus budgétaire. Les dépenses peuvent être réparties comme l'état le souhaite : il peut décider d'augmenter le niveau des minimas sociaux, instaurer un revenu universel, faire un plan de relance de l'investissement, fournir des aides aux entreprises : peu importe. Pareil pour les baisses d'impôt, qui peuvent être générales ou ciblées sur une catégorie de la population. La nature exacte du stimulus, et sa mise en œuvre, spécifient qui touchera l'argent du stimulus fiscal. Et les conséquences ne seront donc pas les mêmes. Suivant comment cet argent est mis en circulation, l'effet macroéconomique favorisera certains secteurs, certaines catégories de la population. Certains deviendront plus riches, ou moins pauvres, d'autres pourront y perdre au change, etc. Au niveau macroéconomique, le stimulus peut avoir une influence sur le niveau des prix et la production, qui sera différente selon le secteur économique. Au niveau agrégé, le résultat est soit une augmentation des prix, soit une augmentation de la production, soit un mélange des deux. Les économistes estiment que l'effet sur les prix se manifeste surtout à long terme, bien qu'il puisse se manifester dès le court terme sui le stimulus est trop fort. Pour la production, l'effet est maximal à court terme, mais s'atténue avec le temps. En fait, le stimulus mobilise des capacités de production inutilisées par manque de demande. En stimulant la demande, les entreprises répondent en réutilisant les capacités de production qu'elles avaient mises en sommeil ou qui étaient en pause suite à une crise économique. Mais si le stimulus est trop fort, toutes les capacités de production sont utilisées et la demande en surplus se transforme en inflation. Précisons cependant que si les prix augmentent au niveau global, certains prix vont augmenter plus que d'autres. Et l'effet sur chaque prix dépend de l'endroit où la monnaie est injectée dans l'économie et de la manière dont elle se propage, dont elle circule. Cela s’appelle l''''effet Cantillon'''. Mais ce qui nous importe n'est pas l'effet du stimulus, mais son financement. Il existe plusieurs manières de financer un stimulus, qui se distinguent fortement par leurs effets. Les deux cas les plus simples sont les suivants : soit l'état se finance par le déficit en empruntant sur les marchés, soit la banque centrale finance directement ses dépenses. Plusieurs politiques sont possibles. * Avec la première, l'état emprunte l'argent du stimulus sur les marchés financiers. Cela mobilise de l'épargne existante, qui est remise en circulation par le stimulus. On parle alors de '''financement par l'emprunt'''. * Dans le second cas, l'état emprunte l'argent sur les marchés, mais la banque centrale rachète la dette associée via '''assouplissement quantitatif'''. C'est un cas particulier de financement par l'emprunt où la banque centrale stérilise les effets de l'emprunt. * Les autres méthodes correspondent au cas où la banque centrale intervient pour faciliter le financement du déficit. Elles sont regroupées sous le terme '''hélicoptère monétaire''', ou encore monnaie-hélicoptère - ''helicopter money'' (HM) en anglais. : ''Précisons que le QE peut être utilisé seul, sans emprunt associé, et ne sert pas forcément à financer les dettes de l'état. Par exemple, une banque centrale peut utiliser le QE pour relancer l'économie, sans que l'état n'utilise de relance fiscale de son côté. Mais le cas est quand même rare.'' : : KONATE Abdoul Karim. [[File:Modes de financement d'un stimulus fiscal.png|centre|vignette|upright=3.0|Modes de financement d'un stimulus fiscal.]] ===Les différentes formes d’hélicoptère monétaire=== Il existe plusieurs formes d'hélicoptère monétaire, qui sont considérées comme identiques du fait de leurs caractéristiques fortement semblables et de leurs effets macroéconomiques similaires. Dans les deux premiers cas, la banque centrale crée la monnaie du stimulus et verse celui-ci soit directement à l'état, soit aux ménages. Dans le troisième cas, la banque centrale annule la dette d'état qu'elle détient. S'il faut distinguer versement de la banque centrale à tous les citoyens et versement de la banque centrale à l'état, nous pouvons cependant faire la confusion tant les deux sont similaires du point de vue monétaire. Dans les deux cas, la base monétaire augmente : elle n'est juste pas distribuée aux mêmes agents économiques. Les trois méthodes permettent de financer le déficit de l'état, bien que ce soit par des moyens différents. Dans le cas où la banque centrale verse de l'argent au ménages, le financement est le plus direct possible. L'argent du stimulus fiscal est versé par la banque centrale, sans passer par le moindre intermédiaire. Dans le cas où la banque centrale donne de l'argent au trésor public, le transfert est indirect : la banque centrale donne de l'argent au trésor qui le redistribue aux ménages. Dans le troisième cas, il y a bien financement du déficit, bien qu'il ne soit pas évident. Le gain est lié au fait que l'état n'a pas à rembourser les échéances des dettes annulées. Les mensualités de remboursement et les intérêts disparaissent, ce qui lui fait de l'argent en moins à payer. Et cet argent en moins à payer est autant de déficit en moins et autant d'argent économisé pour l'état. ===L'étude comptable du financement de l'état=== Regardons maintenant ce qui se passe au niveau du bilan comptable de la banque centrale, quand l'état se finance. Suivant la situation, le bilan n'évoluera pas de la même manière. Le Q.E, le financement par l'emprunt et la monnaie-hélicoptère ont des conséquences très différentes. Le financement par l'emprunt n'implique aucune action de la part de la banque centrale, ce qui fait que son bilan reste inchangé. L'assouplissement quantitatif se traduit par l'augmentation des dettes publiques détenues par la banque centrale, donc une augmentation de son actif. Les dettes sont échangées contre des réserves bancaires par la banque centrale. On a donc une augmentation de l'actif (dettes achetées), mais aussi du passif (hausse des réserves), du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\uparrow</math> | Réserves bancaires <math>\uparrow</math> |- | - | - |} Au niveau comptable, les trois politiques d'hélicoptère monétaire entraînent une baisse des fonds propres de la banque centrale et/ou une création monétaire sans contrepartie. * Avec le versement d'argent aux ménages, la base monétaire augmente et l'argent crée est versé aux citoyens. Mais pour respecter l'égalité entre actif et passif, quelque chose doit diminuer. Ce quelque chose, c'est les fonds propres de la banque centrale, son capital. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) <math>\uparrow</math> |- | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec le versement d'argent à l'état, c'est la même chose, sauf que la base monétaire reste la même. L'argent est versé directement sur le compte du trésor et le capital de la banque centrale diminue du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) |- | Compte du trésor <math>\uparrow</math> |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec l'annulation de la dette publique, les choses sont plus compliquées. Les dettes sont présentes à l'actif, qui diminue donc du montant des dettes annulées. En conséquence, le passif diminue et c'est encore une fois le capital de la banque centrale qui encaisse le choc. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\downarrow</math> | Base monétaire (Espèces et réserves) |- | rowspan="2" | Autres actifs | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} ==L'hypothèse de l'équivalence ricardienne== Les trois politiques sont similaires dans le sens où elles injectent de la monnaie dans l'économie. Mais le sort de cette monnaie ne sera pas le même. Tout dépend de la manière dont les agents économiques vont réagir : vont-ils dépenser ou épargner l'argent du stimulus. S'ils l'épargnent, alors le stimulus n'a aucun effet macroéconomique notable. Les dépenses restent les mêmes, l'inflation reste stable, le chômage aussi, le PIB idem, etc. Par contre, si le stimulus augmente la dépense, alors c'est l'inverse : le chômage baisse, l'inflation repart, etc. Évidemment, la banque centrale peut toujours stériliser ces effets si l'inflation dépasse sa cible. Raison pour laquelle les politique de stimulus fiscal sont utilisées quand les stimulus monétaires ne servent plus, quand les taux d'intérêt sont à zéro et ne peuvent plus baisser, soit en trappe à liquidité. ===L'équivalence ricardienne=== Mais pourquoi les agents économiques épargneraient l'argent du stimulus ? Et bien tout dépend de s'ils s'attendent à devoir le rembourser plus tard. L'hypothèse de l''''équivalence ricardienne''' nous dit que les ménages vont anticiper les conséquences du stimulus et réagir en conséquence. Prenons un stimulus financé par l'emprunt. Les ménages vont se rendre compte que l'argent du stimulus est attaché à une dette, qui devra être remboursée plus tard. En conséquence, ils s'attendent à une augmentation des impôts et à une réduction des dépenses dans le futur. Ce faisant, ils épargnent l'argent du stimulus, afin de compenser l'austérité future. Et c'est une solution parfaitement rationnelle (trop, même). Si l'état dépense une somme X maintenant, il devra rembourser la somme <math>X (1+r)^n</math>, avec r le taux d'intérêt réel sur la dette d'état et N le nombre d'années avant remboursement. En plaçant la somme X sur un support rémunéré à r%, les agents pourront rembourser la dette du stimulus. Ce mécanisme est le même dans le cadre du QE : l'argent injecté dans l'économie peut être retiré par la banque centrale de la circulation. Les ménages vont donc conserver cet argent jusqu’à au moment où la banque centrale décidera de le retirer, afin de ne rien perdre. En théorie, c'est complètement différent pour l'HM. L'HM est supposé être une injection permanente de monnaie dans l'économie, qui ne peut pas être retiré de la circulation. En conséquence, les agents économiques n'ont pas besoin d'épargner l'argent du stimulus et le dépensent comme ils le souhaitent. L'équivalence ricardienne n'a donc aucune raison de tenir, rendant l'HM plus efficace que les autres méthodes pour stimuler l'inflation. La différence fondamentale entre QE et HM est donc son caractère '''temporaire/permanent''' : les agents s'attendent à ce que le QE/l'emprunt disparaisse et qu'il soit remboursé d'une manière ou d'une autre, alors que l'HM est permanent et n'est pas censé être remboursé. Plus précisément, c'est le caractère permanent/temporaire perçu par les agents économiques. Si les agents économiques s'attendent à ce que la création monétaire soit permanente, alors ils vont réagir en conséquence et dépenser l'argent du stimulus. Si à l'inverse ils anticipent que la création monétaire sera temporaire, ils vont décider d'épargner et cela annulera l'efficacité du stimulus. Et si l'HM est réellement permanent, rien n'indique que les agents économiques le verront ainsi, pareil pour le QE. Il se peut que les agents économiques anticipent une réaction de la banque centrale qui ne sera pas celle prévue dans les théories. Par exemple, si la banque centrale n'est pas crédible aux yeux des agents, les marchés réagiront différemment au QE. La banque centrale a beau lancer un QE de grande envergure et jurer que celui-ci sera maintenu durant très longtemps, le QE n'aura que peu d'impact si les agents n'y croient pas et épargnent au cas où. ===Une hypothèse respectée pour le Q.E, moins bien pour les autres méthodes de financement=== L'équivalence ricardienne semble fonctionner assez bien pour le QE : l'argent des différents QE a été conservé par les banques, au lieu d'être mis en circulation dans l'économie. Les banques ont échangé leurs obligations d'état contre des réserves bancaires, mais n'ont pas prêtées celles-ci. L'expérience des banques centrales américaines et européennes lors de la crise de 2008 sont assez parlantes : la totalité de l'argent du QE a été épargnée par les banques. La même chose a été observée lors de la crise japonaise de 1990, les politiques d'assouplissement quantitatif ayant fortement augmenté le bilan de la banque centrale. Aux États-Unis, la baisse sur les taux de long terme a été assez importante, de près d'un pour cent, mais les banques n'ont cependant pas décidé d’augmenter le volume de leurs prêts. Les autres pays ont eu une expérience similaire : pas d'augmentation notable du volume de prêts. Et pourtant, force est de constater que l'augmentation de la base monétaire a été très importante dans tous les cas étudiés, allant jusqu’à tripler ou quadrupler la base monétaire. [[File:Monetary Base United States 1959-01-01 2018-08-01.png|centre|vignette|upright=2.0|Évolution de la base monétaire américaine durant les dernières décennies. On voit qu'elle augmente fortement suite aux différents QE de 2008, signe que l'argent du QE a été épargné par les banques sous la forme de réserves bancaires.]] Une explication à cela est qu'elles n'avaient pas de demande de crédit à financer et qu'elles n'avaient pas d'autre choix que de les conserver. Une autre explication est que la rémunération des réserves incitait les banques à conserver leurs réserves. Mais on ne peut pas nier que les banques ont anticipé que le QE est une mesure temporaire. Les banques sont remplies de professionnels qui connaissent la finance et la macroéconomie sur le bout des doigts (en théorie), qui connaissent le caractère temporaire du QE. D'où, en théorie, le fait que les banques ont beaucoup épargné l'argent des différents QE. Bref : le QE permet de financer un stimulus, mais n'est en soi pas spécialement plus inflationniste que l'emprunt direct. L'argent du stimulus fiscal n'est pas complété par une mise en circulation de l'argent du QE. Précisons cependant que l'hypothèse d'équivalence ricardienne tient assez peu pour le financement par l'emprunt. En effet, beaucoup de ménages ne se rendent pas compte que le stimulus fiscal se traduira par des impôts plus élevés dans le futur. Et s'ils s'y attendent, ils ne vont pas forcément épargner l'argent du stimulus et vont quand même préférer le dépenser. Les ménages de la théorie économique néoclassique sont capables d'anticiper un tel phénomène et de réagir en conséquence, rationnels et optimiseurs qu'ils sont. Les agents économiques du monde réel sont cependant très différents. De plus, divers mécanismes empêchent l'équivalence ricardienne de fonctionner à plein. Quelques études estiment qu'à la louche, environ 50% de l'argent d'un stimulus financé par l'emprunt est dépensé et l'autre moitié est épargnée. Notons cependant que le niveau de dette peut avoir son influence et modérer ou accentuer les effets ricardiens. Si l'état est faiblement endetté, les agents économiques ne se préoccupent pas vraiment d'un emprunt supplémentaire et n'agissent pas de manière ricardienne. Mais pour un état fortement endetté, les agents peuvent réagir autrement : un fort niveau de dette signifie soit un défaut futur probable, soit de très forts impôts pour lesquels il vaut mieux se préparer. D'où l'apparition supposée d'un comportement ricardien à de forts niveaux de dette. Pour l'H.M, l'équivalence ricardienne n'est de toute façon pas censée se manifester. Mais on peut quand même estimer qu'une partie de l'argent de l'HM sera épargnée malgré tout. Cette politique n'ayant pas été mise en œuvre dans les pays développés, sous en quelques rares occasions et à petite échelle, on ne sait pas ce qu'il en est dans le monde réel. Mais il serait suspect que l'équivalence ricardienne tienne dans un tel cas de figure. Certes, les agents peuvent anticiper une sorte de remboursement de l'HM, sous la forme d'une politique monétaire stricte dans le futur, mais cela ne change rien tant que la banque centrale respecte sa cible d'inflation. L'HM, sous cette condition, est alors permanent dans le sens où il sert à remettre l'inflation sur les rails, comme cela aurait dû être le cas si la trappe à liquidité n'existait pas. Pour résumer, QE, financement par l'emprunt et HM sont trois politiques qui se placent sur un continuum en termes d'efficacité : le QE est le moins efficace de tous, l'HM est tellement inflationniste qu'il est considéré comme une arme atomique monétaire, alors que le financement par l'emprunt est un intermédiaire. ==Politique monétaire non-conventionnelle, coûts de financement et désendettement== Les politiques monétaires non-conventionnelles et la dette de l'état interagissent fortement. L'assouplissement quantitatif demande de racheter de la dette de l'état, certaines formes d'H.M se basent sur une annulation de la dette d'état au détenue par la banque centrale, et j'en passe. Intuitivement, Q.E et H.M permettent à l'état de monétiser leur dette, de se désendetter sans frais, sans avoir à taxer pour trouver de quoi rembourser. Mais comme on va le voir dans ce qui suit, les choses sont plus compliquées. Nous allons voir comment Q.E et H.M aident l'état à financer sa dette, et voir comment les agents privés se désendettent ou non suite à une politique monétaire non-conventionnelle. Avant de poursuivre, il est intéressant de distinguer les différents coûts liés à un crédit. Quand l'état ou un agent privé emprunte, il doit rembourser deux choses : les intérêts et le principal (la somme empruntée). Cela demande d’acquérir une certaine somme d'argent pour rembourser les intérêts et une autre pour rembourser le principal. La première somme est ce qu'on appelle la '''charge d'intérêt''' et l'autre est la '''charge de principal'''. La somme de la charge d'intérêt et du remboursement du principal donne la charge totale. Faire la distinction est important, car le Q.E et l'H.M n'impliquent pas les mêmes charges. ===L'emprunt sur les marchés : des coûts de financement élevés=== Sans politique monétaire conventionnelle, l'état emprunte sur les marchés à un taux défini par les marchés? Et sur les marchés financiers, l'état se trouve en compétition avec les autres sources d'épargne. Si l'état veut emprunter 100 millions d'euros supplémentaires, alors ces 100 millions vont devoir se faire une place entre les autres obligations d'entreprises et les marchés actions. En clair, la demande d'emprunt total (état + privé) va augmenter de 100 millions d'euros. Mais le stock d'épargne préexistant est fixe, du moins sur le court terme. Les marchés vont donc prendre 100 millions d'euros qui auraient dû atterrir en emprunt privé, pour les rediriger vers l’emprunt public. Pour résumer, l'emprunt public remplacera l'emprunt privé : c'est ce que l'on appelle l''''effet d'éviction'''. Ce faisant, la confrontation demande d'investissement - offre d'épargne va être chamboulée. Si on trace un graphe offre-demande, on voit rapidement que les taux d'intérêt augmentent. L'état doit fournir des taux plus élevés pour attirer les investisseurs. Les autres marchés vont devoir s'adapter et monter eux-mêmes leurs taux au même niveau, ce qui fait que tous les taux augmentent. L'emprunt direct augmente donc les taux d'intérêts, ce qui est un cout direct pour l'état. : ''Précisons cependant qu'il existe des situations où l'effet d'éviction ne se manifeste pas. Cela arrive notamment lors des situations de trappe à liquidité, y compris quand les taux d'intérêt sont à zéro. Dans ce cas, l'état peut emprunter comme il le souhaite sans que les taux d'intérêts augmentent. Cela n’empêche pas la banque centrale de rajouter une couche de QE par-dessus, histoire de baisser encore plus les couts d'emprunt pour l'état, mais cela n'est pas strictement nécessaire.'' ===L'assouplissement quantitatif : une réduction de la charge d'intérêt=== Le financement par QE se base sur un financement sur un financement par l'emprunt, couplé à une politique de QE. Avec QE ou emprunt seul, l'état se finance sur les marchés et mobilise de l'épargne pré-existante et l'effet d'éviction apparaît. Mais le Q.E permet de neutraliser l'effet d'éviction si on le calibre bien. Si l'état veut emprunter 100 millions, la banque centrale place 100 millions sur la table. Les marchés financent l'état à hauteur de 100 millions d'euros, la banque centrale rachète 100 millions d'euros de dettes, puis les marchés réinvestissent les 100 millions dans de l'investissement privé. Si on fait la somme comptable, la demande d'investissement a augmenté autant que l'offre d'épargne. En conséquence, les taux d'intérêt restent les mêmes, ce qui rend la mesure moins coûteuse pour l'état. L'état économise la hausse des taux d'intérêts, qui n'a pas lieu. De plus, rappelons que la dette de l'état acquise lors d'un Q.E est détenue par la banque centrale. L'état doit toujours la rembourser, mais il rembourse sa banque centrale et non des agents privés. Ce qui fait que le versement des intérêts et du principal se fait à la banque centrale. Au niveau comptable, les intérêts sont comptabilisés comme du profit, profit que la banque centrale reverse à l'état sous la forme de revenus de seigneuriage. Par contre, le principal n'est pas du profit et est comptabilisé comme remboursement d'un crédit. Et rappelons que la monnaie est détruite lors du remboursement d'un crédit, le remboursement de la dette d'état à la banque centrale ne faisant pas exception. En clair, la banque centrale détruit la monnaie du remboursement du principal et reverse tout ou partie des intérêts à l'état. L'économie est donc approximativement égale aux intérêts de la dette d'état, modulo quelques subtilités liées à la rémunération des réserves, comme on le verra plus bas. Avec ce qu'on vient de dire, on peut quantifier le gain apporté par le Q.E. Il correspond à l'économie d'intérêts apportée par une hausse de la base monétaire. Si l'état emprunte une somme D et que l'état rachète cette dette lors d'un Q.E, le gain est le suivant : : <math>S = i \times D</math>, avec D la somme empruntée et i le taux d'intérêt sur la dette. L'équation précédente devrait vous dire quelque chose si vous avez lu le chapitre précédent, de même que le raisonnement comme quoi le gain est une économie d'intérêt. Vous l'avez compris, ce gain n'est autre que le revenu de seigneuriage du Q.E. Et par revenu de seigneuriage, on veut dire seigneuriage définit comme le coût d'opportunité de la base monétaire. Mais nous avions vu que l'équation précédente n'est qu'une approximation et que la véritable équation prend aussi en compte la rémunération des réserves. Quand l'état fait du Q.E ou de l'hélicoptère monétaire, il n'a pas à emprunter l'argent créé. Il ne paye pas les intérêts sur une dette inexistante, ce qui fait une économie. En contrepartie, il doit rémunérer les réserves créées par sa politique, ce qui lui impose un cout supplémentaire, qui est souvent inférieur à l'économie sur la dette non-contractée. La véritable économie est donc égale à la différence entre économie d'intérêt sur la dette et rémunération des réserves, qui vaut approximativement : : <math>S = D \times (t_d - t_r)</math>, avec <math>t_r</math> le taux de rémunération des réserves et <math>t_d</math> le taux de la dette d'état. Le taux sur la dette d'état est le taux de long-terme, alors que le taux de rémunération des réserves est un des taux directeur de la banque centrale. On peut alors utiliser la relation : <math>i_{long} = i_{directeur} + p_r</math> entre les deux taux. En combinant avec l'équation précédente, on trouve : : <math>S = D \times p_r</math>, avec <math>p_r</math> la prime de risque de l'état. L'interprétation de cette équation est que le gain du Q.E dépend du risque de non-remboursement de l'état. Après tout, rien d'étonnant à cela, vu que les réserves sont un instrument sans risque, alors que la dette d'état est elle risquée (l'état peut ne pas la rembourser). Le gain pour l'état correspond à l’intérêt que les agents auraient fait payer à l'état pour le risque de non-remboursement de sa dette. De ce point de vue, le Q.E peut être vu assez grossièrement comme un remboursement anticipé de la dette par la banque centrale. Pour les économies développées, qui ont de bonnes chances de rembourser leur dette, l'état est un placement très peu risqué, la prime de risque est donc limité et le gain du Q.E assez faible. Par contre, le Q.E peut être mis en place suite à une récession ou un choc économique majeur, quand les taux sur la dette d'état sont au plafond et que la prime de risque est très élevée. Le Q.E est donc un très bon instrument quand les taux sont à zéro et que la prime de risque est assez élevée. ===La monnaie-hélicoptère : une réduction de la charge de la dette totale=== L'H.M existe sous plusieurs formes, qui ont des impacts différents sur la dette de l'état. Mais quel que soit la forme d'H.M utilisée, l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. De plus, le désendettement de l'état est plus rapide avec l'H.M qu'avec le Q.E, même si les raisons sont différentes selon que l'on annule la dette de l'état, qu'on la monétise ou qu'on donne de l'argent aux citoyens. Dans les deux premiers cas, le déficit de l'état est réduit et celui-ci peut en profiter pour se désendetter, bien que ce ne soit pas systématique. L'état peut profiter de la baisse du déficit non pas pour réduire sa dette, mais pour dépenser plus, ce qu'il faut faire en cas de récession. Mais avec la monnaie-hélicoptère proprement dite, à savoir donner de l'argent aux citoyens, l'effet sur le déficit n'est qu'indirect. Tout au plus, l'état peut donner de l'argent à ses citoyens sans s'endetter, ce qui lui permet d'augmenter ses dépenses sans coût fiscal direct. Voyons en revue les trois cas. Le cas le plus évident est celui où la banque centrale annule tout ou partie de la dette de l'état au bien de la banque centrale. Là, l'état se désendette d'une manière assez radicale, l'état n'ayant plus à payer une partie de sa dette. Cela entraîne une réduction de la charge totale, l'état n'ayant pas à rembourser le principal de la dette annulée, pas plus que les intérêts. On a alors une réduction de la charge d'intérêt et de la charge totale. Précisons que ce cas est très différent d'un simple Q.E. Avec le Q.E, l'état rembourse le principal et les intérêts à la banque centrale, cette dernière détruit ensuite la monnaie utilisée pour rembourser le principal et reverse les intérêts à l'état. Là où le Q.E permet à l'état de réduire sa charge d'intérêt et elle seule, l'H.M par annulation de dette d'état permet une réduction de la charge totale. Le désendettement de l'état est plus rapide avec l'H.M par annulation de dette publique que le Q.E et on devine donc que l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. Précisons cependant que cette annulation n'est pas sans coûts. En effet, l'annulation de la dette impacte négativement le bilan de la banque centrale. Concrètement, son actif et son passif diminuent tous deux, ce qui se répercute sur son capital. Au premier abord, cela n'a rien de bien problématique ni de coûteux, beaucoup de banques centrales ayant un capital négatif (les banques centrales sont d'ailleurs les seules à pouvoir le faire). Par contre, ce capital est généralement reconstitué par la banque centrale, qui va préférer récupérer le capital perdu. Pour cela, il y a deux solutions. * La première est que l'état recapitalise la banque centrale en injectant des fonds, pour faire revenir le capital de la banque centrale dans le positif. Mais cette situation est improbable et est même assez illogique. Pourquoi gagner de l'argent avec l'annulation, si c'est pour en perdre en recapitalisant la banque centrale ? Certes, l'état peut y gagner, à condition que la dette annulée soit supérieure à ce que l'état doit verser pour recapitaliser la banque centrale. Mais cela fait que le gain net pour l'état est fortement diminué. Concrètement, l'état gagne au maximum une somme équivalente au capital de la banque centrale, pas plus. Ensuite, si un état est en difficulté au point qu'il doive appeler sa banque centrale à annuler sa dette, d'où lui viendrait l'argent nécessaire pour recapitaliser sa banque centrale ? Et surtout, s'il a déjà cet argent, pourquoi ne l'utilise-t-il pas tout simplement pour rembourser sa dette en avance, ou racheter sa dette sur les marchés, ce qui reviendrait de fait à une annulation sans intervention de la banque centrale ? * Une autre solution est que la banque centrale se recapitalise avec les revenus de seigneuriage. C'est à dire qu'elle ne les verse pas à l'état et qu'elle les accumule pour faire remonter son capital. Ce faisant, on comprend que l'annulation n'est pas une politique sans coûts. Elle consiste à échanger un flux de revenus futurs contre une grosse somme d'argent immédiate. En théorie, on peut appliquer les formules du chapitre sur le canal des prix d'actifs et montrer que les deux solutions sont équivalentes, compte tenu de taux d'intérêts. Ce qu'on gagne d'un côté, on le perd de l'autre. Du moins, en première approximation et en oubliant que l'argent peut être plus utile maintenant que plus tard, par exemple si l'économie est en pleine récession. Pour le cas où la banque centrale donne de l'argent à l'état pour financer son déficit, l'effet sur la dette de l'état est indirect. Rappelons qu'un déficit budgétaire est généralement financé par l'émission de dette d'état supplémentaire sur les marchés. Le déficit de l'état étant totalement ou partiellement financé, la dette croît moins vite qu'elle n'aurait dû sans H.M. Cela peut aider l'état à faire des économies ou soulager sa pression financière, ce qui peut l'aider à se désendetter ou à garder une dette stable. Pour l'HM au sens strict, à savoir de l'argent donné aux ménages sans contrepartie, l'état ne se désendette pas, mais l'argent donné peut être utilisé par les agents privés pour se désendetter. Le désendettement est possible, mais est réalisé par les ménages, ce qui a des implications macroéconomiques différentes d'un désendettement de l'état. Notons que l'effet de se désendettement privé induit par l'H.M a des effets ambigus sur la masse monétaire. D'un côté, de la monnaie est créée par la banque centrale, de l'autre le désendettement signifie destruction de monnaie lors des remboursements. Au total, la création monétaire est partiellement compensée par la destruction monétaire par les banques, l'ampleur de la compensation dépendant de l'ampleur du désendettement. Si les deux se compensent totalement et que les taux d'intérêt restent les mêmes, la monnaie créé lors de l'HM est retournée à la banque centrale sous la forme de réserves. Mais dans les faits, l'HM a une influence indirecte sur les taux d'intérêts. Le désendettement entraîne une baisse de l'activité de crédit des banques,mais ces dernières réagissent en baissent leurs taux pour relancer le crédit. Elles sont d'autant plus incitées à le faire que le désendettement induit par l'HM réduit la prime de risque des crédits de nombreux emprunteurs, via les divers canaux du crédit qu'on a vu dans les chapitres antérieurs. Et qui baisse de prime de risque dit baisse des taux bancaires et donc relance de l'activité de crédit. Au final, la masse monétaire augmente bel et bien suite à l'HM , sauf situation exceptionnelle. Pour résumer, on peut classer les trois mesures suivant leur cout pour l'état : l'emprunt seul est la plus chère, le financement par QE est moins cher que l'emprunt seul, l'HM a un effet encore mal compris mais qui devrait être plus important que celui du Q.E. ==Les différences pratiques entre H.M et Q.E== Comme dit plus haut, l'assouplissement quantitatif et la monnaie-hélicoptère n'ont pas les mêmes effets en termes de financement. Mais on peut encore creuser ce point et montrer que les deux politiques n'ont pas les mêmes effets macroéconomiques. Si les deux partagent de nombreux points communs, elles ne se transmettent pas tout à fait de la même manière à l'économie réelle. Déjà, la mise en œuvre de l’assouplissement quantitatif est bien plus simple. L'assouplissement quantitatif demande juste de procéder à des opérations d'''open market'', là où la monnaie–hélicoptère au sens strict demande un transfert direct d'argent à l'état ou aux ménages. L'annulation des dettes de l'état au bilan de la banque centrale semble plus simple à mettre en œuvre, bien qu'aucune banque centrale ne l'ai jamais mise en œuvre. Ensuite, l'assouplissement quantitatif est mieux vu par les marchés que la monnaie-hélicoptère. Elle est considérée comme moins inflationniste et surtout, elle ne remet pas en cause l'indépendance des banques centrales. Rappelons que donner gratuitement de l'argent aux agents économiques est apparenté à une mesure fiscale, et est donc du ressort de l'état, non de la banque centrale. Sans compter que certaines mises en œuvre de la monnaie-hélicoptère se basent sur un transfert direct d'argent de la banque centrale vers l'état, ou une annulation partielle de sa dette... Autant dire que mettre en œuvre cette politique ruinerait la crédibilité de la banque centrale, ce qui pourrait faire plus de mal que de bien, du moins sur le long-terme. ==En savoir plus== * [https://www.nbb.be/doc/ts/publications/economicreview/2016/revecoiii2016_h2.pdf Hélicoptère monétaire et relance budgétaire financée par l'emprunt : du pareil au même ?] * [https://voxeu.org/article/helicopter-money-illusion-free-lunch Helicopter money: The illusion of a free lunch] * [https://voxeu.org/article/true-costs-helicopter-money The true costs of helicopter money]. <noinclude> {{NavChapitre | book=La politique monétaire | prev=Le seigneuriage | prevText=Le seigneuriage : la création monétaire au service de l'état | next=L'équation d'Euler de la consommation | nextText=L'équation d'Euler de la consommation }}{{autoCat}} </noinclude> 3h2cgdj0te9kxembhkxcvdnimfuzgzn 767850 767843 2026-06-16T19:04:49Z Mewtow 31375 Annulation de la modification [[Special:Diff/767843|767843]] de [[Special:Contributions/~2026-35377-53|~2026-35377-53]] ([[User talk:~2026-35377-53|discussion]]) 767850 wikitext text/x-wiki Depuis les années 2008, à la suite de la crise financière, les banques centrales se sont mises à effectuer de l'assouplissement quantitatif (QE) à grande échelle. Beaucoup de commentateurs ont alors accusé ces politiques de monétiser la dette de l'état, sous-entendu de financer directement le déficit. Et l'accusation en question est rapide, pour ne pas dire complètement fausse. En soi, cette confusion n'est pas si stupide : le QE a beaucoup de points communs avec le financement de l'état, mais il s'en démarque cependant par de nombreux points. Dans cette section, nous allons dissiper ces malentendus et expliquer quelles sont les différences fondamentales entre ''hélicoptère money'' (HM), QE et financement normal de l'état. ==Les différentes politiques de financement d'un stimulus fiscal== Dans ce qui va suivre, nous allons supposer que l'état souhaite effectuer une politique de stimulus fiscal. Cela signifie qu'il souhaite baisser les impôts et taxes, ou alors qu'il souhaite verser de l'argent à ses citoyens. Qu'il s'agisse d'une baisse d'impôt ou d'une hausse des dépenses, il s'agit d'un stimulus fiscal, un stimulus budgétaire. Les dépenses peuvent être réparties comme l'état le souhaite : il peut décider d'augmenter le niveau des minimas sociaux, instaurer un revenu universel, faire un plan de relance de l'investissement, fournir des aides aux entreprises : peu importe. Pareil pour les baisses d'impôt, qui peuvent être générales ou ciblées sur une catégorie de la population. La nature exacte du stimulus, et sa mise en œuvre, spécifient qui touchera l'argent du stimulus fiscal. Et les conséquences ne seront donc pas les mêmes. Suivant comment cet argent est mis en circulation, l'effet macroéconomique favorisera certains secteurs, certaines catégories de la population. Certains deviendront plus riches, ou moins pauvres, d'autres pourront y perdre au change, etc. Au niveau macroéconomique, le stimulus peut avoir une influence sur le niveau des prix et la production, qui sera différente selon le secteur économique. Au niveau agrégé, le résultat est soit une augmentation des prix, soit une augmentation de la production, soit un mélange des deux. Les économistes estiment que l'effet sur les prix se manifeste surtout à long terme, bien qu'il puisse se manifester dès le court terme sui le stimulus est trop fort. Pour la production, l'effet est maximal à court terme, mais s'atténue avec le temps. En fait, le stimulus mobilise des capacités de production inutilisées par manque de demande. En stimulant la demande, les entreprises répondent en réutilisant les capacités de production qu'elles avaient mises en sommeil ou qui étaient en pause suite à une crise économique. Mais si le stimulus est trop fort, toutes les capacités de production sont utilisées et la demande en surplus se transforme en inflation. Précisons cependant que si les prix augmentent au niveau global, certains prix vont augmenter plus que d'autres. Et l'effet sur chaque prix dépend de l'endroit où la monnaie est injectée dans l'économie et de la manière dont elle se propage, dont elle circule. Cela s’appelle l''''effet Cantillon'''. Mais ce qui nous importe n'est pas l'effet du stimulus, mais son financement. Il existe plusieurs manières de financer un stimulus, qui se distinguent fortement par leurs effets. Les deux cas les plus simples sont les suivants : soit l'état se finance par le déficit en empruntant sur les marchés, soit la banque centrale finance directement ses dépenses. Plusieurs politiques sont possibles. * Avec la première, l'état emprunte l'argent du stimulus sur les marchés financiers. Cela mobilise de l'épargne existante, qui est remise en circulation par le stimulus. On parle alors de '''financement par l'emprunt'''. * Dans le second cas, l'état emprunte l'argent sur les marchés, mais la banque centrale rachète la dette associée via '''assouplissement quantitatif'''. C'est un cas particulier de financement par l'emprunt où la banque centrale stérilise les effets de l'emprunt. * Les autres méthodes correspondent au cas où la banque centrale intervient pour faciliter le financement du déficit. Elles sont regroupées sous le terme '''hélicoptère monétaire''', ou encore monnaie-hélicoptère - ''helicopter money'' (HM) en anglais. : ''Précisons que le QE peut être utilisé seul, sans emprunt associé, et ne sert pas forcément à financer les dettes de l'état. Par exemple, une banque centrale peut utiliser le QE pour relancer l'économie, sans que l'état n'utilise de relance fiscale de son côté. Mais le cas est quand même rare.'' [[File:Modes de financement d'un stimulus fiscal.png|centre|vignette|upright=3.0|Modes de financement d'un stimulus fiscal.]] ===Les différentes formes d’hélicoptère monétaire=== Il existe plusieurs formes d'hélicoptère monétaire, qui sont considérées comme identiques du fait de leurs caractéristiques fortement semblables et de leurs effets macroéconomiques similaires. Dans les deux premiers cas, la banque centrale crée la monnaie du stimulus et verse celui-ci soit directement à l'état, soit aux ménages. Dans le troisième cas, la banque centrale annule la dette d'état qu'elle détient. S'il faut distinguer versement de la banque centrale à tous les citoyens et versement de la banque centrale à l'état, nous pouvons cependant faire la confusion tant les deux sont similaires du point de vue monétaire. Dans les deux cas, la base monétaire augmente : elle n'est juste pas distribuée aux mêmes agents économiques. Les trois méthodes permettent de financer le déficit de l'état, bien que ce soit par des moyens différents. Dans le cas où la banque centrale verse de l'argent au ménages, le financement est le plus direct possible. L'argent du stimulus fiscal est versé par la banque centrale, sans passer par le moindre intermédiaire. Dans le cas où la banque centrale donne de l'argent au trésor public, le transfert est indirect : la banque centrale donne de l'argent au trésor qui le redistribue aux ménages. Dans le troisième cas, il y a bien financement du déficit, bien qu'il ne soit pas évident. Le gain est lié au fait que l'état n'a pas à rembourser les échéances des dettes annulées. Les mensualités de remboursement et les intérêts disparaissent, ce qui lui fait de l'argent en moins à payer. Et cet argent en moins à payer est autant de déficit en moins et autant d'argent économisé pour l'état. ===L'étude comptable du financement de l'état=== Regardons maintenant ce qui se passe au niveau du bilan comptable de la banque centrale, quand l'état se finance. Suivant la situation, le bilan n'évoluera pas de la même manière. Le Q.E, le financement par l'emprunt et la monnaie-hélicoptère ont des conséquences très différentes. Le financement par l'emprunt n'implique aucune action de la part de la banque centrale, ce qui fait que son bilan reste inchangé. L'assouplissement quantitatif se traduit par l'augmentation des dettes publiques détenues par la banque centrale, donc une augmentation de son actif. Les dettes sont échangées contre des réserves bancaires par la banque centrale. On a donc une augmentation de l'actif (dettes achetées), mais aussi du passif (hausse des réserves), du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\uparrow</math> | Réserves bancaires <math>\uparrow</math> |- | - | - |} Au niveau comptable, les trois politiques d'hélicoptère monétaire entraînent une baisse des fonds propres de la banque centrale et/ou une création monétaire sans contrepartie. * Avec le versement d'argent aux ménages, la base monétaire augmente et l'argent crée est versé aux citoyens. Mais pour respecter l'égalité entre actif et passif, quelque chose doit diminuer. Ce quelque chose, c'est les fonds propres de la banque centrale, son capital. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) <math>\uparrow</math> |- | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec le versement d'argent à l'état, c'est la même chose, sauf que la base monétaire reste la même. L'argent est versé directement sur le compte du trésor et le capital de la banque centrale diminue du même montant. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | rowspan="3" | - | Base monétaire (Espèces et réserves) |- | Compte du trésor <math>\uparrow</math> |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} * Avec l'annulation de la dette publique, les choses sont plus compliquées. Les dettes sont présentes à l'actif, qui diminue donc du montant des dettes annulées. En conséquence, le passif diminue et c'est encore une fois le capital de la banque centrale qui encaisse le choc. {|class="wikitable" |+Bilan comptable de la banque centrale |- ! Actif ! Passif |- | Dette publique <math>\downarrow</math> | Base monétaire (Espèces et réserves) |- | rowspan="2" | Autres actifs | Compte du trésor |- | Capital de la banque centrale (fonds propres) <math>\downarrow</math> |} ==L'hypothèse de l'équivalence ricardienne== Les trois politiques sont similaires dans le sens où elles injectent de la monnaie dans l'économie. Mais le sort de cette monnaie ne sera pas le même. Tout dépend de la manière dont les agents économiques vont réagir : vont-ils dépenser ou épargner l'argent du stimulus. S'ils l'épargnent, alors le stimulus n'a aucun effet macroéconomique notable. Les dépenses restent les mêmes, l'inflation reste stable, le chômage aussi, le PIB idem, etc. Par contre, si le stimulus augmente la dépense, alors c'est l'inverse : le chômage baisse, l'inflation repart, etc. Évidemment, la banque centrale peut toujours stériliser ces effets si l'inflation dépasse sa cible. Raison pour laquelle les politique de stimulus fiscal sont utilisées quand les stimulus monétaires ne servent plus, quand les taux d'intérêt sont à zéro et ne peuvent plus baisser, soit en trappe à liquidité. ===L'équivalence ricardienne=== Mais pourquoi les agents économiques épargneraient l'argent du stimulus ? Et bien tout dépend de s'ils s'attendent à devoir le rembourser plus tard. L'hypothèse de l''''équivalence ricardienne''' nous dit que les ménages vont anticiper les conséquences du stimulus et réagir en conséquence. Prenons un stimulus financé par l'emprunt. Les ménages vont se rendre compte que l'argent du stimulus est attaché à une dette, qui devra être remboursée plus tard. En conséquence, ils s'attendent à une augmentation des impôts et à une réduction des dépenses dans le futur. Ce faisant, ils épargnent l'argent du stimulus, afin de compenser l'austérité future. Et c'est une solution parfaitement rationnelle (trop, même). Si l'état dépense une somme X maintenant, il devra rembourser la somme <math>X (1+r)^n</math>, avec r le taux d'intérêt réel sur la dette d'état et N le nombre d'années avant remboursement. En plaçant la somme X sur un support rémunéré à r%, les agents pourront rembourser la dette du stimulus. Ce mécanisme est le même dans le cadre du QE : l'argent injecté dans l'économie peut être retiré par la banque centrale de la circulation. Les ménages vont donc conserver cet argent jusqu’à au moment où la banque centrale décidera de le retirer, afin de ne rien perdre. En théorie, c'est complètement différent pour l'HM. L'HM est supposé être une injection permanente de monnaie dans l'économie, qui ne peut pas être retiré de la circulation. En conséquence, les agents économiques n'ont pas besoin d'épargner l'argent du stimulus et le dépensent comme ils le souhaitent. L'équivalence ricardienne n'a donc aucune raison de tenir, rendant l'HM plus efficace que les autres méthodes pour stimuler l'inflation. La différence fondamentale entre QE et HM est donc son caractère '''temporaire/permanent''' : les agents s'attendent à ce que le QE/l'emprunt disparaisse et qu'il soit remboursé d'une manière ou d'une autre, alors que l'HM est permanent et n'est pas censé être remboursé. Plus précisément, c'est le caractère permanent/temporaire perçu par les agents économiques. Si les agents économiques s'attendent à ce que la création monétaire soit permanente, alors ils vont réagir en conséquence et dépenser l'argent du stimulus. Si à l'inverse ils anticipent que la création monétaire sera temporaire, ils vont décider d'épargner et cela annulera l'efficacité du stimulus. Et si l'HM est réellement permanent, rien n'indique que les agents économiques le verront ainsi, pareil pour le QE. Il se peut que les agents économiques anticipent une réaction de la banque centrale qui ne sera pas celle prévue dans les théories. Par exemple, si la banque centrale n'est pas crédible aux yeux des agents, les marchés réagiront différemment au QE. La banque centrale a beau lancer un QE de grande envergure et jurer que celui-ci sera maintenu durant très longtemps, le QE n'aura que peu d'impact si les agents n'y croient pas et épargnent au cas où. ===Une hypothèse respectée pour le Q.E, moins bien pour les autres méthodes de financement=== L'équivalence ricardienne semble fonctionner assez bien pour le QE : l'argent des différents QE a été conservé par les banques, au lieu d'être mis en circulation dans l'économie. Les banques ont échangé leurs obligations d'état contre des réserves bancaires, mais n'ont pas prêtées celles-ci. L'expérience des banques centrales américaines et européennes lors de la crise de 2008 sont assez parlantes : la totalité de l'argent du QE a été épargnée par les banques. La même chose a été observée lors de la crise japonaise de 1990, les politiques d'assouplissement quantitatif ayant fortement augmenté le bilan de la banque centrale. Aux États-Unis, la baisse sur les taux de long terme a été assez importante, de près d'un pour cent, mais les banques n'ont cependant pas décidé d’augmenter le volume de leurs prêts. Les autres pays ont eu une expérience similaire : pas d'augmentation notable du volume de prêts. Et pourtant, force est de constater que l'augmentation de la base monétaire a été très importante dans tous les cas étudiés, allant jusqu’à tripler ou quadrupler la base monétaire. [[File:Monetary Base United States 1959-01-01 2018-08-01.png|centre|vignette|upright=2.0|Évolution de la base monétaire américaine durant les dernières décennies. On voit qu'elle augmente fortement suite aux différents QE de 2008, signe que l'argent du QE a été épargné par les banques sous la forme de réserves bancaires.]] Une explication à cela est qu'elles n'avaient pas de demande de crédit à financer et qu'elles n'avaient pas d'autre choix que de les conserver. Une autre explication est que la rémunération des réserves incitait les banques à conserver leurs réserves. Mais on ne peut pas nier que les banques ont anticipé que le QE est une mesure temporaire. Les banques sont remplies de professionnels qui connaissent la finance et la macroéconomie sur le bout des doigts (en théorie), qui connaissent le caractère temporaire du QE. D'où, en théorie, le fait que les banques ont beaucoup épargné l'argent des différents QE. Bref : le QE permet de financer un stimulus, mais n'est en soi pas spécialement plus inflationniste que l'emprunt direct. L'argent du stimulus fiscal n'est pas complété par une mise en circulation de l'argent du QE. Précisons cependant que l'hypothèse d'équivalence ricardienne tient assez peu pour le financement par l'emprunt. En effet, beaucoup de ménages ne se rendent pas compte que le stimulus fiscal se traduira par des impôts plus élevés dans le futur. Et s'ils s'y attendent, ils ne vont pas forcément épargner l'argent du stimulus et vont quand même préférer le dépenser. Les ménages de la théorie économique néoclassique sont capables d'anticiper un tel phénomène et de réagir en conséquence, rationnels et optimiseurs qu'ils sont. Les agents économiques du monde réel sont cependant très différents. De plus, divers mécanismes empêchent l'équivalence ricardienne de fonctionner à plein. Quelques études estiment qu'à la louche, environ 50% de l'argent d'un stimulus financé par l'emprunt est dépensé et l'autre moitié est épargnée. Notons cependant que le niveau de dette peut avoir son influence et modérer ou accentuer les effets ricardiens. Si l'état est faiblement endetté, les agents économiques ne se préoccupent pas vraiment d'un emprunt supplémentaire et n'agissent pas de manière ricardienne. Mais pour un état fortement endetté, les agents peuvent réagir autrement : un fort niveau de dette signifie soit un défaut futur probable, soit de très forts impôts pour lesquels il vaut mieux se préparer. D'où l'apparition supposée d'un comportement ricardien à de forts niveaux de dette. Pour l'H.M, l'équivalence ricardienne n'est de toute façon pas censée se manifester. Mais on peut quand même estimer qu'une partie de l'argent de l'HM sera épargnée malgré tout. Cette politique n'ayant pas été mise en œuvre dans les pays développés, sous en quelques rares occasions et à petite échelle, on ne sait pas ce qu'il en est dans le monde réel. Mais il serait suspect que l'équivalence ricardienne tienne dans un tel cas de figure. Certes, les agents peuvent anticiper une sorte de remboursement de l'HM, sous la forme d'une politique monétaire stricte dans le futur, mais cela ne change rien tant que la banque centrale respecte sa cible d'inflation. L'HM, sous cette condition, est alors permanent dans le sens où il sert à remettre l'inflation sur les rails, comme cela aurait dû être le cas si la trappe à liquidité n'existait pas. Pour résumer, QE, financement par l'emprunt et HM sont trois politiques qui se placent sur un continuum en termes d'efficacité : le QE est le moins efficace de tous, l'HM est tellement inflationniste qu'il est considéré comme une arme atomique monétaire, alors que le financement par l'emprunt est un intermédiaire. ==Politique monétaire non-conventionnelle, coûts de financement et désendettement== Les politiques monétaires non-conventionnelles et la dette de l'état interagissent fortement. L'assouplissement quantitatif demande de racheter de la dette de l'état, certaines formes d'H.M se basent sur une annulation de la dette d'état au détenue par la banque centrale, et j'en passe. Intuitivement, Q.E et H.M permettent à l'état de monétiser leur dette, de se désendetter sans frais, sans avoir à taxer pour trouver de quoi rembourser. Mais comme on va le voir dans ce qui suit, les choses sont plus compliquées. Nous allons voir comment Q.E et H.M aident l'état à financer sa dette, et voir comment les agents privés se désendettent ou non suite à une politique monétaire non-conventionnelle. Avant de poursuivre, il est intéressant de distinguer les différents coûts liés à un crédit. Quand l'état ou un agent privé emprunte, il doit rembourser deux choses : les intérêts et le principal (la somme empruntée). Cela demande d’acquérir une certaine somme d'argent pour rembourser les intérêts et une autre pour rembourser le principal. La première somme est ce qu'on appelle la '''charge d'intérêt''' et l'autre est la '''charge de principal'''. La somme de la charge d'intérêt et du remboursement du principal donne la charge totale. Faire la distinction est important, car le Q.E et l'H.M n'impliquent pas les mêmes charges. ===L'emprunt sur les marchés : des coûts de financement élevés=== Sans politique monétaire conventionnelle, l'état emprunte sur les marchés à un taux défini par les marchés? Et sur les marchés financiers, l'état se trouve en compétition avec les autres sources d'épargne. Si l'état veut emprunter 100 millions d'euros supplémentaires, alors ces 100 millions vont devoir se faire une place entre les autres obligations d'entreprises et les marchés actions. En clair, la demande d'emprunt total (état + privé) va augmenter de 100 millions d'euros. Mais le stock d'épargne préexistant est fixe, du moins sur le court terme. Les marchés vont donc prendre 100 millions d'euros qui auraient dû atterrir en emprunt privé, pour les rediriger vers l’emprunt public. Pour résumer, l'emprunt public remplacera l'emprunt privé : c'est ce que l'on appelle l''''effet d'éviction'''. Ce faisant, la confrontation demande d'investissement - offre d'épargne va être chamboulée. Si on trace un graphe offre-demande, on voit rapidement que les taux d'intérêt augmentent. L'état doit fournir des taux plus élevés pour attirer les investisseurs. Les autres marchés vont devoir s'adapter et monter eux-mêmes leurs taux au même niveau, ce qui fait que tous les taux augmentent. L'emprunt direct augmente donc les taux d'intérêts, ce qui est un cout direct pour l'état. : ''Précisons cependant qu'il existe des situations où l'effet d'éviction ne se manifeste pas. Cela arrive notamment lors des situations de trappe à liquidité, y compris quand les taux d'intérêt sont à zéro. Dans ce cas, l'état peut emprunter comme il le souhaite sans que les taux d'intérêts augmentent. Cela n’empêche pas la banque centrale de rajouter une couche de QE par-dessus, histoire de baisser encore plus les couts d'emprunt pour l'état, mais cela n'est pas strictement nécessaire.'' ===L'assouplissement quantitatif : une réduction de la charge d'intérêt=== Le financement par QE se base sur un financement sur un financement par l'emprunt, couplé à une politique de QE. Avec QE ou emprunt seul, l'état se finance sur les marchés et mobilise de l'épargne pré-existante et l'effet d'éviction apparaît. Mais le Q.E permet de neutraliser l'effet d'éviction si on le calibre bien. Si l'état veut emprunter 100 millions, la banque centrale place 100 millions sur la table. Les marchés financent l'état à hauteur de 100 millions d'euros, la banque centrale rachète 100 millions d'euros de dettes, puis les marchés réinvestissent les 100 millions dans de l'investissement privé. Si on fait la somme comptable, la demande d'investissement a augmenté autant que l'offre d'épargne. En conséquence, les taux d'intérêt restent les mêmes, ce qui rend la mesure moins coûteuse pour l'état. L'état économise la hausse des taux d'intérêts, qui n'a pas lieu. De plus, rappelons que la dette de l'état acquise lors d'un Q.E est détenue par la banque centrale. L'état doit toujours la rembourser, mais il rembourse sa banque centrale et non des agents privés. Ce qui fait que le versement des intérêts et du principal se fait à la banque centrale. Au niveau comptable, les intérêts sont comptabilisés comme du profit, profit que la banque centrale reverse à l'état sous la forme de revenus de seigneuriage. Par contre, le principal n'est pas du profit et est comptabilisé comme remboursement d'un crédit. Et rappelons que la monnaie est détruite lors du remboursement d'un crédit, le remboursement de la dette d'état à la banque centrale ne faisant pas exception. En clair, la banque centrale détruit la monnaie du remboursement du principal et reverse tout ou partie des intérêts à l'état. L'économie est donc approximativement égale aux intérêts de la dette d'état, modulo quelques subtilités liées à la rémunération des réserves, comme on le verra plus bas. Avec ce qu'on vient de dire, on peut quantifier le gain apporté par le Q.E. Il correspond à l'économie d'intérêts apportée par une hausse de la base monétaire. Si l'état emprunte une somme D et que l'état rachète cette dette lors d'un Q.E, le gain est le suivant : : <math>S = i \times D</math>, avec D la somme empruntée et i le taux d'intérêt sur la dette. L'équation précédente devrait vous dire quelque chose si vous avez lu le chapitre précédent, de même que le raisonnement comme quoi le gain est une économie d'intérêt. Vous l'avez compris, ce gain n'est autre que le revenu de seigneuriage du Q.E. Et par revenu de seigneuriage, on veut dire seigneuriage définit comme le coût d'opportunité de la base monétaire. Mais nous avions vu que l'équation précédente n'est qu'une approximation et que la véritable équation prend aussi en compte la rémunération des réserves. Quand l'état fait du Q.E ou de l'hélicoptère monétaire, il n'a pas à emprunter l'argent créé. Il ne paye pas les intérêts sur une dette inexistante, ce qui fait une économie. En contrepartie, il doit rémunérer les réserves créées par sa politique, ce qui lui impose un cout supplémentaire, qui est souvent inférieur à l'économie sur la dette non-contractée. La véritable économie est donc égale à la différence entre économie d'intérêt sur la dette et rémunération des réserves, qui vaut approximativement : : <math>S = D \times (t_d - t_r)</math>, avec <math>t_r</math> le taux de rémunération des réserves et <math>t_d</math> le taux de la dette d'état. Le taux sur la dette d'état est le taux de long-terme, alors que le taux de rémunération des réserves est un des taux directeur de la banque centrale. On peut alors utiliser la relation : <math>i_{long} = i_{directeur} + p_r</math> entre les deux taux. En combinant avec l'équation précédente, on trouve : : <math>S = D \times p_r</math>, avec <math>p_r</math> la prime de risque de l'état. L'interprétation de cette équation est que le gain du Q.E dépend du risque de non-remboursement de l'état. Après tout, rien d'étonnant à cela, vu que les réserves sont un instrument sans risque, alors que la dette d'état est elle risquée (l'état peut ne pas la rembourser). Le gain pour l'état correspond à l’intérêt que les agents auraient fait payer à l'état pour le risque de non-remboursement de sa dette. De ce point de vue, le Q.E peut être vu assez grossièrement comme un remboursement anticipé de la dette par la banque centrale. Pour les économies développées, qui ont de bonnes chances de rembourser leur dette, l'état est un placement très peu risqué, la prime de risque est donc limité et le gain du Q.E assez faible. Par contre, le Q.E peut être mis en place suite à une récession ou un choc économique majeur, quand les taux sur la dette d'état sont au plafond et que la prime de risque est très élevée. Le Q.E est donc un très bon instrument quand les taux sont à zéro et que la prime de risque est assez élevée. ===La monnaie-hélicoptère : une réduction de la charge de la dette totale=== L'H.M existe sous plusieurs formes, qui ont des impacts différents sur la dette de l'état. Mais quel que soit la forme d'H.M utilisée, l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. De plus, le désendettement de l'état est plus rapide avec l'H.M qu'avec le Q.E, même si les raisons sont différentes selon que l'on annule la dette de l'état, qu'on la monétise ou qu'on donne de l'argent aux citoyens. Dans les deux premiers cas, le déficit de l'état est réduit et celui-ci peut en profiter pour se désendetter, bien que ce ne soit pas systématique. L'état peut profiter de la baisse du déficit non pas pour réduire sa dette, mais pour dépenser plus, ce qu'il faut faire en cas de récession. Mais avec la monnaie-hélicoptère proprement dite, à savoir donner de l'argent aux citoyens, l'effet sur le déficit n'est qu'indirect. Tout au plus, l'état peut donner de l'argent à ses citoyens sans s'endetter, ce qui lui permet d'augmenter ses dépenses sans coût fiscal direct. Voyons en revue les trois cas. Le cas le plus évident est celui où la banque centrale annule tout ou partie de la dette de l'état au bien de la banque centrale. Là, l'état se désendette d'une manière assez radicale, l'état n'ayant plus à payer une partie de sa dette. Cela entraîne une réduction de la charge totale, l'état n'ayant pas à rembourser le principal de la dette annulée, pas plus que les intérêts. On a alors une réduction de la charge d'intérêt et de la charge totale. Précisons que ce cas est très différent d'un simple Q.E. Avec le Q.E, l'état rembourse le principal et les intérêts à la banque centrale, cette dernière détruit ensuite la monnaie utilisée pour rembourser le principal et reverse les intérêts à l'état. Là où le Q.E permet à l'état de réduire sa charge d'intérêt et elle seule, l'H.M par annulation de dette d'état permet une réduction de la charge totale. Le désendettement de l'état est plus rapide avec l'H.M par annulation de dette publique que le Q.E et on devine donc que l'effet macroéconomique est plus puissant avec l'H.M que le Q.E. Précisons cependant que cette annulation n'est pas sans coûts. En effet, l'annulation de la dette impacte négativement le bilan de la banque centrale. Concrètement, son actif et son passif diminuent tous deux, ce qui se répercute sur son capital. Au premier abord, cela n'a rien de bien problématique ni de coûteux, beaucoup de banques centrales ayant un capital négatif (les banques centrales sont d'ailleurs les seules à pouvoir le faire). Par contre, ce capital est généralement reconstitué par la banque centrale, qui va préférer récupérer le capital perdu. Pour cela, il y a deux solutions. * La première est que l'état recapitalise la banque centrale en injectant des fonds, pour faire revenir le capital de la banque centrale dans le positif. Mais cette situation est improbable et est même assez illogique. Pourquoi gagner de l'argent avec l'annulation, si c'est pour en perdre en recapitalisant la banque centrale ? Certes, l'état peut y gagner, à condition que la dette annulée soit supérieure à ce que l'état doit verser pour recapitaliser la banque centrale. Mais cela fait que le gain net pour l'état est fortement diminué. Concrètement, l'état gagne au maximum une somme équivalente au capital de la banque centrale, pas plus. Ensuite, si un état est en difficulté au point qu'il doive appeler sa banque centrale à annuler sa dette, d'où lui viendrait l'argent nécessaire pour recapitaliser sa banque centrale ? Et surtout, s'il a déjà cet argent, pourquoi ne l'utilise-t-il pas tout simplement pour rembourser sa dette en avance, ou racheter sa dette sur les marchés, ce qui reviendrait de fait à une annulation sans intervention de la banque centrale ? * Une autre solution est que la banque centrale se recapitalise avec les revenus de seigneuriage. C'est à dire qu'elle ne les verse pas à l'état et qu'elle les accumule pour faire remonter son capital. Ce faisant, on comprend que l'annulation n'est pas une politique sans coûts. Elle consiste à échanger un flux de revenus futurs contre une grosse somme d'argent immédiate. En théorie, on peut appliquer les formules du chapitre sur le canal des prix d'actifs et montrer que les deux solutions sont équivalentes, compte tenu de taux d'intérêts. Ce qu'on gagne d'un côté, on le perd de l'autre. Du moins, en première approximation et en oubliant que l'argent peut être plus utile maintenant que plus tard, par exemple si l'économie est en pleine récession. Pour le cas où la banque centrale donne de l'argent à l'état pour financer son déficit, l'effet sur la dette de l'état est indirect. Rappelons qu'un déficit budgétaire est généralement financé par l'émission de dette d'état supplémentaire sur les marchés. Le déficit de l'état étant totalement ou partiellement financé, la dette croît moins vite qu'elle n'aurait dû sans H.M. Cela peut aider l'état à faire des économies ou soulager sa pression financière, ce qui peut l'aider à se désendetter ou à garder une dette stable. Pour l'HM au sens strict, à savoir de l'argent donné aux ménages sans contrepartie, l'état ne se désendette pas, mais l'argent donné peut être utilisé par les agents privés pour se désendetter. Le désendettement est possible, mais est réalisé par les ménages, ce qui a des implications macroéconomiques différentes d'un désendettement de l'état. Notons que l'effet de se désendettement privé induit par l'H.M a des effets ambigus sur la masse monétaire. D'un côté, de la monnaie est créée par la banque centrale, de l'autre le désendettement signifie destruction de monnaie lors des remboursements. Au total, la création monétaire est partiellement compensée par la destruction monétaire par les banques, l'ampleur de la compensation dépendant de l'ampleur du désendettement. Si les deux se compensent totalement et que les taux d'intérêt restent les mêmes, la monnaie créé lors de l'HM est retournée à la banque centrale sous la forme de réserves. Mais dans les faits, l'HM a une influence indirecte sur les taux d'intérêts. Le désendettement entraîne une baisse de l'activité de crédit des banques,mais ces dernières réagissent en baissent leurs taux pour relancer le crédit. Elles sont d'autant plus incitées à le faire que le désendettement induit par l'HM réduit la prime de risque des crédits de nombreux emprunteurs, via les divers canaux du crédit qu'on a vu dans les chapitres antérieurs. Et qui baisse de prime de risque dit baisse des taux bancaires et donc relance de l'activité de crédit. Au final, la masse monétaire augmente bel et bien suite à l'HM , sauf situation exceptionnelle. Pour résumer, on peut classer les trois mesures suivant leur cout pour l'état : l'emprunt seul est la plus chère, le financement par QE est moins cher que l'emprunt seul, l'HM a un effet encore mal compris mais qui devrait être plus important que celui du Q.E. ==Les différences pratiques entre H.M et Q.E== Comme dit plus haut, l'assouplissement quantitatif et la monnaie-hélicoptère n'ont pas les mêmes effets en termes de financement. Mais on peut encore creuser ce point et montrer que les deux politiques n'ont pas les mêmes effets macroéconomiques. Si les deux partagent de nombreux points communs, elles ne se transmettent pas tout à fait de la même manière à l'économie réelle. Déjà, la mise en œuvre de l’assouplissement quantitatif est bien plus simple. L'assouplissement quantitatif demande juste de procéder à des opérations d'''open market'', là où la monnaie–hélicoptère au sens strict demande un transfert direct d'argent à l'état ou aux ménages. L'annulation des dettes de l'état au bilan de la banque centrale semble plus simple à mettre en œuvre, bien qu'aucune banque centrale ne l'ai jamais mise en œuvre. Ensuite, l'assouplissement quantitatif est mieux vu par les marchés que la monnaie-hélicoptère. Elle est considérée comme moins inflationniste et surtout, elle ne remet pas en cause l'indépendance des banques centrales. Rappelons que donner gratuitement de l'argent aux agents économiques est apparenté à une mesure fiscale, et est donc du ressort de l'état, non de la banque centrale. Sans compter que certaines mises en œuvre de la monnaie-hélicoptère se basent sur un transfert direct d'argent de la banque centrale vers l'état, ou une annulation partielle de sa dette... Autant dire que mettre en œuvre cette politique ruinerait la crédibilité de la banque centrale, ce qui pourrait faire plus de mal que de bien, du moins sur le long-terme. ==En savoir plus== * [https://www.nbb.be/doc/ts/publications/economicreview/2016/revecoiii2016_h2.pdf Hélicoptère monétaire et relance budgétaire financée par l'emprunt : du pareil au même ?] * [https://voxeu.org/article/helicopter-money-illusion-free-lunch Helicopter money: The illusion of a free lunch] * [https://voxeu.org/article/true-costs-helicopter-money The true costs of helicopter money]. <noinclude> {{NavChapitre | book=La politique monétaire | prev=Le seigneuriage | prevText=Le seigneuriage : la création monétaire au service de l'état | next=L'équation d'Euler de la consommation | nextText=L'équation d'Euler de la consommation }}{{autoCat}} </noinclude> r09lyi50ei281s5iwt16iv58fb8uug5 Vocabulaire anglais-français à l'intention des apprenants avancés/A 0 78006 767821 759143 2026-06-16T13:30:05Z Elnon 41284 Compléments 767821 wikitext text/x-wiki {{../Index}} === A === * A (note scolaire) : excellent - straight A student : élève qui n'a que des A * a (art. indéf.) : un, une * abacus (n) : abaque, boulier * abandoned (a) : abandonné(e) * abandon ware / abandonware (n ind sg) (néol.) (= logiciels (pl.) ayant cessé d'être exploités commercialement) : logiciels abandonnés (anglic.), logiciels délaissés, abandogiciels (néol., Q.), vieux jeux (hum.) - abandonware games : jeux abandonnés, jeux délaissés, jeux d'hier - abandonware site : site consacré aux jeux d'hier * abase (v) (tr.) : 1/ avilir ; 2/ abaisser, humilier * abasement (n) (fa) : 1/ avilissement ; 2/ abaissement, humiliation (f) * abat-son (n) : abat-son * abbey (n) : abbaye (f) * abbot (n) : abbé * abduct (v) (tr.) : enlever, ravir - to abduct humans : enlever des humains * abductee (n) : personne enlevée (f), victime d'enlèvement - abductees : (les) enlevés * abduction (n) : enlèvement, rapt - alien abduction : enlèvement par des extraterrestres - abduction account : récit d'enlèvement - abduction case : affaire d'enlèvement * abductor (n) : ravisseur - alien abductor : ravisseur extraterrestre * abend (n) (contr. de abnormal end) (Inf.) : fin anormale (f) * abend (v) (intr.) (Inf.) : [programme] s’arrêter anormalement * abhor (v) (tr.) : abhorrer, détester, exécrer * abide (v) (abode, abode ou régulier) (tr.) endurer, supporter - I can’t abide him : Je ne peux pas le supporter ; (intr.) to abide by + nom : respecter, obéir à, s’en tenir à - to abide by the principles of ethical journalism : respecter les principes du journalisme éthique * abiding (a) : durable * abidingly (adv.) : durablement, de façon durable * ability (n) (pl. abilities) : aptitude (f), capacité (f), compétence (f), savoir-faire - to the best of my ability : de mon mieux - leadership abilities : qualités de meneur d’hommes * abjure (v) (tr.) : abjurer, renier, renoncer à * ablaze (a) (tjrs attribut) : en feu, en flammes - to set ablaze : enflammer * able (a) : capable - to be able to + inf. : être capable de + inf., être à même de + inf., être en mesure de + inf. * able-bodied (ac) : robuste, vigoureux/-euse * ably (adv.) : efficacement, habilement, avec compétence * abnormal (a) : anormal(e) - abnormal operation : dysfonctionnement * abnormally (adv.) : anormalement * abnormally high (ac) : anormalement élevé(e) - abnormally high idle speed : vitesse de ralenti anormalement élevée * Abo (n) (pl. Abos) (tronc. de Aborigine) : Indigène d’Australie * aboard (prép.) : à bord de - aboard a rig : à bord d’une plateforme (pétrolière) - All aboard! : Tout le monde à bord ! * abode (n) (lit. ou jur.) : demeure (f), domicile * abode (prét. de to abide) * abode (pp de to abide) * abolish (v) (tr.) : abolir * abolishment (n) : abolition (f) (syn. abolition) * abolition (n) : abolition (f) (syn. abolishment) * aboriginal (a) : indigène (a) * aboriginal (n) : indigène (n) * abort (n) : (Inf.) arrêt prématuré, suspension d’éxécution, arrêt (d’un programme), abandon * abort (v) : 1/ (tr. et intr.) avorter ; 2/ (Inf.) (tr.) suspendre, mettre un terme à, arrêter avant terme, arrêter prématurément, abandonner (un programme) ; (intr.) s’arrêter prématurément, abandonner * aborted (a) : avorté(e) - aborted coup : tentative avortée de coup d’État * aborting (n) : (Inf.) abandon - abording procedure : procédure d’abandon * abortion (n) : 1/ avortement - self-induced abortion : avortement volontaire, avortement clandestin ; 2/ (Inf.) arrêt avant terme, arrêt prématuré, arrêt d’exécution, suspension d’exécution * about (adv.) : - to be about to + inf. : être occupé(e) à + inf., être sur le point de + inf. - What is he about ? : Qu’est-ce qu’il fait ? - He is still about it : Il y est encore, Il n’a pas terminé - Send him about his business! : Envoyez-le s’occuper de ses affaires ! * about (prép.) : 1/ autour de ; 2/ environ + indication chiffrée - about $100 : dans les 100 dollars ; 3/ au sujet de, à propos de, sur - This isn’t about money : Ce n’est pas une quastion d’argent, L’argent n’est pas en cause * about-face (nc) : volte-face (f) * about-turn (n) (brit.) : 1/ volte-face (f) ; 2/ (fig.) revirement * above (prép.) : au-dessus de - [helicopter] to hover above a place : [hélicoptère] faire du sur place au-dessus d'un endroit - not to be above the law : ne pas être au-dessus des lois * above (adv.) : 1/ au dessus ; 2/ ci-dessus * above (n) : - from above : a/ venant d’en haut ; b/ vu(e) du ciel - The town takes on the appearance of a circuit board-esque pattern from above : Vue du ciel, la ville a l’aspect d’une carte à circuit imprimé * above all (loc. adv.) : surtout, avant tout * abrasive (a) : abrasif/-ive * abrasive (n) : abrasif (n) * abrasive-laden (ac) : chargé(e) d’abrasifs - abrasive-laden composite : composite chargé d’abrasifs * abrasively (adv.) : 1/ de manière agressive ; 2/ rudement, avec rudesse, d’un ton rude * abrasive-resistant (ac) : (Matér.) résistant aux abrasifs * abreast (a) : côte à côte, de front - to keep abreast of sb : se maintenir au niveau de qn, se maintenir à la hauteur de qn * abridge (v) (tr.) : abréger * abridged (ppa) : abrégé(e) - Abridged from The Economist : Version abrégée d’un article de The Economist * abridgement (brit.) / abridgment (amér.) (n) : 1/ (l’action) abrègement ; 2/ (le résultat) abrégé (n), condensé (n), résumé (n) * abroad (adv.) : à l’étranger * abrupt (a) (fa) : 1/ soudain(e), brusque, précipité(e) - abrupt climate change : brusque changement climatique ; 2/ brusque, rude * abruptly (adv.) : 1/ soudainement ; 2/ brusquement, rudement * abruptness (n) : 1/ soudaineté (f) ; 2/ brusquerie (f), rudesse (f) * abscond (v) (intr.) : se soustraire (from sth, à qch), se sauver (from sth, de qch), échapper (from sth, à qch) * absence (n) : absence (f) - days of absence : journées d'absence (à l’école) * absent (a) : 1/ absent(e) - to be absent : être absent, ne pas être là - to be absent from sth : être absent de qch - to be marked (as) absent : être marqué(e) absent(e) (à l’école) ; 2/ absent(e) mentalement, distrait(e) * absently (adv.) : distraitement * absent-minded (ac) : distrait(e) * absolute (a) : absolu(e) - absolute zero : (le) zéro absolu - the absolute (a. subst. sing.) : l’absolu * absolutely (adv.) : 1/ absolument ; 2/ entièrement, parfaitement ; 3/ (= yes!) tout à fait * absolve (v) (tr.) : absoudre (sb of sth, sb from sth) absoudre (qn de qch) - to absolve oneself of sth : s’absoudre de qch * absorb (v) (tr.) : 1/ absorber (du liquide) ; 2/ étouffer (le son) ; 3/ amortir (un choc), encaisser (une charge) ; 4/ avaler, absorber ; 5/ assimiler (des idées, des informations) * absorber (n) : 1/ absorbeur ; 2/ amortisseur - shock absorber : amortisseur (de voiture) * absorbing (a) : qui absorbe, qui encaisse - load-absorbing (ac) : encaissant une charge * abstract (a) : abstrait(e) - abstract art : art abstrait - abstract noun : nom abstrait - the abstract (a. subst. sing.) : l’abstrait * abstract (n) : résumé, abrégé - article abstract : résumé d’article * abstract (v) (tr.) : 1/ puiser, prélever - to abstract water : puiser de l’eau (from, dans) ; 2/ abstraire (from, de) - To abstract science or religion from their context can lead to anachronism : Abstraire la science ou la religion de leur contexte peut aboutir à des anachronismes ; 3/ résumer, abréger * abstractedly (adv.) : d’un air absent * abstractedly from (loc. prép.) : en faisant abstraction de - abstractedly from the political context : en faisant abstraction du contexte politique * abstraction (n) (fa p) : 1/ prélèvement (d’eau) ; 2/ abstraction (f) - gestural abstraction : (l’)abstraction gestuelle, (l’)action painting ; 3/ inattention (f) * abstractly (adv.) : abstraitement, d’une manière abstraite * Abu Dhabi (n pr.) : Abou Dhabi * abundance (n) : abondance (f) - the society of abundance : la société d’abondance (syn. the affluent society) * abuse (n ind. sing.) (fa) : 1/ pratiques abusives (f pl.), agissements illicites (pl.), écarts (pl.), dérapages (pl.), abus (sing.) - alcohol abuse : abus de l’alcool, surconsommation d’alcool - drug abuse : toxicomanie (f) ; 2/ sévices (pl.), mauvais traitements (pl.), dérapages (pl.), violences (f pl.), maltraitance (f) - child abuse : violences contre les enfants - sexual abuse : sévices sexuels ; 3/ injures (f pl.), écarts (pl.) de langage, insultes (f pl.) - to shout abuse at sb : crier des insultes à qn * abuse (v) (fa) (tr.) : 1/ maltraiter ; 2/ insulter - to verbally abuse : insulter, agresser verbalement * abused (ppa) (fa) : 1/ maltraité(e) - an abused child : un enfant maltraité ; 2/ insulté(e) * abuser (n) : agresseur - sex abuser : délinquant sexuel * abusive (a) (fa) : 1/ violent(e) - abusive behaviour : comportement violent, mauvais traitements (pl.) ; 2/ injurieux/-euse - abusive language : insultes (f pl.) * abut (v) (tr.) : être adjacent(e) à * abutment (n) : culée (f), butée (f) * abysmal (a) : 1/ abyssal ; 2/ épouvantable, effroyable - an abysmal state : un état effroyable * AC (n) (init. de alternating current : courant alternatif) : C.A. /c.a. - AC motor : moteur à c.a. - CA power : courant alternatif * academia (n) : (l’)université (f), (le) monde universitaire - to work in academia : être universitaire - tenured academia : chaires universitaires (f pl.) * academic (a) (fa) : 1/ scolaire - academic success : (la) réussite scolaire - academic failure : (l’) échec scolaire - the academic year : l’année scolaire ; 2/ universitaire - academic success : réussite universitaire - academic journal : revue universitaire - academic performance : résultats universitaires - the academic year : l’année universitaire * academic (n) (fa) : universitaire (n) * academically (adv.) : 1/ sur le plan scolaire - academically gifted : doué(e) pour les études ; 2/ sur le plan universitaire * academically driven (ac) : intéressé(e) par des études universitaires - Not all children are academically driven : Tous les enfants ne sont pas intéressés par des études universitaires * academician (n) : academicien(ne) * academicianship (n) : appartenance à une académie, qualité d’académicien, fonction d’académicien * academy (n (pl. academies) : académie - academy of arts : académie des beaux arts - academy of sciences : académie des sciences * a capella / acapella (a) : (Mus.) non accompagné(e) - an a capella male choir : un chœur masculin sans accompagnement (syn. unaccompanied) * a capella / acapella (loc. adv.) (Latin) : (Mus.) sans accompagnement musical - to sing a capella : chanter sans accompagnement musical - [choir] to perform a capella : [chœur] se produire a capella (syn. without musical accompaniment) * a cappella / acappella (a) (It.) voir a capella (a) * a cappella / acappella (loc. adv.) (It.) voir a capella (loc. adv.) * accel (n) (pl. accels) (tronc. de acceleration) : accélération (f) * accelerant (n) : (Chim.) accélérant * accelerate (v) (tr. et intr.) : accélérer * accelerated (ppa) : accéléré(e) - accelerated tempo : rythme accéléré - accelerated wear rate : taux d’usure accéléré * acceleration (n) : accélération (f) * accent (n) : accent - a hint of an accent : un zeste d’accent * accent (v) (tr.) : accentuer - I wear a dress that accents my boobs : je mets une robe qui fait paraître mes seins plus gros * accept (v) (tr.) : 1/ accepter ; 2/ admettre - But let’s accept it that… : Mais admettons un instant que… * acceptability (n) : admissibilité (f) * acceptable (a) : admissible, convenable, décent(e) * acceptably (adv.) : comme il faut, convenablement * acceptance (n) : 1/ réception (f) (d'un ouvrage), recette (f) (de matériel) - final acceptance : réception définitive - interim acceptance : réception provisoire - provisional acceptance : réception provisoire - acceptance tests : essais de réception ; 2/ accueil (fait à un produit) - 3/ approbation (f) - 4/ acception (f) (d'un terme) * access (n) : 1/ accès ; 2/ consultation (f) - to provide access to on-line services : fournir l’accès à des services en ligne - the access to… : l’accès à…, la consultation de… - access provider : fournisseur d’accès * access (v) (tr.) : 1/ avoir accès à, pénétrer dans ; 2/ aller sur, consulter - to access a database : consulter une base de données ; 3/ solliciter * accessibility (n) : accessibilité (f) * accessible (a) : accessible * accession (n) : 1/ accession (f) (to power, au pouvoir) ; 2/ consentement donné (to sth, à qch) * accessory (a) : auxiliaire, secondaire - accessory shaft : arbre secondaire * accessory (n) (pl. accessories) : 1/ accessoire ; 2/ complice * accident (n) : accident - scene of accident : lieu de l’accident, lieu du sinistre - by accident : par hasard - industrial accident : accident du travail - occupational accident : accident du travail - traffic accident : accident de la circulation * accidental (a) : accidentel(le) * accidentally (adv.) : accidentellement, par accident * accidentally propagated (ac) : diffusé(e) accidentellement - accidentally propagated virus : (Inf.) virus diffusé par accident * accident-prone (ac) : ayant tout le temps des accidents * acclimatise (brit.) / acclimatize (amér.) (v) (tr.) : acclimater - to acclimatise oneself to sth : s’acclimater à qch * accolade (n) (fa p) : 1/ accolade (f); 2/ honneur, distinction (f), récompense (f) * accommodate (v) (tr.) (fa) : 1/ loger ; 2/ avoir de la place pour, contenir, pouvoir recevoir - the cottage accommodates up to six people : la villa peut recevoir jusqu’à six personnes ; 3/ répondre aux besoins de, prendre en considération * accommodation (n) : 1/ (brit.) (tjrs sing.) (l')hébergement, (le) logement - official living accommodation : (le) logement de fonction ; 2/ (au plur.) (amér.) accommodations : aménagements - waterside accommodations : aménagements portuaires * accompaniment (n) : 1/ (Cuis.) garniture (f) ; 2/ (Mus.) accompagnement * accompany (v) (tr.) : accompagner * accompanying (a) : qui accompagne, d’accompagnement, joint(e) - the accompanying leaflet : le feuillet joint * accomplice (n) : complice (in / to, de) * accomplish (v) (tr.) : accomplir, effectuer, réaliser - to accomplish additional tasks : effectuer des tâches supplémentaires * accomplishment (n) : accomplissement, réalisation (f) * accord (v) (intr.) : s’accorder (with, à), être en accord (with, avec), concorder (with, à) - All medical equipment must accord with US technical standards : tous les équipements médicaux doivent être en accord avec les normes techniques américaines * accordance (n) : conformité (f) - in accordance with… : a/ conformément à…, d’après… ; b/ en fonction de… * accordingly (adv.) : 1/ en conséquence ; 2/ Accordingly (a m p) : Ainsi, Donc * according to (loc. prép. ) : selon, d’après, suivant, en fonction de, si l’on en croit, à en croire, en s’en tenant à - according to his/her tortured logic : selon ses raisonnements aberrants - according to my calculations : d’après mes calculs * account (n) : 1/ compte - accounts (pl.) : comptes, écritures, comptabilité (d’une société) - to keep the accounts : tenir la comptabilité - account balance : balance comptable ; 2/ compte (bancaire) - bank account : compte en banque - to overdraw one's account : mettre son compte à découvert - current account (brit.) : compte courant ; 3/ compte (d’abonnement) - social media account : compte de réseau social - user account : compte individuel, compte d’abonné (éviter le calque « compte utilisateur ») - to set up an individual user account : créer un compte individuel ; 4/ récit - abduction account : récit d'enlèvement - eyewitness account : récit d'un témoin ; 5/ compte rendu, exposé - to give an account of… : faire un compte rendu de… ; 6/ motif, raison (f) - on account of… : en raison de… * account (v) (intr.) : - to account for… : 1/ représenter, se traduire par…. ; 2/ expliquer * accountability (n) : responsabilité (f) * accountable (a) : responsable - to be held accountable for sth : être tenu(e) responsable de qch * accountancy (n) : (la) comptabilité, (la) compta (fam.) * accountant (n) : comptable (n) * accounting (n) : comptabilité (f) - accounting department : service de la comptabilité, (la) Comptabilité * accuracy (n) : 1/ précision (f) ; 2/ exactitude (f), justesse (f) * accurate (a) : 1/ précis(e) ; 2/ exact(e), juste * accurately (adv.) : 1/ précisément, avec précision ; 2/ exactement, justement (anton. inaccurately) * accuse (v) (tr.) : accuser * accusation (n) : accusation (f) - a salvo of accusations : une volée d’accusations * accusatory (a) : accusateur/-trice (a) * accuser (n) : accusateur/-trice * ace (a) : (arg. brit.) super (inv.), génial(e), formidable - to be ace : être génial * ace (n) : 1/ as (aux cartes) ; 2/ champion, championne, as * ace (v) (tr.) (arg.) : réussir (un examen) les doigts dans le nez (fam.) - to ace an exam : cartonner à un examen * acerbity (n) : 1/ amertume (f) (au goût) ; 2/ (fig.) amertume, aigreur (f) * acetate (n) : 1/ (Chimie) acétate - sheet of acetate : transparent (n) ; 2/ (an acetate) un transparent * ache (n) : (une) douleur (f) * ache (v) (intr.) : [partie du corps] faire mal * achieve (v) (tr.) (fa) : 1/ obtenir, atteindre, arriver à, parvenir à - to achieve a goal : atteindre un objectif - to achieve immortality : devenir immortel - to achieve one’s purpose : parvenir à ses fins ; 2/ accomplir, mener à bien, exécuter, réaliser - to achieve a technological feat : réaliser un exploit technologique * achievement (n) (fa) : 1/ obtention (f) ; 2/ accomplissement, réalisation (f), exécution (f) ; 3/ succès, réussite (f) - a school with a high level of achievement : une école au taux de réussite élevé ; 4/ exploit, prouesse (f) - a technical achievement : une prouesse technique * achiever (n) : personne qui réussit (f), personne douée (f), battant(e), gagneur/-euse * aching (a) : douloureux/-euse * acid (a) : acide - acid medium : milieu acide - acid rain : pluies acides (f pl.) * acid (n) : acide - acid rain : pluie acide * acidic (a) : acide - acidic soil : sol acide * acid-proof (ac) : 1/ qui résiste aux acides ; 2/ [vernis] anti-acide * acid-resistant (ac) : inattaquable aux acides * acid-resisting (ac) : inattaquable aux acides * acknowledge (v) (tr.) : reconnaître (syn. to admit) - It must be acknowledged that… : Il faut reconnaître que… * acknowledgement (n) : reconnaissance (f), aveu * acolyte (n) : collaborateur, collaboratrice * acorn (n) : gland * acoustic (a) : acoustique (a) * acoustics (n sing. ou pl.) : (l')acoustique (f), (les) qualités acoustiques (f pl.) * acquaint (v) (tr.) : - to acquaint sb with sth : familiariser qn à qch - to acquaint oneself with sth : se familiariser avec qch * acquaintance (n) : connaissance (f), relation (f) * acquire (v) (tr.) : 1/ acquérir (une langue) ; 2/ (Inf.) collecter, saisir, enregistrer, obtenir (des données) (automatiquement, au moyen de capteurs) - to acquire data : saisir (automatiquement) des données * acquisition (n) : 1/ acquisition (f) (d’une langue) - second-language acquisition : acquisition d’une seconde langue ; 2/ (Inf.) collecte (automatique) (f), saisie (automatique) (f), prélèvement (automatique), prise (f), relevé, enregistrement, obtention (f), acquisition (f) (anglic.) (de données par capteur) - data acquisition : saisie automatique de données * acquisitive (a) : 1/ apte à acquérir (qch), rapide à acquérir (qch) ; 2/ âpre au gain * acquisitiveness (n) : 1/ aptitude à acquérir (qch), rapidité à acquérir (qch) ; 2/ âpreté au gain * acrid (a) : âcre * acrobat (n) : acrobate (m/f) * across (prép.) : 1/ (avec déplacement) a/ à travers - [fireball] to streak across the sky : [boule de feu] traverser le ciel ; b/ d’un bout à l’autre de, dans tout(e), sur (toute) - across America : d’un bout à l’autre des États-Unis - across the nation : dans tout le pays - across the world : dans le monde entier, sur toute la planète ; 2/ (sans déplacement) de l’autre côté de - across the street : sur l’autre trottoir * across (adv.) : (selon le cas) de large, de long * act (n) : 1/ acte - act of God : cas de force majeure, agent extérieur, cause naturelle (f), fléau naturel - act of vandalism : acte de vandalisme - treasonous act : acte de trahison, trahison (f) ; 2/ acte (d’une pièce de théâtre) ; 3/ (dans un spectacle) numéro - stand-up comedy act : numéro de comique de scène - to put on an act : (fig.) jouer la comédie ; 4/ (Droit) action en justice, procès - a class action : une action collective, un recours collectif (en justice) * act (v) (intr.) : 1/ agir - to act responsibly : agir de manière responsable ; 2/ faire office - to act as a backstop to… : faire office de filet de sécurité pour… ; 3/ [acteur] jouer * acting (a) : temporaire - the acting CEO : le PDG temporaire * acting (n) : (Théât., Cin.) jeu - His acting is superb : Il a un jeu magnifique * action (n) : 1/ action (f) - Action! (Cin.) : On tourne ! (syn. Camera!) - action film : film d'action (syn. actioner) ; 2/ mouvement - strike action : (la) grève, mouvement de grève - call for strike action : appel à la grève - to call for strike action : appeler à la grève - to take strike action : faire la grève ; 3/ mesures (f pl.) - political action : mesures politiques * actionable (a) : 1/ passible de poursuite, opposable ; 2/ exploitable - actionable intelligence : renseignement exploitable ; 3/ concret/-crète, pratique * actioner (n) : film d’action (syn. action film) * action-laden (ac) : plein(e) d’action, bourré(e) d’action - action-laden story : récit bourré d’action * action-oriented (ac) : tourné vers le jeu - action-oriented gameplay : scénario de jeu tourné vers l’action (aussi action gameplay) * activate (v) (tr.) : 1/ activer ; 2/ actionner, déclencher, commander * activated (ppa) : 1/ activé(e) ; 2/ commandé(e) - voice-activated : commandé à la voix ; 3/ actif/-ive - activated carbon : charbon actif * activation (n) : 1/ activation (f) ; 2/ actionnement, déclenchement, commande (f), mise en marche - activation of an alarm : déclenchement d’une alarme * active (a) : actif/-ive, en activité, en cours, en service, en fonction - active workers : ouvriers en activité * actively (adv.) : activement * activism (n) (fa) : militantisme - green activism : militantisme écologique * activist (a) : 1/ activiste ; 2/ militant(e) * activist (n) (fa p) : 1/ activiste (m/f) ; 2/ militant, militante - animal activist : défenseur des droits des animaux - climate activist : militant climatique - environmental activist : militant écologiste - green activist : militant écologique - human rights activist : militant des droits de l’Homme - political activist : militant politique * activity (n) (pl. activities) : activité (f) - activities and interests : activités extra-professionnelles - field of activity : domaine d’activité - market making activities : (Fin.) activités de tenue de marché - railway-related activities : activités dans le domaine ferroviaire * actor (n) : acteur (de théâtre, de cinéma), comédien (syn. comedian) - a character actor : un acteur de genre - a supporting actor : un second rôle masculin - a typecast actor : un acteur typé * actress (n) (pl. actresses) : actrice (f) (de cinéma), comédienne (syn. comedian) - silent film actress : actrice du muet * actual (a) (fa) : 1/ réel(le), effectif/-tive, véritable - actual dimensions : dimensions réelles - in actual fact : en fait ; 2/ proprement dit(e), lui-même, elle-même (etc.) ; 3/ (Proc.) instantané(e) - actual value valeur instantanée * actuality (n) (fa) : réalité (f) - in actuality : en réalité, véritablement * actually (adv.) (fa) : en réalité, en fait, à dire vrai, véritablement * actual-size (ac) : grandeur nature * actuate (v) (tr.) : actionner, mettre en action, déclencher * actuation (n) : actionnement, mise en action, déclenchement * actuator (n) : 1/ (le mécanisme) a/ actionneur, déclencheur, b/ (Inf.) bras de lecture-écriture (d'un disque dur) ; 2/ (la personne) opérateur, opératrice * acumen (n) : perspicacité (f), sagacité (f) - political acumen : sens aigu de la politique * ad (n) pl. ads (tronc. fam. de advertisement) : annonce publicitaire (f), petite annonce (f), réclame (f), pub (f) - display ad : annonce grand format (f), annonce de grande surface (f), grande annonce (f), annonce presse (f), pavé publicitaire * adage (n) : adage * adamant (n) : substance d’une dureté impénétrable - a heart of adamant : un cœur de pierre * adamant (a) : inflexible, intransigeant(e) - to be adamant about + gér. : être absolument déterminé(e) à + inf. * adamantly (adv .) : catégoriquement * adapted (pp de to adapt) : - to be adapted for the screen by… : être porté à l’écran par… * adapter (n) : adaptateur, pièce d’adaptation et de liaison, raccord (électrique), manchon guide * add (v) (tr.) : 1/ ajouter (to, à ; into, dans) ; 2/ additionner * addendum (n) (pl. addenda) : ajout, supplément (à un livre) * adder (n) : vipère (f) (syn. viper) * addict (n) : 1/ drogué (n) - drug addict : toxicomane - opioid addict : opiamane, accro aux opiacés ; 2/ accro (n), mordu (n) * addicted (a) : accro - to become addicted : devenir accro (to sth, à qch) * addiction (n) : - drug addiction : toxicomanie (f) * addictive (a) : - an addictive track (Mus.) : un morceau (de musique) prenant * add in (v) (tr.) : (Inf.) rajouter (à l'intérieur de la machine) * add-in (n) (pl. add-ins) : (Inf.) extension interne (f) * add-in (a) : (Inf.) rajouté à l’intérieur, additionnel - add-in card : carte additionnelle interne - add-in program : complément interne de programme * addition (n) (fa) : 1/ adjonction (f), ajout (to, à) - in addition : de surcroît, en outre, en sus, de plus - with the addition of… : en y ajoutant…., si on y ajoute… ; 2/ addition (f), somme (f) - to make a series of additions : faire une série d'additions * additional (a) : supplémentaire - an additional charge : un supplément (à payer) - additional info : infos supplémentaires (f pl.) - additional tasks : tâches supplémentaires (f pl.) * Additionally, … (a m p) (en t d p) : En outre, … , En sus, …, De surcroît, … * additive (n) : 1/ additif ; 2/ adjuvant * admitting (that) (loc. conj.) : en admettant que * add on (v) (tr.) : (Inf.) rajouter (à l'extérieur de la machine) * add-on (pl. add-ons) : (Inf.) extension externe (f) * add-on (a) : (Inf.) rajouté à l’extérieur - add-on card : carte additionnelle externe (f) * address (n) (fa p) : 1/ adresse (f) - change of address : changement d’adresse - business address : adresse professionnelle (f) - mailing address : adresse postale - mailing list address : (Inf.) adresse d’une liste de publipostage, adresse d’une liste de diffusion ; 2/ discours, allocution (f) * address (v) (tr.) (fa p) : 1/ adresser (une lettre, un colis) ; 2/ aborder (un sujet, une question), s’occuper de (d’un problème), régler (un souci) - to address a challenge : relever un défi - to address an issue : traiter d'une question - to address a concern : régler un souci ; 3/ (Inf.) désigner par son adresse, accéder à, adresser (anglic.) * addressee (n) : destinataire * addressless (a) : (Inf.) sans adresse - addressless instruction format : format d’instruction sans adresse * adduce (v) (tr.) : 1/ (Droit) présenter, fournir, produire, apporter (des explications, des preuves, des indices) - to adduce new evidence : apporter de nouveaux éléments de preuve - to adduce relevant evidence : produire des éléments de preuve pertinents - No evidence was ever adduced in support of the threadbare thesis : Aucun élément de preuve n’a jamais été apporté à l’appui de cette thèse usée ; 2/ [expert] invoquer, citer * adduceable (a) : voir adducible (a) * adducible (a) : [élément de preuve] pouvant être présenté, fourni, produit, apporté, cité (var. ortho. adduceable) * adept (a) (fa) : habile, doué(e) - to be adept at doing sth : être doué(e) pour faire qch * adeptly (adv.) : de façon habile, de manière experte * adhesion (n) : adhérence - brake adhesion : adhérence au freinage * adjacent (a) : adjacent(e), contigü(e) - to be adjacent to : être tout à côté de * adjective (n) : adjectif * adjunct (n) : 1/ complément, adjuvant - adjuncts in vaccines : adjuvants des vaccins ; 2/ assistant * adjust (v) (fa) : 1/ (tr.) adapter (to, à) ; (intr.) s'adapter (to, à) ; 2/ (tr.) régler (to, sur) * adjustable (a) (fa) : 1/ adaptable ; 2/ réglable, variable, orientable, modulable * adjusting (n) : réglage, mise au point - adjusting screw : vis de réglage * adjustment (n) (fa p) : 1/ mise au point, réglage - fine adjustment : réglage précis ; 2/ correction (f), rectification (f), retouche (f) * ad-lib / adlib (a) : improvisé(e) * ad-lib / adlib (v) (tr.) : improviser * Adm. : abr. de Admiral - Adm. Horatio Nelson * adman (n) (pl. admen) (abr. de advertising man) : publiciste, publicitaire (n) * admin (n) : 1/ (tronc. de administration) a/ administration (f) (d’un établissement scolaire) - to complain to admin (Éduc.) : se plaindre à l’administration ; b/ (amér.) (fa) gouvernement - the Trump admin : le gouvernement Trump ; 2/ (tronc. de administrator) administrateur * administer (v) (tr.) : administrer, gérer * administration (n) : 1/ administration (f) (d’un établissement scolaire) ; 2/ (amér.) (fa) gouvernement - the Obama administration : le gouvernement Obama ; 3/ direction * administrator (n) : administrateur - network administrator : administrateur de réseau - website administrator : administrateur de site web * admiral (n) : amiral * admiralty (n) : 1/ amirauté (f), fonction d’amiral - admiralty law : (la) loi maritime ; 2/ the Admiralty (brit.) : l’amirauté, les amiraux (pl.) (syn. amér. the Navy Department) * admissibility (n) : recevabilité (f) * admissible (a) : recevable, acceptable * admission (n) (fa) : 1/ aveu, reconnaissance (f) ; 2/ admission (f), entrée (f) - Free admission : « Entrée libre » * admit (v) (tr.) (fa) : avouer, reconnaître, concéder * admitted (ppa) : avoué(e), déclaré(e) * admittedly (adv.) : 1/ (en tête de phr.) il faut avouer que…, il faut reconnaître que…, on ne saurait nier que…, j’avoue que…, je reconnais que…, il est vrai que…, c’est vrai que… (fam.) ; 2/ (en incise) on doit le reconnaître, …, on doit l’admettre, …, il faut l’avouer, …, de l’aveu général, certes * adobe (n) : terre séchée au soleil * adolescence (n) : adolescence (f) * adolescent (n) : adolescent, ado (fam.) * adopt (v) (tr.) : 1/ adopter ; 2/ employer, suivre (une méthode, une ligne de conduite, etc.) * adopted (ppa) : adopté(e), d’adoption - adopted language : langue d’adoption * adoption (n) : 1/ adoption (f) ; 2/ recours (à une méthode) * adorn (v) (tr.) : orner, parer * adspeak (n) : (le) parler des pubeux * ad-supported (ac) : financé(e) par la pub - ad-supported software : logiciels financés (pl.) par la pub * adult (a) : adulte * adult (n) : adulte - young adult : jeune adulte * adulterate (v) (tr.) : altérer * adulteress (n) : femme adultère (f) * adultery (n) : adultère - to commit adultery : commettre un adultère * adulthood (n) : âge adulte * advance (n) : 1/ progrès (ponctuel) ; 2/ avance (f) (on salary, sur salaire) ; 3/ pl. advances : avances (f pl.) - She ignored his advances : Elle ne répondit pas à ses avances * advance (v) (fa) : 1/ (tr.) faire évoluer, faire progresser ; (intr.) évoluer, progresser ; 2/ (tr.) promouvoir * advanced (ppa) : 1/ (Fortif.) avancé(e) - advanced work : ouvrage avancé ; 2/ avancé(e) - évolué(e), perfectionné(e), de pointe, le plus moderne, la plus moderne, d’avant-garde, qui est à l’avant-garde - advanced aerospace vehicles : véhicules aérospatiaux de pointe - very advanced ideas : idées très avancées - more advanced natives : indigènes plus évolués - advanced prototype : prototype évolué ; 3/ supérieur(e), haut(e) - advanced mathematics : mathématiques supérieures (f pl.) - school for advanced studies : école des hautes études - advanced students : étudiants déjà avancés * advancement (n) (fa) : progrès * advantage (n) (fa p) : 1/ avantage - there are advantages to + gér. : il y a des avantages à + inf. - to (fully) take advantage of : profiter (pleinement) de, tirer (pleinement) parti de, exploiter (à fond) ; 2/ supériorité (f) ; 3/ bras de levier - mechanical advantage : force de levier - to have a higher mechanical advantage : avoir une force de levier plus élevée * advantageous (a) : profitable, avantageux, bénéfique * advent (n) : arrivée (f), avènement, venue (f) (syn. arrival - coming) * adventure (n) : aventure (f) - to go in search of adventure : partir à l’aventure - short-lived adventure : aventure brève * adverb (n) : (Gram.) adverbe - adverb of degree : adverbe de degré - interrogative adverb : adverbe interrogatif - manner adverb : adverbe de manière - place adverb : adverbe de lieu – relative adverb : adverbe relatif - time adverb : adverbe de temps * adverbial (a) : (Gram.) adverbial(e) - adverbial clause : proposition adverbiale (f) - adverbial phrase : a/ locution adverbiale (f) ; b/ complément circonstanciel - adverbial phrase of manner : complément circonstanciel de manière - adverbial phrase of place : complément circonstanciel de lieu - adverbial phrase of time : complément circonstanciel de temps * adverbial (n) : (Gram) locution adverbiale (f) * advergame (n) (tronc. de advertisement game) : jeu vidéo publicitaire * advergaming (n) : 1/ domaine des jeux vidéo publicitaires, ludopublicité (off.) ; 2/ pratique du jeu vidéo publicitaire * adversary (n) (pl. adversaries) : adversaire (m/f) - to outplay one’s adversary : battre son adversaire (syn. enemy, opponent) * adverse (a) : 1/ [effet] négatif/-ive, [circonstances] défavorable - adverse effect : effect indésirable, effet négatif ; 2/ [vent] contraire * adversely (adv.) : de façon négative - to affect sb adversely : avoir un effet négatif sur qn * advert (n) (tronc. de advertisement) : annonce publicitaire (f), réclame (f), publicité (f), pub (f) (l'objet, et non le domaine) * adverse (a) : 1/ négatif/-ive, nocif/-ive, indésirable, défavorable - adverse effect : effet négatif, effet indésirable ; 2/ contraire * advertise (v) (tr.) : faire connaître * advertisement (n) (fa) : annonce publicitaire (f), réclame (f), publicité (f) (l'objet, et non le domaine) - display adertisement : annonce grand format (f), annonce de grande surface (f), grande annonce (f), annonce presse (f), pavé publicitaire * advertising (n) : (la) publicité - in-game advertising : (la) publicité intégrée au jeu (vidéo) - advertising campaign : campagne de publicité * advertorial (n) (amalg. de advertisement et de editorial) : article publicitaire * advice (n ind. sing.) : conseils (pl.) - He generally gives good advice : Il donne généralement de bons conseils - a piece of advice : un conseil - a word of advice : un conseil - financial advice : conseils financiers - advice column : (Presse) courrier du cœur * advisability (n) : caractère opportun, opportunité * advisable (a) : conseillé(e) * advise (v) (fa p) : 1/ (tr.) aviser (langue administrative) - to advise sb of sth : aviser qn de qch ; 2/ (tr.) conseiller qn ; 3/ (tr.) informer qn * adviser / advisor (n) : conseiller/-ère (m/f) - careers advisor : conseiller / conseillère d’orientation professionnelle - military advisor : conseiller militaire (syn. amér. counsellor) - policy advisor : conseiller politique * advocacy (n) : défense (f) (d’une cause, d’une idée), promotion (f) - advocacy group : groupe de défense, groupe de plaidoyer * advocate (n) (fa) : défenseur, porte-parole, champion (d'une cause), partisan - advocate of the status quo : partisan(e) du statu quo - to be an outspoken advocate for sth : être un fervent défenseur de qch, être un ardent défenseur de qch - envirnmental advocate : défenseur de l’environnement * advocate (v) (tr.) : prôner, défendre - to advocate a particular viewpoint : défendre un point de vue particulier * AE (n) (init. de automatic exposure : (Photog.) mise au point automatique) * aeon (brit.) / eon (amér.) (n) : (une) éternité (au fig.), (des) siècles (pl.), (des) lustres (pl.) - for aeons of time : a/ pendant une éternité ; b/ depuis une éternité - for the first time in eons : Pour la première fois depuis une éternité * aerial (a) : aérien(ne) - aerial archaeology : (l’)archéologie aérienne (f) - aerial cable : câble aérien - aerial photography : (la) photographie aérienne (f) - aerial vehicle : véhicule aérien - unexplained aerial phenomena (pl.) : phénomènes aériens inexpliqués (pl.) * aerial (n) (brit.) : antenne (f) (syn. amér. antenna) * aerialist (n) : trapéziste (m/f) * aerobatic (a) : acrobatique - aerobatic flights : vols acrobatiques - acrobatic flying display : démonstration d’acrobaties aériennes * aerobatics (n) : 1/ (Av.) (= la spécialité, sing.) (l’)acrobatie aérienne (f) - aerobatics demonstration : démonstration d’acrobaties aériennes ; 2/ (= les cascades, f pl.) acrobaties aériennes (f pl.) * aerobic (a) : aérobique * aerobics (n sing.) : (l’)aérobic - an aerobics class: une leçon d’aérobic * aerobridge (n) : (Av.) passerelle télescopique (f) * aerodynamic (a) : aérodynamique - aerodynamic design : profil aérodynamique (d’un avion) * aerodynamically (adv.) : sur le plan dynamique * aero-engine (n) : (Av.) moteur d’avion * aeronautical (a) : aéronautique - aeronautical engineering : (la) construction aéronautique * aeroplane (n) (brit.) : (Av.) avion (amér. airplane) * aerosolise (brit.) / aerosolize (amér.) (v) (tr.) : 1/ mettre en aérosol, aérosoliser ; 2/ diffuser sous forme d’aérosol, aérosoliser * aerospace (a) : aérospatial(e) * aerospace (n) : (l’)aérospatiale (f) * AFAIK (init. de as far as I’m concerned : en ce qui me concerne, quant à moi) * affable (a) : affable, courtois(e) * affably (adv.) : avec affabilité, courtoisement * affair (n) (fa p) : 1/ a/ affaire (f), b/ (svt au pl.) questions (f), problèmes - state of affairs : état de choses - business affairs : affaires commerciales (f pl.) - current affairs : problèmes d’actualité, actualités (f pl.) - foreign affairs : (la) politique internationale (f) - home affairs : (la) politique intérieure (f) - humanitarian affairs : affaires humanitaires , questions humanitaires - legal affairs : questions juridiques - political affairs : affaires politiques, questions politiques - social affairs : affaires sociales, questions sociales ; 2/ (love affair) aventure amoureuse (f), liaison amoureuse (f) - He has recently had an affair with her : Il a récemment eu une aventure avec elle - He has been in affairs with other girls : Il a eu des liaisons avec d’autres filles - long-running affair : liaison qui remonte à loin ; 3/ scandale * affect (v) (tr.) : affecter, toucher - Her death has greatly affected him : Sa mort l’a grandement affecté - to adversely affect living creatures : avoir des effets néfastes sur les créatures vivantes * affidavit (v) : 1/ (Droit) affidavit ; 2/ déclaration (écrite) sous serment * affiliate (n) : 1/ filiale (f) (détenue à moins de 50% par la société mère) ; 2/ groupe affilié ; 3/ associé(e) * affirmative (a) : affirmatif/-ive - affirmative action : discrimination positive (f) * affirmatively (adv.) : affirmativement * affix (v) (tr.) : attacher (to, à), apposer (to, sur) * afflict (v) (tr.) : frapper, toucher, affecter * affluence (n) (fa p) : richesse (f), aisance (f), prospérité (f) * affluent (a) (fa): riche, aisé(e), prospère, ayant des moyens (financiers) - to be affluent : vivre dans l’aisance - the affluent society : la société d’abondance (syn. the society of abundance) * afford (v) (tr.) : avoir les moyens de… , pouvoir s’offrir - I could ill afford it : Je ne pourrais guère me permettre cela * affordability (n) : caractère abordable * affordable (a) : abordable (quant au prix) - to make sth affordable : rendre qch abordable * affordance (n) : possibilité offerte (f), possibilité qui s’offre, potentialité (f) * Afghan (a) : afghan(e) (sans maj.) * Afghan (n pr.) : Afghan (le ressortissant) * Afghan (n) : (l’)afghan (la langue) * Afghanistan (n pr.) : (l’)Afghanistan * aficionado (n) : amateur passionné * afloat (a) : qui flotte à la surface, qui flotte ; 2/ (fig.) à flot ; 3/ (fig.) [rumour] qui circule * afoot (a) : en cours - to be afoot : se préparer - There’s something afoot : Il se trame qch * aforementioned (a) : susdit(e), susmentionné(e), mentionné(e) ci-dessus * afraid (a) (tjrs attribut) : qui a peur - Children are afraid of the dark : Les enfants ont peur du noir * afresh (adv.) : de nouveau - to look afresh at sth : réexaminer qch - to start afresh : prendre un nouveau départ * Africa (n pr.) : (l’)Afrique - North Africa : Afrique du Nord - South Africa : Afrique du Sud * African (a) : africain(e) (sans maj.) * African (n pr.) : Africain (l’habitant) * after (prép.) : 1/ après - after which : après quoi, et après cela, puis, ensuite ; 2/ au bout de + expression de durée ; 3/ + gér. : après + inf. passé ; 4/ d'après * after (adv.) (seulement en fin de proposition) : après - a week after : une semaine plus tard * after (conj. de temps) : après que + ind.; après + subst.; après + inf. passé * afterbirth (n) : placenta * after-effect (brit.) / aftereffect (n) : effet secondaire, répercussion, conséquence - (au pl.) after-effects : séquelles (f pl.) (d’une maladie, etc.) * after-hold (n) : cale arrière (f) (d’un navire) * afterlife (n) : - in the afterlife : dans l’au-delà, dans l’autre monde - to speculate about the afterlife : se poser des questions sur l’au-delà * aftermath (n) : séquelles (f pl.) d’une guerre, suites (pl.) d’une catastrophe * afternoon (n) : après-midi (m/f) * afterwards (adv.) : après cela, ensuite * Again (adv.) (en tête de phrase) : 1/ De plus, En outre ; 2/ D'ailleurs * again (adv.) : à nouveau, de nouveau (ou préfixe « re… ») - Make sure you don’t misspeak again : Veillez à ne plus vous tromper - Here we go again : Ça recommence, nous y revoilà, on remet ça * against (prép.) : 1/ (opposition) contre - to be dead against sth : être à fond contre qch - to go against the popular will : aller à l’encontre de la volonté populaire - to go on a crusade against sth : partir en croisade contre qch - to go to war against… : partir en guerre contre… ; 2/ (protection) contre - to guard against fire : se protéger contre l’incendie - to take precautions against sth : prendre des précautions contre qch ; 3/ (Sport) (= versus) contre ; 4/ (contraste) par rapport à - the rise of the pound against the mark : la montée de la livre par rapport au mark ; 5/ (contact) contre - to lean against a wall : s’appuyer contre un mur ; 6/ (expressions diverses) - to go against the flow : aller à contre-courant - to race against time : courir contre la montre * agape (a) (tjrs attribut ou en appo.) : [bouche] grand ouverte - Mouth agape, she watched in complete shock : bouche bée, elle regardait en état de choc ; [individu] bouche bée * age (n) (fa p) : 1/ âge - average age : âge moyen, moyenne d’âge - middle age : âge mûr - to be past middle age : être sur le déclin de la vie, être sur le retour d’âge, être sur le retour - the school-leaving age : l’âge de quitter l’école, l’âge de fin de scolarité ; 2/ ère (f), âge - the ice age : l'ère glaciaire - the information age : l'ère de l'information - the space age : l'ère spatiale - the Stone Age : l’âge de la pierre ; 3/ éternité (f) - for ages and ages : pendant une éternité, pendant des lustres ; 4/ grand âge - old age : vieillesse (f) - age spots : taches de vieillesse * age (v) : (tr.) faire vieillir - Cabin life is aging me : Vivre dans une hutte me fait vieillir ; (intr.) : vieillir * ageless (a) : [personne] sans âge * agency (n) (pl. agencies) : agence (f) - dating agency : agence de rencontres - distribution agency : (Presse) agence de diffusion - news agency : (Presse) agence de presse - rating agency : (Fin) agence de notation - relief agency : organisation humanitaire (f) - travel agency : agence de voyage * agenda (n) (fa p) : 1/ ordre du jour (d'une réunion) - the political agenda of a newspaper : le programme politique d’un journal - What's first on the agenda ? : Qu'est-ce qui vient en premier dans l'ordre du jour ? - to set the agenda for a meeting : fixer l’ordre du jour d’une réunion ; 2/ programme qu'on s'est fixé, cause (f) - to push an agenda : militer pour une cause - hidden agenda : buts cachés (pl.), intentions cachées (f pl.), dessein inavoué, objectif secret - ideological agenda : programme idéologique - agenda pusher : militant d’une cause, propagandiste - agenda setting : fixation d’un ordre du jour, établissement d’un ordre du jour * agenda-driven (ac) : guidé par un objectif, déterminé par une cause - agenda-driven narrative : discours guidé par un objectif * agent (n) : 1/ agent - double agent (Intel.) : agent double - sleeper agent (Intel.) : agent dormant ; 2/ (Com.) représentant, concessionnaire ; 3/ - estate agent : administrateur de terres ; 4/ (Cin.) impresario / imprésario ; 5/ (Médias) attaché(e) - press agent : attaché(e) de presse ; 6/ (Gram.) complément d’agent ; 7/ produit - delousing agent : produit anti-poux * age-old (ac) : séculaire * aggrandise (brit.) / aggrandize (amér.) (v) (tr.) : agrandir * aggrandisement (brit.) / aggrandizement (amér.) (n) : agrandissement, extension - the policy of territorial aggrandizement : la politique de l’agrandissement territorial * aggravate (v) (tr.) (fa p) : 1/ aggraver ; 2/ agacer, exaspérer, taquiner * aggregating (n) : (Toile) agrégation (f) - content aggregating : agrégation de contenus * aggregation (n) : (Toile) agrégation (f) - content aggregation : agrégation de contenus * aggregator (n) : (Toile) agrégateur - content aggregator : agrégateur de contenus * aggression (n) : agression (f) - war of aggression : guerre d’agression * aggressive (a) : agressif/-ive - aggressive driving : conduite agressive en voiture, comportement agressif au volant * aggressively (adv.) : agressivement * aggressiveness (n) : agressivité (f) * aggro (a) (abr. de aggressive : agressif/-ive) (arg.) : - to go aggro : devenir agressif * aggrieved (a) : blessé(e), froissé(e) * aghast (a) : consterné(e), horrifié(e) * agile (a) : agile, souple, réactif/-ive * agility (n) : agilité (f), souplesse (f), réactivité (f) * aging (a) : vétuste, vieillissant(e) * aging (n) : vieillissement * agitate (v) (tr.) : 1/ agiter, secouer, remuer ; 3/ troubler, inquiéter * agitated (a) : 1/ agité(e), secoué(e), remué(e) ; 2/ troublé(e), inquiet/-iète * agitation (n) : nervosité (f) * ago (adv.) : il y a + expression de durée - ten years ago : il y a dix ans * agonal (a) : d’agonie, d’agonisant(e), agonique, agonal(e) - agonal breathing : respiration d’agonisant(e) - agonal state : état d’agonie * agonise (brit.) / agonize (amér.) (v) (intr.) (fa) : se tourmenter - She agonised for weeks over the decision : Elle retourna la décision dans tous les sens des semaines durant * agony (n) (fa) : douleur extrême (f), angoisse (f) - agony column : (Presse) courrier du cœur - agony uncle (brit.) : (Presse) responsable (masculin) du courrier du cœur * agree (v) (intr.) : 1/ (tr.) - to agree that… : être d’accord avec le fait que… ; (intr.) être d’accord - I couldn’t agree more : Je partage pleinement ce sentiment, Je suis entièrement de cet avis ; 2/ (intr.) consentir - to agree to sth : consentir à qch ; 3/ (tr.) - to be agreed upon sth : être d’accord sur qch, convenir de qch ; (intr.) se mettre d’accord (upon sth, sur qch) ; 4/ (intr.) (Gram.) s’accorder (with, avec) * agreeable (a) (fa p) : 1/ agréable ; 2/ consentant(e), favorable - I'm agreeable : Je n'y vois pas d'inconvénient, Je n'y suis pas opposé * agreeably (adv.) : agréablement * agreement (n) (fa) : 1/ accord, convention (f) - to backtrack on an agreement : revenir sur un accord - internship agreement : convention de stage - manufacturing agreements : accords de fabrication ; 2/ contrat - supply agreement : contrat d’approvisionnement ; 3/ (Gram.) accord - subject-verb agreement : accord du sujet et du verbe - gender agreement : accord en genre * agricultural (a) : agricole - agricultural engineer : ingénieur agronome - agricultural implements : instruments aratoires - agricultural science : agronomie (f) - agricultural show : salon de l’agriculture - agricultural terrace : terrasse agricole (f), terrasse de culture * agriculturally (adv.) : sur le plan agricole, du point de vue agricole * agriculturally produced : d'origine agricole - agriculturally produced biofuels : biocarburants d'origine agricole * agriculture (n) : agriculture (f) - intensive agriculture : agriculture intensive (syn. farming) * aground (a) : (Naut.) échoué(e) * aground (adv.) : (Naut.) sur le rivage, à terre - to run aground : s’échouer * ahead (a) : en tête - to be ahead : être en tête * ahead (adv.) : 1/ devant ; 2/ en tête ; 3/ à venir - in the weeks ahead : dans les semaines à venir - in the hours and days ahead : dans les heures et les jours qui viennent * ahead of (loc. prép.) : 1/ devant - to be (way) ahead of the others : être bien plus avancé que les autres ; 2/ en tête de - to stay ahead of… : rester en tête de… ; 3/ en amont de ; 4/ en avance sur - Production is ahead of schedule : La production est en avance sur les prévisions * AI (n) (init. de artificial intelligence : intelligence artificielle) : IA - AI product : progiciel d’IA * aid (n) : 1/ assistance (f), aide (f), soutien - to deliver aid to… : fournir une assistance à… ; 2/ soins (pl.), secours (pl.) - to render first aid : donner les premiers soins ; 3/ (an aid) outil d’aide, moyen, auxiliaire (n) ; 4/ prothèse (f) - hearing aid : appareil auditif, prothèse auditive (f) (syn. brit. deaf aid) * aid and abet (v) (tr.) : être complice de (sth, qch, sb, qn) * aided (pp de to aid) : (en compo.) assisté(e) par - computer-aided : assisté par ordinateur *AIDS (n) (init. de Acquired Immune Deficiency Syndrome : syndrome immuno-déficitaire acquis) SIDA - AIDS patient : malade du SIDA - AIDS vaccine : vaccin contre le SIDA * aids (n pl.) : outils (pl.) (éviter l'anglic. « aides » = subsides en français) * aileron (n) : aileron (de gauchissement) * ailing (a) : souffrant(e), malade * ailment (n) : maladie (f) * aim (n) : but, objet * aim (v) (intr.) : viser - to aim at zero paper : se fixer le zéro papier comme objectif - to aim to + inf. : viser à + inf. * aimless (a) : sans but * aimlessly (adv.) : [errer] au hasard * air (n) : 1/ air (l’élément) - compressed air : air comprimé - hot air : a/ air chaud ; b/ (fig.) du vent, des paroles en l’air - air bag : coussin autogonflable, coussin de protection (voir airbag) - air bed : matelas pneumatique, matelas gonflable - air conditioner : climatiseur - air mattress : matelas pneumatique - air pollution : pollution de l'air - air polisher : polisseuse pneumatique (f) - air quality : qualité de l'air ; 2/ air (où l’on vole) - [aircraft] to be back in the air : [aéronef] voler à nouveau, revoler - air base : base aérienne (f) - air carrier : transporteur aérien - air demonstration : démonstration aérienne (f) (syn. aerial demonstration) - air display : spectacle aérien, démonstration aérienne (syn. flying display) - air raid : raid aérien - air safety : sécurité aérienne (f) - air show : salon aéronautique, meeting aérien (anglic.) (aussi airshow) ; 3/ (the air) les ondes (f pl.), l’antenne (f) - to be on the air : (Radio) être à l'antenne, (Télé.) être en en direct - to go off the air : quitter l'antenne - air time : temps d’antenne * air (v) (tr.) : 1/ (tr.) exhaler ; 2/ (tr.) exhiber, afficher - Once out of the room, he aired his feelings in words which we cannot record : À peine sorti de la pièce, il donna libre cours à ses sentiments en des termes que nous ne pouvons rapporter ; 3/ (tr.) diffuser - [network] to air a debate : [chaîne] diffuser un débat ; (intr.) [émission] passer à l’antenne, être diffusé(e) * airbag (n) : coussin autogonflable, coussin de protection (voir airbag) * airbed (n) voir air bed * airborne (a) : 1/ en vol - to be airborne : être en vol, rester en vol - to go airborne : (au prop.) prendre son envol, prendre de l’altitude ; (au fig.) devenir aérien, s’étendre aux airs ; 2/ aérien - airborne ultrasonics : ultrasons aériens ; 3/ aéroporté(e) - airborne infantry : infanterie aéroportée (f) * aircraft (n) (pl. inv.) : appareil aérien, avion, aéronef - attack aircraft : avion de combat - commercial aircraft : aéronef commercial - light aircraft : petits avions (pl.) - retired aircraft : avion retiré du service, avion réformé - aircraft builder : constructeur d’avions, constructeur aéronautique - aircraft boneyard (amér.) : cimetière d’avions - the aircraft division : la direction avions - the aircraft industry : l’industrie aéronautique (f) - aircraft magazine : revue d’aviation (syn. aviation magazine) - aircraft maker : constructeurs d’aéronefs, avionneur * aircraft-related (ac) : relatif/-ive aux avions - aircraft-related documentation : documentation relative aux avions * air-dropped (ac) : parachuté(e), largué(e) par avion, largué(e) depuis les airs * air dry (vc) (tr.) : sécher à l’air * air-filled (ac) : pneumatique * airflow (n) : écoulement de l’air (sur un objet en soufflerie) - airflow body : carrosserie aérodynamique (f) * airhead (n) (péj.) : écervelé (n), crétin * airiest (a) (superl. de airy) : - the airiest place : l’endroit le plus aéré * airily (adv.) : 1/ légèrement, avec insouciance, d’un ton cavalier, d’un air dégagé ; 2/ joyeusement * airline (n) : compagnie aérienne (f), transporteur aérien * airliner (n) : avion de ligne - dual-engine airliner : avion de ligne à deux réacteurs * airman (n) (pl. airmen) : pilote * airmanship (n) : qualités (f pl.) de pilote, professionnalisme aéronautique * airplane (n) (amér.) : avion (brit. aeroplane) - commercial airplane : avion commercial * airplay (n) : passage (d'un disque) à la radio - It's getting a lot of airplay : On n’arrête pas de le passer à la radio * airport (n) : aéroport - airport tug : tracteur d’aéronefs * air power / airpower (n) : puissance aérienne (f) * airship (n) : aérostat, dirigeable * airspace (n) : espace aérien * airshow (n) : salon aéronautique, meeting aérien (anglic.) (aussi air show) (syn. air fair) - international airshow : salon aéronautique international - military airshow : spectacle aérien militaire * airstrike (n) : frappe aérienne (f) * airstrip (n) : piste d’envol, piste d’atterrissage * air-to-air (ac) : air-air - air-to-air missile : missile air-air * airwave (n) : onde (radio) (f) * airways ( n pl.) : 1/ (Av.) voies aériennes (f pl.) ; 2/ (Méd.) voies respiratoires - to unblock airways : dégager les voies respiratoires - congested airways : voies respiratoires congestionnées * airworthiness (n) : navigabilité (f) - airworthiness directive : consigne de navigabilité * airy (a) : 1/ aéré(e) ; 2/ spacieux/-euse ; 3/ élevé(e), aérien(ne) ; 4/ léger/légère ; 5/ éthéré(e) ; 6/ désinvolte * airy-fairy (a) (brit.) : farfelu(e) * aisle (n) : 1/ allée (f) (dans un autobus, un avion, un magasin), couloir (dans un train) ; 2/ allée centrale (f) (d’une église) - to walk up the aisle (fig.) : [futur mariée] se faire conduire à l’autel * aisled (a) : à bas-côtés - aisled barn : grange à bas-côtés * ajar (a) : [door, porte] entrouvert(e) * aka (prép.) (m d l) (= also known as) : également connu(e) sous le nom de, dit(e) * Ala. : abr. de Alabama, (l’)Alabama * Alabamian (n pr.) : habitant de l’Alabama * alacrity (n) : empressement * alarm (n) : alarme (f) - to set an alarm : programmer une alarme, régler une alarme - to sound the alarm : sonner l’alarme (over sth, à propos de qch) - activation of an alarm : déclenchement d’une alarme - alarm clock : réveille-matin (masc.), réveil * alarming (a) : alarmant(e), inquiétant(e) * alarmingly (adv.) : de façon alarmante, de façon inquiétante * alarmist (n) : alarmiste (m/f) - climate alarmists : pessimistes en matière de climat * Alaska (n pr.) : (l’)Alaska * Alaskan (a) : de l’Alaska, alaskain(e) * Alaskan (n pr.) : habitant de l’Alaska, Alaskain * Albania (n pr.) : (l’)Albanie * Albanian (a) : albanais(e) (sans maj.) * Albanian (n pr.) : Albanais (la langue) * albeit (conj. de concession) (lit.) : quoique, bien que * Albigensian (a) : (Rel.) albigeois(e) - the Albigensian crusade : la croisade contre les albigeois * Albigensian (n) : (Rel.) albigeois(e) * album (n) : 1/ (Mus.) (vinyle) 33 tours; 2/ (Mus.) album - stellar album : album remarquable - tribute album : hommage musical * alcohol (n) : alcool * alcoholic (a) : alcoolique - alcoholic beverage : boisson alcoolique (f) * alcohol-related (ac) : lié à l’alcool - alcohol-related disorders : troubles liés à l’alcool * alcove (n) : alcôve (f) * alderman (n) (pl. aldermen) : échevin - board of aldermen : conseil municipal - the Aldermen Court : la cour des échevins, le tribunal des échevins * aldermanic (a) : d’échevin - aldermanic gothic : le gothique d’échevin, le gothique victorien * ale (n) : bière (anglaise) (f) - pale ale : bière blonde * alert (a) (fa) : attentif/-ive - to stay alert : rester attentif, rester sur ses gardes * alert (n) : 1/ message d’alerte - air raid alert : alerte aérienne - alert condition : état d’alerte ; 2/ incident * alert (v) (tr.) : avertir (to, de), prévenir (to, de), alerter (to, à propos de) * A-Levels (brit.) (A étant l'init. de Advanced) : (Éduc.) (le) Bac (équiv. amér. the Scholastic Aptitude Test) - to take A-levels : préparer le Bac * alfalfa (n) : luzerne (f) * Algeria (n pr.) : (l’)Algérie * Algerian (a) : algérien(ne) (sans maj.) * Algerian (n pr.) : Algérien (le ressortissant) * algorithm (n) : algorithme * alkaline (a) : alcalin(e) - alkaline lake : lac salé * alkali-resisting (ac) : inattaquable par les alcalis * alias (adv.) (m d l) ) : alias, ou (de reformulation, d'équivalence), autrement dit * alien (a) : extraterrestre (syn. extraterrestrial) - alien being : créature extraterrestre (f) - alien invasion : invasion extraterrestre (f) - alien spaceship : vaisseau extraterrestre - alien underground base : base souterraine extraterrestre (f) * alien (n) : extraterrestre (n) (syn. extraterrestrial) * align (v) (tr.) : aligner * alignment (n) : alignement * alimony (n) (pl. alimonies) : pension alimentaire (f) * alkaline (a) : alcalin(e) - alkaline soil : sol alcalin * all (adj. indéf.) : tout/-te, tous/-tes * all (pron. indéf.) : tout ; tous/-tes - all of which : qui tous / toutes * all about (loc. prép.) : 1/ dans all about sth : tout sur qch, tout de qch - Read all about it! (cri de vendeur de journaux) : Tout sur… ; 2/ dans to be all about (sth) : se concentrer sur (qch) - This operation is all about encircling the enemy : Cette opération vise surtout à encercler l’ennemi * all about (loc. adv.) (brit.) : [regarder] tout autour * all aquiver (a) : voir aquiver (a) * allay (v) (tr.) : calmer, apaiser * all but (adv.) : (+ adj.) quasi - all but surreal : quasi irréel(le) * all-digital (ac) : entièrement numérisé(e) * alleged (ppa) : présumé(e) * allegedly (adv.) : 1/ (+ adj. ou loc. adj.) prétendument ; 2/ (mod. phr.) à/ (en incise) selon certaines sources, d’après ce qu’on dit, paraît-il (syn. reportedly) ; b/ (avec verbe au preterit) verbe au conditionnel en français * all-encompassing (ac) : qui englobe tout, universel(le), complet/-ète, exhaustif/-ive * alleviate (v) (tr.) : 1/ alléger, soulager (une douleur, la souffrance) ; 2/ atténuer, réduire * Allen (n p.) : Allen - Allen key : clé Allen, clé hexagonale (f) * allergy (n) (pl. allergies) : allergie (f) * alley (n) (fa p) : 1/ allée (f) (de jardin) - back alley : allée derrière la maison ; 2/ ruelle (f) * alleyway (n) : ruelle (f), venelle (f) - a warren of alleyways : un dédale de ruelles * all-female (ac) : exclusivement féminin(e), réservé(e) aux femmes - all-female party : a/ groupe composé uniquement de femmes ; b/ soirée réservée aux femmes (anton. all-male) * alliance (n) : alliance (f) * alligator (n) : alligator - alligator clip (amér.) : pince crocodile (f) (syn. brit. crocodile clip) * all-in (ac) : intégral(e) - all-in wrestler : lutteur professionnel, lutteuse professionnelle * all in all (loc. adv.) : dans l’ensemble, somme toute, à tout prendre * all-knowing (ac) : omniscient(e), qui a la science infuse * all-male (ac) : exclusivement masculin(e), réservé(e) aux hommes - all-male party : a/ groupe composé uniquement d’hommes ; b/ soirée réservée aux hommes (anton. all-female) * all-night (ac) : - all-night bar : bar ouvert toute la nuit * allocate (v) (tr.) : attribuer (to, à), affecter (to, à), allouer (to, à) * all-out (ac) : total(e) - all-out strike : grève totale (f) - all-out war : guerre totale (f) - to wage an all-out war : livrer une gerre totale (against, contre) * allow (v) : 1/ (tr.) permettre à, autoriser ; 2/ (intr.) (to allow for) a/ tenir compte de ; b/ rendre possible, autoriser ; 3/ (tr.) laisser, ménager * allowing (p. prés.) : (après virgule) ce qui permet * allowing for (loc. prép.) : 1/ en tenant compte de, eu égard à - Standards for children's height at ages 2-9 years allowing for height of parents : Tailles normales des enfants de 2 à 9 ans compte tenu de la taille des parents ; 2/ sous réserve de - allowing for normal use, … : sous réserve d'une utilisation normale, … * alloy (n) : alliage - alloy of gold and silver : alliage d’or et d’argent - semi-pure alloy : alliage semi-pur * all-powerful (ac) : tout-puissant(e) * all-purpose (ac) : tous usages - all-purpose tractor : tracteur tous usages * allround (a) : général(e) - allround rise : augmentation générale (f) * all the same (loc. adv.) : malgré tout, quand même, tout de même, au demeurant * all the way (expr.) : 1/ tout du long, pendant tout le parcours ; 2/ jusqu’au bout * all the way through (loc. adv.) : d’un bout à l’autre - to read a book all the way through : lire un livre du début à la fin * all through (loc. prép.) : d’un bout à l’autre de, pendant tout / toute - all through the recession : pendant toute la crise * all told (loc. adv.) : 1/ (après un nombre) : en tout ; 2/ - all told, … (en début de phrase) : tout compte fait, …, somme toute, … * allude (v) (intr.) : faire allusion (to, à) * allure (n) (fa) : attrait, charme, séduction (f) * alluring (a) : attrayant(e), séduisant(e) * ally (n) (pl. allies) : allié (n) * ally (v) : (tr.) to ally sth/sb with sth/sb : allier qch/qn à qch/qn ; (intr.) to ally with sth/sb : s’allier à qch/qn * almost (adv.) : presque * alms (n) : aumône (f) * aloft (n) (lit.) : en haut * alone (a) 1/ (attribut) seul(e) ; 2/ (en apposition) à lui seul / elle seule, à eux seuls / elles seules, etc. * alone (adv.) : seul, tout seul - to go it alone : faire cavalier seul * along (prép.) : 1/ (= en longeant) le long de ; 2/ (= en suivant) - He walked along the lane : Il suivit le sentier * alongside (prép.) : 1/ le long de ; 2/ côte à côte avec, à côté de, aux côtés de * along with (loc. prép.) : 1/ avec, en compagnie de, à côté de, en combinaison avec ; 2/ en même temps que, ainsi que * aloof (a) : distant(e) * aloofness (n) : attitude distante (f), réserve (f), détachement, attitude hautaine (f) * alphabetically-arranged (ac) : disposé(e) selon l’ordre alphabétique * alphanumeric (a) : alphanumérique - alphanumeric characters : caractères alphanumériques *alphatest (n) : essai préliminaire * alpine (a) : alpin(e) - alpine skiing : ski alpin * Alps (n pr.) : (les) Alpes (f pl.)- the French Alps : les Alpes françaises * already (adv.) : déjà * also (adv.) : 1/ également, aussi ; 2/ (Also) (en t de p) a/ De plus, … ; b/ De même, … * alt (a) (tronc. de alternative, employé en compo.) : alt lit (= alternative literature) : littérature publiée à compte d’auteur, littérature mise en ligne sur les réseaux sociaux - the alt right (= the alternative right) : l’extrême droite, la droite radicale * altar (n) : (Rel.) autel - horned altar : (Archéo.) autel à cornes - altar piece : rétable (masc.) * alter (v) (tr.) (fa) : 1/ modifier, changer ; 2/ remanier, retoucher - to alter photos : retoucher des photos ; 3/ fausser, truquer (péj.), trafiquer (péj.) - to alter the facts : falsifier les faits, trafiquer la réalité * alterable (a) (fa) : modifiable * alteration (n) (fa) : 1/ modification (f), changement ; 2/ remaniement, retouche (f) * altering (n) (fa) : modification (f), retouchage, retouche (f) - photo altering : retouche de photos * alternating (a) : 1/ alternant ; 2/ [courant] alternatif - alternating current : courant alternatif * alternative (a) (fa) : 1/ autre, de remplacement, de substitution, de rechange - alternative fuel : carburant de substitution - alternative sources of energy : énergies de substitution - alternative suggestion : proposition de rechange ; 2/ non officiel(le), parallèle, alternatif/-ive (anglic.) - the alternative media : les médias non officiels, les médias alternatifs (anton. the mainstream media) - alternative news : nouvelles non officielles, nouvelles alternatives - alternative technology : technologies parallèles * alternative (n) (fa) : solution de rechange, solution de substitution, solution de remplacement - to come up with an alternative : trouver une solution de rechange * Alternatively (a m p) (t d p) (fa) : Une autre solution serait de ..., Une autre possibilité serait de …, Autre solution : …, Autre possibilité : ... * although (conj. de concession) : 1/ bien que, quoique, en dépit du fait que ; 2/ même si * altogether (adv.) : 1/ tout à fait, complètement ; 2/ en tout, en tout et pour tout * alt-right (ac) : d’extrême droite, de la droite radicale - alt-right organization : officine d’extrême droite * aluminium (brit.) / aluminum (amér.) (n) : aluminium - aluminium foil : clinquant d’aluminium - aluminium parts : pièces d’aluminium * aluminium-intensive (ac) : demandant beaucoup d’aluminium - aluminium-intensive construction : construction demandant beaucoup d'aluminium * alum (n) (abr. de alumnus, alumna) (amér.) : ancien étudiant, ancienne étudiante (f), ancien, ancienne (f) * alumna (n) (pl. alumnae) : ancienne élève (f) * alumnus (n) (pl. alumni) : 1/ étudiant(e) (d’une université) ; 2/ diplômé(e) (d’une université) * always (adv.) : toujours (au sens de continuellement) * always-on (ac) : toujours allumé(e) - always-on microphone : micro toujours allumé * a. m. (adv.) (init. du latin ante meridiem : avant midi) : du matin, du mat’ (fam.) * amalgam (n) : fusion (f), réunion (f), mariage * amateur (a) : amateur/-trice - amateur historian : historien amateur * amateur (n) (fa p) : 1/ amateur, amatrice ; 2/ non professionnel, non professionnelle * amateurish (a) : d’amateur, non professionnel(le) * amaze (v) (tr.) : stupéfier * amazed (a) : stupéfait(e), ébahi(e) * amazement (n) : étonnement, stupéfaction (f), stupeur (f) - to look on in amazement : contempler la scène avec stupéfaction * amazing (a) : étonnant(e), stupéfiant(e) (syn. astonishing) * amazingly (adv.) : de façon étonnante, de façon stupéfiante * ambassador (n) : ambassadeur (fém. ambassadress) * ambassadorship (n) : fonction d’ambassadeur - to hold an embassadorship in Iran : être ambassadeur en Iran * ambassadress (n) : ambassadrice (f) (le masc. est ambassador, anciennement embassador) * amber (n) : ambre (masc.) * amber (a) : ambré(e), jaune * ambiguity (n) : ambiguité (f) * ambiguous (a) : ambigu(ë), incertain(e) * ambiguously (adv.) : de façon ambiguë * ambition (n) : ambition (f) * ambitious (a) : ambitieux/-euse * ambitiously (adv.) : ambitieusement, avec ambition * ambivalent (a) (fa p) : 1/ ambivalent(e) ; 2/ partagé(e) - to feel ambivalent about sth : être partagé à propos de qch ; 3/ indécis(e), hésitant(e) * amble (n) : 1/ (Équit.) amble ; 2/ pas tranquille * amble (v) (intr.) : 1/ (Équit.) aller l’amble, ambler ; 2/ marcher d’un pas tranquille * ambush (n) (pl. ambushes) : embuscade (f), guet-apens * ambush (v) (tr.) : tendre une embuscade à, tendre un guet-apens à * AmE (sigle) (abr. de American English : anglais américain) : angl. amér. * amenable (a) : disposé(e), prêt(e) (to sth, à qch ; to doing sth, à faire qch) * America (n pr.) : (l’)Amérique (f) - Latin America : (l’)Amérique latine - North America : (l’)Amérique du Nord - South America : (l’)Amérique du Sud * American (a) : américain(e) (sans maj.) - It’s as American as apple pie : C’est aussi américain que la tarte aux pommes - an American woman : une Américaine * American (n pr.) : Américain (l’habitant) * americanise (brit.) / americanize (amér.) (v) : (tr.) américaniser - to americanise one’s accent : américaniser son accent ; 2/ (intr.) s’américaniser * americanism (n) : américanisme * American-made (ac) : fabriqué aux États-Unis - American-made products : produits fabriqués aux États-Unis, produits américains (syn. US-made) * amiability (n) : amabilité (f) * amiable (a) : aimable * amiably (adv.) : avec amabilité, aimablement, gentiment * amicability (n) : disposition amicale (f), bienveillance (f) (syn. amicableness) * amicable (a) : 1/ amical(e) ; 2/ à l’amiable - an amicable settlement of our difficulties : un règlement à l’amiable de nos problèmes * amicableness (n) : disposition amicale (f), bienveillance (f) (syn. amicability) * amicably (adv.) : 1/ amicalement ; 2/ à l’amiable * amid (prép.) : parmi * amidst (prép.) = amid * amiss (a) : mal (à propos) - Something is amiss : Quelque chose ne va pas * ammo (n) (abr. de ammunition, munitions (f pl.) : live ammo : munitions réelles, balles réelles (f pl.), vraies balles (f pl.) - ammo depot : dépôt de munitions (syn. ammo dump) * ammonia (n) : ammoniaque (f) * ammunition (n) : ammunitions (f pl.) - ship laden with ammunition : navire chargé de munitions * amok (a) : pris(e) de folie meurtrière - to run amok : se déchaîner, devenir fou furieux * among (prép.) : 1/ parmi, entre, au nombre de - among other things : entre autres choses - They are always fighting among themselves : Ils se battent toujours entre eux ; 2/ chez * amoral (a) : amoral(e) * amorality (n) : amoralité (f) * amortisation (n) (fa) : remboursement (d'un emprunt) * amount (n) : 1/ montant, quantité (f) (syn. quantity), somme (f) (syn. sum), volume - a massive amount of… : une énorme quantité de… ; a small amount : une faible quantité ; 2/ (amér.) importance (f), portée (f) * amount (v) (intr.) : 1/ se monter (to, à), s’élever (to, à), équivaloir (to, à) ; 2/ to amount to (amér.) : valoir qch * amp (n) (tronc. de amplifier : amplificateur) : ampli * amphibian (a) : amphibie * amphibious (a) : amphibie - amphibious aircraft : aéronef amphibie, avion amphibie * amphora (n) : amphore (f) * ample (a) (fa) : suffisant(e) (en quantité) - There is ample room in my car : Il y a suffisamment de place dans ma voiture * amplifier (n) : amplificateur * amplifier/receiver (n double) : amplificateur-syntoniseur * amply (adv.) : amplement * amputate (v) (tr.) : amputer * amputation (n) : amputation (f) * amusement (n) : amusement - amusement fair : fête foraine (f) (syn. fun fair) - amusement park : parc d’attractions * an (art. indéf.) : un, une - an effort : un effort - an hour (h muet) : une heure * anachronism (n) : anachronisme - to be a total anachronism : être un parfait anachronisme * anaesthetised/-ized (ppa) : 1/ anesthésié(e) ; 2/ (fig.) édulcoré(e) * anal (a) : anal, de l’anus - anal dilatation : dilatation anale - anal fissure : fissure anale (f) - anal fisting : (Sex.) enfoncement du poing dans l’anus - anal toy : (Sex.) jouet anal * anally (adv.) : par voie anale - to be anally raped : être victime d’un viol par voie anale - to get anally stretched : (Sex.) se faire distendre l’anus * analog (amér.) / analogue (brit.) : analogique - analogue watch : montre analogique (f) * analogical (a) : analogique * analogous (a) : analogue (to, à), identique (to, à) * analogy (n) : 1/ analogie (f), comparaison (f) - by analogy : par analogie ; 2/ analogie, similitude (f) * analyse (v) (tr.) : analyser * analysis (a) (pl. analyses) : analyse (f) - prediction analysis : (l’)analyse prévisionnelle * analyst (n) : spécialiste (m/f), expert, analyste (m/f) - CIA analyst : analyste de la CIA - intelligence analyst : analyste du renseignement - military analyst : analyste militaire - market analyst : spécialiste des marchés - political analyst : analyste politique, politologue - share analyst : analyste financier * analytics (n) : 1/ (sing.) (l’)analyse de données ; 2/ (f pl.) données analysées - personal analytics : données personnelles analysées * anaphylactic (a) : anaphylactique - anaphylactic shock : choc anaphylactique * anarchic (a) : anarchique, chaotique * anarchically (adv.) : anarchiquement, de façon anarchique, de façon désordonnée * anarchical (a) : arachique, chaotique * anarchism (n) : anarchisme * anarchist (n) : anarchiste (m/f) * anarchy (n) : anarchie (f) * anchor (n) : ancre (f) - Anchors away! : Levez l’ancre ! - anchor ring : anneau d’une ancre ou d’un grappin, cigale * anchored (ppa) : ancré(e) * anchorman (n) : présentateur vedette (du journal télévisé) (syn. newsreader - newscaster) * anchor ring-shaped (ac) : en forme d’anneau d’ancre, en forme de cigale * anchorwoman (n) : présentatrice vedette (f) (du journal télévisé) (syn. newsreader - newscaster) * ancient (n) : 1/ (fa) antique - Life in ancient Rome : La vie dans la Rome antique ; 2/ ancien(ne), très vieux/vieille, très âgé(e) - the ancient (a. subst. sing.) : l’ancien - ancient language : langue ancienne - ancient Tahiti : Tahiti aux temps anciens * ancillary (a) : auxiliaire, supplémentaire - ancillary equipment : matériel auxiliaire * ancillary (n) (pl. ancillaries) : accessoire (n) * and (conj. de coord.) : 1/ et ; 2/ (en tête de phrase) And …, De plus, … * Andalusian (a) : andalous(e) - an Andalusian song : une chanson andalouse * Andean (a) : andin(e) * Andes (n pr.) : (la) cordillère des Andes, (les) Andes * android (n) : androïde * and so on (expr.) : et ainsi de suite * anecdotally (adv.) : 1/ de façon anecdotique ; 2/ Anecdotally, … (a m p) Soit dit en passant, ... , En passant, ... , Incidemment, ... (var. More anecdotally, …) ; 3/ selon des sources non confirmées, sans confirmation * anent (prép.) (Écosse) : à l'égard de * anaesthesiologist (n) (amér.) : anesthésiologiste, anesthésiste-réanimateur/-trice * anaesthetist (n) (brit.) : anesthésiologiste, anesthésiste-réanimateur/-trice * aneurism / aneurysm (n) : anévrisme / anévrysme - to have aneurism surgery : se faire opérer d’un anévrisme * anew (adv.) : de nouveau, à nouveau, une nouvelle fois - [economic system] to collapse or rise anew : [système économique] s’effondrer ou se relever * angel (n) : ange - evil angel : ange du mal - guardian angel : ange gardien * angelic (a) : angélique, d’ange - angelic beauty : beauté angélique (f) * anger (n) : colère (f), courroux * anger (v) (tr.) : mettre en colère, courroucer * angle (n) : 1/ angle - angle bracket : équerre de fixation - (Math.) angle brackets : chevrons ; 2/ (fig.) angle, aspect ; 3 / (fig.) vision (f) * angle (v) : (tr.) incliner, régler à l’angle voulu, orienter à l’angle voulu ; (intr.) faire un angle, être incliné, être penché, se pencher - to angle for sth : chercher à obtenir qch * angled (ppa) : coudé(e) * anglicism (n) : anglicisme - fake anglicism : faux anglicisme (syn. pseudo-anglicism) * anglo- (préf.) : anglo- (préf.) * Anglo (n) (pl. Anglos) (amér.) : [Américain] blanc, [Américaine] blanche - the Anglo elite : l’élite blanche * Anglo-American (a) : anglo-américain(e) - the Anglo-American establishment : l’oligarchie anglo-américaine * anglophile (n) : anglophile (f) * anglophone (a) : anglophone (syn. English-speaking) * Anglophone (n) : anglophone (syn. English speaker) * anglosphere (n) : sphère anglophone (f), anglosphère (f) * angrily (adv.) : 1/ avec colère ; 2/ d’un air furibond, sur un ton furibond * angry (a) : courroucé(e), en colère * animal (n) : animal - animals in their natural habitat : animaux dans leur habitat naturel - performing animals : animaux savants - testing on animals : (l’)expérimentation animale - animal activist : défenseur des droits des animaux - animal trainer : dresseur d’animaux, dompteur (pour des fauves) * animated (a) : animé(e) - animated cartoon : dessin animé * animator (n) : réalisateur de films d’animation, réalisateur de dessins animés - computer animator : spécialiste de l’animation assistée par ordinateur, infographiste - film animator : auteur de films d’animation * animosity (n) : animosité (f) * annihilate (v) (tr.) : annihiler, anéantir * annihilation (n) : annihilation (f), anéantissement - annihilation of a country : anéantissement d’un pays - war of annihilation : guerre d’annihilation * anniversary (n) : anniversaire de mariage * announce (v) (tr.) : annoncer, faire savoir * announcer (n) (fa p) : 1/ annonceur (personne chargée de faire des annonces) ; 2/ présentateur (à la radio, à la télé) * annoy (v) (tr.) : embêter, agacer, exaspérer * annoyance (n) : désagrément * annoying (a) (fa) : agaçant(e), exaspérant(e) * annoyingly (adv.) : de façon exaspérante * annuity (n) : rente viagère (f), viager (m) * anoint (v) (tr.) : oindre (qch ou qn) * anointed (a) : oint(e) - the Lord’s anointed : l’oint du Seigneur * anomalous (a) : anormal(e) - anomalous events : événements anormaux * anomaly (n) (pl. anomalies) : anomalie (f) - to report an anomaly : signaler une anomalie - electrical anomalies : bizarreries électriques (f pl.) * anonymise (brit.) / anonymize (amér.) (v) (tr.) : rendre anonyme * anonymity (n) : anonymat - to speak on condiion of anonymity : parler sous couvert d’anonymat * anonymous (a) : anonyme * anonymously (adv.) : anonymement * anorak (n) : coupe-vent, K-way * another (a) : un autre, une autre - It is another matter : C’est une autre histoire * anoxia (n) : anoxie (f) * answer (n) : réponse (f) - positive answer : réponse positive - answer keys : corrigés (d’exercises) - answer sheet : corrigé (n), feuille de corrigés * answer (v) : 1/ (tr.) répondre ; 2/ (intr.) - to anwer to the name of… : répondre au nom de… - Answer to your name : (en classe) Répondez à l’appel de votre nom * answering (n) : réponses (f pl.) - answering device : répondeur automatique * Antarctica (n pr.) : (l’)Antarctique * ante (n) : mise (f) (au poker), enjeu - to raise the ante : augmenter la mise, faire monter les enjeux * antelope (n) : antilope (f) (noter diff. ortho.) * antenna (n) (pl. antennas ou – en biologie – antennae) : antenne (f) (de radio, de télé) - community antenna : antenne collective - dish antenna : antenne parabolique - radio antenna : antenne de radio - TV antenna : antenne de télé (syn. brit. aerial) * anthem (n) : hymne * anthropogenic (a) anthropique, anthropogène (syn. human-made, man-made, human-caused) * anti-aircraft (a) : anti-aérien(ne) - anti-aircraft cannon : canon anti-aérien * anti-American (n) : anti-américain(e) * anticipate (v) (tr.) (fa) : 1/ attendre, escompter, espérer ; 2/ prévenir, devancer, prévoir - to anticipate the future : prévoir l'avenir * anticipation (n) : 1/ attente (f), impatience (f) - in anticipation of… : dans l’espoir de… ; 2/ prévision - in anticipation of the future : en prévision de l'avenir * anticlericalism (n) : (l’) anticléricalisme (anton. clericalism : (le) cléricalisme) * anticlockwise (a) (brit.) : [sens] anti-horaire, senestrorsum (amér. counterclockwise) * anticlockwise (adv.) (brit.) : dans le sens anti-horaire (amér. counterclockwise) * antics (n pl.) : bouffonneries (f pl.), singeries (f pl.) * anti-cult (a) fa) anti-secte - anti-cult movement : mouvement anti-secte * antidisestablishmentarian (a) : qui est contre la désinstitutionnalisation de l’église anglicane, qui est antidésinstitutionnalisation * antidisestablishmentarianism (n) (un des terme les plus longs de la langue anglaise) : fait d’être contre la désinstitutionnalisation de l’église anglicane, antidésinstitutionnalisationnisme * antidote (n) : antidote (masc.) * anti-dumping (a) : anti-dumping - an anti-dumping investigation : une enquête anti-dumping - anti-dumping measures : mesures anti-dumping * anti-masker (n) : opposant au port du masque, anti-masque (n) * anti-money laundering (ac) : qui est contre le blanchiment d'argent - anti-money laundering measures : mesures contre le blanchiment d'argent * anti-noise (a) : antibruit - anti-noise helmet : casque anti-bruit * antinukes (n pl.) : (les) anti-nucléaires * antipollution (a) : antipollution - to take antipollution measures : prendre des mesures contre la pollution - to set new antipollution standards : fixer de nouvelles normes antipollution * antiquated (a) : désuet(te), démodé(e), dépassé(e) - antiquated work rules : une réglementation du travail dépassée * antique (n) (fa) : (une) antiquité (achetée dans un magasin) - antique dealer : antiquaire * anti-roll (a) : antiroulis - anti-roll bar (Auto.) : barre antiroulis (f) * anti-Russian (a) : anti-russe * anti-seismic (a) : antisismique * anti-semitic (a) : antisémite * antisubmarine (a) : anti-sousmarin(e) - antisubmarine warfare : (la) guerre anti-sousmarine * antithesis (n) (pl. antitheses) : antithèse (f) * anti-vaccination (a) : anti-vaccination - anti-vaccination activist : militant anti-vaccination * antivaxer (n) : opposant à la vaccination, anti-vaccin (n) (var. antivaxxer) * antonym (n) : antonyme * anus (n) : anus * anw (jarg. Web) : abr. de anyway (adv.) * anxiety (n) (fa p.) : 1/ anxiété (f) ; 2/ angoisse (f) - free-floating anxiety : angoisse diffuse, angoisse flottante ; 3/ fort désir, grand désir, vif désir * anxious (a) (fa) : 1/ inquiet/-ète (about, de), préoccupé(e) (about, par) ; 2/ désireux/-euse (to + inf., de + inf.) * anxiously (adv.) : 1/ avec inquiétude, avec anxiété ; 2/ impatiemment * any (adj. indéf.) : n’importe quel(le), tout(e) * any (adv.) (+ comparatif à la forme négative) : le moins du monde - The cost of living is not any cheaper : Le coût de la vie n’a absolument pas diminué * any and all (paire adj.) : tout le / toute la … sans exception, tous les … quels qu’ils soient, toutes les … quelles qu’elles soient - (to ignore) any and all objections : toutes les objections quelles qu’elles soient - any and all available means : tous les moyens disponibles sans exception - (not to accept) any and all liability : (décliner) toute responsabilité quelle qu’elle soit * anyhow (adv.) : de toute façon, de toute manière * anytime (conj.) : chaque fois que * anyway (adv.) : de toute manière, de toute façon * anywhere (adv.) : 1/ (remplace somewhere après une négation ou l’expression d’un doute) quelque part - Do you want to go anywhere special? : Veux-tu aller quelque part en particulier ? - I didn’t see your keys anywhere : Je n’ai vu tes clés nulle part part ; 2/ (dans une phrase affirmative) n’importe où * A-one (a) : (Maint.) en parfait état, en excellente condition (aussi A-1) * apace (adv.) : rapidement * apart (adj. tjrs attribut) : séparé(e) - We’ve been so long apart! : Nous avons été séparés si longtemps ! - wide apart : (en parlant de deux objets) largement écartés * apart from (loc. prép.) : en dehors de, en plus de, outre * apartment (n) (amér.) : appartement, appart (fam.) - to move into a new apartment : emménager dans un nouvel appartement - walk-up apartment : appartement sans ascenseur - maisonette apartment : duplex * apathy (n) : apathie (f) * aperture (n) : ouverture (f) * apex (n) (pl. apices ou apexes) : sommet, point culminant - the apex of a triangle : le sommet d’un triangle * apiary (n) : rucher - family apiary : rucher familial * apiece (a) : (après somme d’argent) la pièce, l’unité - at $1m apiece : coûtant 1 million de dollars l'unité * apocalyptic (a) : apocalyptique - apocalyptic visions : visions apocalyptiques (f pl.) * apocryphal (a) : apocryphe * apogee (n) : apogée (masc.) * apologise (brit.) / apologize (amér.) (v) (intr.) : s'excuser * apology (n) (fa) : excuses (f pl.) * app (n) (pl. apps) (tronc. de application) : (Inf.) appli (f) - app server : serveur d'applis * appal (v) (tr.) : épouvanter, terrifier * appalled (pp) : terrifié(e) (at, de), horrifié(e) (at, de) * appalling (a) : terrifiant(e), effroyable, épouvantable * appallingly (adv.) : effroyablement, épouvantablement * apparatus (n) : appareil, appareillage - electrical apparatus : appareillage électrique * apparel (n) (amér.) (fa) : habillement, vêtements (pl.) - women's apparel : vêtements de femme * apparent (a) (fa p) : 1/ apparent(e), ostensible ; 2/ manifeste, évident(e), clair(e), patent(e) ; 3/ présumé(e) - the apparent winner : le vainqueur présumé * apparently (adv.) : 1/ apparemment, en apparence ; 2/ (a m p) (t d p) Apparemment, ... , À ce qu’il paraît, ... * apparition (n) : apparition (surnaturelle) (f), spectre - to see an apparition : voir un spectre * appeal (n) : 1/ appel, injonction (f), demande insistante (f) ; 2/ attrait - to lose one's appeal : perdre de son attrait - sex appeal : attrait sexuel, charme sexuel, charme animal, séduction (f) * appeal (v) : (intr.) - to appeal to sb : solliciter qn * appealing (a) : 1/ [regard] suppliant(e) ; 2/ attirant(e), attrayant(e) ; 3/ [idée] séduisant(e) * appear (v) (intr.) : apparaître * appearance (n) (fa p) : 1/ apparence (f) ; 2/ apparition (f) - in order of appearence : par ordre d’apparition (acteurs dans un générique de film)- sudden appearance : émergence (f) * appease (v) (tr.) : 1/ apaiser, calmer ; 2/ désamorcer, faire retomber * appeaser (n) : 1/ partisan(e) de l’apaisement ; 2/ conciliateur/-trice * append (v) (tr.) : ajouter en annexe (to, à) * appendage (n) : pièce annexe (f) * appendix (n) (pl. appendices) (fa) : annexe (f) (d'un document, d'un rapport) * appetite (n) : appétit - appetite suppressant : coupe-faim (masc.) * applaud (v) (tr.) : applaudir * applause (n) : applaudissements (pl.) * apple (n) : 1/ pomme (f) - apple pie : tarte aux pommes ; 2/ (expressions diverses) - She is the apple of his eyes : Il tient à elle comme à la prunelle de ses yeux * apple-laden (ac) : couvert(e) de pommes - apple-laden tree : arbre couvert de pommes * applet (n) : (Inf.) appliquette, appelette / applette (francis.), applet (frangl.) (lang. java) * appliance (n) : appareil - audio appliance : appareil audio - electrical appliance : appareil électrique - home appliance : appareil domestique, appareil ménager - household appliance : appareil ménager - video appliance : appareil vidéo * applicant (n) : candidat(e), postulant(e) * application (n) (fa p) : 1/ application (f) (= soin) ; 2/ demande d'inscription, demande d'emploi ; 3/ application (pratique) (f) - application generator : (BdD) générateur d’applications * application-oriented (ac) : (Inf.) tourné(e) vers les applications, destiné(e) aux applications * application-specific (ac) : (Inf.) propre à une application, particulier à un client, spécifique à une application - application-specific integrated circuit : circuit intégré spécifique à une application, circuit intégré développé pour un client * applied (ppa) : appliqué(e) - applied psychology : psychologie appliquée - applied linguistics : linguistique appliquée * appliqué / applique (n) : (Cout.) 1/ (la technique) (l’)application, (l’)appliqué - appliqué techniques : techniques de l’appliqué ; 2/ (l’objet) (un) appliqué * appliqué / applique (v) (tr.) : (Cout.) coudre en application (on / to sth, sur qch) * apply (v) : 1/ (tr.) exercer, appliquer - to apply pressure : exercer une pression ; 2/ (tr.) appliquer (to, à) - to apply the brakes to the wheels : actionner les freins des roues ; 3/ (intr.) s’appliquer à, concerner ; 4/ (intr.) poser sa candidature, postuler - to apply for a post : postuler un poste * appoint (v) (tr.) (fa) : nommer (à un poste) * appointed (ppa) : [rendez-vous] fixé(e), [ministre] désigné(e) * appointee (n) : candidat(e) retenu(e), personne nommée * appointment (n) (fa) : 1/ nomination (f) - appointment to the position of manager : nomination au poste de directeur ; 2/ rendez-vous - to make an appointment : prendre un rendez-vous - to keep an appointment : aller à un rendez-vous - appointment schedule : liste de rendez-vous * apportion (v) (tr.) : assigner (sth, qch) comme part (to sb, à qn), attribuer (sth to sb, qch à qn, répartir (sth among…, qch parmi…) * apportionment (n) : répartition (f) * apposition (n) : (Gram.) apposition - "today’s phrase, kangaroo court" - "today’s phrase" and "kangaroo court" are in apposition : … sont en apposition * appraisal (n) : évaluation (f) * appraise (v) (tr.) : évaluer * appreciate (v) (fa p) : 1/ (tr.) apprécier (à sa juste valeur) ; (intr.) augmenter de valeur ;2/ être reconnaissant(e) de - I'd appreciate it if you... : Je vous serais reconnaissant(e) si vous... * apprehend (v) (tr.) (fa p) : appréhender (au sens d’arrêter) * apprentice (n) : apprenti (n) * apprenticeship (n) : apprentissage - to take up an apprenticeship with Veag : suivre un apprentissage chez Veag - to serve one’s apprenticeship : faire son apprentissage (as, en tant que) - work-study apprenticeship : apprentissage en alternance * apprised (ppa) : informé(e) * approach (n) (fa) : 1/ façon d'aborder, manière de s'y prendre, méthode (f), démarche (f), mode d'intervention - ecosystemic approach : démarche écosystémique ; 2/ solution (f) * approach (v) (tr.) : 1/ aborder (une personne, un sujet), contacter (une personne), saisir (une personne) de - to approach a problem : aborder un problème ; 2/ atteindre ; 3/ accoster tangentiellement (un contour) * appropriate (a) : approprié(e), adapté(e), adéquat(e), convenable, bon(ne), ad hoc (anton. inappropriate) - the appropriate location : le bon endroit * appropriate (v) (tr.) : 1/ s’approprier, s’emparer de, faire main basse sur ; 2/ attribuer, affecter (to sb, à qn) - to appropriate funds for sth : affecter des fonds à qch * appropriately (adv.) : de façon appropriée, de façon convenable * approval (n) : approbation (f) - to receive approval for sth : recevoir le feu vert pour qch - to win approval from… : obtenir l’aval de… * approve (v) : (tr.) approuver (au sens de ratifier, homologuer, agréer); (intr.) to approve of : approuver (au sens d’être en faveur de), voir d'un bon œil * approved (ppa) : approuvé(e) - approved manufacturing techniques : règles de fabrication * approx. : abr. de approximately * approximate (a) : approximatif/-ive * approximately (adv.) : approximativement * apron (n) : tablier * apt (a) : - to be apt to + inf. : être susceptible de + inf., être de nature à + inf. * aquarist (n) : aquariophile (m/f) * aquarium (n) (pl. aquariums ou aquaria) : 1/ aquarium (le bocal) ; 2/ aquarium (public) * aquatic (a) : aquatique - aquatic weed : herbes aquatiques (f pl.) * aquiline (a) : aquilin(e) - aquiline nose : nez aquilin * aquiver (a) (tjrs attribut) : frémissant(e) (aussi all aquiver) - to be aquiver with sth : frémir à la perspective de qch * Arabian (a) : 1/ d’Arabie ; 2/ arabique - the Arabian peninsula : la péninsule arabique * arachnophobe (n) : arachnophobe (m/f), personne craignant les araignées * arachnophobia (n) : arachnophobie (f), peur des araignées * arbitrariness (n) : arbitraire (n), caractère arbitraire * arbitrary (a) : arbitraire * arboretum (n) : arboretum * arboriculturist (n) : arboriculteur, arboricultrice * arborist (n) : élagueur, élagueuse, arboriste (m/f) * arc (n) : arc - arc light : lampe à arc * arc (v) (intr.) : décrire un arc * arch (n) (pl. arches) : 1/ (Archi.) arche (f), arc - triangular arch : arc en mitre ; 2/ voûte plantaire (f) - All I’m developing is fallen arches! : Tout ce que j’attrape, c’est les pieds plats ! * arch (v) : (tr.) courber, arquer (one’s back, le dos) ; (intr.) former une voûte (over sth, sur qch) * archaeologist (n) : archéologue (m/f) - aerial archaeologist : spécialiste de l’archéologie aérienne * archaeology (brit.) / archeology (amér.) (n) : archéologie (f) - aerial archaeology : archéologie aérienne - fringe archaeology : archéologie des marges, archéologie marginale * archduke (n) : archiduc * archeomania (n) : archéomanie (f) * archeomaniac (n) : archéomane (m/f) * archer (n) : archer/-chère * archery (n) : tir à l’arc - archery bow : arc de tir à l’arc * architect (n) : architecte (m/f) - landscape architect : architecte paysagiste * architectural (a) : architectural(e) - architectural enthusiast : mordu d’architecture - architectural technologist : technologue en architecture (Q) * architecturally (adv.) : architecturalement, d’un point de vue architectural * architecture (n) : architecture (f) * archive (n) : 1/ fonds archivistique, dépôt, centre d’archivage, service des archives ; 2/ document d’archives * archive (v) (tr.) : archiver * archivist (n) : archiviste (m/f) - audiovisual archivist : (Presse) archiviste audiovisuel * Arctic (a) : arctique - the Arctic cirle : le cercle arctique * area (n) : 1/ zone (f), espace (f), région (f) - high-risk area : zone à haut risque ; 2/ secteur (d’activité) * arena (n) : 1/ arène (f) ; 2/ champ d’activité, domaine, secteur, échiquier * Argentina (n pr.) : (l’)Argentine * Argentine (a) : argentin(e) * Argentine (n pr.) : Argentin (le ressortissant) * arguably (a m p) : possiblement, peut-être, probablement, sans doute, on peut soutenir que… * argue (v) (fa) : 1/ (tr.) prétendre, soutenir (syn. to claim) - to argue that… : contester le fait que ; 2/ (intr.) discuter (avec force), plaider - Please stop arguing! : Arrête / Arrêtez de râler ! - to argue for sth : préconiser qch * argument (n) (fa p) : 1/ argument - the argument goes (prop. incise) : si l’on en croit cette thèse ; 2/ vive discussion (f), dispute (f), querelle (f) (over sth, à propos de qch) (syn. dispute) - I hate all these arguments : Je ne supporte plus toutes ces disputes * arise (v) (arose, arisen) (intr.) : 1/ se lever ; 2/ s’élever ; 3/ survenir, se présenter, se manifester, surgir - if need arises : si le besoin s’en fait sentir - The first question that arises is… : La première question qui se pose est… * arisen (pp de to arise) * aristocracy (n) : aristocratie (f) * aristocrat (n) : aristocrate (m/f) * aristocratic (a) : aristocratique * arithmetic (n) : (l’)arithmétique - mental arithmetic : (le) calcul mental - Your mental arithmetic is excellent : Tu es / Vous êtes fort en calcul mental * Ariz. : abr. de Arizona, (l’)Arizona * Arizona (n pr.) : (l’)Arizona * Ark. : abr. de Arkansas, (l’)Arkansas * Arkansas (n pr.) : (l’)Arkansas * Arkie (n pr.) : habitant de l’Arkansas * arm (n) (fa p) : 1/ (au propre) bras - the upper arm : l’avant-bras ; 2/ (au fig.) branche (f) (d’une compagnie) - the sales arm : le bras commercial ; * arms (n pl.) armes (f pl.) - arms company : marchand d’armes - arms dealer : trafiquant d’armes - arms dealing : trafic d’armes - arms embargo : embargo sur les armes - arms race : course aux armements * arm (v) (tr.) : armer * armadillo (n) : tatou * armament (n ind. sing.) : armements (pl.) - armament manufacturer : fabricant d’armes * armchair (n) : fauteuil - armchair general : général de salon, général en pantoufles, stratège en chambre * armed (a) : armé(e) - armed robbery : vol à main armée, braquage * armed and ready (paire adj.) : prêt(e) au combat - The gunship, armed and ready, patrolled the skies : L’hélicopère d’attaque, prêt au combat, patrouillait dans le ciel - Missiles armed and ready, sir : Missiles armés et prêts, capitaine * Armenia (n pr.) : (l’)Arménie (f) * Armenian (a) : arménien(ne) (sans maj.) * Armenian (n pr.) : Arménien (le ressortissant), Arménienne (la ressortissnte) * armistice (n) : armistice * armorer (brit.) / armourer (amér.) : armurier * armpit (n) : 1/ aisselle (f) - armpit hair : poils sous les aisselles ; 2/ (arg.) coin malfamé * army (n) : armée (f) - paper army : armée de papier, armée d’opérette - stay-behind army : armée dormante - the Salvation Army : l’Armée du salut - army hazing : bizutage à l’armée * armyworm (n) : (la) légionnaire (la chenille) - the fall armyworm : la légionnaire d’automne * arose (prét. de to arise) * around (prép.) : 1/ (tout) autour de (syn. brit. about) ; 2/ dans - around the house : dans la maison (syn. brit. about) * around (adv.) : autour de soi, aux alentours, partout (syn. brit. about) - Anybody around? : Y a-t-il quelqu’un dans le coin ? * arouse (v) (tr.) : éveiller, susciter - to arouse admiration : susciter l’admiration * arrange (v) (fa) : 1/ (tr.) agencer, ordonner, disposer ; (intr.) prendre des dispositions ; 2/ (tr.) organiser - Who arranged this meeting? : Qui a organisé cette réunion ? ; 3/ (tr.) (Mus.) adapter, arranger * arrangement (n) :1/ accord, entente (f) ; 2/ disposition (f), configuration (f) ; 3/ dispositif, solution (f) - mounting arrangement : solution de montage * array (n) : 1/ ensemble, jeu, gamme (f), réseau ; 2/ étalage, déploiement * arrayed (pp) (lit.) : (re)vêtu(e) (in, de) * arrears (n pl.) : arriérés (pl.) - [home owner] to fall into arrears with one’s mortgage payments : [propriétaire d’une maison] prendre du retard dans le remboursement de son emprunt * arrest (n) : 1/ arrêt - to suffer a cardiac arrest : être victime d’un arrêt cardiaque ; 2/ arrestation (f) - to put sb under arrest : mettre qn en état d'arrestation - You're under arrest : Vous êtes en état d'arrestation - house arrest : assignation à résidence - to be held under house arrest : être assigné à résidence * arrest (v) (tr.) : 1/ arrêter, contenir, faire barrage à ; 2/ arrêter, appréhender * arrester (n) : - flame arrester : coupe-flamme (masc.) * arresting (a) : 1/ qui arrête l’attention ; 2/ attachant(e) * arrival (n) : 1/ arrivée (f) ; 2/ arrivant, nouveau venu / nouvelle venue * arrive (v) (intr.) : arriver (at, à) (sens spatial) - to arrive to market : être mis(e) sur le marché * arrogance (n) : arrogance (f) * arrogant (a) : arrogant(e) - arrogant mediocrities : médiocrités arrogantes * arrogantly (adv.) : avec arrogance * arrow (n) : flèche (f) - arrow head : pointe de flèche * arse (n) (brit.) / ass (amér.) : derrière, cul (vulg.) (syn. bottom - behind - booty (amér.)) - a divine ass : un cul sublime - a perfect ass : un cul parfait - a pain in the ass (amér.) : un casse-couille (vulg.), un casse-pied (fam.) - arse licker (brit.) : lèche-cul - arse wipe (brit.) (vulg.) : con, conne (amér. asswipe) * arsehole (n) : 1/ trou du cul ; 2/ (Brit.) connard * arsenal (n) : arsenal - nuclear arsenal : arsenal nucléaire * arson (n) : incendie volontaire, incendie criminel, arsin (obs.) * arsonist (n) : pyromane (m/f) * art (n) : 1/ art - abstract art : art abstrait - land art : (l’)art in situ, (l’)art environnemental - rock art : art rupestre - art director (Cin.) : directeur artistique - art editor (Presse) : directeur artistique - art gallery : galerie d’art - art history : histoire de l’art - art install : installation artistique (f) - art installation : installation artistique (f) - art treasure : trésor artistique, œuvre d’art ; 2/ (arts, pl.) (les) arts - academy of arts : académie des beaux arts - fine arts : (les) beaux-arts - martial arts : (les) arts martiaux - performing arts : (les) arts de la scène, (les) arts du spectacle ; 3/ domaine - the current state of the art : l’état des connaissances dans ce domaine ; 4/ (ind. sing.) (Inf.) illustrations (f pl.), images (f pl.), iconographie (f sing.) - ASCII art : illustrations (en) ASCII, iconographie (en) ASCII - clip art : (litt. iconographie à agrafer) images / illustrations / dessins en boîte prêts à l'emploi ; (le) prêt-à-illustrer - halftone art : images en demi-teintes - line art : illustrations au trait, images bitonales - rock art : (selon le cas) : gravures sur roche (f. pl.), gravures rupestres (f. pl.), peintures rupestres (f. pl.) * art (n ind. sing.) (tronc. de artwork) : illustrations (f pl.), photographies (f pl.) (destinées à être reproduites) * artefact (n) (brit.) : objet ancien, objet archéologique, objet fabriqué, artéfact (var. ortho. amér. artifact) * artery (n) (pl. arteries) : 1/ artère (f) (du système sanguin) ; 2/ artère, rue (f) - main artery : artère principale, grand axe * artery-clogging (ac) : qui bouche les artères * art-house (en mod.) : (Ciné) d’art et d’essai - art-house cinema : cinéma d'art et d'essai - art-house film : film d'art et d'essai * arthropod (n) : arthropode * article (n) : 1/ article, élément - an article of equipment : un équipement ; 2/ (Gram.) article - definite article : article défini - indefinite article : article indéfini ; 3/ (Presse) article (de journal, de revue) - feature article : article vedette, grand article, article de fond trending article : (Toile) article qui fait recette / qui cartonne (fam.), article « tendance »- well-researched article : article très fouillé - article abstract : résumé d’article * articling (n) : (Droit) rédaction juridique (f) - articling placement : stage de rédaction juridique - articling position : poste de stagiaire en rédaction juridique - articling student : stagiaire en rédaction juridique * articulate (a) (fa) : [individu] qui s'exprime bien, qui s’exprime clairement * articulated (a) : articulé(e) - articulated lorry : semi-remorque (masc.) - articulated wrist : poignet articulé (de robot) * articulately (adv.) : de manière claire et précise, avec clarté et précision * artifact (n) (amér.) : objet ancien, objet archéologique, objet fabriqué, artéfact (var. ortho. brit. artefact) * artificial (a) : 1/ artificiel(le) ; 2/ reconstitué(e), de synthèse - artificial cork : liège reconstitué * artificially (adv.) : artificiellement * artificially lit (ac) : à éclairage artificiel, éclairé(e) artificiellement * artillery (n) : artillerie (f) - towed artillery : artillerie tractée * artilleryman (n) : artilleur * artist (n) : 1/ artiste (m/f) - faux-bois artist : créateur de faux-bois - layout artist : maquettiste (en animation) - make-up artist : maquilleur / maquilleuse - quick-change artist : transformiste (n) (m/f) - rap artist : chanteur de rap - street artist : peintre d’art urbain ; 2/ spécialiste (de l’escroquerie) - con artist : escroc, arnaqueur - scam artist : escroc, arnaqueur - shakedown artist : spécialiste de l’extorsion * artistic (a) : artistique * artistically (adv.) : de façon artistique * artwork (n) : 1/ (an artwork) une œuvre, un tableau ; 2/ (artwork, ind. sing.) 2/ illustrations (f pl.), photographies (f pl.) (destinées à être reproduites) * artwork (n ind. sing.) (abr. de mechanical artwork ou de camera-ready artwork) : documents d'exécution - artwork bank : banque d’images, fonds iconographique (sing.) * arty (n) (abr. de artillery : artillerie (f.) * as (conj. de cause) : 1/ (général. t. de phr.) comme, étant donné que, dans la mesure où ; 2/ (exprimant la raison) car * as (conj. de comparaison) : comme * as (conj. de manière) : 1/ ainsi que, comme ; 2/ (discours rapporté) pour citer, pour reprendre - as Victor Hugo warned : pour reprendre l’avertissement de Victor Hugo * as (conj. de temps) : 1/ pendant que ; 2/ (au fur et) à mesure que ; 3/ (idée de concomitance) tandis que, alors que, en même temps que ; 4/ (traduction par) en + forme en –ant * as a consequence (m d l) : de ce fait, en conséquence (de quoi) * as against (loc. prép., parfois abrégée en against) : comparé à (dans un sens d’opposition), en comparaison de (dans un sens d’opposition), contre * as a matter of fact (loc. adv.) : en fait * as and when (conj. double) : au fur et à mesure que * as a result (m d l) : de ce fait, en conséquence (de quoi), du coup (fam.) * as a result of (loc. prép.) : à cause de, en raison de, à la suite de, sous l'effet de - as a result of an undetected fatigue crack (Maint.) : en raison d’une crique de fatigue * asbestos (n) : amiante (f) * asbestos-containing (ac) : contenant de l’amiante - asbestos-containing pipes : tuyaux comportant de l’amiante * asbestos-filled (ac) : (qui est) rempli(e) d’amiante - asbestos-filled factory : usine qui regorge d’amiante * (as) compared to/with (loc. prép.) : en comparaison de, comparé à, par rapport à, auprès de, à côté de * ascending (a) : ascendant(e), montant(e) - ascending order : ordre ascendant (anton. descending) * ascribe (v) (tr.) : attribuer (to, à), imputer (to, à) - Never ascribe to malice that which can be explained by incompetence : N'attribuez jamais à la méchanceté ce qui peut s'expliquer par l'incomptétence - The accident can be ascribed to human error : On peut imputer cet accident à une erreur humaine * ascription (n) : attribution (f) (to, à), imputation (f) (to, à) * as far as (prép. ) : 1/ aussi éloigné que ; 2/ jusqu’à * as for (loc. prép.) : pour ce qui est de, quant à, côté / question ... (fam.) * as from (loc. prép.) : à compter de, à partir de, dès + mesure ou date (cf. as of) * ash (n) (pl. ashes) : cendre (f) - ash heap : tas de cendres - to be consigned to the ash heap of history : être relégué dans les poubelles de l’histoire - slag heap : crassier * ashamed (a) (tjrs attribut) : honteux/-euse - to be ashamed of… : avoir honte de… * ashcan (n) : poubelle (f) * ashore ( adv.) : vers le rivage, sur le rivage - to get ashore : aller à terre * ash (n) : frêne * ashen (a) : [visage] pâle * Asia (n pr.) : Asie (f) - Central Asia : (l’) Asie centrale * Asian (a) : asiatique (sans maj.) * Asian (n pr.) : Asiatique (l’habitant) * aside (adv.) : 1/ sur le côté - to glance aside : dévier ; 2/ de côté, en réserve - to be set aside : être mis(e) de côté, être mis(e) en réserve ; 3/ à part - all jokes aside : toutes plaisanteries mises à part, blague à part, sans plaisanter - But (leaving) irony aside… : Mais trêve d’ironie…- to leave aside : faire abstraction de * aside from (loc. prép.) : en dehors de, hormis, outre * as if (loc. conj. de comparaison) : 1/ comme si (cf. as though) ; 2/ as if to (+ inf.) : comme pour + inf. * asinine (a) : 1/ relatif à l’âne, asinien(ne) ; 2/ idiot(e), bête, stupide * as long as (loc. conj.) : 1/ (de temps) aussi longtemps que, tant que ; 2/ (de restriction) pourvu que, tant que - You can have any color you want as long it is black (Henry Ford) : Vous pouvez demander n’importe quelle couleur tant que c’est le noir * as many as (+ quantité pl.) : jusqu’à + quantité pl. * as much as (+ quantité sing.) : jusqu'à + quantité sing. * ask (v) : (tr.) demander - to ask sb : demander à qn - I’ll ask my lady (fam.) : Je vais demander à la patronne - to ask whether : demander si… - to ask oneself : se demander ; (intr.) to ask for sth : a/ demander qch - to ask for seconds : (à la cantine) demander du rab (fam.) ; b/ chercher (des ennuis) - They were asking for it : Ils l’avaient bien cherché * askew (a) : de biais, de travers * Askhenazi (a) : askhénaze (sans maj.) * Askhenazi (n) (pl. Askhenazim) : Askhénaze (m/f) * ask round (v) (tr.) (brit.) : inviter chez soi - I’ve asked her round for a drink : Je l’ai invitée à venir chez moi boire un verre * as of (loc. prép.) : à compter de, à partir de + date - to be end-of-lifed as of December : devant cesser d’être vendu à compter de décembre (cf. as from) - as of now : à la date d’aujourd’hui * as opposed to (loc. prép.) : contrairement à, par opposition à, contre, au lieu de * asp (n) : aspic * as part of (loc. prép.) : dans le cadre de - to take an internship in a company as part of one’s university course : suivre un stage en entreprise dans le cadre de son cursus universitaire * aspect (n) 1/ aspect, facette (f) ; 2/ (fa p) dans l'expression aspect ratio : format d'écran, format d'image - an aspect ratio of six to nine : un format d'écran de six sur neuf * as per (loc. prép.) (parfois abrégée en per) : suivant, selon, d'après, en vertu de, conformément à - as per article 1 of the convention : en vertu de l’article 1 de la convention - as per request : comme demandé - as per the company’s policy : selon la politique de l’entreprise - as per the AP agency : selon l’agence Associated Press - as per sources : d’après les sources * aspersion (n) (fa) : calomnies (f pl.), médisances (f pl.) - to cast aspersions on sb : répandre des calomnies sur qn, dire des noirceurs de qn * asphalt (n) : asphalte (masc.) - asphalt finisher : finisseur d’asphalte * asphyxiate (v) (tr.) : asphyxier, étouffer - to be asphyxiated : s’asphyxier, s’étouffer * ass (n) (pl. asses) (amér.) : cul (voir arse, brit.) - I saved your ass (vulg.) : Je t’ai sauvé la peau, Je t’ai sauvé les fesses - ass eating : bouffage de cul - ass fucking : enculage - ass kisser (fig.) : lèche-cul * assassin (n) : 1/ assassin ; 2/ tueur à gages * assassinate (v) (tr.) : assassiner * assassination (n) : assassinat - targetd assassinations : assassinats ciblés * assault (n) : 1/ (Milit.) assaut - to drive back an assault : repousser un assaut - assault rifle : fusil d’assaut ; 2/ agression (f) (on, sur) - assault and battery : coups et blessures - indecent assault : attentat à la pudeur - sexual assault : agression sexuelle * assault (v) (tr.) : 1/ assaillir, agresser * assemble (v) (tr.) : assembler, monter * assembler (n) : assembleur, monteur * assembly (n) : 1/ assemblage, montage - assembly line : ligne de montage, chaîne de montage - to come off the assembly line : sortir de la chaîne de montage - assembly hall : salle de montage - assembly plant : installation de montage - assembly station : poste d’assemblage ; 2/ (Éduc.) (G.-B.) assemblée (f) (des élèves et des professeurs avant les cours) * assemblyman (n) : député * assert (v) (tr.) : affirmer * assertion (n) : affirmation (f) - an unsupported assertion : une affirmation non fondée, une allégation * assess (v) (tr.) : évaluer (syn. to evaluate), apprécier, juger * assessment (n) : 1/ fixation (f), répartition (f) (d’impôts, d’une amende) ; 2/ imposition (f), impôt ; 3/ évaluation (f), appréciation (f) - to give an assessment : donner une évaluation - continuous assessment (brit.) : (Éduc.) (le) contrôle continu - overall assessment : évaluation générale, appréciation globale ; 2/ (Archi.) - assessment tool : outil d'évaluation * asset (n) : 1/ (pl. assets) actif, bien (matériel, immatériel, etc.) - to reflate assets : augmenter la valeur des actifs - unsellable assets : biens invendables - asset management : gestion d’actifs ; 2/ (fig.) atout * asset-intensive (ac) : 1/ à forte teneur en actifs ; 2/ lourdement équipé(e) - asset-intensive network : réseau lourdement équipé * asshole (n) (amér.) : 1/ trou du cul, trou de balle (fam.) ; 2/ [individu] trouduc (vulg.), enfoiré (vulg.) * assign (v) (tr.) : attribuer à, affecter à - to assign sb an access level (Inf.) : attribuer à qn un niveau d'accès - to be assigned to + inf. : être chargé de + inf., avoir pour mission de + inf. - to be assigned to complete a specific task : être chargé d'effectuer une tâche précise * assignment (n) : 1/ affectation (f) ; 2/ devoir, travail (à rendre) - When is this assignment due? : Pour quand ce travail est-il à rendre ? - This assignment is due Thursday : Ce devoir est pour Jeudi - an incomplete assignment : un travail non terminé * assist (n) (amér.) : assistance (f), aide (f), soutien (surtout informatique) - with or without the assist of a computer : avec ou sans l’aide d’un ordinateur * assist (v) (fa p) : (tr.) aider à, faciliter - to assist sb in doing sth : aider qn à faire qch ; (intr.) aider - to assist in an investigation : aider dans une enquête * assistance (n) : assistance (f), aide (f), secours * assistant (a) : assistant, secrétaire - assistant editorial director : directeur adjoint de la rédaction - assistant engineer : sous-ingénieur * assistant (n) : 1/ (Édu.) assistant - the French assistant (G.-B.) : l'assistant de français ; 2/ vendeur - shop assistant : vendeur (de magasin) * assistantship (n) : (Édu.) poste d’assistant - foreign language assistantship : poste d’assistant en langue étrangère * assisted (ppa) : assisté(e) - assisted decision making : aide à la prise de décision * -assisted (ppa) : (en compo.) assisté(e) par - computer-assisted : assisté(e) par ordinateur, informatisé(e) * ass-obsessed (ac) (amér.) : obsédé par le cul * associate (a) : 1/ associé(e) - associate professor : maître de conférences ; 2/ adjoint(e) * associate (n) : 1/ associé ; 2/ adjoint * associateship (n) : 1/ statut d’associé, qualité de membre associé ; 2/ qualité d’adjoint * as soon as (loc. conj. de temps) : dès que * assorted (a) (fa) : varié(e) - a box of assorted socks : des chaussettes de couleurs variées * assume (v) (tr.) (fa p) : 1/ présumer, supposer, tenir comme établi(e), partir du principe que ; 2/ assumer, prendre * assuming (prép.) : en admettant, dans l'hypothèse de * assuming (that) (loc. conj.) : en admettant que, en partant du principe que * assumption (n) (fa p) : 1/ supposition (f), hypothèse (f) (de départ), postulat - to present assumptions as facts : faire passer des hypothèses pour des réalités - the assumption is that… : on suppose que… - on the assumption that… : en partant de l’hypothèse que… ; 2/ prise (f)) (de pouvoir) ; 3/ assomption (f) (de la Vierge) * assurance (n) : assurance (f), garantie (f) - quality assurance : (la) garantie de la qualité * assure (v) (tr.) : assurer * assured (a) : assuré(e) - an assured gait : une démarche assurée * assuredly (adv.) : 1/ avec assurance ; 2/ sûrement, certainement (syn. surely, certainly) - most assuredly : très certainement, sans aucun doute, sans l’ombre d’un doute, assurément, sans contredit * asswipe (n) (amér.) (vulg.) : con, conne (brit. arse wipe) * asteroid (n) : astéroïde * astern (adv.) : à l’arrière (sur un navire) * asthma (n) : asthme - asthma attack : crise d’asthme * asthmatic (a) : asthmatique * asthmatic (n) : asthmatique (n) * as though (loc. conj.) : comme si - He made as though to hit me on the head : Il fit mine de me frapper à la tête * as to (loc. prép.) : quant à, pour ce qui est de * astonish (v) (tr.) : étonner * astonishing (a) : étonnant(e), stupéfiant(e) (syn. amazing) * astonishingly (adv.) : étonnament, de façon étonnante, de manière stupéfiante * astonishment (n) : étonnement - to nobody's great astonishment : sans provoquer de grande surprise - the principle of least astonishment : (Inf.) le principe de moindre étonnement (syn. the principle of least surprise : le principe de moindre surprise) * astounded (ppa) : éberlué(e), stupéfait(e) * astounding (a) : stupéfiant(e) * astray (a) : hors du chemin - to go astray : s’égarer - to lead astray : égarer * astronaut (n) : astronaute (m/f) * astronomer (n) : astronome (m/f) * astute (a) : astucieux/-euse - the astute (adj. subst. pl.) : les astucieux, les petits malins * As well, … (loc. adv.) (t. de phr.) : De surcroît * as well (loc. adv.) (f de p) : également * as well as (loc. conj. de coordination) (fa) : ainsi que, de même que * as with (loc. prép.) : comme pour, comme dans le cas de, à l'instar de * asylum (n) : 1/ asile, refuge ; 2/ abr. de lunatic asylum : asile d’aliénés, asile de fous * asymptomatic (a) : sans symptômes, asymptomatique - asymptomatic carrier : porteur sain * at (prép.) : 1/ à + lieu ou moment précis ; 2/ à + vitesse, température, etc. ; 3/ sur, contre + cible * at all (loc. adv.) : du tout - there was no marketing strategy at all : il n'y avait pas du tout de stratégie d'attaque du marché * at best (loc. adv.) : au mieux, dans le meilleur des cas (anton. at worst) * ate (prét. de to eat) * atheist (n) : athée * athlete (n) : athlète * athletic (a) : athlétique * athletics (n pl.) : activités sportives (f pl.) * athwart (a) : en travers, par le travers * Atlanticism (n) : (l’)atlantisme (noter la différence d’ortho.) * Atlanticist (a) : atlantiste (noter la différence d’ortho.) * Atlanticist (n) : atlantiste (n) (noter la différence d’ortho.) * at least (loc. adv.) : 1/ au moins ; 2/ du moins * ATM (n) (init. de automated teller machine : guichet automatique bancaire) : GAB - ATM vestibule : local des distributeurs * atmosphere (n) : 1/ atmosphère (f) ; 2/ (fig.) ambiance (f) - conducive atmosphere : ambiance favorable * atmospheric (a) (fa p) : 1/ atmosphérique ; 2/ pittoresque * atom (n) : atome * atomic (ac) : atomique - atomic clock : horloge atomique (f) * atop (prép.) : au sommet de, en haut de * atrocity (n) : 1/ (le sentiment) atrocité (f), horreur (f) ; 2/ (svt au pl. atrocities) atrocités (commises) - atrocity propaganda : fausses accusations d’atrocités, faux récits d’atrocités * attaboy! (interj.) : bravo ! (s’adresse à un homme) (pour une femme, voir attagirl!) * attaboy (n) : encouragement (donné à un homme) * attach (v) (tr.) : attacher (to, à), raccorder (to, à), connecter (to, à), brancher (to, sur) * attaché (n) : attaché, attachée - cultural attaché : (Diplo.) attaché culturel * attached (ppa) : joint(e) (à un courriel, un message) * attachment (n) : 1/ attachement - journalism of attachment : journalisme émotionnel ; 2/ dispositif interposé, dispositif raccordé, accessoire, appareil - grinding attachment (Usin.) : dispositif de rectification (on a planing machine, sur une raboteuse) - modem attachment : dispositif de modulation-démodulation, carte modem * attack (n) : 1/ attaque (f) - attack helicopter : hélicoptère de combat - attack submarine : sous-marin d’attaque ; 2/ crise (f) - asthma attack : crise d’asthme - heart attack : crise cardiaque * attack (v) (tr.) : attaquer - to be poised to attack : être prêt(e) à attaquer * attagirl! (interj.) : bravo ! (s’adresse à une femme) * attagirl (n) : encouragement (adressé à une femme) * attain (v) (tr.) : 1/ atteindre ; 2/ réaliser (un objectif) * attainable (a) : 1/ atteignable, accessible ; 2/ réalisable * attempt (n) : tentative (f) (at + gér., de + inf.) - dilettantish attempt : tentative d’amateur - vain attempt : tentative inutile * attempt (v) (tr.) : tenter, essayer * attempted (a) : (se traduit par) « tentative de » - attempted murder : tentative de meurtre * attend (v) (tr.) (fa) : 1/ aller à (un cours, une messe), assister à (une réunion, une conférence) - to attend a briefing : assister à une réunion d’information - to attend a lecture : assister à un cours - to attend a mandatory practicum : suivre un stage obligatoire - 100 people attended the meeting : Cent personnes assistèrent à la réunion ; 2/ fréquenter - to attend a school : fréquenter une école ; 3/ (intr.) (to attend to sth) s'occuper de qch, vaquer à qch - I've got a few things to attend to before I can leave : J'ai quelques affaires à régler avant de pouvoir partir * attendance (n) : présence (f), fréquentation (f), assistance (f) (à une réunion) - to be in attendance : être présent(e) - attendance figure : nombre de personnes présentes - attendance sheet : feuille de présence (f) * attendant (n) : préposé, préposée (n) * attendee (n) : visiteur/-euse, personne présente (f) * attention (n) : attention (f) - to be the centre of attention : être le centre d’attention, être le point de mire - to grab attention : accaparer l’attention - to pay close attention to sth : faire très attention à qch - to pay too much attention : faire trop attention (to, à) - to vie for attention : se disputer l’attention du public, se disputer le devant de la scène ; 2/ souci - attention to detail : (le) souci du détail ; 3/ garde-à-vous - to stand at attention : se mettre au garde-à-vous - Attention! (interj.) : Garde à vous ! * attention-grabbing (ac) : qui attire l’attention, accrocheur (syn. eye-catching) * attention-seeking (ac) : qui cherche à attirer l’attention, qui cherche à se faire remarquer * attest (v) (intr.) : - to attest to… : témoigner de…, attester * attic (n) : grenier * attire (n) (lit.) : accoutrement, tenue (f), vêtements (pl.) * attorney (n) : avoué * attraction (n) : 1/ (Phys.) attraction (f) ; 2/ attrait ; 3/ attirance (f) ; 4/ attraction (d’une foire, d’un carnaval) * attractive (a) : attrayant(e), séduisant(e) - to make sth attractive : rendre qch attrayant * attractively (adv.) : de façon attrayante, de façon séduisante * attribute (n) : attribut, caractéristique (f), paramètre * attribute (v) (tr.) : 1/ attribuer (to, à) ; 2/ (fa) donner (telle ou telle source) comme origine d’(informations), donner (des informations) comme provenant de (telle ou telle source), imputer (des informations) à (telle ou telle source) - to attribute information (to the military, etc.) : donner (les militaires, etc.) comme origine des informations * attribution (n) : 1/ attribution ; 2/ (fa) origine, provenance ; 3/ (fa) imputation (to, à) - the interviews are not for attribution : les entretiens doivent rester anonymes, la source des entretiens ne doit pas être indiquée * attrite (v) (tr.) : réduire par attrition (une armée ennemie) * attrition (n) : 1/ usure par frottement ; 2/ usure - war of attrition : guerre d'usure ; 3/ réduction naturelle (f) (des effectifs), départs naturels (pl.) (à la retraite), attrition (f) - attrition rate : taux de perte (de la clientèle, etc.) - * atrocity (n) (pl. atrocities) : 1/ atrocité (f), caractère atroce ; 2/ atrocité, acte atroce - to commit atrocities : commettre des atrocités * attune (v) (tr.) : 1/ mettre d’accord (to, avec), mettre au même ton (to, que) ; 2/ accorder (un instrument) * at worst (loc. adv.) : au pire, dans le pire des cas (anton. at best) * atypical (a) : atypique * aubergine (n) : aubergine (f) * auction (v) (tr.) : vendre aux enchères * auction (n) : vente aux enchères - auction mart : salle des ventes * auctioning (n) : mise aux enchères - auctioning of the catch : criée (f) * audience (n) (fa) : 1/ (en général) auditoire, public, assistance (f) - The conductor bowed to the audience : Le chef d'orchestre salua l'auditoire - the camera panned over the audience : la caméra fit un panoramique sur le public - to target an audience : viser un public - niche audience : public restreint, auditoire ciblé - target audience : public visé, public utile ; 2/ (Presse écrite) public, lecteurs (pl.), lectorat - primary audience (amér.) : lectorat primaire (syn. primary readership) ; 3/ (Radio) public, auditeurs (pl.) ; 4/ (Cinéma) spectateurs (pl.) ; 5/ (Télé) public, téléspectateurs (pl.) - audience ratings : indices d’écoute * audio (a) : audio - audio appliance : appareil audio - audio effects : effets sonores - audio equipment : équipements audio * audio (n) : (l’)audio * audiologist (n) : audiologue * audiovisual (a) : audiovisuel(le) - audiovisual archivist : (Presse) archiviste audiovisuel - audiovisual communications : communications audiovisuelles (f pl.)- the audiovisual field : l’audiovisuel * audiovideotext : (l’)audio-vidéotex, (le) Minitel vocal * audit (n) : 1/ vérification (f) (d’un compte), apurement (d’un compte) ; 2/ examen, diagnostic, expertise (f), analyse (f), audit (anglic.) (d'une société) - to conduct an audit : effectuer un audit - to perform an audit : procéder à un audit - management audit : vérification des activités de gestion - quality audit : expertise de la qualité, audit (de la) qualité - security audit : audit (de la) sécurité - audit findings : conclusions d’audit, résultats d’audit - audit list : liste de contrôle (Inf.) - audit log : liste de contrôle (Inf.) - Audit Office : cour des Comptes - audit trail : vérification à rebours, analyse rétrospective (f), piste de vérification * audit (v) (tr.) : vérifier (des factures, un compte), apurer (un compte), contrôler (des factures, un compte), analyser (des fichiers informatiques), auditer (anglic.) - to audit a bill : vérifier une facture * auditability (n) : vérifiabilité (f), contrôlabilité (f) * auditable (a) : [compte] vérifiable, contrôlable * auditee (n) : personne contrôlée, personne auditée (anglic.) * auditing (n) : vérification (f) (des comptes, des factures, etc.), contrôle, audit (anglic.) * auditor (n) : 1/ expert comptable ; 2/ vérificateur (de comptes), commissaire (m) aux comptes, contrôleur, auditeur (anglic.) - data-processing auditor : auditeur informatique (anglic.) * Augean (a) : d’Augias - the Augean stables : les écuries d’Augias * augment (v) (tr.) : augmenter (syn. to increase) * augur (v) : (tr.) laisser augurer; (intr.) augurer - to augur well ≠ ill/badly augurer bien / mal (for sb, pour qn) * augury (pl. auguries) : 1/ augure (masc.) (le présage) - auguries of deaths : funestes augures ; 2/ augure (masc.) (la personne) * August (n pr.) : août * august (a) : auguste, imposant(e) * aunt (n) : tante (f) * auntie / aunty (n) : tantine (f), tatie (f) (fam.), tata (f),(fam.) * aura (n) (pl. auras ou aurae) : aura (f) * Aussie (a) (brit., austr.) (fam.) : australien(ne) (sans maj.) * Aussie (n pr.) (brit., austr.) (fam.) : Australien (le ressortissant) * austerity (n) : austérité (f) - austerity measure : mesure d’austérité * Australasia (n pr.) : (l’)Australasie * Australasian (a) : australasien(ne) (sans maj.) * Australia (n pr.) : (l’)Australie * Australian (a) : australien(ne) (sans maj.) * Australian (n pr.) : Australien (le ressortissant) * Austria (n pr.) : (l’)Autriche * Austrian (a) : autrichien(ne) (sans maj.) * Austrian (n pr.) : Autrichien (le ressortissant) * autarky (n) : autarcie (f) * auteur (n) : (Cin.) auteur - auteur cinema : cinéma d'auteur * authentic (a) : authentique * authentically (adv.) : authentiquement * authenticator (n) : dispositif d’identification, identifiant * authenticity (n) : authenticité * author (n) : auteur - your author : l’auteur de ces lignes (syn. this author) * authorisation (brit.) / -ization (amér.) (n) : autorisation (f) * authorise (brit.) / -ize (amér.) (v) (tr.) : 1/ autoriser ; 2/ agréer, habiliter * authorised (brit.) / authorized (amér.) (a) : 1/ autorisé(e) ; 2/ agréé (e), habilité(e) - authorised dealer : concessionnaire agréé - authorised distributor : distributeur agréé * authority (n) :1/ (fa) source sûre - to have it on good authority that… savoir de source sûre que… ; 2/ (au pl. authorities) autorités (f pl.), organisme (sing.) - regulatory authorities : organisme de contrôle - media regulatory authorities : organisme de contrôle des médias (syn. media regulator) * authorship (n) : 1/ paternité (littéraire, artistique, etc.) (f) ; 2/ qualité d’auteur, statut d’auteur ; 3/ ensemble des auteurs, auteurs (pl.) * austism (n) : (l’)autisme * auto (a) (tronc. de automatic : automatique) : automatique - an auto update feature (Inf.) : une fonction de mise à jour automatique * auto (n) (tronc. de automobile (n), automobile) : auto (n), bagnole (fam.) - auto graveyard : cimetière de bagnoles - auto mechanic : mécanicien automobile, mécanicien auto - auto plant : usine automobile (f) * autobiographical (a) : autobiographique * autobiography (n) : autobiographie (f) * autocorrect (v) (tr.) : (Inf.) corriger automatiquement * autocracy (n) : autocratie (f) * autocrat (n) : autocrate * autocratic (a) : autocratique * auto-eject (v) : (tr.) éjecter automatiquement ; (intr.) s'éjecter automatiquement * autofocus (n) : (Photog.) mise au point automatique (f) * autofocusing (n) : (Photog.) mise au point automatique (f) - autofocusing system : système de mise au point automatique * auto-hide / autohide (v) (-hid, -hidden) (intr.) : (Inf.) [logiciel] se dissimuler automatiquement * automaker (n) (amér.) : fabricant d’automobiles, fabricant d’autos * automate (v) (tr.) : automatiser * automated (ppa) : automatisé(e) - automated cycle : cycle automatisé - automated manufacturing : fabrication automatisée (f) - automated production engineering : productique (n) (f) * automatic (a) : automatique - automatic focusing : mise au point photographique - automatic shutdown : arrêt automatique ordonné * automatic (n) : 1/ pistolet automatique, automatique (masc.) - muted automatic : automatique à silencieux ; 2/ voiture à boîte automatique, automatique (fém.) * automatically (adv.) : automatiquement * automatically regulated (ac) : à régulation automatique * automation (n) : automatisation (f) - flexible automation : (Prod.) automatisation souple, automatisation flexible - office automation : automatisation du bureau, bureautique (n) (f) - automation system : système automatisé * automaton (n) (pl. automata) : automate * automobile (n) (amér.) : automobile (n) (f) * automotive (a) : automobile - automotive engineering : (la) mécanique automobile - the automotive industry : l’industrie automobile (f) (syn. brit. the car industry) * autonomous (a) : autonome * autonomously (adv.) : de façon autonome * autonomy (n) : autonomie (f) - (a) higher level of autonomy : (un) degré plus élevé d’autonomie, (une) autonomie plus grande * auto-off (v) : (tr.) arrêter automatiquement, éteindre automatiquement ; (intr.) s’arrêter automatiquement, s’éteindre automatiquement * autopsy (n) : autopsie (f) - to complete an autopsy : effectuer une autopsie - autopsy table : table d’autopsie * auto-repeat (v) (intr.) : (Inf.) [touche] se mettre en répétition automatique * auto-resume (v) (intr.) : (Inf.) reprendre automatiquement * autorun (v) (intr.) : (Inf.) [cédérom] s’exécuter automatiquement * auto-save (n) : (Inf.) enregistrement automatique, sauvegarde automatique (f) (aussi to autosave) * auto-save / autosave (v) : (Inf.) (tr.) enregistrer automatiquement, sauvegarder automatiquement ; (intr.) s’enregistrer automatiquement, se sauvegarder automatiquement * autostop (n) (fa) : mise en arrêt automatique * autumn (n) (brit.) : automne (amér. fall) * AUV (n) (init. de autonomous underwater vehicle : engin sous-marin autonome) ESMA * auxiliary (a) : auxiliaire - auxiliary verb : verbe auxiliaire * avail (v) : - to avail oneself of (v réfl.) : profiter de, user de * availability (n) : disponibilité (f) - availability round the clock : disponibilité 24 h sur 24 - limited availability : disponibilité réduite * available (a) : disponible (from, auprès de) - to make sth available : rendre qch disponible - to be available to être à la disposition de - to be made available to… : être mis(e) à la disposition de… - readily available : immédiatement disponible * avalanche (n) : avalanche (f) * avalanche-prone (ac) : [zone] exposé(e) au risque d’avalanche, exposé(e) aux avalanches, avalancheuse * avenge (v) (tr.) : venger (sth, ch ; sb, qn) * avenger (n) : vengeur / vengeresse * avenue (n) (fa p) : 1/ avenue (f) ; 2/ (fig.) possibilité (f), piste (f) - We are looking at several avenues : Nous examinons plusieurs possibilités * aver (v) (prét. et pp averred) (tr.) : affirmer, déclarer * average (a) : moyen(ne) - average age : âge moyen * average (n) : moyenne (n) - on an average : en moyenne * average-sized (ac) : de taille/grandeur/grosseur moyenne - an average-sized novel : roman de longueur moyenne * averse (a) : (attribut) to be averse to sth : être opposé à qch, être contre qch - I am not averse to an occasional drink : Je n'ai rien contre le fait de boire un coup de temps en temps - to be averse to doing sth : répugner à faire qch * aversion (n) (fa p) : 1/ évitement, prévention (f); 2/ aversion (f), dégoût, répugnance (f) * avert (v) (tr.) : éviter (syn. to avoid) - to avert a catastrophe : éviter une catastrophe - to avert clashes : éviter des affrontements - to avert a tragedy : éviter une tragédie * aviation (n) : aviation (f) - the golden days of aviation : l’âge d’or de l’aviation - civil aviation : aviation civile - combat aviation : aviation de combat - military aviation : (l’)aviation militaire - naval aviation : (l’)aviation navale - passenger aviation : (l’)aviation commerciale - aviation engineering : génie aéronautique - aviation English : anglais pour la communication entre pilote et tour de contrôle, anglais de l’aviation, anglais aéronautique - aviation enthusiast : passionné d’aviation, mordu d’aviation (fam.) - aviation magazine : revue d’aviation (syn. aircraft magazine) * aviatrix (n) (pl. aviatrixes) : (Av.) aviatrice (f) * avionics (n sing.) : (l’)électronique de vol, (l’)électronique embarquée (f), (l’) avionique (f) * avocado (n) (pl. avocados) : avocat (le fruit ou l’arbre) - avocado green : vert avocat - avocado oil : huile d’avocat * avocational (a) : amateur - avocational archaeologist : archéologue amateur, archéologue autodidacte * avoid (v) (tr.) : éviter - to avoid + gér. : éviter de + inf. * avowed (ppa) : avoué(e), déclaré(e), avéré(e) - an avowed pessimist : un pessimiste avéré - the avowed purpose of (sb) : le but avoué de (qn) * avowedly (adv.) 1/ de son propre aveu, de l'aveu de l'auteur ; 2/ ouvertement * await (v) (tr.) : attendre * awake (a) (tjrs attribut) : éveillé(e) * awake (v) (awoke, awoken) (intr.) : se réveiller * awaken (v) (tr.) : éveiller, susciter * award (n) : récompense (f), prix, trophée - to be presented with an award : recevoir une récompense, un oscar * award (v) (tr.) : décerner, attribuer * aware (a) (tjrs attribut) : conscient(e) - to be aware of… : être conscient de… (syn. to be conscious of…) - to be aware that... : se rendre compte que... - to become aware that… : se rendre compte que… - to make sb aware of… : faire prendre à qn conscience de… * awareness (n) : 1/ réceptivité (f) - network awareness : (Inf.) réceptivité aux réseaux ; 2/ prise de conscience - environmental awareness : prise de conscience écologique ; 2/ sensibilisation (f) - public awareness : sensibilisation du public - safety awareness : sensibilisation à la sécurité * away (a) : parti(e) - to be away : être parti, n’être plus là * away (adv.) : au loin * away from (loc. prép.) : 1/ à l'écart de, en s'éloignant de, en s'écartant de - to keep oil away from the sensor head tenir la tête du capteur à l’abri des projections d’huile ; 2/ en retrait de * awe (n) : 1/ respect admiratif, crainte respectueuse (f) ; 2/ épouvantement * awesome (a) : impressionnant(e) * awful (a) : horrible, affreux/-euse, terrible, atroce * awfully (adv.) : horriblement, affreusement, terriblement, atrocement * awkward (a) : 1/ gauche, maladroit(e) ; 2/ malaisé(e), incommode * awkwardly (adv.) : gauchement, maladroitement * awkwardness (n) : gaucherie (f), maladresse (f) * awning (n) : auvent * awoke (prét. de to awake) * awoken (pp de to awake) * awry (a) : de travers - to go awry : [plan, etc.] mal tourner * ax (amér.) / axe (brit.) (n) (fa) : cognée (f), hache (f) - to have an axe to grind : avoir un compte à régler (against sb, avec qn), avoir une dent (against sb, contre qn) * axe (v) (tr.) : couper à coups de hache - to axe jobs : supprimer des emplois * axis (n) (pl. axes) : axe * axle (n) : essieu * Azerbaidjan (n pr.) : (l’)Azerbaïdjan * Azerbaidjani (a) : azerbaïdjanais(e), azéri(e) (sans maj.) * Azerbaidjani (n pr.) : Azerbaïdjanais, Azéri (le ressortissant) * ay(e) (n) : oui 70aiuv4rb8a9xq2jdb07idc1zmfvh7a Vocabulaire anglais-français à l'intention des apprenants avancés/B 0 78007 767822 759144 2026-06-16T13:39:39Z Elnon 41284 Compléments 767822 wikitext text/x-wiki {{../Index}} === B === * B : (note scolaire) bien * baboon (n) : babouin * baby (n) (pl. babies) : bébé - to expect a baby : attendre un bébé - unborn baby : enfant à naître, futur bébé - baby boom : boum des naissances, explosion démographique (f) - baby boomer : enfant de l’après-guerre, enfant du boum des naissances - baby carriage : landau - baby carrier : porte-bébé (le harnais) - baby pacifier : tétine de bébé - baby scale (amér.) / baby scales (brit., pl.) : pèse-bébé - baby seat : porte-bébé (le siège) * babyish (a) : de bébé, puéril(e) * baby-sit / babysit (v) (intr.) : 1/ garder des enfants ; 2/ [instrument de mesure automatique] veiller * baby-sitter / babysitter (n) : gardien(ne) (d’enfants) (Q) * baby-sitting / babysitting (n) : (la) garde d’enfants * bachelor (n) (fa) : 1/ célibataire (en parlant d’un homme) - He was still a bachelor at 40 : Il était encore célibataire à 40 ans ; 2/ licencié(e) - bachelor of Arts : licencié(e) ès lettres - bachelor’s degree : licence (universitaire) (f) * back (postp.) : to be back : être de retour * back (a) : 1/ arrière, de derrière - back alley : allée derrière la maison - back office : a/ bureau du fond, deuxième ligne, commerciaux (pl.) ; b/ post-marché (off.), traitement administratif des opérations - back light : a/ contre-jour, b/ (Inf.) rétro-éclairage - back slang : (le) verlan ; 2/ de retour - back link : (Toile) lien retour * back (n) : dos - to have someone‘s back (fig.) : toujours soutenir qn * back (v) (tr.) : 1/ soutenir, appuyer - to back the right horse : miser sur le bon cheval ; 2/ financer * backache (n) : mal de dos - to give sb backache : donner mal au dos à qn * backbiter (n) : diffamateur/-trice, médisant(e) (n) * backboard (n) : panneau de basket * backbone (n) : colonne vertébrale (f) * backbreaking (a) : éreintant(e) * back-burner / backburner (n) : - to be pushed to the backburner : être mis en veilleuse, être relégué au second plan * back channel / backchannel (nc/n) : 1/ canal de retour ; 2/ (Polit.) canal de communication secret, canal détourné, canal non officiel - to use backchannels : faire appel à des canaux non officiels * backcomb (v) (tr.) : crêper - to backcomb one's hair : crêper ses cheveux * backdrop (n) : toile de fond (f) * back-engineer (v) (tr.) : désosser, démonter (une machine) * backer (n) : 1/ partisan, allié ; 2/ commanditaire, bailleur de fonds * backfire (n) : 1/ retour de flamme ; 2/ retour de manivelle * backfire (v) (intr.) : provoquer un résultat contraire, avoir l’effet inverse, se retourner contre son auteur * back-flow / backflow (n) : refoulement, reflux * back-formation (n) : dérivation régressive (f) (from, de) - ‘intervene’ is a back-formation from ‘intervention’ : « intervene » est une dérivation régressive de « intervention » * back garden (n) (brit.) : jardin (de derrière) * background (n) : 1/ fond, arrière-plan ; 2/ milieu - social background : milieu social * backhand (n) : revers (au tennis) - the two-handed backhand : le revers à deux mains * backing (a) : d’accompagnement - backing vocals : chœurs (pl.) * backing (n) : 1/ soutien, appui, support ; 2/ financement ; 3/ (Mus.) accompagnement * back into (postp. + prép.) : - to rework a part back into tolerance : remettre une pièce à la cote * backlight (n) : 1/ contre-jour ; 2/ (Inf.) rétro-éclairage (aussi back light) * backlighting (n) 1/ éclairage en contrejour ; 2/ (Info.) éclairage par l’arrière, rétro-éclairage * backlit (a) : 1/ à contre-jour ; 2/ rétro-éclairé(e), éclairé par l’arrière - backlit by the setting sun : éclairé depuis l’arrière par le soleil couchant - backlit clouds nuages éclairés par l’arrière * backlog (n) : 1/ travail en retard, travaux (pl.) en souffrance, retard (de fabrication) - backlog of orders : commandes en attente, commandes en souffrance - order backlog carnet de commandes, commandes en portefeuille ; 2/ arriéré (n) * backpedal (v) (intr.) : faire marche arrière * backroom (n) : réserve (f) (la pièce) - backroom stock : (les) réserves, (les) stocks * backscratcher (n) : gratte-dos (l’instrument) (masc.) (aussi back scratcher) * back seat / backseat (n) : 1/ siège arrière ; 2/ rôle secondaire - to take a backseat : s’effacer (au fig.) * backside (n) : arrière-train (d’un animal), derrière (d’une personne), postérieur (d’une personne), fondement (hum.), fesses (f pl.) * backspace (n) : (Inf.) (sur clavier d’ordinateur) recul d’une espace, retour arrière - destructive backspace : retour arrière destructif, retour arrière avec effacement - (the) backspace key (la) touche de déplacement arrière, (la) touche flèche gauche, (la) touche espace arrière * backspace (v) (intr.) : reculer d'une espace * back-stabbing / backstabbing (a) : qui poignarde dans le dos, traître * backstage (a) : de coulisse - backstage quarrels : querelles de coulisse * backstage (adv.) : derrière le rideau, dans les coulisses - to go backstage : aller dans les coulisses * backstop (n) : 1/ (Baseball) receveur ; 2/ filet de sécurité - to act as a backstop to… : faire office de filet de sécurité pour… ; 3/ pare-balles (masc.) (dispositif anti-balles dans un stand de tir) * backstop (v) (tr.) : 1/ (Fin.) servir de filet de sécurité à ; 2/ servir de renfort à, venir renforcer * back then (loc. adv.) : à l’époque, en ce temps-là * back to (loc. prép.) : de retour à - [car] to have been back to the garage 17 times : [voiture] être retournée chez le garagiste 17 fois - to send a pressure gauge back to the manufacturer : retourner un manomètre au fabricant * back-to-back (ac) : consécutif/-ive * backtrack (v) (intr.) : 1/ (au prop.) revenir sur ses pas, rebrousser chemin ; 2/ (au fig.) faire machine arrière - to backtrack on an agreement : revenir sur un accord * back-up / backup (a) : 1/ de recul, de marche arrière - back-up lights : feux de recul, feux de marche arrière ; 2/ auxiliaire, de secours, de rechange - backup saving : (Inf.) sauvegarde (f) - backup server : serveur de sauvegarde * back-up / backup (n) : 1/ assistance technique (f), secours, soutien ; 2/ renforts (pl.) ; 3/ doublure (f), remplaçant(e) ; 3/ (Inf.) sauvegarde (f), recopie (f) ; 4/ (Circul.) bouchon, embouteillage * back up (v) : 1/ (tr.) faire reculer ; (intr.) faire marche arrière ; 2/ (Inf.) (tr.) sauvegarder ; (intr.) faire une sauvegarde, faire une copie de secours * back wages (n pl.) : arriérés de salaire, salaires impayés - to demand back wages : exiger le versement des salaires impayés * backward (a) : 1/ qui est en arrière ; 2/ qui va en arrière ; 3/ retardé(e), attardé(e) ; 4/ rétrograde, arriéré(e) * backward-compatible (ac) : (Inf.) compatible en amont, compatible avec les versions précédentes, à compatibilité ascendante, rétrocompatible * backwardness (n) : 1/ retard, sous-développement - technological backwardness : retard technologique ; 2/ arriération (f) * back wash (nc) : ressac * backwoodsman (n) : homme des bois - the laconic backwoodsman : l’homme des bois peu causant * backyard (n) : arrière-cour * bacon (n) : lard, bacon - rasher of bacon : tranche de lard, tranche de bacon - to bring home the bacon : faire bouillir la marmite * bacterial (a) : bactérien(ne) - antibacterial gel : gel antibactérien * bacterium (n) (pl. bacteria) : bactérie (f) * bad (a) : mauvais(e) - to be bad at swordplay : ne pas être bon à l’épée - bad habits : mauvaises habitudes (f pl.) - bad movie : daube (f) (fam.) - a bad patch : un mauvais quart d’heure * bad-ass / badass (a) (arg. amér.) : agressif/-ive, teigneux/-euse * bad-ass / badass (n) (arg. amér.) : personne qui déchire (f) * bade (prét. de to bid) * badge (n) : écusson - the blazer with the badge (brit.) : la veste croisée avec son écusson * badger (n) : blaireau - honey badger : ratel, zorille du Cap * badly (adv.) : 1/ (adv. de manière) mal - I knew this would end badly : Je savais que cela se terminerait mal - to augur badly : augurer mal (for sb, pour qn) ; 2/ (adv. de degré) - The door badly needed a coat of paint : La porte avait grand besoin d’une couche de peinture * baffle (v) (tr.) : déconcerter, laisser perplexe * bag (n) : 1/ sac, sachet - barf bag : sac à vomi - carrier bag : sac de courses - designer bag : sac de style, sac de créateur - drawstring bag : sac à cordon coulissant, sac à cordonnet - mart bag : sac de courses - scruff bag : personne débraillée (f) - tote bag : sac fourre-tout (masc.), sac cabas ; 2/ housse (f) - body bag : housse mortuaire - foldable garment bag : housse à vêtements pliable ; 3/ poche (f) (sous les yeux) - to have eye bags : avoir des poches sous les yeux ; 4/ - bags of… : des masses de… , plein de… - We’ve got bags of time : Ce n’est pas le temps qui nous manque * bag (v) (tr.) : emballer, mettre en sac * baggage (n) : 1/ (ind. sing.) bagages (pl.) ; 2/ passif (n), casseroles (f pl.) (fig.) (d’une personne) ; 3/ (a baggage) vaurienne (f) ; friponne (f) ; putain (f) * baggie (n) (amér.) : sac en plastique, poche * baggy (a) : [pantalon] large, ample * baggy-kneed (ac) : [pantalon] qui fait des poches aux genoux * bail (n) (fa) : 1/ liberté sous caution (f) - He was granted bail : Il fut mis en liberté sous caution - on bail : sous caution ; 2/ caution (f) (contre libération) * bailee (n) : dépositaire (d’un bien meuble) * bailiff (n) : huissier - house calls by bailiffs : visites de huissiers * bailor (n) : déposant(e) * bail out (v) (intr.) : sauter d’un avion, évacuer un avion, s’éjecter d’un avion * bait (n) : appât, leurre, amorce (f) * bait (v) (tr.) : 1/ appâter ; 2/ (fig.) taquiner, embêter, asticoter (syn. to annoy) * baize (n) : feutre, feutrine (f) - a piece of baize : un morceau de feutrine - green baize : (de la) feutrine verte (on card table, sur une table de jeu, etc.) ; the green baize (fig.) : le tapis vert, les tapis verts, le jeu - a green baize table : une table de jeu * baize-covered (ac) : feutré(e) * bake (v) (tr.) : cuire (au four), faire cuire (au four) * bakehouse (n) : fournil * baker (n) : boulanger * bakery (n) : boulangerie (f) * baking (n) : cuisine (f) (au four) - baking soda (amér.) : bicarbonate de soude (l’agent levant) * balance (n) (fa p) : 1/ balance (f) ; 2/ équilibre - He lost his balance : Il perdit l'équilibre ; 3/ solde (d’un compte en banque) - account balance : balance comptable - balance sheet : bilan comptable * balance (v) (tr.) (fa) : (tr.) tenir en équilibre, mettre en équilibre, équilibrer ; (intr.) s'équilibrer, être en équilibre * balanced (a) : équilibré(e) * balcony (n) (pl. balconies) : balcon * bald (a) : chauve * bald-faced (ac) : éhonté(e) (syn. bare-faced) * baldie (n) (fam.) : chauve (n), crâne pelé * balding (a) : qui perd ses cheveux, qui devient chauve - to be balding : perdre ses cheveux, devenir chauve, se dégarnir, se déplumer (fam.) - balding forehead : front dégarni * baldness (n) : calvitie (f) * bale (n) : botte (f) (de foin), ballot (de paille) - hay bale : botte de foin (aussi bale of hay) - straw bale : ballot de paille - straw bale house : maison en ballots de paille * baleful (a) (lit.) : funeste, maléfique * balk (v) (intr.) : regimber (at sth, devant qch) * ball (n) (fa) : 1/ balle (f), ballon - punching ball : a/ ballon de frappe ; b/ (fig.) tête de turc - ball game : jeu de ballon - ball girl : (Tennis) ramasseuse de balles - ball kid : (Tennis) ramasseur de balles ; 2/ boule (f) - ball of flames : boule de feu - ball lightning : (la) foudre en boule ; 3/ boulet ; 4/ bille (f) - steel ball : bille d’acier - ball bearing : roulement à billes - ball bushes : douilles à billes - ball pen : stylo à billes ; 5/ boulette (f) (de viande) - meat ball : boulette de viande ; 6/ couille (f) (vulg.) - ball breaker : casse-couille (vulg.), rabat-joie (syn. ball buster) ; 7/ bal - masquerade ball : bal masqué - to have a ball (amér.) : prendre son pied (fam.) - to have a real ball : s’amuser vachement bien, passer un très bon moment, bien rigoler ; 8/ (expressions) - to be on the ball : être à la hauteur ; être au courant de ce qui se fait * ball (v) : (tr.) mettre en boule ; (intr.) se mettre en boule * ball breaker / ballbreaker (n) (vulg.) : casse-couille (vulg.), rabat-joie (syn. ball buster / ballbuster) * ball buster / ballbuster (n) (vulg.) : casse-couille (vulg.), rabat-joie (syn. ball breaker / ballbreaker) - I’d hate to be a ball buster : Je ne veux pas passer pour un casse-couille * ballerina (n) : ballerine (f) * ballistic (a) : 1/ balistique (noter la différence d’orthographe) - intercontinental ballistic missile : missile balistique intercontinental ; 2/ (fig.) dingue (fam.) - to go ballistic over sth : prendre qch très mal * ball-like (ac) : en forme de boule - ball-like object : objet en forme de boule * balloon (n) : ballon de baudruche - Buy some balloons for the party : Achète quelques ballons de baudruche pour la fête - to pop a balloon : faire éclater un ballon - hot air balloon : montgolfière (f), ballon à air chaud - helium balloon : ballon à l'hélium - meteorological balloon : ballon météorologique - tethered balloon : ballon captif - weather balloon : ballon météorologique * balloon (v) (tr. et intr.) : gonfler, grossir démesurément * ballooning (ppa) : qui gonfle, qui grossit démesurément * ballooning (n) : - hot air ballooning : (le) vol en montgolfière - ballooning company : société de montgolfières - ballooning enthusiast : fana du vol en montgolfière * ballot (n) (fa) : 1/ scrutin ; 2/ vote - to cast a ballot : voter - absentee ballot : vote par correspondance - in-person ballot : vote en bureau de vote * ballpoint (n) : stylo à bille, stylo bille - ballpoint pen : stylo à bille (syn. brit. : Biro ou biro, nom de marque) * ballsy (a) (fam.) : [musique] pour guincher - I need something loud and ballsy : Il me faut un truc qui gueule et sur lequel guincher * ballyhoo (n) : battage (publicitaire ou médiatique) * ballyhoo (v) (prét. et ppassé -hooed, gérond. et p. présent -hooing) (arg. amér.) (tr.) : faire tout un battage autour de… * Baltic (a) : balte - the Baltic states : les pays baltes * Baltic (n pr.) : (la) Baltique, (la) mer Baltique * baluster (n) : balustre - carved baluster : balustre sculpté * balustrade (n) : balustrade (f) * bamboo (n) : bambou - bamboo house : maison de bambou, maison en bambou * bamboozle (v) (tr.) : mystifier, embobeliner, duper * ban (n) (fa) : interdiction (f), mise à l’index - topic ban : (WP) restriction thématique (f) * ban (v) (tr.) (fa) : interdire, mettre à l'index * banana (n) : banane (f) - banana republic : république bananière (f) * band (n) (fa p) : 1/ bande (f) (de tissu, d’élastique, de métal) - Alice band : serre-tête (masc.) - conveyor band : tapis roulant, courroie transporteuse (f), transporteur à bande, bande de manutention - hair band : serre-tête - head band : serre-tête (aussi headband) - rubber band : élastique (n) - watch band : bracelet de montre - wide band : large bande ; 2/ orchestre - big band : grand orchestre (jazz) - brass band : fanfare (f) ; 3/ groupe vocal - touring band : groupe en tournée - boys' band : groupe vocal de garçons - band leader : chef de groupe (musical) (aussi bandleader) - band manager : agent artistique de groupe * Band-Aid (n pr.) / band-aid (n com.) : (le) Tricosteril - a band-aid : a/ un pansement (adhésif); b/ (fig.) une solution de fortune * bandleader (n) : chef de groupe (musical) (aussi band leader) * bandstand (n) : kiosque (à musique) * bandwagon (n) (amér.) : char des musiciens (en tête d’une cavalcade), char de la victoire - to jump on the bandwagon : a/ (au propre) grimper sur le char de la victoire ; b/ (au figuré) voler au secours de la gloire, suivre le mouvement, emboîter le pas, prendre le train en marche - the bandwagon effect : l’effet de mode, l’effet d’entraînement, l’effet boule de neige - a bandwagon jumper : un opportuniste, une opportuniste * bandwidth (n) (Rés.) : 1/ largeur de bande ; 2/ bande passante (f), débit * bandy (a) : arqué(e) - bandy legs : jambes arquées (f pl.) * bandy-legged (a) : 1/ aux jambes arquées ; 2/ bancal(e) * bane (n) : 1/ poison - rat’s bane : (de la) mort aux rats ; 2/ (fig.) fléau, malheur - public bane : fléau public - He was the bane of his mother : Il a empoisonné la vie de sa mère * baneful (a) 1/ empoisonné(e) ; 2/ pernicieux/-euse, funeste * bang (n) : détonation (f), claquement, fracas, boum - gang bang : partouze (f) - all-girl gang bang : partouze lesbienne (f) * bang (v) (tr.) : 1/ cogner, heurter, frapper ; 2/ claquer, faire claquer - to bang one’s desk : faire claquer son pupitre ; 3/ (arg.) (vulg.) baiser, se faire (une fille) * bangs (n pl.) (amér.) : frange (f) (de cheveux) - I like having bangs : J’aime avoir une frange * banger (n) (arg.) : saucisse (f) - bangers and mash : saucisses et purée, saucisses-purée * Bangladesh (n pr.) : (le) Bangladesh * Bangladeshi (a) : bangladais(e) (sans maj.) * Bangladeshi (n pr.) : Bangladais (le ressortissant) * bangle (n) : petit bracelet * banish (v) (tr.) : bannir - to banish waste : bannir le gaspillage * banister(s) (n) : rampe d’escalier * bank (n) (fa p) : 1/ talus ; 2/ rive (f) (d’une rivière) ; 3/ banque (f) - the Bank for International Settlements : la Banque des règlements internationaux - the bank of England : la banque d'Angleterre - central bank : banque centrale - the European Central Bank : la Banque centrale européenne - merchant bank : banque d’affaires - bank holiday : jour férié - bank run : panique bancaire, ruée bancaire, course aux guichets ; 4/ maison de jeu, banque - to break the bank (fig.) : faire sauter la banque ; 5/ - image bank : banque d’images ; 6/ conteneur - bottle bank : conteneur pour le verre usagé ; 7/ banque (iconographique, alimentaire) - artwork bank : banque d’images, fonds iconographique - food bank : banque alimentaire - to visit a food bank : passer à la banque alimentaire * bank (v) (intr.) : 1/ compter, miser (on, sur) ; 2/ (Aéro.) faire un virage sur l’aile * bankable (a) : 1/ négociable en banque ; 2/ apte à bénéficier d’un financement, pouvant bénéficier de concours bancaires / de l’appui d’une banque - bankable project : projet susceptible de bénéficier de concours bancaires ; 3/ [acteur] qui facilite le financement d’un film, qui est susceptible de rapporter de l’argent, dont le succès est assuré, qui est une valeur sûre * banker (n) : banquier * banking (n) : (la) banque, (les) activités bancaires (f pl.), (les) opérations bancaires (f pl.) - home banking : (la) banque à domicile - banking corporation : compagnie bancaire (f) - banking institution : établissement bancaire - banking regulator : organisme de réglementation bancaire - the global banking sector : le secteur bancaire mondial - electronic banking services : services bancaires électroniques * bankrupt (a) : en faillite - to go bankrupt : faire faillite, se retrouver sur la paille * bankrupt (v) (tr.) : mettre en faillite, mener à la faillite, mettre sur la paille (fam.) * bankruptcy (n) : faillite (f) - to declare bankruptcy : déclarer faillite, faire faillite * bankrupted (ppa) : mis(e) en faillite, en faillite * banner (n) : bannière (f) * bantam (n) : coq nain, poule naine (f) * bantering (a) : [ton, air] plaisantin * baptistery / baptistry (n) : 1/ (le bâtiment) baptistère ; 2/ fonds baptismaux (pl.) * bar (n) : 1/ barre (f) - anti-roll bar (Auto.) : barre antiroulis - dejamming bar : barre de décoincement - miner’s bar : barre à mine - tamping bar : bourroir - bar code : code à barres, code-barres - bar graph : diagramme à barres : 2/ barreau - to be behind bars : être derrière les barreaux - to find oneself behind bars : se retrouver derrière les barreaux ; 3/ tablette (f) - a bar of chocolate : une tablette de chocolat ; 4/ bar - bar tender : responsable du bar - bar tending : tenue d’un bar ; 5/ obstacle (to, à) * barbarian (n pr) : Barbare - Conan the Barbarian : Conan le Barbare * barbarism (n) : barbarisme * barbed (a) : barbelé(e) - barbed wire : fil de fer barbelé * barber (n) : 1/ barbier ; 2/ coiffeur hommes - the barber’s chair (brit.) / the barber chair (amér.) : le fauteuil du coiffeur - barber shop : salon de coiffure hommes * barbie (n) (Aus.) (abr. fam. de barbecue) : barbecue * barbiturate (n) : barbiturique * bard (n) : 1/ barde, chantre ; 2/ barde (de lard) * bare (a) : 1/ nu(e), dénudé(e), dévêtu(e) - bare wire end : extrémité de fil électrique dénudée ; 2/ simple, seul * bare (v) (tr.) : dénuder, dévêtir, découvrir * bare-faced (ac) : éhonté(e) - bare-faced liar : menteur éhonté (syn. bald-faced) * barefoot (a) : (qui est) pieds nus, déchaussé(e) * barely (adv.) : à peine, tout juste * barf (n) (arg. amér.) : (du) vomi, (du) dégulis (syn. vomit) - barf bag : sac à vomi * barf (v) (arg. amér.) (intr.) : vomir, dégobiller (fam.), gerber (arg.) * bargain (n) : affaire (f), occasion (f) - You got the worse of the bargain : Tu t’es fait rouler * bargain (v) (tr.) : marchander, négocier * barge (n m) : chaland, péniche (f) - coal-laden barge : chaland empli de charbon - barge pole (brit.) : perche de batelier - I would not touch it with a barge pole : Je n'y toucherais pas même avec des pincettes * bark (n) : écorce (f) * bark (v) : (intr.) aboyer * barley (n) : orge - barley beer : bière d’orge * barn (n) : grange (f) - aisled barn : grange à bas-côtés - tithe barn : grange dimière, grange à dîmes - barn stormer : acteur ambulant (aussi barnstormer) * barnacle (n) : balane (f), bernacle (f), anatife * barnstormer (n) : 1/ acteur ambulant ; 2/ (Pilotage) acrobate ambulant ; 3/ orateur électoral (aussi barn stormer) * baron (n) : 1/ (brit.) baron ; 2/ (fig.) baron, magnat - press baron : baron de la presse, magnat de la presse * baroness (n) (brit.) : baronne (f) * baronet (n) (brit.) : baronnet * barracks (n) (pl.) (fa) : caserne (sing.) (f) * barrel (n) : 1/ tonneau, fût, barrique (f) - barrel maker : tonnelier ; 2/ baril ; 2/ canon (d’un fusil) * barrel roll (n) : tonneau (la figure) - to do a barrel roll : (Av.) faire un tonneau * barrel-shaped (ac) : en forme de baril * barrette (n) (amér.) : barrette (f) * barrier (n) : barrière (f) - to be a barrier : faire barrière (to, à) - to set up barriers : installer des barrières - crash barrier (brit.) : glissière de sécurité - floating barrier : barrière flottante - insulation barrier : écran isolant - the language barrier : l’obstacle de la langue - the sound barrier : (le) mur du son * barring (prép.) : sauf, excepté - barring accidents : sauf accident, à moins d’un accident - barring miracles : sauf miracle - barring the unforeseen : sauf imprévu * barrister (n) (brit.) : avocat, membre du Barreau - barrister in business law : avocat en droit des affaires * barter (v) (tr.) : troquer, échanger (for, contre) * barter (n) : troc * base (n) : 1/ base (f) - air base : base aérienne - Mars base : base martienne - moon base : base lunaire - rear base : (Milit.) base arrière ; 2/ socle, fondement, support ; 3/ base (de données) - term base : base terminologique * base (a) : de base - base wages (pl.) : salaire (sing.) de base * base (v) (tr.) : fonder * based (ppa) : 1/ (+ in) basé(e) à (anglicisme) (sens géographique), ayant son siège (social) à, sis(e) à ; 2/ (+ on) fondé(e) sur, reposant sur * -based (ppa) (en compo.) : (selon le cas) à base de, reposant sur, implanté à, à + n pl, en + n sing. - British-based : implanté(e) en Grande-Bretagne - community-based : communautaire - computer-based : géré(e) par ordinateur - dollar-based : a/ fondé(e) sur le dollar ; b/ exprimé(e) en dollars, libellé(e) en dollars - electron-tube-based : muni(e) de tubes à vide - facts-based : reposant sur des faits, concret/-ète - gender-based : déterminé(e) par le sexe - Moscow-based : moscovite - multiprocessor-based : à multiprocesseurs - office-based : de bureau - petroleum-based : dérivé(e) du pétrole - school-based : en milieu scolaire - space-based : implanté(e) dans l’espace - team-based : en équipe - web-based : présent(e) sur la Toile - work-based : en milieu de travail, en entreprise * based on (loc. prép.) : à partir de * baseline (n) : 1/ point de comparaison ; 2/ (Baseball) ligne des bases ; 3/ (Tennis) ligne de fond ; 4/ slogan * baseline (a) : de base, basique - baseline data : données de base (anton. endline data : données finales) - baseline product : produit de base, produit de référence * basement (n) : sous-sol * bashful (a) : timide * bash (n) : coup * bash (v) (tr.) : cogner, frapper, tabasser * bashing (n) : tabassage * basic (a) (fa) : 1/ essentiel(le), fondamental(e), élémentaire, constitutif/-ive, de base, basique (anglic.) - basic English : (l’)anglais de base - basic parts : pièces élémentaires, pièces constitutives ; 2/ (Chimie) basique - basic medium : milieu basique * basically (adv.) : fondamentalement * basics (n pl.) : connaissances de base (f pl.), notions essentielles (f pl.), rudiments - to master the basics : maîtriser les bases * basilica (n) : basilique (f) * basin (n) : 1/ bassine (f), cuvette (f) ; 2/ (dans la cuisine) évier ; 3/ (dans la salle de bain(s)) lavabo - hand basin : lavabo - wash basin : lavabo ; 4/ (au sens géographique) bassin - drainage basin (Hydro.) : bassin versant ; 5/ (au sens portuaire) bassin - tidal basin : avant-port * basis (n) : base (f) - on the basis of… : reposant sur… * bask (v) (intr.) : se chauffer - to bask in the sun : se dorer au soleil - to bask in success : se reposer sur ses lauriers * basket (n) : corbeille (f), panier - trolley basket : panier de chariot (de supermarché) - waste paper basket : corbeille à papier - basket case (fig.) : cas désespéré, catastrophe absolue (f) - basket weaver : vannier * bass (a) : (Mus.) de basse - bass guitar : guitare basse - bass player : bassiste * bassist (n) : (Mus.) bassiste * bastard (n) : 1/ bâtard ; 2/ salaud * bastardise (brit.) / bastardize (amér.) (v) (tr.) : abatardir * bastardised (brit.) / bastardized (amér.) (ppa) : abatardi(e) - bastardised/-ized language : langue abatardie (f) * bat (n) : 1/ batte (f) (de base-ball, cricket) ; 2/ raquette (f) (de tennis de table) * bat (v) (tr.) : frapper * batch (n) (pl. batches) : 1/ fournée (f) ; 2/ lot - to produce in batches : produire par lots - batch number : numéro de lot * batch (v) (tr.) : grouper (en lots) * batching (n) : mise en lots, groupage en lots * bated (a) : retenu(e) - with bated breath : en retenant son souffle * bath (n) : 1/ bain - to run a bath : faire couler un bain - to have/take a bath : prendre un bain - bath robe : peignoir de bain (aussi bathrobe) - spa bath : bain à remous, jacuzzi ; 2/ baignoire (f) (syn amér. bath tub) - slipper bath : baignoire sabot * bathe (v) : (tr.) baigner, faire prendre un bain à ; (intr.) se baigner * bathe away (v) (tr.) : faire disparaître par un bain * bathing (n) : baignade (f) - bathing beach : plage de baignade * bathroom (n) : salle de bain(s) - to visit the bathroom (amér.) : aller aux toilettes - bathroom cabinet : armoire de salle de bain(s) (f) - bathroom linen : linge de toilette - bathroom scale (amér.) / bathroom scales (brit., pl.) : pèse-personne (masc.) * batten down (v) : (tr.) bien fermer ; (intr.) - to batten down the haches : a/ fermer les écoutilles ; b/ (fig.) se préparer au pire * batter (n) : pâte (f) (à crêpes) * batter (n) : inclinaison (f), talus * batter (n) : (Cricket, Baseball) batteur * batter (v) (tr.) : battre * battering (n) : raclée (f) - to take a battering : souffrir beaucoup * battery (n) (pl. batteries) : 1/ accus (pl.), pile (f) - dead (amér.) / flat (brit.) battery : accus à plat - storage batteries : accumulateurs - battery life : longévité des accus - battery operation : fonctionnement sur piles ; 2/ coups et blessures (m pl.) * battery-powered (ac) : fonctionnant sur pile - battery-powered portable computer : ordinateur portable fonctionnant sur pile * battle (n) : bataille (f) - to lose the battle over ... to : perdre la bataille de ... face à - to march into battle : se jeter dans la bataille - to win a battle : gagner une bataille - hard-fought battle : bataille remportée de haute lutte - pitched battle : bataille rangée * battle (v) (tr.) : lutter contre, tenir tête à - to battle cancer : lutter contre le cancer * battlefield (n) : champ de bataille - to regress from the battlefield : quitter le champ de bataille * battleground (n) : (prop. et fig.) champ de bataille * battle group (n) : groupe de bataille, groupe de combat, groupement tactique - naval battle group : groupe de combat naval * battle-hardened (ac) : aguerri(e) * battlements (n pl.) (n) : 1/ créneaux (pl.) ; 2/ remparts (pl.) * battle-worthy (ac) : prêt(e) pour le combat, sur le pied de guerre - battle-worthy weapons : armes prêtes pour le combat * bauble (n) : babiole (f) * bawbee (n) : sou (en Écosse), bawbee * bawd (n) (arch.) : 1/ catin (f) ; 2/ tenancière de bordel * bawdy (a) : paillard(e) - bawdy house : bordel (syn. brothel) * bawl (out) (v) : (intr.) beugler, brailler ; (tr.) - to bawl sb out : engueuler qn * bay (n) : 1/ renfoncement, compartiment (dans un navire), soute (f) (dans un avion) ; 2/ (Électron.) armoire (f) - control bay : armoire de commande ; 3/ (Inf.) emplacement (de lecteur) - vacant bay : emplacement inoccupé ; 4/ baie (f) - the Bay Area : la région de la baie de San Francisco * bay (n) : aboiement * bay (v) (intr.) : aboyer * bazaar (n) (fa p) : 1/ bazar ; 2/ vente de charité * BC (adv.) (init. de Before Christ, lit. « avant le Christ ») : av. J.-C. * BCE (adv.) (init. de Before Common Era, « avant ère courante ») : avant notre ère * be (v) (was, been) : être - to be in pain : avoir mal, souffrir * beach (n) (pl. beaches) : plage (f) - oil on beaches : mazout sur les plages - bathing beach : plage de baignade - nudie beach : plage nudiste - shingle beach : plage de galets - beach break : 1/ a/ brisants de sable (pl.) ; b/ (Surf) plage à brisants, site sur fond sableux ; 2/ (a beach break) des vacances à la plage, un séjour à la plage - beach music : musique de plage - beach resort : a/ station balnéaire (f), plage ; b/ complexe hôtelier donnant sur une plage * beach (v) (tr.) : (Naut.) échouer (un navire) - to be beached : s’échouer * beaching (n) : 1/ (Naut.) échouage (d’un navire) ; 2/ - beachings (pl.) : échouements (de coquillages, etc.), objets échoués (pl.) * beacon (n) : 1/ fanal ; 2/ phare (syn. lighthouse) ; 3/ (fig.) flambeau, phare - beacon of freedom : flambeau de la liberté ; 4/ balise (f) * bead (n) : 1/ perle (f) ; 2/ grain (de chapelet) - anal beads (pl.) : (Sex.) chapelet anal (sing.) * beadle (n) : bedeau (syn. verger) * beak (n) : bec - parrot beak : tire-clou (masc.) * beaked (a) : (Hérald.) à bec * beaker (n) : gobelet (pour boire) * beam (n) : 1/ rayon (lumineux), faisceau (lumineux) - to emit a beam of light : émettre un rayon lumineux - beam of electrons : faisceau d’électrons - laser beam : rayon laser, faisceau laser - narrow beam : faisceau étroit ; 2/ poutre (f) * beam (v) : (intr.) rayonner * beam down (v) (tr.) : téléporter (sur la planète) - 2 to beam down! : (Star Trek) Deux à téléporter (sur la planète) ! * beam up (v) (tr.) : téléporter (sur le vaisseau) - 2 to beam up! : (Star Trek) Deux à téléporter (sur le vaisseau) ! * bean (n) : 1/ haricot - green beans : haricots verts ; 2/ grain - coffee beans : grains de café ; 3/ (expressions) - full of beans (brit.) (fam.) : tout feu tout flamme, qui pète le feu * beanfeast (n) : dîner annuel (offert par un patron à ses ouvriers) * bear (n) : ours - Goldilocks and the three bears : Boucle d’or et les trois ours - brown bear : ours brun - polar bear : ours polaire - bear hug : câlin (fam.) (aussi bearhug) * bear (a) : (Bourse) baissier/-ière - bear market : marché baissier * bear (v) (intr.) : (Bourse) spéculer à la baisse * bear (v) (bore, borne) (tr.) : 1/ supporter, soutenir - to bear the brunt of… : soutenir le choc de…, subir ou essuyer le plus gros d’(une attaque) ; 2/ tolérer, supporter - I can't bear + gér. : Je ne supporte pas de + inf. ; 3/ donner (des fruits) - to bear fruit : donner des fruits ; 4/ donner naissance à, accoucher de, enfanter - She bore him five children : Elle lui donna cinq enfants ; 5/ porter, arborer - to bear the imprint of… : porter l’empreinte de… ; 6/ (expressions diverses) - to bear a grudge against sb : avoir de la rancune contre qn - to bear a resemblance to… : présenter une ressemblance avec… - to bear similarities to… : présenter des similitudes avec… * beard (n) : barbe * bear down (v) (bore, borne) (intr.) : to bear down on/upon sb : oppresser qn - to bear down on the enemy : foncer sur l'ennemi * bearer (n) : 1/ porteur, porteuse - cross bearer : porte-croix (la personne) (masc.) - standard bearer : porte-drapeau (prop. et fig.) (masc.) ; 2/ détenteur, détentrice * bearing (n) : 1/ (a) bearing : (un) roulement - ball bearing : roulement à billes - roller bearing : roulement à rouleaux ; 2/ palier * bearish (a) : baissier/-ière - bearish tendency : tendance baissière (anton. bullish) * bearskin (n) : peau d’ours * beast (n) : 1/ bête f), animal ; 2/ sauvage, brute (f) ; 3/ (la) bête (humaine) * beat (n) : 1/ battement - beats per minute (bpm) : (nombre de) battements à la minute, cadence (f) ; 2/ temps fort (de la mesure), rythme, tempo - to march to a different beat (fig.) (litt. marcher sur un rythme différent) : faire les choses différemment, être non conformiste, ne pas suivre le troupeau - to skip a beat : sauter un temps - to play on the beat : jouer en rythme - danceable beats : rythmes dansants - beat drop : chute de rythme - beat juggling : jonglage des tempos (technique de platiniste) - beat matching : superposition des battements, calage tempo (technique de platiniste) - beat mixing : mixage des tempos (technique de platiniste) ; 3/ ronde (f) (d'un gardien de la paix) - beats and patrols : rondes et patrouilles (f pl.) - on the beat : en patrouille * beat (v) (beat, beaten) (tr.) : 1/ (Mus.) battre - to beat the rhythm : battre la mesure - to beat time : battre la mesure ; 2/ rosser, battre, tabasser - to beat sb to death : rosser qn jusqu’à ce que mort s’ensuive, battre qn à mort ; 2/ (expressions diverses) - Beat it! (arg.) : Fiche / Fichez le camp ! - That beats all! : Ça c’est le bouquet !- That beats me! : Cela me dépasse ! * beat (prét. de to beat) * beatbox (n) : (Mus.) boîte à rythmes * beaten (pp de to beat) : - to be beaten to death : être battu à mort * beater (n) : 1/ (Cuisine) fouet à œufs), batteur ; 2/ tapette (f) (à tapis) ; 3/ battoir - clothes beater : battoir à linge * beating (n) : correction (f), raclée (f), rossée (f), volée (f) (syn. blows (pl.)), défaite (f) (syn. defeat) - to take a severe beating : se faire rosser copieusement * beaver (n) : 1/ castor ; 2/ (vulg.) foufoune (f), (fam.) minou * beautiful (a) : beau/-elle - the beautiful (a. subst. sing.) : le beau * beautifully (adv.) : merveilleusement, divinement, magnifiquement, à la perfection * beauty (n) : 1/ (la qualité) beauté (f) - angelic beauty : beauté angélique - timeless beauty : beauté intemporelle - beauty shop (amér.) : salon de coiffure femmes ; 2/ (la personne) - bathing beauty : beauté en maillot, belle en maillot, belle baigneuse, sirène- the Dunce and the Beauty : la belle et la bête * became (prét. de to become) * because (conj. de cause) : 1/ parce que ; 2/ (Because, t d p) comme, du fait que, c'est parce que ... que ; 3/ (marquant la raison) car * because of (loc. prép.) : à cause de, du fait de, en raison de * Because of this / that, ... (m d l) : C'est la raison pour laquelle ..., Pour cette raison, … * beck (n) : dans l’expression at s.o.’s beck and call : aux ordres de qn * beckon (v) : faire signe (to sb, à qn) (to do, de faire) * become (v) (became, become) : 1/ (tr.) devenir ; 2/ (+ adj.) devenir + adj. - to become clear : devenir évident - to become operational : devenir opérationnel - to become unprofitable : a/ devenir peu rentable ; b/ devenir peu profitable * become (pp de to become) * becoming (a) : 1/ convenable, bienséant(e) ; 2/ [vêtement] seyant(e) * bed (n) : 1/ lit - to make one's bed : faire son lit - double bed : grand lit - four-post bed : lit à baldaquin (syn. canopy bed) - twin beds : lits jumeaux - unmade bed : lit défait - bed sheet : drap de lit ; 2/ banc (au sens technique) - test bed : banc d'essai ; 3/ parterre - flower bed : parterre de fleurs * bed (v) (tr.) : 1/ loger, coucher ; 2/ mettre au lit, coucher ; 3/ coucher avec - to bed a woman : coucher avec une femme ; 4/ poser à plat, coucher * bedbug (n) : punaise (f) (de matelas) * bedding (n) : literie (f) * bedeck (v) (tr.) : orner (with, de) * bedraggled (a) : [vêtements, personne] débraillé(e) (et tout trempé(e)) * bedrock (n) : (Géol.) soubassement, socle rocheux - bedrock ledge : rebord rocheux * bedroom (n) : chambre à coucher - double bedroom : grande chambre - spare bedroom : chambre d'amis (syn. guest bedroom) - bedroom community : ville dortoir * bedside (n) : chevet - bedside lamp : lampe de chevet - bedside table : table de chevet, table de nuit (syn. amér. nightstand) * bedspread (n) : dessus de lit, couvre-lit (syn. arch. counterpane : courte-pointe) * bed-sitting / bedsitting (ac) : - bed-sitting room : chambre d’étudiant * bedsitter (n) : chambre d’étudiant * bedtime (n) : heure du coucher, heure d’aller se coucher / de se mettre au lit - bedtime story : histoire (avant de s’endormir) * bedwetter (n) : personne qui fait pipi au lit, personne qui mouille son lit, pisse-au-lit (vulg.) - music for bedwetters : musique pour les énurétiques, musique pour les incontinents * bed-worthiness (n) (brit.) : baisabilité (f) (d’une fille) * bed-worthy (ac) (brit.) : (en parlant d’une fille) à mettre dans son lit, baisable * bee (n) : abeille (f) - (the) queen bee : (la) reine des abeilles - worker bee : ouvrière (n) - bee bole : buc - bee enclosure : enclos à ruches - bee hole : niche à ruche (syn. bee niche) - bee skep : ruche à abeilles * (the) Beeb (n pr.) (fam.) : la BBC * beech (n) : hêtre - beech grove : hétraie (f) - beech tree : hêtre * beef (n) : 1/ (vieil.) (pl. beeves) bœuf (l’animal) ; 2/ bœuf (la viande) ; 3/ muscles (pl.) - There is too much beef on him : Il a trop de muscles ; 4/ force (f), énergie (f) - Put some beef in it : Mets-y un peu de nerf ; 5/ - to have a beef with sb : avoir une dent contre qn * beefier (a) (compar. de beefy) : plus costaud(e), plus baraqué(e) * bee-friendly (ac) : bon(ne) pour les abeilles - bee-friendly flowers : fleurs bonnes pour les abeilles * beef up (v) (tr.) : gonfler * beehive (n) : ruche (f) - beehive well : puits couvert en forme de ruche * beehive-like (ac) : en forme de ruche * beehive-shaped (ac) : en forme de ruche * beefy (a) : 1/ de bœuf - beefy flavour : goût de bœuf ; 2/ baraqué(e), costaud(e) * been (pp de to be, être) : été * beep (n) : bip * beep (v) (intr.) : émettre un signal sonore, émettre un bip * beeper (n) : dispositif sonore * beer (n) : bière (f) - pitcher of beer : pichet de bière - chilled beer : (de la) bière fraîche - beer mat : dessous de bock - beer enthusiast : grand amateur de bière * beet (n) : betterave (f) - sugar beet : betterave à sucre * befall (v) (-fell, -fallen) (tr.) : arriver à - the trouble that have befallen the country in recents years : les problèmes qui ont assailli le pays ces derniers temps * befallen (pp de to befall) * befell (prét. de to befall) * before (prép.) : 1/ devant ; 2/ avant ; 3/ + gér. : avant de + inf. : 4/ face à - the task before our engineers : la tâche qui attend nos ingénieurs * before (conj. de temps) : avant que, avant de + inf. * before (adv.) : (en fin de proposition) auparavant - a few years before : quelques années auparavant * before and after (prép. coordonnées) : avant et après + subst. * beforehand (adv.) : à l’avance * befouled (a) : souillé(e) * befuddled (a) : ivre (syn. drunk) * beg (v) (tr.) : 1/ supplier, prier - I beg you : Je vous en conjure ; 2/ mendier * began (prét. de to begin) * beget (v) (begot, begotten) (tr.) : engendrer * beggar (n) : 1/ mendiant (n) - beggar monk : moine mendiant - beggar woman : mendiante (f) ; 2/ - little beggar : petit chenapan, petit vaurien - lucky beggar : sacré veinard * beggar (v) (tr.) : 1/ réduire à la mendicité ; 2/ défier (dans diverses expressions) - to beggar belief : défier la raison - to beggar description : défier toute description * begging (n) : mendicité - to go begging : pratiquer la mendicité * begin (v) (began, begun) (tr.) : commencer - to begin commercial flights : (Av.) [compagnie aérienne] inaugurer des vols commerciaux - to begin to + inf. : commencer à + inf. * beginner (n) : débutant, novice (syn. starter) * beginning (n) : 1/ commencement, début - at the beginning : au début (of, de) ; 2/ (beginnings, n pl.) : prémices * beginning on (loc. prép.) (+ numéro de page, de revue, etc.) : à partir de, à compter de - Beginning on June 28, 2011, ... : À partir du 28 juin 2011, ... - beginning on page 40 : à partir de la page 40 * beginning with (loc. prép.) : (+ date, etc.) à commencer par, à partir de, à compter de * begot (prét. de to beget) * begotten (pp de to beget) * begrudge (v) (tr.) : to begrudge sb sth : reprocher qch à qn * beguile (v) (tr.) : séduire * begun (pp de to begin) * behalf (n) : représentant (n) - on behalf of : au nom de (syn. in the name of) * behave (v) (intr.) : 1/ se conduire, se comporter, se tenir ; 2/ to behave oneself : bien se tenir - Behave yourself! : Tiens-toi / Tenez-vous bien ! * behavior (amér.) / behaviour (brit.) (n) : comportement, conduite (f), tenue (f) - human behaviour : comportement humain - playful behaviour : taquineries (f pl.) - self-serving behaviour : comportement intéressé * behead (v) (tr.) : décapiter * beheading (n) : décapitation (f) * beheld (prét. de to behold) * beheld (pp de to behold) * behind (prép.) : 1/ derrière ; 2/ à l’origine de - behind the move : à l’origine de la mesure ; 3/ qui se cache derrière - the truth behind… : la vérité qui se cache derrière… ; 4/ dans la locution to be behind : être à la traîne, être en retard - to be technologically behind : être en retard sur le plan technologique * behind (adv.) : 1/ à l’arrière, en arrière - to lead from behind : diriger en coulisse ; 2/ derrière - (not to) be far behind : n'être pas loin derrière * behind (n) : derrière (n), postérieur, fesses (f pl.) * behind-the-scene (ac) : (Théätre) qui se passe en coulisse - behind-the-scene joke : blague de coulisses * behold (v) (beheld, beheld) (tr.) : regarder, contempler - Behold! (interj.) (littéraire) : Regardez ! - lo and behold : a/ ô surprise, surprise , b/ et voilà que… * beholden (a) : redevable - to be beholden to sb : être redevable à qn * beholder (n) : spectateur, observateur - Beauty is in the eyes of the beholder : Il n’y a pas de laides amours * being (p. prés.) : 1/ étant - This being so : Cela étant ; 2/ en train d'être - the product being made : le produit en cours de fabrication * being (n) : 1/ existence (f) - to come into being : voir le jour, naître, apparaître (syn. to come into existence) ; 2/ être, créature (f) - beings from other worlds : créatures venant d'autres mondes - alien being : créature extraterrestre - human being être humain * be it ... or ... (loc. conj. alternative) : que ce soit ... ou ..., qu'il sagisse de ... ou de ... * Belarus (n pr.) : (la) Biélorussie, (le) Bélarus * Belarussian (a) : biélorusse (sans maj.) * Belarussian (n pr.) : Biélorusse (le ressortissant) * belated (a) : 1/ qui s’est laissé surprendre par la nuit ; 2/ attardé(e) ; 3/ en retard, retardé(e) ; 4/ tardif/-ive * belatedly (adv.) : tardivement, avec du retard, en retard - to admit sth belatedly : admettre qch tardivement * beleaguer (v) (tr.) : 1/ assiéger (un château, une ville) ; 2/ harceler * beleaguered (a) : assiégé(e) (syn. besieged) * belfry (n) : beffroi * Belgium (n pr.) : (la) Belgique * Belgian (a) : belge (sans maj.) * Belgian (n pr.) : Belge (le ressortissant, la ressortissante) * belief (n) : croyance (f) - to beggar belief : défier la raison - firm belief : conviction (f) - contrary to popular belief : contrairement à ce que croient les gens * believe (v) (tr.) : (tr.) croire - Believe me : Crois-moi, Croyez-moi - Believe you me (fam.) : Tu peux me croire, Vous pouvez me croire - to believe that… : croire que…, être d’avis que… ; (intr.) croire (in sth, en qch) * believer (n) : croyant, croyante (n) - staunch believer : dévot - UFO believer : croyant en matière d’ovnis (anton. non-believer, skeptic) * belittle (v) (tr.) : rabaisser, dénigrer, déprécier * bell (n) : cloche (f) - the opening bell (Bourse) : la cloche à l'ouverture - bell curve : courbe en cloche - bell ringer : sonneur de cloches - bell tower : clocher * bellboy (n) : portier, garçon d’étage * bellicose (a) : belliqueux/-euse - bellicose trade policies : politiques commerciales belliqueuses * bellicosity (n) : caractère belliqueux, bellicisme * belligerence (n) : 1/ belligérance (f) - an act of belligerence : une manifestation d’hostilité ; 2/ pugnacité (f) * belligerent (a) : 1/ belliqueux/-euse, agressif/-ive, hostile ; 2/ pugnace * bellow (n) : beuglement * bellow (v) (intr.) : beugler * bell-shaped (ac) : en forme de cloche, campaniforme * bellwether (n) : 1/ tête de troupeau (de moutons), chef de troupeau (de moutons) ; 2/ meneur, chef ; 3/ (fig.) indicateur de tendance, baromètre * belly (n) : ventre - distended belly : ventre distendu, ventre gonflé - belly button : nombril (syn. navel) * belong (v) (intr.) : appartenir (to, à) * belongings (n pl.) : biens (pl.), possessions (f pl.) * beloved (a) : bien aimé(e) * below (prép.) : 1/ au-dessous de, en dessous de, sous ; 2/ en deçà de, inférieur(e) à + indication chiffrée * below (adv.) : 1/ en dessous ; 2/ ci-dessous * below-average (ac) : en dessous de la moyenne, inférieur à la moyenne - people with below-average intelligence : gens dotés d’une intelligence inférieure à la moyenne * belt (n) : 1/ ceinture (f) - to tighten one’s belt : se serrer la ceinture - garter belt (amér.) : porte-jarretelle (masc.) - suspender belt (brit.) : porte-jarretelle (masc.) - belt tightening : serrage de ceinture, politique de rigueur ; 2/ bande (f) - conveyor belt : tapis roulant, transporteur à bande, bande de manutention - tool belt : porte-outil (masc.) ; 3/ région (f) - rust belt : région industrielle sinistrée * belt-driven (ac) : entraîné(e) par courroie - belt-driven pulley : poulie entraînée par courroie * belt up (v) (intr.) (arg.) : fermer sa gueule, la fermer * bemoan (v) (tr.) : déplorer * bench (n) : 1/ banc (de jardin) ; 2/ banquette (f) ; 3/ (Indust.) établi, paillasse (f), banc - presetting bench : banc de préréglage - bench drill : perceuse d'établi - bench operation : fonctionnement sur paillasse ; 4/ banc (d’essais) - test bench : banc d’essais, banc de tests, banc-test - testing bench : banc d'essais, banc de tests, banc-test * benchmark (n) : banc d’essais, batterie de tests d’évaluation, essai comparatif * benchmarking (n) : évaluation des performances, évaluation comparative (d'une entreprise) * benchtop (n) : établi (n) - benchtop magnifier : loupe d’établi * benchwarmer (n) : (Sport) réchauffeur de banc, remplaçant * bend (n) : virage - sharp bend : virage serré * bend (v) (bent, bent) : (tr.) courber, cintrer ; (intr.) se pencher, plier * bender (n) : 1/ plieuse (f), machine à plier ; 2/ - spoon bender : plieur de petites cuillères (Uri Geller) ; 3/ (arg.) beuverie (f) - to go on an all-night bender : se biturer toute la soirée ; 4/ cuite (f) - to go on a bender : prendre une cuite ; 5/ (arg. brit.) pédé ; 6/ travelo (péj.) * bending (n) : cintrage - bending machine : machine à cintrer, cintreuse (f) * beneath (prép.) : au-dessous de, en dessous de, sous (syn. under) * benefactor (n) : bienfaiteur * benefactress (n) : bienfaitrice (f) * benefit (n) (fa p) : 1/ bénéfice - to give sb the benefit of the doubt : donner à qn le bénéfice du doute ; 2/ avantage, atout - the benefits of living in the city : les avantages de la vie citadine ; 3/ bienfait ; 4/ allocation (f) (de chômage, etc.), indemnité (f) - daily benefit : indemnité journalière - employee benefits : avantages sociaux- social security benefits (pl.) (brit.) : aide sociale (f) - unemployment benefit : allocation de chômage - He draws unemployment benefits : Il touche une allocation de chômage * benefit (v) (tr.) (fa) : 1/ être utile à ; 2/ profiter à, être bénéfique à * benevolence (n) : 1/ bienveillance (f) ; 2/ acte de bienfaisance, bienfait * benevolent (a) : bienveillant(e) - benevolent society : société de secours mutuel * benign (a) : 1/ bénin/-igne ; 2/ inoffensif/-ve, qui n’est pas méchant(e), bienveillant * benignly (adv.) : 1/ bénignement, de façon bénigne, sans faire de mal ; 2/ avec bienveillance, avec bonté et douceur * benighted (a) : plongé(e) dans les ténèbres de l’ignorance, ignare, attardé(e) * bent (prét. de bend) * bent (pp de bend) * bent (a) : 1/ courbé(e), plié(e) ; 2/ (brit.) homosexuel (syn. queer) - a bent character : un homo, un pédé * bequeath (v) (tr.) : léguer (to, à) * bequest (n) : legs (faux pluriel) - charitable bequest : don testamentaire * berate (v) (tr.) : réprimander, tancer - to berate sb for doing sth : réprimander qn pour avoir fait qch * bereaved (a) : en deuil - the bereaved (a. subst. pl.) : les proches (du disparu) * bereft (a) : dénué(e) (of, de) * berk (n) (arg. brit.) : idiot, imbécile, crétin - Don’t make a berk of yourself! : Ne fais pas l’idiot ! * Berliner (n pr.) : Berlinois(e) (l’habitant) * berry (n) (pl. berries) : baie (des bois) * berserk (a) (tjrs attribut) : fou furieux, folle furieuse - to go berserk : a/ [individu] devenir fou/folle, pêter les plombs, disjoncter ; b/ [machine] s’emballer * berth (n) : poste de mouillage - to give a wide berth to sth : a/ passer au large de qch ; b/ (fig.) éviter qch, se tenir à l’écart de qch * beseech (v) (besought, besought ou régulier) (tr.) (lit.) : implorer - I beseech you : Je vous en conjure * beseem (v) (tr.) : convenir à, seoir à * beset (v) (-set, -set) (tr.) : assaillir, assiéger * beset (prét. de to beset) * beset (p passé) : assailli(e) - to be beset with obstacles : être semé(e) d'embûches, être hérissé(e) d’obstacles * beside (prép.) : 1/ à côté de, auprès de ; 2/ en plus de - beside the point : en dehors de la question * besides (prép.) : 1/ en plus de, outre - besides the fact that… : sans compter que… 2/ besides + gér. : outre que, outre le fait de + inf., en plus de + inf. * besides (adv.) : en outre, de plus, par ailleurs * besiege (v) (tr.) : assiéger * besmirch (v) (tr.) : salir - wastes that besmirch the land : des déchets qui souillent le territoire * besought (prét. de to beseech) * bespeak (v) (bespoke, bespoke/bespoken) (tr.) : indiquer, montrer, témoigner de * bespectacled (a) : portant des lunettes * bespoke (prét. de to bespeak) * bespoke (a) : sur mesure * bespoken (pp de to bespeak) * best (a) (superl. de good) : meilleur(e) - in the best case : dans le meilleur des cas (anton. in the worst case : dans le pire des cas) * best (n) : (le) meilleur, (la) meilleure ; (le) mieux * best (v) (tr.) : avoir le dessus sur, l’emporter sur, filer une raclée à (fam.) * bestir (v) (intr.) : se remuer, s’activer * bestow (v) (tr.) : conférer (on, à), accorder (on, à) * best-seller / bestseller (nc/n) : succès de librairie, livre à succès, livre à grand succès * bet (n) : pari - to hedge one’s bets : limiter les risques, protéger ses arrières (fam.) * bet (v) (bet, bet ou régulier) (tr.) : parier (une somme) (on, sur), miser (on, sur) - I bet : je parie, pour sûr, à tout coup * bet (prét. de to bet) * bet (pp de to bet) * betcha (expr.) (pour I bet you) (arg.) : je te parie que, je vous parie que * bethink (v) (tr.) : considérer, songer à * betoken (v) (tr.) : annoncer, présager, être le signe de, augurer de * betray (v) (tr.) : trahir - to betray one’s country : vendre son pays (to, à) * betrayal (n) : trahison (f) * better (a) (compar. de supériorité de good) : meilleur(e) * better (n) : (le) meilleur - for better or for worse : pour le meilleur ou pour le pire * betterment (n) : 1/ amélioration (f) ; 2/ plus-value (f) * better off (tjrs attribut) : en meilleure posture - You could be better off : Tu pourrais mener une vie plus aisée (anton. worse off) * better-quality (ac) : de meilleure qualité * better still (loc. adv.) : encore mieux, mieux encore * betting (n) : paris (pl.) * between (prép.) : entre - the gulf between rich and poor : l’écart entre riches et pauvres * beverage (n) : breuvage, boisson (f) - alcoholic beverage : boisson alcoolique - effervescent beverage : boisson gazeuse - beverage can : canette/cannette (f) * beware (v) (tr.) : - May the Gods beware you of… : puissent les dieux vous garder de… * bewilder (v) (tr.) : abasourdir, ahurir, dérouter * bewildered (a) : abasourdi(e), ahuri(e), époustouflé(e), dérouté(e), éberlué(e) * bewildering (a) : ahurissant(e), époustouflant(e), déroutant(e) * bewitch (v) (tr.) : ensorceler, enchanter * bewitched (ppa) : ensorcelé(e), enchanté(e) * beyond (prép.) : au-delà de - far beyond… : dépassant de loin… * beyond (adv.) : au-delà * bias (n) : préjugé, parti pris - confirmation bias : préjugé de confirmation - gender bias : sexisme * biased (a) : 1/ partial(e) - to be biased : être de parti pris ; 2/ biaisé(e), tendancieux/-ieuse * bicameral (a) : [parlement] bicaméral(e), qui a deux chambres, à deux chambres * bicarb (n) (tronc. fam. de bicarbonate (of sodium)) : bicarbonate (de soude) * bicarbonate (n) : bicarbonate - bicarbonate of soda (brit.) : bicarbonate de soude (l’agent levant) (amér. baking soda) * biceps (n) (pl. biceps) : biceps - bulging biceps : gros biceps * bicker (n) : chamailleries (f pl.) * bicker (v) (intr.) : se chamailler * bicycle (n) : bicyclette (f) - bicycle friendliness : attitude favorable à la bicyclette - bicycle rack : porte-vélo (var. bike rack) * bid (n) : 1/ offre (f) (aux enchères), offre d’achat - takeover bid : offre de rachat - bid price : cours acheteur ; 2/ tentative (f) - to make a bid for sth : tenter d’obtenir qch, s’efforcer de gagner qch - murder bid : tentative de meurtre * bid (v) (bade, bidden ou bid, bid) : 1/ (tr. et intr.) commander, ordonner ; 2/ faire une offre (d’achat) (intr.) to bid for sth : faire une offre d’achat pour qch ; 3/ (tr.) souhaiter - to bid goodbye to sb / to bid sb goodbye : dire au revoir à qn * bid (prét. de to bid) * bid (pp de to bid) * bidet (n) : bidet * bidden (pp de to bid) * bidder (n) : enchérisseur, enchérisseuse - the highest bidder : le plus offrant * bidding (n) : 1/ enchères (f pl.) ; 2/ ordres (pl.) - to do sb’s bidding : être aux ordres de qn * bide (v) (tr.) : attendre - to bide one’s time : attendre le bon moment, chercher à gagner du temps * bier (n) : 1/ bière (f) ; 2/ catafalque * biff (v) (tr.) (fam.) : donner un coup de poing à, filer un gnon à (fam.), coller un pain à (fam.) * bifilar (a) : bifilaire - bifilar winding : enroulement bifilaire * big (a) : grand(e), gros(se), important(e) - big data (sing.) : (les) gros corpus de données - big size : grand format - big stocks : réserves importantes (f pl.) * biggest (a) (superl. de supériorité de big) : le plus grand, le plus gros - the biggest benefits : les plus grands avantages * big-headed (ac) : qui a la grosse tête (fam.), infatué(e) de soi-même, vaniteux/-euse * big-name (ac) : connu(e), célèbre, important(e) * bigot (n) : fanatique (n) (m/f), sectaire (n) (m/f) * bigoted (a) : sectaire, intolérant(e) * bigotry (n) : sectarisme, intolérance (f) * big-titted (ac) : qui a de gros seins, à grosses loches (vulg.)- big-titted slut : salope à grosses loches * bike (n) (fam.) : 1/ (abr. de bicycle) vélo, biclou (fam.) - bike with training wheels : vélo avec une paire de roulettes - bike lane : piste cyclable (f) - bike mugger : voleur de vélo à l’arraché - bike rack : porte-vélo (masc.) ; 2/ (abr. de motorbike) moto (f) - chopper bike : (amér.) moto modifiée (f), moto réduite (abr. chopper) * bikepacker (n) : voyageur à vélo sans porte-bagages (avec de simples sacoches accrochées au guidon, au cadre et à la tige de la selle) * bikepacking (n) : voyager sur un vélo sans porte-bagages (avec de simples sacoches accrochées au guidon, au cadre et à la tige de la selle) * bikini-clad (ac) : vêtu(e) d’un bikini - bikini-clad creature : belle fille en bikini * bilge (n) : 1/ eau de cale ; 2/ propos insignifiants (pl.) * bilingual (a) : bilingue - bilingual concordancer : concordancier bilingue - bilingual corpus : corpus bilingue * bilingual (n) : bilingue (n) - bilinguals : (les) bilingues * bilingualism (n) : bilinguisme - symbolic bilingualism : bilinguisme de façade * bilk (n) : escroquerie (f) * bilk (v) (tr.) : 1/ escroquer (qn) ; 2/ contrecarrer ; 3/ se dérober à * bill (v) : (tr.) donner des coup de bec à ; (intr.) se becoter * bill (n) : 1/ bec (d’oiseau) ; 2/ billet ; 3/ facture (f) - phone bill : facture téléphonique - the bill (brit .) : l’addition (f) (au restaurant) - Shall I make up your bill? : Je vous fais votre compte ? * bill and coo (v coord.) (intr.) : se bécoter et roucouler, se faire des mamours * billet (n) (fa) : cantonnement * billiards (n) : (le) billard * billion (n) (amér. = 10 puissance 9) : mille millions, milliard (en français, un billion représente aujourd'hui un million de millions) * billionfold (a) : multiplié(e) par un milliard * billow (n) : volute * billy-goat (nc) : bouc * bi-metal / bimetal (a) : bimétallique - bimetal strip : élément bimétallique * bimetallic (a) : bimétallique - bimetallic strip : élément bimétallique * bin (n) : casier, réceptacle - bin liner (brit.) : sac poubelle * binarisation (brit.) / binarization (amér.) (n) : binarisation (f) * binarise (brit.) / binarize (amér.) (v) : transformer en données binaires, binariser * binary (a) : binaire * bind (v) (bound, bound) (tr.) : 1/ attacher, lier ; 2/ unir, cimenter (fig.) * binder (n) : moissonneuse-lieuse (f) * binge (n) : 1/ gueuleton ; 2/ beuverie (f), soûlerie (f) - binge drinking : beuverie, beuveries (pl.) ; 3/ frénésie (f) - binge viewing : visionnage boulimique (syn. binge watching) * bio (n) pl. bios (tronc. fam. de biography biographie) bio (f) * bio-car (n) : voiture écolo (f) * biochemist (n) : biochimiste (m/f) * biochemistry (n) : biochimie (f) * biodegradable (a) : biodégradable * biodegrade (v) (tr.) : biodégrader, décomposer - to be able to biodegrade plastic : être capable de décomposer le plastic * biodiesel (n) : biodiesel - biodiesel car : voiture roulant au biodiesel * bio-diverse / biodiverse (a) : biodivers(e) * bio-diversity / biodiversity (n) : diversité biologique (f), biodiversité (f) - to increase biodiversity : accroître la biodiversité - to maintain biodiversity : préserver la biodiversité - biodiversity hotspot : point chaud de biodiversité, zone critique de biodiversité * biofuel (n) : biocarburant - agriculturally produced biofuels : biocarburants d'origine agricole * biography (n) (pl. biographies) : biographie * biological (a) (fa p) : biologique (au sens de relatif à la biologie), de biologie - biological clock : horloge biologique - biological lab : labo de biologie * biologically (adv.) : biologiquement * biology (n) : (la) biologie ; 2/ (Éduc.) (les) sciences de la vie et de la terre * biomass (n) : biomasse (f) - plant biomass : biomasse végétale (f) * biopesticide (n) : biopesticide * biopic (n) (pl. biopics) (abr. de biographical picture : film biographique) biographie filmée (f) * biosphere (n) : (la) biosphère - our planet's biosphere : la biosphère terrestre * biotech (n) (tronc. de biotechnology) : biotech (n f) - biotech company : société de biotech - the biotech industry : l’industrie de la biotech - biotech scientist : biotechnicien * biotechnology (n) : biotechnologie (f) - biotechnology scientist : biotechnicien * bioterrorism (n) : bioterrorisme * bioweapon (n) : arme biologique (f), arme bactériologique (f) - to develop a bioweapon : créer une arme biologique - bioweapon research facility : centre de recherches sur les armes biologiques * bipartisan (a) : constitué(e) de deux partis politiques, bipartite, biparti * biped (n) : bipède * bipedal (a) : bipède * bipolar (a) : bipolaire * birch (n) (pl. birches) : bouleau * bird (n) : 1/ oiseau - carrion bird : charognard - migratory bird : oiseau migratoire - bird spotting : observation des oiseaux (aussi bird watching) ; 2/ (fig.) fille (f), nana (f) (fam.) * birdbath (n) : vasque à oiseaux, abreuvoir à oiseaux * bird-brained (ac) : à la cervelle d’oiseau * birdie (n) : oiselet * birdstrike : (Aéro.) impact d’oiseau (sur un avion) * Biro / biro (n de marque) : stylo à bille (syn. ballpoint, ballpoint pen, ball pen) * birth (n) : naissance (f) - to give birth : donner naissance (to, à), accoucher (to, de) - birth mother : mère biologique (f) - birth rate : taux de natalité * birthday (n) : anniversaire - My birthday is not for another month : Mon anniversaire est dans un mois - birthday party : fête d’anniversaire * birthstone (n) : pierre porte-bonheur (f) * biscuit (n) : biscuit * bishop (n) : 1/ évêque ; 2/ (aux échecs) fou * bison (n) : bison - steppe bison : bison des steppes * bit (prét . de to bite) * bit (n) : 1/ morceau, bout, brin, soupçon (de qch) - Not one bit! : Pas un brin !, Pas un iota ! - He hasn’t changed one bit : Il n’a pas changé d’un iota - I don’t like it one bit : Je n’aime pas ça du tout ; 2/ mèche (f) (de vilebrequin) - tool bit : mèche d’outil * bitch (n) (pl. bitches) : 1/ chienne (f) ; 2/ garce (f), salope (f) - Karma is a bitch! : On récolte ce qu’on a semé ! * bitch (v) (intr.) : râler, rouspéter, se plaindre - to bitch about sb : dire du mal de qn * bitchslap (n) : baffe (f), torgnole (f) (vulg.) * bitchslap (v) (tr.) : filer une baffe à, baffer, foutre une torgnole à (vulg.) - to get bitchslapped : prendre une baffe, se faire torgnoler (vulg.) * bitchy (a) : méchant(e), vache (fam.) * bite (v) (bit, bitten) (tr.) : 1/ mordre ; 2/ ronger - to bite one’s nails : ronger ses ongles, se ronger les ongles * biter (n) : 1/ personne ou animal qui mord ; 2/ personne qui ronge - nail biter : a/ personne qui se ronge les ongles ; b/ situation tendue (f) ; c/ (Sport) (selon le cas) match serré, course serrée (f), championnat très disputé, chaude lutte (f) * bitten (pp de to bite) * bitter (a) : amer/-ère, plein(e) d’amertume (anton. sweet) * bitterly (adv.) : avec amertume, amèrement * bitterness (n) : amertume (f) * bittersweet (a) : 1/ [goût] aigre-doux, aigre-douce, amer et doux, amère et douce ; 2/ [émotion] doux-amer, douce-amère - bittersweet memory : souvenir mêlant douceur et amertume ; 3/ [bilan] mitigé(e) * bizarre (a) : 1/ bizarre ; 2/ singulier/-ière, scabreux/-euse * black (a) : noir(e) - black gold : or noir (le pétrole) - black spot : tache noire (f) * black (n) : noir(e) (n) * blackamoor (n) 1/ (Hérald.) tête de Maure ; 2/ (péj.) nègre / négresse (m/f) * black-and-white (adj. doubles coord. par and) : noir et blanc (inv.), en noir et blanc - black-and-white film : pellicule noir et blanc * blacken (v) (tr.) : noircir ; (intr.) noircir, se noircir * blackberry (n) : mûre (f) * blackboard (n) : tableau noir (syn. chalkboard) * blackface (n) : grimage en Noir(e), maquillage en Noir(e) - to be in blackface : être grimé en Noir - white actors in blackface : acteurs blancs grimés en Noirs - blackface makeup : maquillage en Noir(e) * blackguard (n) : gueux * blackjack (n) (amér.) : matraque (f) * blacklist (n) : liste noire (f) - the McCarthyite blacklist : la liste noire mccarthyste * blacklist (v) (tr.) : mettre sur la liste noire * blacklisting (n) : mise sur la liste noire * blackmail (v) (tr.) : faire chanter (fig.) * blackmailer (n) : maître chanteur * blackmailing (n) : chantage * black or white (adj. doubles coord. par or) : 1/ [opinion] manichéen(ne) ; 2/ [opinion] tranché(e), arrêté(e) * black out (v) (tr.) : 1/ obscurcir ; 2/ couvrir (une fenêtre) ; 3/ plonger dans le noir (une ville) * blackout (n) : panne totale de courant * blacksmith (n) : forgeron * black tops (n pl.) : (litt. « têtières noires ») journaux sérieux (pl.) par opposition aux red tops (litt. « têtières rouges ») journaux populaires – existe aussi au singulier : a black top * bladder (n) : vessie (f) - bladder leakage : fuites urinaires (f pl.) * blade (n) : 1/ lame (f) (de couteau) - the edge of the blade : le fil de la lame - serrated blade : lame dentelée ; 2/ - turbine blade : ailette (f) ; 3/ - wiper blade : caoutchouc d’essuie-glace ; 4/ aube (f) * blame (n) : responsabilité (f), culpabilité (f) - to place blame on sb : attribuer la responsabilité (de qch) à qn - to put the main blame on… : incriminer principalement… - the blame game : les accusations mutuelles (f pl.), les reproches mutuels - to play the blame game : jouer à qui la faute, se renvoyer la balle * blame (v) (tr.) (fa) : rendre responsable, tenir pour responsable, attribuer la responsabilité à, rejeter la faute sur, mettre en cause - to blame the manufacturer : s’en prendre au fabricant - to have only oneself to blame : ne s'en prendre qu'à soi-même - The accident was blamed on human error : On imputa l'accident à une erreur humaine - to be to blame : en être responsable * blameworthy (a) : blamable, répréhensible - blameworthy conduct : conduite répréhensible * bland (a) : 1/ fade, insipide ; 2/ [individu] doux/-ouce, poli(e), affable, débonnaire ; 3/ [ton] suave * blandly (adv.) : 1/ platement ; 2/ avec douceur, avec affabilité ; 3/ avec suavité * blandness (n) : 1/ douceur (f), affabilité (f); 2/ suavité (f) * blank (a) : 1/ à l’état d’ébauche - blank collars : bagues à l’état d’ébauches - blank forgings : ébauches forgées(f) ; 2/ vide, occulté(e) - blank screen : écran vide, écran occulté - blank space : blanc (n) ; 3/ inexpressif/-ive * blank (n) : bloc de métal brut, pièce brute (f), brut (n), flan, ébauche (f) (Usin.) * blank (v) (tr.) : occulter * blanket (a) : global(e), général(e) - blanket rate : taux uniforme * blanket (n) (fa) : 1/ couverture (f) - electric blanket : couverture chauffante ; 2/ (fig.) chape (f), manteau - blanket of snow : manteau neigeux * blankly (adv.) : sans comprendre * blare (n) : beuglement, braillement * blare (v) (intr.) : beugler, brailler * blast (n) : 1/ souffle (d’explosion) ; 2/ rafale (f), coup (de vent) ; 3/ - air blast : jet d’air, air soufflé * blast (v) (tr.) : 1/ faire exploser, faire sauter, souffler (un immeuble) ; 2/ bombarder * blaster (n) : - sand blaster : sableuse (f) - water blaster : nettoyeur haute pression * blast-resistant (ac) : résistant aux explosions - blast-resistant building : [bâtiment] résistant aux explosions * blatancy (n) : caractère criant, caractère flagrant (syn. obviousness) * blatant (a) : criant(e), flagrant(e) (syn. obvious) * blatantly (adv.) : de façon flagrante, de façon éhontée * blaze (n) : 1/ incendie ; 2/ brasier ; 3/ flamboiement, éclat * blaze (v) (intr.) : 1/ flamber, brûler ; 2/ flamboyer * blazer (n) : veste croisée (f) - the blazer with the badge (brit.) : la veste croisée avec son écusson * bleach (n) : 1/ eau de Javel ; 2/ décolorant * bleach (v) (tr.) : 1/ blanchir ; 2/ décolorer * bleachers (n pl.) (amér.) : gradins * bleak (a) : sombre, morne, désolé(e) * bleary (a) : [yeux] trouble(s), voilé(s) * bleat (n) : 1/ bêlement ; 2/ plainte (f), jérémiade (f) * bleat (v) (intr.) : 1/ [mouton] bêler : 2/ (fig.) se plaindre (about sth, de qch) * bleating (a) : bêlant(e) - a bleating sheep : un mouton bêlant * bled (prét. de to bleed) * bled (p passé de to bleed) * bleed (n) : saignement, hémmoragie (f) - brain bleed : hémmoragie cérébrale * bleed (v) (bled, bled) : 1/ (tr. et intr.) saigner - My heart bleeds for you : J’ai de la peine pour toi ; 2/ (tr. et intr.) purger * bleeding (a) : 1/ [individu] qui saigne, en sang, [blessure] qui saigne ; 2/ - bleeding edge : (fig.) pointe (f), avant-garde (f) * bleeding (n) : saignement - menstrual bleeding : saignements menstruels (pl.) * bleeding-edge (ac) : de pointe, d’avant-garde * bleep (n) : bip * bleep (v) : (tr.) (Radio, Télé) censurer, biper - The radio station always bleeped the word crap : Cette station de radio ne manquait jamais de censurer le mot merde ; (intr.) émettre un bip, biper * blemish (n) : souillure (f) * blend (n) : mélange - oil blend : a/ mélange d’huiles ; b/ mélange de pétroles * blend (v) : (tr.) mélanger - to blend sth with sth : mélanger qch à qch ; (intr.) se mélanger - to blend with sth : se mélanger à * blender (n) : mélangeur - electric blender : mélangeur électrique * bless (v) (tr.) (fa) : bénir - God bless you! : Que Dieu vous bénisse ! - Bless you! : 1/ (après un éternuement) À vos souhaits ! ; 2/ (en remerciement) Merci mille fois ! * blessed (ppa) : béni(e), saint(e) * blessedness (n) : béatitude (f), félicité (f) * blessing (n) : 1/ bénédiction (f) ; 2/ bienfait - the blessings of civilization : les bienfaits de la civilisation * blew (prét. de to blow) * blight (n) : dégradation (f) - urban blight : quartier délabré * blight (v) (tr.) : 1/ flétrir, brûler ; 2/ nuire à * blighted (ppa) : malade, mal en point * blind (a) : 1/ aveugle - to turn a blind eye : fermer les yeux (to, sur) ; 2/ - blind date : a/ rendez-vous avec un inconnu ; b/ inconnu avec qui on a rendez-vous (syn. blind dater) ; 3/ (Av.) sans visibilité - blind landing : atterrissage sans visibilité ; 4/ (au fig.) aveugle, qui ne se pose pas de questions - blind obedience : obéissance aveugle (f) * blind (n) : 1/ store ; 2/ auvent - sun blind : auvent (aussi sunblind) * blinder (n) : œillère (f) * blinding (a) : 1/ aveuglant(e), éblouissant(e) ; 2/ fou/folle - blinding speed : vitesse folle (f) * blindly (adv.) : aveuglément * blindness (n) : 1/ cécité (f) ; 2/ (fig.) aveuglement, refus de voir - ideological blindness : cécité idéologique * blindside (n) : (Rugby) côté fermé, petit côté * blindside (v) (tr.) : 1/ (Sport) attaquer de côté ; 2/ (fig.) prendre par surprise, prendre en traître * blindsided (ppa) : pris(e) de court, pris(e) au dépourvu - to get blindsided : se trouver pris de court * blink (n) : 1/ battement (des paupières) ; 2/ clignotement - [TV] to be on the blink (amér.) : être détraqué(e), être en panne, être en rade, yoyoter (fam.) * blink (v) : (intr.) cligner des yeux * blinking (a) : clignotant(e) - blinking lights : lumières clignotantes (f) * blink out (v) (intr.) : [ampoule électrique] clignoter et s’éteindre * blip (n) : parasite d’écran * bliss (n) : bonheur (f), félicité (f) - wedded bliss : bonheur conjugal * blissful (a) : bienheureux/-euse * blissfully (a) : 1/ merveilleusement ; 2/ d’un air béat ; 3/ complètement * blisteringly fast (ac) : qui tourne à un train d'enfer, qui carbure * blithe (a) : gai(e), joyeux/-euse * blithely (adv.) : gaiement, avec insouciance * blitz (n) : 1/ bombardement aérien, blitz ; 2/ attaque éclair (f), attaque soudaine - blitz attack : attaque éclair ; 3/ campagne éclair (f) * blitz (v) (tr.) : 1/ bombarder (par avion) ; 2/ attaquer impétueusement * blitz-attack (vc) : (tr.) se livrer à une attaque éclair sur * blizzard (n) : tempête de neige - black blizzard (amér.) : blizzard noir, tempête de poussière (du Dust Bowl – « bassin de poussière » – dans les années 1930) * bloated (a) : 1/ boursouflé(e), enflé(e), gonflé(e), ballonné(e) - bloated corpse : cadavre boursouflé - bloated face : visage enflé ; 2/ (fig.) exagéré(e) * block (n) (fa p) : 1/ bloc (de pierre, de glace) - stumbling block : pierre d’achoppement, écueil ; 2/ billot ; 3/ cube (de construction) - building blocks : cubes de construction, éléments constructifs ; 4/ - dans block (of flats) (brit.) : immeuble d’habitation ; 5/ (amér.) pâté (de maisons, d'immeubles) ; 6/ - pulley block : palan * block (v) (tr.) : 1/ bloquer, barrer - to block sb’s path : se mettre en travers du chemin de qn - to block the view of… : gêner la vue de… ; 2/ obturer * blockade (n) : blocus - to subject a country to a blockade : soumettre un pays à un blocus - air blockade : blocus aérien, embargo aérien - land blockade : blocus terrestre - naval blockade : blocus naval - sea blockade : blocus maritime * blockade (v) (tr.) : faire le blocus de * blockbuster (n) : 1/ bombe de gros calibre (capable de faire sauter un immeuble, a block of flats) ; 2/ (fig.) superproduction (américaine) (f), grosse machine hollywoodienne (f) * blockhead (n) (fam.) : imbécile (m/f) * blocking (n) : blocage - site blocking : (Toile) blocage de sites * blockline (n) : légende (d'une photo de presse) * blog (n) : blogue, blog - blog reader : lecteur/-trice de blogues - content aggregating blog : blogue agrégateur de contenus * blogging (n) : tenue d’un blogue - blogging platform : plate-forme pour blogues * bloke (n) (brit.) : type, bonhomme, mec * blonde (a) : blond(e) - blonde bombshell : belle blonde (f), blonde de toute beauté, blonde incendiaire (f) * blonde (n) : (en parlant d’une femme) blonde (n f) * blood (n) : sang - My blood curdled (fig.) : Mon sang s’est figé - tainted blood : sang contaminé - blood clot : caillot de sang, caillot sanguin - blood drive : collecte de sang - blood libel : accusation de meurtre rituel - blood pressure : pression sanguine (f) - blood stream : circulation du sang, circulation sanguine (f) * blood-curdling (ac) : à vous figer le sang * bloodmobile (n) : camion pour le don du sang * bloodshed (n) : effusion de sang * blood-stained (ac) : ensanglanté(e), taché(e) de sang * bloody (a) : 1/ sanglant(e) ; 2/ (juron brit.) sacré(e), fichu(e), foutu(e) + subst. * bloody (v) (tr.) : 1/ couvrir de sang, ensanglanter ; 2/ faire saigner - to bloody sb’s nose : mettre le nez de qn en sang * bloom (n) : velouté (n) (de la peau d’un fruit, d’une personne) * bloom (v) (intr.) : 1/ fleurir ; 2/ s’épanouir * blooper (n) : (Cin.) bêtisier - bloopers and outtakes : bêtisier et prises inexploitées * blossom (v) (intr.) : s’épanouir * blot (n) : tache (f) * blotchy (a) : boutonneux/-euse, pustuleux/-euse * blot out (v) (tr.) : effacer (syn. to obliterate) * blouse (n) (fa) : 1/ corsage, chemisier ; 2/ vareuse (f) * bloviating (a) : pompeux/-euse * blow (n) : coup - to deal a serious blow : porter un rude coup (to, à) - to come to blows : en venir aux coups - to elude a blow : esquiver un coup - foul blow : coup en traître * blow (v) (blew, blown) : 1/ (tr.) souffler - to blow kisses : envoyer des baisers ; (intr.) souffler ; 2/ (intr.) [ampoule] griller, sauter - The bulb blew : L'ampoule a sauté / grillé ; 3/ (tr.) faire sauter, faire exploser ; (intr.) exploser - to blow one’s top (fig.) : piquer une crise (fam.), péter les plombs (fam.) ; 4/ (amér.) faire foirer (vulg.) - I blew it, completely and utterly : J’ai tout fait foirer * blow away (v) (blew, blown) (tr.) : 1/ faire s’envoler ; 2/ impressionner - It blew me away : Ça m’a soufflé * blower (n) : - leaf blower : souffleur de feuilles, souffleuse de feuilles * blowhole (n) : évent (de baleine) * blowing (a) : - blowing cave : caverne respirante (syn. breathing cave) * blowjob (n) : (Sex.) fellation (f), pompier (fam.) * blown (pp de to blow) * blow off (v) (blew, blown) : 1/ (intr.) être emporté par le vent ; 2/ (tr.) - to blow sb off (amér.) : faire comme si qn n’existait pas - to blow sth off (amér.) : laisser tomber qch * blowout (n) : 1/ explosion (f) (on an oil rig, sur une plateforme pétrolière) - to experience a blowout : être victime d'une explosion ; 2/ éclatement de pneu, creuvaison (f) * blow out (v) (blew, blown) (tr.) : éteindre en soufflant - He blew out the candle : Il éteignit la bougie * to blow over (v) : (tr.) [vent] renverser (un pot de fleur, un arbre) ; (intr.) [nuages] se dissiper, [tempête] se calmer, [situation] se tasser - Don’t worry, it will all blow over : Ne t’en fais pas, ça va se tasser / Ne vous en faites pas, ça va se tasser * blowtorch (n) : chalumeau * blow up (v) (blew, blown) : 1/ (tr.) faire exploser, faire sauter (fam.) ; (intr.) exploser, sauter (fam.) ; 2/ (tr.) (Photog.) faire un agrandissement de, agrandir * blown-up (ppa) : - blown-up photograph : photographie agrandie (f), agrandissement photographique (syn. enlarged photograph) * blub (v) (intr.) (brit.) : pleurnicher, gémir (about sth, sur qch) * blue (a) : 1/ bleu(e) - blue chips : (Fin.) valeurs refuge (f pl.), valeurs vedette (f pl.) - blue collar : litt. « col bleu », ouvier d’usine - blue movie : film porno (syn. porn movie) ; 2/ déprimé(e) - to feel blue : avoir le cafard ; 3/ (expressions) - once in a blue moon : tous les 36 du mois * blue (n) : bleu (n) * blueberry (n) : myrtille (f) * bluebottle (n) : mouche à viande * blueness (n) : bleuté * blueprint (n) : 1/ photocalque, calque, bleu (n) ; 2/ épure (f) ; 3/ plan (de travail) ; 4/ schéma directeur * blues (n pl.) : - the blues : le cafard, le bourdon * bluff (n) : falaise (f), promontoire * blunder (n) : 1/ gaffe (f), bourde (f), boulette (f) (fig.) ; 2/ énormité (f) (que l’on dit) * blunder (v) (intr.) : 1/ faire une gaffe, faire une bourde, faire une boulette ; 2/ dire une énormité * blundering (a) : maladroit(e), gaffeur/-euse * blunt (a) : 1/ émoussé(e) - blunt edge : bord émoussé ; 2/ [choc] brusque, brutal(e) ; 3/ [individu] direct(e) - and, to be blunt, it could… : et, pour être franc(he), cela pourrait… * blunt (v) (tr.) : 1/ émousser (une lame) ; 2/ (fig.) atténuer * bluntly (adv.) : d’un ton brusque * blur (n) : flou (n) * blur (v) : 1/ (tr.) obscurcir ; (intr.) s’obscurcir ; 2/ se brouiller, devenir indistinct(e) * blurred (ppa) : flou(e), brouillé(e) * blurring (n) : aspect flou * blurt (v) (tr.) : bredouiller (des excuses) * blush (n) : fard * blush (v) (intr.) : [individu] rougir * bluster (v) (intr.) : [individu] tempêter * B.O. (n) (init. de body odour (brit.) / body odor (amér.) : mauvaise odeur corporelle) * boar (n) : verrat - wild boar : sanglier * board (n) : 1/ planche (f) - chopping board : planche à découper, planche à hacher - draining board : égouttoir - ironing board : planche à repasser - Ouija board : planche Ouija - pastry board : planche à pâtisserie ; 2/ planche de glisse - to make boards : fabriquer des planches ; 3/ (Inf.) carte - expansion board : carte d’extension, carte additionnelle - system board : carte principale, carte mère ; 4/ conseil d’administration - censorship board : commission de censure * board (v) (tr.) : appareiller à bord de * boarder (n) : (Éduc.) interne (n) * boardroom (n) : salle de réunion du conseil d'administration, salle de conseil d’administration * board up (v) (tr.) : obturer avec des planches, condamner (une baie) - to board up a window : obturer une fenêtre avec des planches * boardwalk (n) (amér.) : passage en bois, passerelle en bois, promenade (le long du front de mer) * boast (n) : motif d’orgueil * boast (v) (tr.) : 1/ être fier/fière de posséder, avoir à son actif ; 2/ prétendre * boastful (a) : vantard(e) * boat (n) : bateau - boat trip : excursion en mer * boating (n) : navigation de plaisance - boating enthusiast : adepte de la navigation de plaisance * boat-shaped (ac) : en forme de bateau * bob (n) : 1/ hochement de tête ; 2/ petite révérence (f) ; 3/ petit tour (sur un manège) - I want a bob on the bobby horses : Je veux faire un petit tour sur les chevaux de bois ; 4/ balancier (d’horloge) ; 5/ cheveux courts (pl.), coupe au carré * bob (n) (inv.) (brit.) : shilling * bob (n) (abr. de bobsleigh) * bob (v) : 1/ (intr.) : danser, s’agiter - to bob up and down : danser sur l’eau ; 2/ (tr.) couper (la queue d’un chien), couper au carré (les cheveux) * bobber (n) (amér.) : (= bobbed bike, moto écourtée) * bobblehead (n) : jouet qui hoche la tête, figurine (f) qui hoche la tête * bobby (a) : - the bobby horses : les chevaux de bois (le manège) * bobsledder (n) : adepte du bobsleigh, bobeur * bobsleigh (n) : 1/ traîneau court ; 2/ (Sport) (le) bobsleigh * bode (v) (intr.) : augurer, présager - to bode well/ill : être de bon/mauvais augure * body (n) (pl. bodies) : 1/ corps - body double : doublure physique (f) (dans les scènes chaudes) - body clock : horloge interne (f) - body language : langage du corps, langage corporel - body odour (brit.) / boy odor (amér.) : mauvaise odeur corporelle (f) ; 2/ cadavre - alien bodies : cadavres d’extraterrestres - body bag : housse mortuaire (f) ; 3/ caisse (f) (de véhicule), carrosserie (f) - car body : carrosserie de voiture - partially assembled body : caisse assemblée partiellement - body panels : panneaux de carrosserie - body shop : atelier de carrosserie * body-friendly (ac) : 1/ non agressif/-ive pour l’organisme, supportable par le corps, bon(ne) pour la santé - body-friendly vinegar jam : confiture au vinaigre bonne pour la santé ; 2/ agréable à porter - body-friendly synthetic fibre material : matière fibreuse synthétique agréable à porter * body man (n) (amér.) : 1/ garde du corps ; 2/ aide personnel (m) * bodywork (n) : 1/ carrosserie (f) (d’une voiture) ; 2/ (activité de réparation) (la) carrosserie - to do bodywork : travailler comme carrossier, travailler comme tôlier * boffin (n) : technicien radar * bog (n) : 1/ fondrière (f) ; 2/ (brit.) the bog ou the bogs (arg.) : les chiottes (f pl.) (vulg.) - bog roll : (du) papier toilette, (du) papier cul (vulg.), (du) PQ * bog down (v) (tr.) : embourber - to get bogged down : s’enliser (in mud, dans de la boue, in one’s work, dans son travail, etc.) * bogey / bogy (n) (pl. bogeys / bogies) : 1/ démon, fantôme ; 2/ crotte de nez (var. ortho. amér. boogeyman) * bogeyman / bogyman (n) : 1/ - the bogeyman : le croquemitaine, le Père Fouettard ; 2/ épouvantail (au fig.) (var. ortho. amér. boogeyman) * bogus (a) (amér.) : faux/fausse, factice, simulé(e), bidon (inv.) - bogus company : société fantôme (f) * boil (n) : furoncle * boil (n) : point d’ébullition - to bring to the boil : amener à ébullition * boil (v) : (tr.) faire bouillir ; 2/ (intr.) bouillir * boil down (v) : 1/ (Cuis.) (tr.) faire réduire, laisser réduire (une sauce) ; (intr.) [liquide] réduire, se réduire par ébullition ; 2/ (fig.) (intr.) to boil down to sth : se résumer à qch - It all boils down to this : Tout se ramène à ceci. * boiler (n) : chaudière - gas-fired boiler : chaudière à gaz - oil-fired boiler : chaudière à mazout - boiler suit (brit.) : bleu de travail, bleu de chauffe - boiler works : chaudronnerie * boiling (a) : bouillant(e) * boisterous (a) : 1/ bruyant(e), tapageur/-euse (syn. noisy) ; 2/ tumultueux/-euse * boisterously (adv.) : bruyamment ; 2/ tumultueusement * bold (a) : hardi(e), intrépide, audacieux/-euse - bold decision : décision hardie * boldly (adv.) : hardiment, intrépidement, audacieusement - to boldly go where no man has gone before (amér.) : aller audacieusement là où aucun homme n'est allé auparavant. * boldness (n) : hardiesse (f), intrépidité (f), audace (f) * bole (n) : 1/ renfoncement (dans n mur) ; 2/ tronc creux (servant de ruche), ruche (f) dans un tronc creux - bee bole : buc * Bolivia (n pr.) : (la) Bolivie * Bolivian (a) : bolivien(ne) (sans maj.) * Bolivian (n pr. ) : Bolivien (le ressortissant), Bolivienne (la ressortissante) * bollock up (v) (brit.) (arg.) (tr.) : foutre (qch) en l’air, merder sur (qch) - We can’t risk you bollocking this up : On peut pas te laisser foutre ça en l’air * bollocks (a) (brit.) (en position d’attribut du sujet) : merdique, pourri(e) * bollocks (n pl) (brit.) (arg.) (vulg.) : 1/ couilles (f pl.) (vulg.), rouflaquettes (f pl.) ; 2/ (fig.) conneries (f pl.), cagades (f pl.) - to talk bollocks : dire des conneries - a load of old bollocks : un tas de vieilles cagades (syn. bull) * bolster (n) : traversin * bolster (v) (tr.) : 1/ renforcer ; 2/ soutenir, appuyer (syn. to support) * bolt (n) : 1/ boulon - to drive a bolt : insérer un boulon - to tighten a bolt : serrer un boulon - clamping bolt : boulon de serrage - fixing bolt : boulon de fixation - screw bolt : boulon fileté - through bolt : boulon traversant ; 2/ targette (f) ; 3/ verrou ; 4/ rouleau (de tissu) - bolt of silk : rouleau de soie * bolt (v) : 1/ (tr.) fixer par des boulons (to, sur), boulonner ; 2/ (intr.) s’emballer, déguerpir - to bolt like a rabbit : détaler comme un lièvre * bolus (n) : bol (alimentaire) - food bolus : bol alimentaire * bomb (n) : 1/ bombe (f) - letter bomb : lettre piégée (f) - stink bomb : bombe puante - thermonuclear bomb : bombe thermonucléaire - time bomb : bombe à retardement - bomb crater : cratère de bombe ; 2/ (fig.) (arg. brit.) a/ grand succès, belle réussite (f), b/ argent fou, fric monstre - to make a bomb : gagner un fric fou - It costs a bomb : Ça coûte un argent fou ; 3/ (fig.) (amér.) désastre * bomb (v) (tr.) : 1/ bombarder ; 2/ (arg. amér.) a/ rater, foirer (vulg.) (un examen, etc.) ; b/ faire foirer - How to bomb a photo : Comment faire foirer une photo * bombard (v) (tr.) : bombarder * bombast (n) : emphase (f) * bombastic (a) : grandiloquent(e), ampoulé(e), pompeux/-euse * bomber (n) : bombardier - strategic bomber : bombardier stratégique - water bomber : bombardier à eau, canadair * bombing (n) : bombardement - carpet bombing : bombardement intensif, pratique du tapis de bombes - bombing campaign : campagne de bombardement - bombing raid : raid aérien * bombshell (n) : 1/ obus ; 2/ (fig.) bombe (f), nouvelle faisant l’effet d’une bombe, nouvelle fracassante (f) - to let fall a bombshell : faire éclater une bombe, annoncer une nouvelle fracassante (aussi to drop a bombshell) - bombshell report : article faisant l’effet d’une bombe, article explosif ; 3/ (fig.) bombe (sexuelle) - She’s a bombshell : Elle est canon * bonanza (n) (amér.) : 1/ (fig.) filon, mine d’or ; 2/ manne (f) * bonce (n) (arg. brit.) : caboche (f) * bond (n) (fa) : 1/ lien ; 2/ (Fin.) obligation (f), titre - government bond : obligation d'État, bon du Trésor - catastrophe bonds : obligations catastrophe - high-yield bond : obligation à fort rendement - junk bond : obligation pourrie, titre douteux, action sans valeur - short-dated bonds : obligations à court terme - bond trading : commerce de titres * bond (v) : 1/ (tr.) souder, coller ; 2/ (intr.) to bond : nouer des liens (with sb, avec qn) * bondage (n) : servitude (f) * bonder (n) : 1/ soudeur, colleur ; 2/ dispositif de liaison * bondholder : obligataire (n) * bone (n) : 1/ os - bone marrow : moelle osseuse(f) ; 2/ (expression) bone of contention : pomme de discorde ; 3/ (brit.) courge (f) * bone lazy (a) (amér.) : fainéant(e), flemmard(e) - He’s bone lazy : C’est un fainéant (syn. brit. bone idle) * bone setting (n) : reboutage, reboutement * boneshaker (n) : vieille bagnole (f), vieux tacot, vieille guimbarde (f) (syn. jalopy) * boneyard (n) (arg.) : cimetière - aircraft boneyard (amér.) : cimetière d’avions * bonnet (n) (fa p) : 1/ bonnet ; 2/ (brit.) capot (d'automobile) - Look under the bonnet for leaks : Soulevez le capot pour voir s'il n'y a pas de fuites * bonus (n) (pl. bonuses) : prime (f) * boo (interj.) : 1/ (pour saluer) hou !, houhou !, coucou !; 2/ (pour surprendre) bouh ! * boo (n) (svt au pl.) : huée (f) * boo (v) : (tr.) huer, conspuer ; (intr.) pousser des huées * boob (n) (arg.) : 1/ sein, nichon (fam.), loche (f) (fam.), nibard (vulg.) - (Cin.) boob shot : plan nichons ; 2/ bourde (f), boulette (f) ; 3/ idiot, crétin, âne, nullité (f) * booby (n) (pl. boobies) : 1/ sein, nichon, nibard ; 2/ idiot, crétin, âne, nullité (f) - booby prize : lot de consolation - booby trap : (Milit.) a/ objet piégé ; b/ piège * book (n) : 1/ livre - to skim through a book : parcourir un livre - to thumb through a book : feuilleter un livre - book of spells : grimoire, livre de sorts (aussi spell book) - hand-signed book : livre dédicacé - You’re an open book (fig.) : On lit en toi comme dans un livre ouvert, Tu es transparent(e) - school book : manuel scolaire, livre de classe (syn. text book) - book chapter : chapitre de livre - book end : serre-livre (aussi bookend) - book enthusiast : bibliophile - book mark : signet, liseuse (f) (aussi bookmark) ; 2/ cahier - copy book : cahier d’élève - grade book : cahier de notes (du professeur) * book (v) (tr.) : réserver * bookcase (n) : bibliothèque (f) (le meuble) * bookend (n) : serre-livre (aussi ortho. book end) * booking (n) : réservation (f) - advance booking required : sur réservation * bookkeeper (n) : comptable (n) * bookkeeping (n) : comptabilité (f) * bookmark (n) : signet, liseuse (f) (aussi book mark) * booklet (n) : livret, fascicule * bookshelf (n) : étagère à livres * Boolean (a) : booléen(ne) (sans maj.) * boom (n) : 1/ fracas, grondement ; 2/ boum, essor, expansion (f) - baby boom : boum des naissances, explosion démographique (f) * boom (v) (intr.) : 1/ tonner, gronder ; 2/ être en plein essor * booming (a) : en plein essor * boon (n) : aubaine (f) * boost (n) : 1/ poussée verticale (f), impulsion (f) - to be given a boost : recevoir une impulsion - to deliver a boost to… : donner une impulsion à… ; 2/ (fig.) coup de fouet ; 3/ (fig.) coup de pouce, encouragement * boost (v) (tr.) : 1/ impulser, propulser ; 2/ accroître, augmenter ; 3/ stimuler, renforcer, donner un coup de fouet à - to boost productivity : stimuler la productivité * booster (n) : 1/ stimulant - productivity booster : stimulant de la productivité ; 2/ accélérateur, lanceur ; 3/ fusée d’appoint, propulseur auxiliaire, pousseur - solid rocket booster : propulseur à poudre - strap-on booster : pousseur latéral * boot (n) : 1/ botte - rain boots : bottes de pluie - thigh-high boots : cuissardes - boot licker : lèche-botte ; 2/ (brit.) coffre (de voiture) - boot sale : vente depuis l’arrière de sa voiture (syn. boot fair) * boot (n) (tronc. de bootstrap) : (Inf.) initialisation, amorce, démarrage, redémarrage - cold boot : redémarrage à froid, redémarrage après mise hors tension - warm boot : redémarrage à chaud, redémarrage sans mise hors tension * boot (v) (tronc. de bootstrap) (tr.) : (Inf.) amorcer, mettre en route, lancer (le système d’exploitation) * bootable (a) : (Inf.) initialisable, amorçable * boot camp / bootcamp (n) : 1/ camp d’entraînement (militaire) ; 2/ centre de redressement (pour délinquants) ; 3/ formation intensive (f), classes (f pl.) (à l’armée) * booth (n) : 1/ cabine (f) - photo booth : cabine de photomaton ; 2/ alcôve (f) ; 3/ baraque (f) * booties (n pl.) : 1/ chaussons (pl.) d’enfant ; 2/ bottines (f pl.) de femme * bootlace (n) : lacet * bootleg (n) (amér.) : 1/ alcool fabriqué clandestinement, alcool de contrebande ; 2/ copie piratée (f) (d’un progiciel) * bootleg (a) : piraté(e) - bootleg duplicate : double piraté, copie piratée (f) (d’un logiciel) * bootleg (v) (amér.) (intr.) : faire de la contrebande d’alcool (à l’époque de la Prohibition) * bootlegger (n) (amér.) : contrebandier d’alcool * bootlegging (n) : contrebande de l’alcool, contrebande d’alcool * bootlicker (n) : lèche-botte * boot out (v) (tr.) : mettre à la porte à coups de bottes, flanquer dehors, virer * booty (n) : 1/ butin ; 2/ magot * booze (n) (arg. brit.) : alcool, boisson (f) * booze (v) (intr.) : picoler * booze away (v) (tr.) (arg. brit.) : dépenser en boisson (one’s salary, son salaire) * boozer (n) (arg. brit.) : 1/ bistrot, pub, bar ; 2/ soulard, soûlaud, soûlot * booze-up (n) (arg. brit.) : beuverie (f), cuite (f) - to have a booze-up : se payer une cuite * border (n) : 1/ bordure (f) (de fenêtre, de page, etc.) ; 2/ frontière (f) - the Iraq-Syria border : la frontière entre l’Irak et la Syrie * border (v) (tr.) : être à la limite de * bore (prét. de to bear) * bore (n) : 1/ calibre (d’un tuyau) ; 2/ (Usin.) alésage ; 3/ (fig.) raseur * bore (v) (tr.) : 1/ forer, creuser - bore well : puits de forage; 2/ (Usin.) aléser ; 3/ (fig.) ennuyer, raser * bored (ppa) : las, lasse - to be bored : être las (with, de) * boredom (n) : ennui * boring (a) : ennuyeux/-euse * boring (n) : alésage - boring machine : machine à aléser * boringly (adv.) : de façon ennuyeuse, de façon assommante * born-again (a) : (Rel.) né(e) de nouveau - to have been born again : avoir connu une nouvelle naissance - born-again believer : croyant né de nouveau, croyante née de nouveau * borne (pp de to bear) * borough (n) : quartier, circonscription (f) * borrow (v) (tr.) : emprunter (from, à) - [language] to borrow a foreign word : [langue] emprunter un terme étranger * bosky (a) : boisé(e), broussailleux/-euse * Bosnia (n pr.) : (la) Bosnie * Bosnian (a) : bosniaque, bosnien(ne) (sans maj.) * Bosnian (n pr.) : Bosniaque, Bosnien (le ressortissant) * bosom (n) : poitrine (f) (d’une femme), sein (fig.) * bosomy (a) : qui a une forte poitrine, à la poitine forte * boss (n) : bossage * boss (n) (pl. bosses) : patron, patronne, chef, cheffe - to show who is boss : montrer qui est le patron * boss about (v) (tr.) : mener par le bout du nez * bossy (a) : autoritaire, qui aime donner des ordres * botanical (a) : botanique - botanical garden : jardin botanique * botch (n) : 1/ travail bâclé ; 2/ ratage, foirage (vulg.) * botch (v) (tr.) : bousiller * botched (ppa) : bousillé(e), loupé(e) - botched machined parts : loupés d'usinage * botfly (n) : gastérophile (masc.), gastrophile (masc.) - a botfly infestation : une prolifération de gastrophiles - botfly larva : larve de gastérophile * both + n. and + n. (loc. conj.) : à la fois ... et, aussi bien… que…, tant ... que… - Blake was both a painter and a poet : Blake était à la fois peintre et poète * bother (n) : ennui, tracas - It’s no bother for them : Ce n’est pas un problème pour eux, Ça ne les tracasse pas * bother (v) : 1/ (tr.) ennuyer, déranger - I was fearful of bothering them : J’avais peur de les déranger ; 2/ (tr.) chagriner - What's bothering you? : Qu'est-ce qui te chagrine ? ; 3/ (intr.) faire un effort, prendre la peine, se donner la peine ; se soucier (about, de ; with, de) * bottle (n) : 1/ bouteille (f) - non-returnable bottle : bouteille non consignée - onion bottle : bouteille en forme d’oignon - bottle bank : conteneur pour le verre usagé - bottle carrier : porte-bouteille (masc.) (le casier mobile) - bottle rack : porte-bouteille (l’armoire) (masc.) - bottle rinsing : rinçage de bouteilles - bottle stopper : bouchon mécanique ; 2/ biberon * bottleneck (n) : goulet d’étranglement * bottle feed (vc) (-fed, -fed) (tr.) : nourrir au biberon * bottle feeding (n) : le biberon (le fait de nourrir au biberon) * bottling (n) : embouteillage - bottling equipment : machines d’embouteillage * bottom (a) : le plus bas, du bas, inférieur(e) - bottom line : a/ dernière ligne (du bilan) ; b/ bas de gamme * bottom (n) : 1/ bas, partie inférieure (f), fond - at the bottom of… : a/ en bas de …(fig.) ; b/ à la base de…, à l’origine de… * bottom-of-the-line (ac) : de bas de gamme * bought (prét. de to buy) * bought (pp de to buy) * bought and paid for (paire adj.) (ppa de to buy and pay for) : acheté(e), rémunéré(e) - to be bought and paid for by the large corporations : être à la solde des grands groupes - The witness was bought and paid for by the culprit : Le témoin était à la solde du prévenu * bought-and-paid-for (a) (tjrs épithète) : 1/ [bien, marchandise] acheté(e) et payé(e) - bought-and-paid-for goods : biens achetés et payés ; 2/ [personne] acheté(e), rémunéré(e) - bought-and-paid-for street activist : provocateur urbain rémunéré * boulder (n) : bloc erratique * bouldering (n) : (l’)escalade de blocs, (le) bloc (jarg.) - urban bouldering : (l’)escalade de blocs en milieu urbain * bounce (v) : 1/ (tr.) faire rebondir ; (intr.) : rebondir ; 2/ (tr.) refuser (un chèque) ; (intr.) [chèque sans provision] être refusé, être rejeté - The check bounced : la chèque a été rejeté ; 3/ virer (qn), flanquer à la porte (qn) * bouncer (n) : videur (de boîte de nuit) * bouncing (a) : rebondissant(e) - bouncing boobs : loches qui rebondissent * bound (prét. de to bind) * bound (pp de to bind) * bound (ppa) : 1/ - homeward bound : [navire] retournant au port / pays, sur le retour ; 2/ forcé(e) - to feel bound to + inf. : se sentir obligé(e) de + inf. * bound (n) : borne (f), limite (f) - to know no bounds : ne pas connaître de limites * bound (v) (tr.) : border, limiter * boundary (n) : limite (f), frontière (f) - boundary marker : borne (f) * bounder (n) (brit.) : goujat, malotru * boundless (a) : sans bornes, sans limites, illimité(e), infini(e) * bountiful (a) : abondant(e) * bounty (n) : 1/ prime (f) (on, sur la tête de) ; 2/ abondance (f) ; 3/ (lit.) générosité (f) * bout (n) : 1/ accès (de fièvre), quinte (f) (de toux) - bout of sectarian violence : accès de violence confessionnelle ; 2/ période (f) - drinking bout : période de beuverie ; 3/ (Boxe) combat * bootblack (n) : cireur de chaussures, cireur de rue, petit cireur (syn. shoe shiner - shoeshine boy (amér.)) * bovine (a) : bovin(e) - bovine excrement : excréments de bovins, bouse de vache * bow (n) : avant (d'un navire), proue (f) * bow (n) : 1/ courbe (f), coude ; 2/ arc (l’arme) - archery bow : arc de tir à l’arc - the bow handle : la poignée de l’arc - bow string : corde d’arc - to add another string to one’s bow (fig.) : avoir plusieurs cordes à son arc ; 3/ (Mus.) archet - violin bow : archet de violon - bow string : corde d’archet ; 4/ nœud (décoratif) * bow (n) : révérence (f), salut de la tête - to give a bow : faire la révérence - to take a bow : saluer (l’auditoire, le public) - neck bow : inclination de la tête * bow (v) : 1/ (tr.) incliner - to bow one’s head : incliner la tête ; (intr.) faire une révérence, s’incliner, saluer d'un signe de tête - to bow to sb : faire une révérence à qn, s’incliner devant qn - to bow low : s’incliner très bas ; 2/ (tr.) faire ployer, faire plier, soumette ; (intr.) se courber, ployer, fléchir * bow down (v) (tr.) : accabler, abattre * bowed down (pp) : abattu(e), accablé(e) * bowels (n pl.) : intestins (pl.) * bowie-knife (n) : couteau-poignard * bowl (n) : bol - finger bowl : rince-doigts (masc.) - trinket bowl : vide-poche (masc.) * bowler (n) : 1/ (brit.) lanceur/-euse de cricket - bowler hat (brit.) : chapeau melon ; 2/ joueur/-euse de bowling * bowser (n) : camion-citerne - water bowser : camion-citerne d’eau * bowstring (n) : 1/ corde d'archet ; 2/ corde d'arc - bowstring girder : poutre en arc sous-tendu, poutre en arc à tirant * bow tie (n) : nœud-papillon * box (n) (pl. boxes) 1/ boîte (f) - Pandora’s box : la boîte de Pandore - shoe box : boîte à chaussures - suggestion box : boîte à idées ; 2/ emballage - cardboard box (brit.) : carton - box cutter : couteau à lame rétractable, cutter (anglic.) ; 3/ coffret ; 4/ boîtier, machine (f), boîte (f) (fam.) - control box : boîtier de commande - gear box : boîte de vitesses (aussi gearbox) - glove box : boîte à gants (d’une auto) ; 5/ loge (f) (de théâtre) ; 6/ guérite (f) - sentry box : guérite de sentinelle - 7/ (Inf.) case, cadre (d'interface graphique) - to check off a box : cocher une case - dialogue box : boîte de dialogue, case à dialogue ; 8/ encadré ; 9/ rectangle marqué au sol (à une intersection) - to block the box : bloquer l’intersection (en restant coincé au milieu de celle-ci lorsque le feu passe au rouge) ; 10/ the box (brit.) : la télé, la téloche (fam.) ; 11/ (expressions diverses) - to think outside the box : sortir des sentiers battus, faire preuve de créativité, faire montre d’originalité * box (v) : 1/ (tr.) boxer contre (un autre boxeur) ; (intr.) faire de la boxe, boxer ; 2/ (tr.) frapper, boxer (qn) * box (v) (tr.) : mettre dans une boîte, mettre en boîte - to box oneself into a corner : se retrouver acculé(e) * boxcar (n) (amér.) : wagon de marchandises * boxed-in (ppa) : [auto] coincé(e) (entre trois camions) * boxers (n pl.) : caleçon (sing.) (syn. boxer shorts, pl.) * box in (v) (tr.) : [trois camions] coincer [une auto] * Boxing Day (n pr.) (brit.) : (le) 26 décembre (jour férié) (= la Saint-Étienne en Moselle et Alsace) * box office (nc) : bureau de location, guichet, caisse (f), billetterie (f) - [film] to take millions at the box office : [film] faire des millions de recettes dans les salles - box-office success : film qui fait recette (syn. box office hit) * box room / boxroom (n) : débarras * boxy (a) : carré(e), cubique * boy (n) : garçon - errand boy : garçon de courses - old boy (G.-B.) : ancien élève - school boy : écolier - boys' band : groupe vocal de garçons - a boy cyclist : un jeune cycliste - a girl cyclist : une jeune cycliste * boy ! (exclam.) : bon sang ! * boy-friend / boyfriend (n) : petit ami, amoureux * bpm (n) (init. de beats per minute) : (nombre de) battements à la minute, cadence (f) * bra (n) (tronc. de brassiere) (fa) : soutien-gorge * brace (n) : 1/ appareil dentaire ; 2/ attelle (f) ; 3/ couple, paire (f) ; 4/ vilebrequin ; 5/ accolade (f) ; 6/ braces (n pl.) (brit.) : bretelles (f pl.) * brace (v) : 1/ (tr.) arc-bouter - to brace one's feet on sth : appuyer ses pieds contre qch ; 2/ (tr.) renforcer, fortifier - to brace oneself : rassembler ses forces ; 3/ (tr.) tonifier ; 4/ (intr.) se préparer (for, à) * bracing (a) : tonique * bracket (n) : 1/ équerre (f) (for a shelf, etc., d'une étagère, etc.) ; 2/ patte de fixation ; 3/ (Typo.) parenthèse (f), crochet - (Math.) angle brackets : chevrons - curly brackets : accolades (f) (syn. braces) - round brackets : parenthèses ; 4/ tranche (f) (d’âge, de revenu) - income bracket : tranche de revenu * bracket (v) (tr.) : mettre entre parenthèses - to bracket together : mettre entre parenthèses / crochets * braid (n) : tresse (f) * brain (n) : 1/ cerveau - brain bleed : hémmoragie cérébrale - brain cancer : cancer au cerveau - brain child : idée personnelle (f), invention personnelle (f) - a brain drain of experts : une fuite de cerveaux - brain teaser : casse-tête (le jeu) (masc.) (aussi brainteaser) - brains trust : état-major ; 2/ (brains, pl.) cervelle (f), tête (f) - to pick sb’s brains : faire appel aux lumières de qn - to rack one’s brains : se creuser la tête * brain-damaged (ac) : atteint(e) de lésions cérébrales * brain-dead (ac) : en état de mort cérébrale * brainpower (n) : ressources intellectuelles (f) pl.), ressources en intelligence * brainstorm (v) (intr.) : se remuer les méninges, cogiter - to brainstorm about new high-tech ideas : faire assaut d’idées pour trouver de nouvelles techniques * brainstormer (n) : participant à une séance de remue-méninges * brainstorming (n) : assaut d'idées, recherche d'idées, libre expression d'idées, remue-méninges (masc., inv.) (l'activité) - brainstorming session : remue-méninges (la séance) * brainteaser (n) : casse-tête (le jeu) (masc.) (aussi brain teaser) * brainwash (v) : (tr.) lessiver le cerveau de, faire un lavage de cerveau à, bourrer le crâne de - They brainwashed us into believing that we are fighting for our rights : Ils nous ont mis dans la tête que nous luttions pour nos droits * brainwave (n) : idée lumineuse (f), inspiration (f) * brainy (a) : intelligent(e), futé(e) * braise (v) (tr.) : faire mijoter, braiser (du bœuf, etc.) * braising (n) : cuisson (f) * brake (n) : frein - to apply the brakes fully : actionner les freins à fond - brake adhesion : adhérence au freinage * brake (v) (tr. et intr.) : freiner * braking (n) : freinage - braking system : système de freinage * bramble (n) : ronce (f) * branch (n) : 1/ branche (f) (d’arbre, d’une famille) - a branch of futurology : une branche de la futurologie ; 2/ agence (f), succursale (f), filiale (f) - branch office : succursale ; 3/ (Inf.) branchement, rupture de séquence * branch (v) : (intr.) se ramifier - to branch away from : se séparer de * brand (n) : marque (f) - global brand : marque mondiale - luxury brand : marque de luxe - brand name : nom de marque, marque de commerce - brand partner : associé de la marque * brand (v) (tr.) : 1/ marquer (les bêtes d’un troupeau) ; 2/ flétrir, stigmatiser (syn. to stigmatise/ize) * branded (a) : de marque - branded products : produits de marque * branding (n) : 1/ marquage au fer, ferrage (des bêtes d’un troupeau) - cattle branding : marquage du bétail, ferrage du bétail ; 3/ création de l’image de marque ; 4/ valorisation de la marque * brand new (a) : tout neuf, toute neuve, flambant neuf, flambant neuve * brash (a) : 1/ impudent(e), effronté(e), impertinent(e) ; 2/ impétueux/-euse, irréfléchi(e), téméraire, imprudent(e) * brass (a) : en cuivre (jaune), en laiton * brass (n) : 1/ cuivre (jaune), laiton ; 2/ (Mus.) (les) cuivres ; 3/ (Milit.) (les) gradés - the top brass : les haut gradés ; 4/ (les) huiles (f pl.) (fam.), (les) gros bonnets (fam.), (les) grosses légumes (fam.) - the top brass : les grosses légumes (fig.) (f pl.) * brassed off (ppa) (brit., arg.) : - to be / to get brassed off : en avoir ras le bol, en avoir ras la casquette * brat (n) (péj.) : sale gosse, sale gamin, sale gamine, sale morveux, sale morveuse, petit morveux, petite morveuse - army brat : enfant de militaires * bravado (n) : bravade (f) - in a voice full of bravado : d’un ton bravache * brave (a) : brave, hardi(e), courageux/-euse - the brave (a. subst. pl.) : les braves - the home of the brave : la patrie des braves * bravely (adv.) : courageusement * brawl (n) : mêlée (f) - mass brawl : mêlée générale * brawny (a) : musclé(e), baraqué(e) (syn. beefy) * bray (n) : braiment * bray (v) (intr.) : braire * braying (n) : braiment * brazen (a) : effronté(e) * brazenly (adv.) : effrontément * Brazil (n pr.) : (le) Brésil * Brazilian (a) : brésilien(ne) (sans maj.) * Brazilian (n pr.) : Brésilien (le ressortissant) * BrE (sigle) (abr. de British English : anglais britannique) : angl. brit. * breach (n) (pl. breaches) : 1/ brèche (f) ; 2/ (fig.) infraction (f) * breach (v) (tr.) : 1/ faire une brèche dans ; 2/ enfreindre * bread (n) : pain - mouldy bread : pain moisi - raisin bread : pain aux raisins (secs) - wholemeal bread : pain complet - bread crumb : miette de pain (aussi breadcrumb) - the bread line : la soupe populaire (f) (l’institution) (aussi breadline) - bread riot : émeute du pain, émeute pour le pain * breadcrumb (n) : miette de pain - trail of breadcrumbs : fil d’ariane (ausi breadcrumb trail) ; 2/ (pl. breadcrumbs) panure (f), chapelure (f) * breadline (n) : soupe populaire (f) - to stand in a breadline : faire la queue à la soupe populaire * breadth (n) : largeur (f) * breadwinner (n) : soutien de famille * break (n) : 1/ (Mus.) coupure (f), interruption (f) (d'un morceau pour laisser la place à un solo) ; 2/ pause (f) - to be on a break : être en pause - Give me a break! : Lâche-moi / Lâchez-moi ! - to take a break : faire une pause - prayer break : pause pour la prière - tea break : pause pour le thé ; 3/ vacances (f pl.) - beach break : vacances à la plage, séjour à la plage - spring break : vacances de printemps, relâche scolaire de printemps ; 4/ (Éduc.) récréation (f), récré (f) (fam.) (syn. amér. recess) ; 5/ brisants (pl.) - beach break : a/ brisants de sable ; b/ plage à brisants, site sur fond sableux - reef break : a/ brisants de récif ; b/ (Surf.) site sur récifs, site sur fond rocheux - shore break : rouleaux de bord (pl.) * break (v) (broke, broken) : 1/ (tr.) casser, briser, rompre, péter (fam.) - to break the sound barrier : briser le mur du son - to break a string : péter une corde (de guitare) ; (intr.) se casser, se briser, se rompre ; 2/ (tr.) couper, interrompre ; (intr.) s’interrompre ; 3/ (intr.) - to break into (a house) : s'introduire par effraction dans (une maison) ; 4/ (tr.) annoncer, faire part de (news, une nouvelle), entamer (a subject, un sujet) - Who shall break the news to her? : Qui se chargera de lui apprendre la nouvelle ? - to break bad news : annoncr une mauvaise nouvelle - to break one’s mind to sb : faire part de ce que l’on pense à qn ; (intr.) [dawn, aube] percer, poindre - Morning has broken : Le matin point * breakage (n) : bris, casse (f), rupture (f) * break apart (v) (intr.) : se rompre, se briser, se disloquer - The bridge broke apart : Le pont se disloqua * breakaway (a) : séparatiste * breakdown (n) : 1/ décomposition (f), répartition (f), ventilation (f) - a breakdown of employees by category : une répartition des employés par catégorie - (the) breakdown in terms of time : (la) répartition horaire ; 2/ défaillance (f), panne (f), avarie (f) - the breakdown van (brit.) : la dépanneuse ; 3/ (fi.) effondrement, désintégration - a breakdown of society : un effondrement de la société, une désintégration sociale * break down (v) (broke, broken) : 1/ (tr.) décomposer (into, en) ; (intr.) se décomposer (into, en), se réduire (into, à) ; 2/ (intr.) s’effondrer - to break down into tears : éclater en sanglots ; 3/ tomber en panne * breaker (n) : 1/ - ball breaker : casse-couille (masc.) - circuit breaker : disjoncteur, coupe-circuit - law breaker : contrevenant à la loi, délinquant - quarantine breaker : personne réfractaire à la quarantaine ; 2/ (Éduc.) personne faisant une pause, personne prenant un congé - spring breaker (amér.) : élève ou étudiant faisant la pause de printemps, élève ou étudiant en relâche scolaire de printemps * breakeven (n) : seuil de rentabilité, équilibre financier - to be at breakeven : être en équilibre financier, être au seuil de rentabilité - breakeven point : point d'équilibre, seuil de rentabilité * break in (v) (broke, broken) (tr.) : dresser (un cheval) * breakneck (a) : de casse-cou, dangereux - at breakneck speed : à toute allure, à toute berzingue (fam.), à tombeau ouvert * breaks (n pl.) (fam.) : destin - These are the breaks : C’est le destin * breakthrough (n) : 1/ percée (f), avancée (f) (syn. advance) - to be no small breakthrough : être une avancée considérable ; 2/ découverte (f), progrès important, innovation (f) (syn. discovery) - breakthrough product : produit novateur * break up (v) (broke, broken) : (tr.) briser, démanteler ; (intr.) [couple] rompre, [groupe musical] se disloquer, éclater (syn. to split up - to disband) * breakwater (n) : brise-lames (masc.), môle * breast (n) : poitrine (f) - duck breast : magret de canard - breast cancer : cancer du sein - breast pump : tire-lait (masc.) * breast feed (vc) (tr. et intr.) : allaiter, donner le sein (à) * breast feeding (n) : allaitement, le sein (anton. bottle feeding, le biberon) * breastpin (n) : épingle de cravate * breath (n) : 1/ haleine (f), souffle - with bated breath : en retenant son souffle - to be out of breath : être essoufflé(e) - to get one’s breath back : reprendre son souffle - to hold one’s breath : retenir son souffle - to take sb’s breath away : couper le souffle à qn - morning breath : haleine du matin, haleine matinale (f) ; 2/ souffle (d’air) - breath of air : souffle d’air - Can we go get a breath of fresh air for a sec? : On peut aller prendre l’air un petit moment ? * breathable (a) : respirable * breathalyser (brit.) / breathalizer (amér.) (n) : alcooltest, étylotest, alcoomètre * breathe (v) (tr. et intr.) : respirer * breather (n) : pause (f), petite pause - I need a breather : Il faut que je souffle un peu - to take a breather : a/ reprendre son souffle ; b/ (fig.) faire une pause * breathing (n) : respiration (f) - agonal breathing : respiration d’agonisant(e) - breathing difficulties : ennuis respiratoires * bred (prét. de to breed) * bred (pp de to breed) * breed (n) : race (f), espèce (f) - a rare breed : une espèce rare * breed (v) (bred, bred) : 1/ (tr.) élever, faire l’élevage de ; 2/ (tr.) engendrer - Repetitive work breeds boredom : Un travail monotone engendre l’ennui ; (intr.) se multiplier - to breed like flies : se multipier comme des mouches * breeder (n) : 1/ reproducteur - The human breeder looks not more than two generations ahead, if that : Le reproducteur humain ne se projette pas au-delà de deux générations, et encore ; 2/ éleveur - cattle breeder : éleveur de bovins * breeding (n) : 1/ reproduction (f) - breeding ground : pépinière (f) (for, de) ; 2/ éducation (f), savoir-vivre - He lacks breeding : Il manque de savoir-vivre * breeze (n) : brise (f) - summer breeze : brise d’été, brise estivale * brethren (n) (pl. irrég. de brother) : frères (en religion, en esprit, etc.) * Breton (a) : breton(ne) (sans maj.) * Breton (n pr.) : Breton (habitant) * brew (n) : 1/ bière (f), mousse (f) (fam.) - Anybody want a brew? : Quelqu’un veut-il une bière ? ; 2/ (brit., région.) thé - Shall I make some brew? : Je fais du thé ? * brew (v) (tr.) : 1/ (tr.) brasser (de la bière) ; (intr.) [bière] fermenter ; 2/ (tr.) faire, préparer (du café, du thé) ; (intr.) [thé] infuser, [café] passer ; 3/ (fig.) - [storm] to be brewing : [tempête] se préparer * brewer (n) : brasseur * brewery (n) (pl. breweries) : brasserie (f) * briar (n) : églantier * bribe (n) (fa) : pot-de-vin * bribe (v) (tr.) : soudoyer (qn), acheter (qn), corrompre (qn) * brick (n) : 1/ brique (f) - dry-laid bricks : briques posées à sec (pl.) ; 2/ - to drop a brick (brit.) : faire une gaffe * bricklayer (n) : maçon (pour les briques) * bride (n) (fa) : mariée, jeune mariée, future mariée, future (n) * bridegroom (n) : marié, jeune marié, futur marié, futur (n) * bridesmaid (n) : demoiselle d’honneur * bridge (n) : 1/ pont - It’s water under the bridge : De l’eau a coulé sous les ponts depuis, C’est de l’histoire ancienne, C’est du passé maintenant - railway bridge : pont de chemin de fer - signature bridge : pont emblématique, pont distinctif - suspension bridge : pont suspendu (syn. hanging bridge) - trestle bridge (amér.) : pont à chevalets ; 2/ arête (f) (of the nose, du nez) * bridle (n) : bride (f) (for horses, de cheval) - bridle path : sente cavalière (f), piste cavalière (f) * brief (a) : bref/brève - a brief piece of news : une nouvelle brève, une brève * brief (n) : 1/ instructions (f pl.), consignes (f pl.), ordre de mission, topo (fam.) 2/ - individual product brief : description de produit ; 3/ dossier, mémoire (m), abrégé, exposé ; 4/ pl. briefs : slip (sing.) (anglic.) (voir briefs) * brief (v) (tr.) : mettre au courant, mettre au parfum (fam.), breffer (francis.), affranchir, donner des instructions à, fournir des directives à, donner son ordre de mission à * briefcase (n) : mallette (f), contenant d'affaires (jarg.) * briefcase-size (ac) : de la taille d’une mallette * briefing (n) : 1/ affranchissement, mise au courant, mise au parfum (fam.) - to attend a briefing : assister à une réunion d’information ; 2/ instructions (f pl.), consignes (f pl.), directives (f pl.) * briefs (n pl.) : slip (sing.) (anglicisme) - men’s briefs : slips d’hommes * brier (n) : bruyère (f) * brig (n) : 1/ brick ; 2/ (arg. amér.) taule (f) * brigade (n) : (Milit.) brigade * bright (a) : 1/ brillant(e) - bright object : objet brillant - bright speck : point brillant ; 2/ vif / vive - bright yellow : jaune vif ; 3/ radieux/-ieuse - a bright future : un avenir radieux * brighten (v) : 1/ (tr.) faire briller, éclairer ; (intr.) s’éclairer ; 2/ aviver * brighten up (v) : (tr.) dérider ; (intr.) se dérider * bright-hued (ac) : aux teintes vives * brightly (adv.) : avec éclat * brightness (n) : éclat, luminosité (f), intensité lumineuse (f) - brightness control : réglage de la luminosité * brights (n pl.) : 1/ couleurs (f pl.) ; 2/ (amér.) feux de route * brim (n) : bord, rebord (of a hat, d'un chapeau, of a cup, d'une tasse) - well brim : bordure de puits, margelle de puits * brim (v) (intr.) : être plein(e) à déborder * brine (n) : saumure (f) * bring (v) (brought, brought) (tr.) : 1/ apporter (qch) - to bring a new meaning to a term : donner une nouvelle acception à une expression ; 2/ amener (qn) ; 3/ (expressions) - to bring sth to a halt : forcer qch à s’arrêter - to bring sth to the boil : amener qch à ébullition - to bring sth up to date : mettre qch à jour - to bring sth up to scratch : mettre qch à niveau * bring about (v) (brought, brought) (tr.) : entraîner, amener * bring back (v) (brought, brought) (tr.) : rapporter (qch) * bring down (v) (brought, brought) (tr.) : 1/ amener (qn), apporter (qch) ; 2/ faire baisser ; 3/ abattre, descendre - to bring the whole place down : faire tout sauter ; 4/ renverser (un roi, etc.) ; 5/ donner le cafard à (qn), déprimer (qn) * bring in (v) (brought, brought) (tr.) : rapporter (de l’argent) - How much money will it bring in? : Combien d’argent cela rapportera-t-il ? * bring out (v) (brought, brought) (tr.) : sortir, publier * bring up (v) (brought, brought) (tr.) : éduquer, élever * brink (n) : bord (du précipice, de la guerre, etc.) - on the brink of war : au bord de la guerre, à deux doigts de la guerre - brink of war policy : politique du bord de l’abîme, politique de la corde raide * brinksman (n) : stratège de la corde raide, stratège du bord de l’abîme, stratège du risque calculé * brinksmanship (n) : stratégie de la corde raide, stratégie du bord de l’abîme, stratégie du risque calculé * brisk (a) : 1/ vif/vive, alerte, actif/ive ; 3/ brusque, [ton, voix] sec / sèche * brisken (v) : (tr.) activer ; (intr.) s’activer * briskly (adv.) : 1/ vivement ; 2/ brusquement, sèchement * bristle (n) : poil, soie (f) - stiff bristles : soies raides (d’une brosse) * bristle (v) (intr.) : [poil] se hérisser * Brit (a) (tronc. de British) (fam.) : britannique, angliche (fam.) * Brit (n pr.) (tronc. de Briton) (fam.) : Britannique (le ressortissant), Angliche (fam.) * briticism (n) : briticisme (var. britishism) * British (a) : britannique (sans maj.) - British English : (l’)anglais britannique - the British Museum : le Musée britannique - the British pound : la livre britannique * British-based (ac) : implanté(e) en Grande-Bretagne * britishism (n) : briticisme (var. briticism) * Briton (n pr.) : Britannique (le ressortissant), Angliche (fam.) - fellow Briton : compatriote britannique * Brittany (n pr.) : (la) Bretagne * brittle (a) : fragile, cassant(e) * broach (n) : 1/ foret ; 2/ broche (f) * broach (v) (tr.) : 1/ (Usin.) brocher ; 2/ (angl. gén.) entamer (a discussion, une discussion), aborder (a subject, un sujet) - to broach an awkward subject : aborder un sujet délicat * broaching (n) : (Usin.) brochage - broaching machine : machine à brocher * broad (a) : large - broad range of products : large gamme de produits * broadband (n) : large bande (f) - broadband modem : modem à large bande, modem à haut débit * broadcast (n) : émission (f) (radio, télé) - live broadcast : émission en direct - pre-recorded broadcast : émission en différé * broadcast (v) (-cast, -cast ou régulier) (tr.) : diffuser (à la radio, à la télé) * broadcast (prét. de to broadcast) * broadcast (pp de to broadcast) * broadcaster (n) : diffuseur - private broadcaster (selon le cas) radiodiffuseur privé, télédiffuseur privé, chaîne de radio privée, chaîne de télé privée - public broadcaster (selon le cas) radiodiffuseur public, télédiffuseur public, chaîne publique de radio, chaîne publique de télévision - radio broadcaster radiodiffuseur, chaîne de radio - state broadcaster a/ radio d’État, radio nationale, b/ télévision d’État, télévision nationale, c/ radiotélédiffusion d’État, radiotélédiffusion nationale, (l’)audiovisuel public - television broadcaster : télédiffuseur, chaîne de télé * broadcasting (n) : 1/ diffusion (f) - broadcasting company : société de diffusion ; 2/ (selon le cas) radiodifusion (f), télédiffusion (f) - radio broadcasting : radiodiffusion - TV broadcasting : télédiffusion * broaden (v) : (tr.) élargir ; (intr.) s’élargir * broad-leafed (a) : feuillu(e) - broad-leafed forest : forêt de feuillus * broadly (adv.) : 1/ largement ; 2/ en gros, grosso modo * broad-minded (ac) : aux idées larges * broadsheet (n) : 1/ (abr. de broadsheet format ou size) grand format, plein format; 2/ (abr. de broadsheet paper) journal grand format, journal plein format, journal sérieux * brochure (n) : brochure (f), plaquette (f) * brogue (n) : accent irlandais * broil (v) : (tr.) faire griller (de la viande), faire cuire (de la viande) sur le grill ; (intr.) (amér.) (fig.) griller, connaître une chaleur torride * broiler (n) : volaille à point pour la broche - broiler chicken : poulet à la broche électrique * broil pan (n) : lèchefrite (f) * broke (prét. de to break) * broke (a) (tjrs attribut) : sans le sou, sans un rond (fam.), fauché(e) (fam.) - to go broke : se retrouver sans le sou - to go for broke : jouer son va-tout, jouer le tout pour le tout * broken (pp de to break) * broken (ppa) : 1/ brisé(e) - broken tools : (Usin.) outils (de coupe) brisés, bris d'outils (de coupe) - broken stones : pierraille (sing.) ; 2/ (fig.) [langue parlée] écorché(e) - broken English : anglais écorché, mauvais anglais, anglais approximatif, anglais boiteux * broker (n) : 1/ courtier/-ière (dans le commerce, les assurances, etc.) - investment broker : courtier en placements - real-estate broker (amér.) : agent immobilier ; 2/ - power broker (amér.) : personnage influent, homme influent, femme influente, éminence grise (f) * broker (v) (tr.) : négocier - to broker a ceasefire : négocier un cessez-le-feu * brokerage (n) : commerce des valeurs en bourse, courtage (syn. stockbroking) * brolly (n) (abr. fam. de umbrella) : parapluie, pépin (fam.) * bronchitis (n) : bronchite (f) * bronco (n) (pl. broncos) (amér.) : cheval sauvage - bronco buster : champion de rodéo - bronco busting : dressage de chevaux sauvages * brood (n) : couvée (f), nichée (f) * brood (v) : 1/ (tr.) couver (eggs, des œufs) ; 2/ (intr.) méditer tristement (over, sur) * broody (a) : pensif/-ive, maussade * brook (n) : ruisseau * brook (v) (tr.) : supporter, tolérer, admettre * broom (n) : balai * broth (n) : bouillon - Too many cooks spoil the broth : Deux patrons font chavirer la barque * brothel (n) : bordel, maison close (f) * brother (n) : frère * brotherhood (n) : 1/ fraternité (f) ; 2/ confrérie (f) * brought (prét. de to bring) * brought (pp de to bring) * brow (n) : 1/ front ; 2/ sourcil ; 3/ expression faciale (f), visage ; 4/ sommet (de colline) * browbeat (v) (-beat, -beaten) (tr.) : traiter avec hauteur, traiter avec dédain * browbeat (prét. de to browbeat) * browbeaten (pp de to browbeat) * brown (a) : 1/ brun(e) - brown goods : (l’)électronique grand public - brown hyena : hyène brune - to be in a brown study : être absorbé dans ses pensées, être dans les nuages - to do sb brown : filouter qn ; 2/ marron (la couleur) * brown (v) : (intr.) [plants, végétaux] jaunir * brownfield (n) (amér.) : friche industrielle (f), site industriel désaffecté * brownie (n) (amér.) : gateau au chocolat, brownie - hash brownie : brownie au cannabis (syn. pot brownie) * browning (n) : jaunissement (des végétaux) - [tree, arbre] to be prone to browning : être sujet au jaunissement * to brown-nose (v) (tr.) : lécher le cul de (qn) (vulg.), cirer les pompes de (qn) * brown-nosing (n) : (la) lèche (vulg.), (le) cirage de pompes, (le) faillotage * brown off (v) (brit.) (tr.) : 1/ énerver ; 2/ saouler (fam.), gaver (fam.) - to be browned off : en avoir plus que marre, en avoir ras la casquette * browse (v) (Inf.) : (tr.) feuilleter, explorer, naviguer sur - to browse search results : compulser les résultats d'une recherche - to browse the Internet : explorer l'Internet ; (intr.) flâner, se promener, baguenauder (fam.), musarder - to browse through a directory : parcourir un répertoire * browser (n) : (Inf.) logiciel de navigation, lecteur navigationnel, navigateur * browsing (nv) : (Inf.) survol, exploration, navigation, consultation, flânerie, baguenaudage, furetage (Q), butinage (sur l'Internet) * bruiser (n) : malabar, armoire à glace * bruit (v) (arch., amér.) (tr.) : ébruiter - to bruit a rumour : ébruiter une rumeur * brunet (a) (amér.) (en parlant d’un homme) : brun, aux cheveux bruns * brunet (n) (amér.) : (en parlant d’un homme) brun * brunette (a) (amér.) : (en parlant d’une femme) brune, aux cheveux bruns - Men prefer blondes but marry brunettes : Les hommes préfèrent les blondes mais épousent des brunes * brunette (n) (amér.) : (en parlant d’une femme) brune (n) * brunt (n) : poids - to bear the brunt of… : soutenir le choc de, subir ou essuyer le plus gros d’(une attaque) * brush (n) (pl. brushes) : 1/ brosse (f) ; 2/ pinceau * brushstroke (n) : coup de pinceau * brush up (v) (tr.) : rafraîchir - to brush up one’s English : se remettre à son anglais, rafraîchir ses connaissances en anglais * brutal (a) : brutal(e) * brutality (n) : brutalité (f) * brutalise (brit.) / brutalize (amér.) (v) (tr.) : 1/ rendre brutal(e) ; 2/ brutaliser, maltraiter - Student brutalised by cops (Titre) : Un étudiant maltraité par les flics * BS (init. de bachelor of science : licence ès sciences) * bsh. (n) (Mes.) (abr. de bushel : boisseau) * bubble (n) : bulle (f) - housing bubble : bulle immobilière - speculative bubble : bulle spéculative - the tech bubble : la bulle technologique, la déconfiture des valeurs technologiques (en 2000) - bubble wrap : papier bulle * bubbly (a) : pétillant(e), à bulles * bubbly (n) : (selon le cas) champagne, mousseux (n) * bubonic (a) : bubonique - bubonic plague : (la) peste bubonique * buck (n) : 1/ [animal] mâle ; 2/ gaillard - old buck : mon vieux ; 3/ (amér.) (fam.) dollar * bucket (n) : 1/ seau - rust bucket : a/ tas de ferraille, tas de rouille ; b/ (selon le cas) vieux rafiot, vieux tacot, épave (f) - bucket drumming : percussion de seaux - bucket list : liste de choses à faire avant de mourir ; 2/ godet - bucket loader : chargeur à godets ; 3/ (expressions) - a drop in a bucket (amér.) : une goutte d’eau dans l’océan - to kick the bucket : casser sa pipe (fam.), lâcher la rampe (fam.), trépasser * buckle (n) : boucle (f) (de ceinture, de chaussure), attache (f) * buckle (v) : 1/ (tr.) boucler ; 2/ (tr.) déformer, gauchir ; (intr.) [métal] se déformer, [roue] se voiler, [jambes] se dérober ; 3/ (fig.) céder * buckshot (n ind. sing.) : chevrotine (f) * buck tooth (nc) (svt au pl. buck teeth) : dent qui avance, dent de lapin * buck-toothed (ac) : qui a des dents de lapin * buck up (v) (brit.) : (tr.) remonter le moral à (qn) - to buck oneself up : se remonter le moral ; (intr.) a/ se secouer ; b/ se grouiller (fam.), se magner (fam.) * buddy (n) (amér.) : copain, pote (fam.) - my buddies and me : mes potes et moi - buddy movie : duo de choc, binôme de flics, film à tandem * budge (v) (intr.) : 1/ bouger : 2/ changer d'avis * budget (n) : budget * budget (v) (tr. et intr.) : budgetiser * budgerigar (n) : perruche (f) * budgie (n) (abr. du précédent) : perruche (f) * buff (n) : 1/ chamois ; 2/ amateur/-trice, mordu(e) - film buff : cinéphile (m/f) (syn. film fan - film enthusiast - cinema lover) - computer buff : mordu de l’informatique - history buff : passionné d’histoire * buff (v) (tr.) : 1/ polir ; 2/ émeuler * buffer (n) : 1/ (Usin.) tampon - to hold one week’s stock as a parts buffer : avoir une semaine de stock de pièces - buffer stocks : stocks régulateurs ; 2/ tampon (de wagon), pare-choc (d’automobile) ; 3/ (Inf.) mémoire-tampon (f) * buffer (v) (tr.) : (Inf.) mettre en mémoire-tampon * buffering (n) : (Inf.) mise en mémoire-tampon * buffet (v) (tr.) : [vagues] battre, [vent, pluie] cingler * buffeting (n) : coups (pl.), chocs (pl.) - to take the buffeting : supporter les coups, tenir le coup * buffoon (n) : bouffon * buffoonish (a) : buffonesque * bug (n) : 1/ insecte, petite bête (f) (fam.), bestiole (f) (fam.) ; 2/ punaise (f) ; 3/ microbe, saleté (f), saloperie (f) (qu’on attrape) ; 4/ (fig.) virus (au sens d’intérêt pour qch) - to get bitten by the bug of… : être mordu par le virus de… * bugbear (n) : bête noire (f), cauchemar * bugger (n) (brit.) (vulg.) : bougre - Silly bugger! : Bougre d’imbécile ! * bugger about (v) (intr.) (brit.) (vulg.) : faire le con, faire l’idiot, faire l’âne * bugger all / bugger-all (n) (brit.) (vulg.) : que dalle (syn. sod all / sod-all, fuck all / fuck-all) - It costs me bugger-all : Ça ne me coûte que dalle * bugger off (v) (intr.) (brit.) : foutre le camp, aller se faire foutre - Bugger off! : Vas te faire foutre / Allez vous faire foutre ! * buggery (n) (brit.) (vulg.) : sodomie * Buggery! (interj.) (brit.) (vulg.) : Merde !, Putain ! * buggy (n) : chariot - overhead motorised buggy : chariot aérien automatisé - moon buggy : jeep lunaire (f) * bugle (n) : clairon * bug out (v) (intr.) : déguerpir, prendre la poudre d'escampette (fam.), se tirer (fam.), se casser (fam.) * bug-out (mod.) : - bug-out bag : sac d'évacuation, sac de survie, sac d'escampette - bug-out location : retraite de survie * bug-ridden (ac) : 1/ infesté(e) de bestioles, (selon le cas) plein(e) de puces, (selon le cas) plein(e) de punaises ; 2/ (fig.) [programme informatique] infesté(e) de bogues, truffé(e) d’erreurs * build (v) (built, built) : 1/ (tr.) bâtir, construire, édifier - to build sth into… : incorporer qch à…, intégrer qch à… ; 2/ (tr.) fabriquer - to build (sth) to order : fabriquer (qch) à la demande - to build (sth) to stock : fabriquer (qch) selon les stocks ; 3/ (tr.) fonder, établir (on, sur) ; (intr.) tirer parti (on, de) * build (n) : 1/ constitution (f), carrure (f) (d'un homme) ; 2/ structure (f) (d'un objet) - the basic build of a tyre : la structure de bas d’un pneu ; 3/ (Inf.) version (f) * builder (n) : 1/ constructeur/-euse, bâtisseur/-euse - aircraft builder : constructeur d’avions, constructeur aéronautique - field builder : faiseur de champs ; 2/ - vocabulary builder : entraînement de vocabulaire, leçons de vocabulaire (f pl.) * buildering (n) : (la) grimpe urbaine * building (n) : 1/ (l’activité) construction (f) (d’ouvrages, de structures de toute sorte), édification (f), développement - skill building : acquisition de compétences, développement de compétences - building work : travail sur une chantier de construction ; 2/ (l’activité) construction (de machines), fabrication (f) - building to order : fabrication à la demande - machine building : construction de machines-outils, fabrication de machines-outils - building society : société de crédit immobilier ; 3/ (le résultat, a building) bâtiment, édifice, construction (f), bâtisse (fam.) (f), immeuble - to collapse a building : provoquer l’effondrement d’un bâtiment - high-rise building : tour - multi-story building : immeuble - office building : immeuble de bureaux - building at risk : chef-d’œuvre en péril * build up (v) (built, built) : (tr.) faire monter - to build up tension : faire monter la tension ; (intr.) : s’accumuler (syn. to pile up) * build-up (n) : accumulation (f) - debris build-up : accumulation de débris * built (prét. de to build) * built (pp de to build) * built-in (ac) : incorporé(e) (d’origine), intégré(e) - built-in cupboard : placard mural * bulb (n) (fa p) : 1/ bulbe, oignon ; 2/ ampoule (électrique) (f) - 100-watt bulb : ampoule de 100 watts - The bulb blew : L'ampoule a sauté / grillé * Bulgaria (n pr.) : (la) Bulgarie * Bulgarian (a) : bulgare (sans maj.) * Bulgarian (n pr.) : Bulgare (le ressortissant) * bulge out (v) (intr.) : se renfler * bulging (a) : [yeux] globuleux/-euse, [muscles] protubérant(e) - bulging biceps : gros biceps * bulk (n) : 1/ majeure partie (f), plus grande partie (f), plus grosse partie (f), essentiel (n) - the bulk of… : la plus grosse partie de… - the bulk of the customers : le gros des clients ; 2/ volume ; 3/ vrac - in bulk : en vrac - bulk cargo : fret en vrac, marchandises en vrac (pl.) - bulk carrier : vraquier, transporteur de vrac * bulky (a) : 1/ [objet] volumineux/-euse, encombrant(e) ; 2/ [individu] corpulent(e) * bulkiness (n) : 1/ caractère volumineux ; 2/ corpulence (f) * bull (a) : [marché] spéculateur à la hausse, haussier/-ière - bull market : marché haussier * bull (n) : taureau * bull (n) (amér.) (abr. de bullshit : conneries (f pl.), foutaises (f pl.)) - a load of bull : un tas de conneries * bull (v) (intr.) : (Bourse) spéculer à la hausse * bullcrap (n) (amér.) : conneries (f pl.), foutaises (f pl.) - That is such a load of bullcrap! : C’est vraiment un tas de conneries ! * bulldoze (v) (tr.) : raser * bulldozer (n) : bulldozer, bouteur (off.) - bulldozer operator : conducteur de bouteur * bullet (n) (fa) : balle (f) (le projectile) - to fire rifle bullets : tirer des coups de fusil - bullet time (Photog.) : effet de ralenti à la Matrix (syn. frozen time) * bulletin (n) : avis, annonce (f) - news bulletin (brit.) : bulletin d'informations, bulletin d'infos, bulletin de nouvelles - bulletin board : tableau d’affichage électronique (de petites annonces) * bullet-proof / bulletproof (ac/a) : à l’épreuve des balles, pare-balles, blindé(e) - bullet-proof vest : gilet pare-balles - bulletproof windows : vitres blindées (f pl.) * bullhorn (n) (amér.) : porte-voix, mégaphone * bullion (n) : (selon le cas) argent en lingots, or en lingots - stock of bullion : encaisse métallique (f) * bullish (a) : (Bourse) haussier/-ière - bullish tendency : tendance haussière (f) (anton. bearish) * bullring (n) : arène (f) * bullroarer (n) : (Mus.) rhombe (masc.) * bullshit (n) (amér.) : 1/ connerie (f), conneries (pl.), foutaise (f), foutaises (pl.), merde (f) (vulg.) - I don’t have time for this bullshit! : Je n’ai pas de temps à perdre à ces conneries ! - I’m done with this bullshit! : J’en ai terminé avec cette merde ! - bullshit job : boulot à la con, boulot de merde (vulg.), boulot merdique (vulg.) ; 2/ affabulations (f pl.), mensonges (pl.) * bullshit! (interj.) : connerie !, conneries !, foutaise !, foutaises ! * bullshit (v) : 1/ (tr.) raconter des conneries à (qn), dire des conneries à (qn), se foutre de (qn) ; (intr.) déconner * bullwhip (n) : nerf de bœuf, cravache (f)- bullwhip effect : (amplification des variations de la demande à mesure qu'on s'éloigne du client) effet coup de fouet (dans une chaîne logistique) * bully (n) : brute (n) (f) - a classroom bully : la terreur de la classe, un caïd * bully (v) (tr.) : 1/ intimider ; 2/ brutaliser, malmener (syn. to ill-treat) * bully (a) (amér. et colonial) : épatant(e) * bully (interj.) : bravo ! - Bully for him : Il mérite un bravo * bullying (n) : intimidation (f) * bulrush (n) : quenouille (f) * bulwark (n) : rempart * bum (n) : 1/ (amér.) clochard, clodo (fam.), vagabond - street bum : clochard ; 2/ fainéant, glandeur, flemmard ; 3/ (brit.) cul, derrière, postérieur, pétard (fam.) (syn. arse, bottom, behind) * bum (v) (tr.) (tr.) : demander (qch) - to bum a lift (somewhere) : se faire déposer (quelque part) * bum around (v) (intr.) (amér.) : 1/ vagabonder ; 2/ (fam.) glander, glandouiller * bumbag (n) (brit.) : banane (f) (sac à la ceinture) * bummer (n) (arg. amér.) : déception (f) - What a bummer! : Quelle déception !, C’est nul ! * bummer ! (interj.) (arg. amér.) : mince !, zut !, dommage !, quelle poisse !, la poisse ! * bump (v) (intr.) : heurter, cogner - to bump into sb : bousculer qn, rentrer dans qn * bump along (v) (intr.) : rouler en cahotant * bumper (n) : pare-choc (masc.) * bumpy (a) : cahoteux/-euse * bum rap (n) (arg.) : fausse accusation (f), accusation injuste (f) - I got a bum rap : on m’a accusé injustement ; 2/ coup monté ; 3/ condamnation d’un innocent * bun (n) : petit pain - chocolate bun : petit pain au chocolat (syn. chocolate-filled roll) * bunch (n) (pl. bunches) : 1/ groupe, bande (f) - bunch of crooks : bande d’escrocs ; 2/ bouquet - bunch of flowers : bouquet de fleurs * bunch (v) : (tr.) regrouper, rassembler - to bunch electric cables : regrouper des câbles électriques ; (intr.) se regrouper, se rassembler, s’agglutiner (aussi to bunch up, tr. et intr.) * bundle (n) : 1/ paquet ; 2/ (arg. amér.) paquet de fric, grosse somme d’argent * bung (n) : tampon, bouchon, bonde (f) * bung (v) (tr.) (arg. brit.) : mettre, ficher, foutre (vulg.) * bungee (n) : corde élastique (f) - bungee cord : cordon élastique - bungee jumping : (le) saut à l’élastique * bungee (v) (intr.) : sauter à l’élastique * bungle (v) (tr.) : gâcher * bung (up) (v) (tr.) : boucher (syn. to stop up, to stuff up) * bunk (n) : 1/ couchette (f) (in a ship, train, dans un navire, un train) ; 2/ (de la) foutaise, (des) foutaises (f pl.) - to be complete bunk : être un ramassis de conneries - bunk and bilge : foutaises et billevesées (f pl.) * bunker (n) : 1/ abri souterrain, bunker - nuclear-proof bunker : bunker anti-nucléaire - bunker buster : bombe pénétrante (f) ; 2/ (Naut.) soute (f) (d'un navire) ; 3/ (Golf) bunker * bunker-busting (ac) : pénétrant(e) - bunker-busting munitions (brit.) : bombes pénétrantes * bunk off (v) (arg. brit.) : (tr.) ne pas aller (work, au travail, school, en cours) ; (intr.) sécher les cours, sécher * bunting (n) : guirlande de drapeaux * buoy (n) : 1/ bouée (f) ; 2/ balise (flottante) (f) * buoy (v) (tr.) : 1/ maintenir à flot ; 2/ baliser ; 3/ revigorer * bur (n) : voir burr (n) * burden (n) : 1/ charge (f) (à porter), fardeau, poids - the debt burden : le fardeau de la dette ; 2/ charge (f), obligation (f) - burden of proof : charge de la preuve, fardeau de la preuve à charge - burden of disproof : obligation de réfuter, fardeau de la preuve à décharge - the burden of disproof is on you : c’est à vous d’apporter le fardeau de la preuve à décharge * burden (v) (tr.) : charger - [bridge] to be burdened with traffic : [pont] avoir à supporter de la circulation * burdensome (a) : 1/ lourd(e), pesant(e) : 2/ (fig.) pesant(e), pénible - burdensome limitation : restriction pesante * bureau (n) : 1/ (brit.) secrétaire (le meuble) (syn. amér. writing desk) ; 2/ (amér.) commode ; 3/ bureau (le lieu) - design bureau : bureau d’études ; 4/ agence - employment bureau : agence pour l’emploi ; 4/ brigade - the homicide bureau : (la) brigade criminelle * bureaucrat (n) : bureaucrate * bureaucratic (a) : bureaucratique * burgeoning (part. prés. adj.) : naissant, en plein essor, en développement * burger (n) : 1/ steak hâché ; 2/ burger * burglar (n) : cambrioleur - cat burglar : monte-en-l’air, pl. monte-en-l’air - burglar alarm : dispositif anti-cambriolage * burglarise (brit.) / burglarize (amér.) (v) (tr.) : cambrioler * burglary (n) : cambriolage, vol avec effraction * burgle (v) (tr.) : cambrioler (a house, une maison) * Burgundian (a) : bourguignon(ne) (sans maj.) * Burgundian (n pr.) : Bourguignon (l’habitant) * Burgundy (n pr.) : (la) Bourgogne * burial (n) : enterrement * burl (n) : 1/ nœud (dans le bois) ; 2/ loupe (f), nodosité (f) * burlap (a) (amér.) : en toile de jute, en toile à sac * burlap (n) (amér.) : toile de jute, toile à sac * burlap (v) (tr.) : emballer dans de la toile de jute * burlap-covered (ac) : recouvert(e) de toile - burlap-covered water bottle : gourde recouverte de toile * burly (a) : costaud(e) * Burma (n pr) : (la) Birmanie * Burmese (a) : birman(e) - the Burmese python : le python birman * Burmese (n) : Birman(e) * burn (v) (burnt, burnt (brit.) ou régulier) : 1/ (tr.) brûler ; (intr.) brûler- Something’s burning : Il y a quelque chose qui brûle ; 2/ (au fig.) - You’re burning : Tu brûles (au jeu de l’objet caché) - My ears are burning : Mes oreilles tintent - to be burnt : y laisser des plumes * burner (n) : 1/ (l’artisan) charbonnier - charcoal burner : charbonnier ; 2/ (l’objet) - log burner : poêle à bois - perfume burner : brûle-parfum ; 2/ (Inf.) graveur - CD burner : graveur de CD * burner (n) (tronc. de burner phone) : portable prépayé, téléphone prépayé * burning (nv) (Inf.) : gravure (de CD) - CD burning : gravure de CD * burnish (v) (tr.) : (Usin.) brunir * burnishing (n) : (Usin.) brunissage - burnishing machine : machine à brunir * burnoose (n) : burnous * burn out (v) (brit. burnt, burnt, ou régulier) (intr.) : [ampoule] claquer, sauter - A bulb has burnt out : Une ampoule a claqué * burnt (prét. brit. de to burn) * burnt (pp de to burn) : brûlé(e) - to be burnt : (fig.) y laisser des plumes * burn up (v) (amér.) : 1/ (intr.) être brûlant de fièvre ; 2/ (tr.) (fig.) faire bouillir (qn) (de colère) ; (intr.) (fig.) exploser de fureur * burn-up (n) (arg. amér.) : emportement, explosion de colère - to have a burn-up : s’emporter * burp (n) : rot * burp (v) : (intr.) roter ; (tr.) faire faire un rot à (un bébé) * burr (n) 1/ bardane (f), chardon ; 2/ (Usin.) bavure (f), barbe (f), ébarbure (f) - to remove burrs : enlever des ébarbures * burr (v) (tr.) : 1/ échardonner ; 2/ (Usin.) ébavurer, ébarber * bursar (n) : trésorier, trésorière * burst (n) : 1/ explosion (f), salve (f), poussée (f) ; 2/ rafale (f), paquet * burst (v) (burst, burst) (intr.) : éclater, exploser * burst (pp de to burst) * burst (prét. de to burst) * bury (v) (tr.) : enterrer, ensevelir * bus (n) (pl. buses) : 1/ bus - fleet of buses : flotte de bus ; 2/ (amér.) car - a Greyhound bus : un car Greyhound * bush (n) (pl. bushes) : douille (f) - ball bushes : douilles à billes * bushel (n) : 1/ (Mes.) (obs.) boisseau (= 4 pecks) ; 2/ (Mes.) (amér.) boisseau (= 25 kg) ; 3/ (expression) - to hide under the bushel : mettre sous le boisseau - to hide one’s light under the bushel : cacher son talent * bushing (n) : diabolo - rubber bushing : diabolo en caoutchouc * bushwhacker (n) (amér.) : 1/ homme des bois ; 2/ (Hist. amér.) franc-tireur * bushy (a) : 1/ broussailleux/-euse, en broussaille ; 2/ [cheveux, barbe, sourcils] touffu(e), fourni(e) - bushy eyebrows : sourcis touffus * business (n) (pl. businesses) : 1/ commerce, activités commerciales (f pl.), affaires (f pl.) - to be in business : être dans les affaires - to do business : faire des affaires, faire du commerce - line of business : métier, activité professionnelle - big business : (les) grandes entreprises (f pl.) - core business : cœur de métier - education business : (le) marché éducatif - family-owned business : entreprise familiale (f) - business address : adresse professionnelle (f) - business affairs : affaires commerciales (f pl.) - business centre : quartier d’affaires, quartier commercial - business day : jour ouvrable, jour ouvré - business district : quartier d’affaires, quartier commercial - business insight : sens des affaires - business jet : avion d’affaires, biréacteur d’affaires - business model : modèle d’affaires - business name : raison sociale (f) - business partner : associé - business plan : plan d’affaires (anglic.), plan de création d’entreprise, plan de financement d’entreprise, projet d’entreprise - business planning : planification commerciale (f) - business people : hommes d’affaires, milieux d’affaires, cadres d’entreprise - business school : école de commerce - business trip : déplacement professionnel - business use : usage professionnel ; 2/ questions importantes (f pl.), choses (f pl.) dont discuter, occupations (f pl.), affaires courantes (f pl.) - to make it one’s business to + inf. : se faire un devoir de + inf., faire en sorte de + inf. - new order of business : nouvel ordre du jour ; 3/ affaires (pl.), problèmes, oignons (pl.) (fam.), problème - That is their business : C’est leur affaire, Ça les regarde - This is none of your business : Ce ne sont pas tes / vos affaires / oignons, Ça ne te / vous regarde pas ; 4/ besoins naturels (pl.) - to do one’s business : (pour des animaux) faire ses besoins, se soulager ; 5/ (a business, pl. businesses) entreprise (f), firme (f), société (f), affaire (f), boîte (f) (fam.) - to start one’s own business : démarrer sa propre affaire - business management : (la) gestion d’entreprises ; 6/ industrie (f) - the oil business : l’industrie du pétrole - the pharmaceutical business : l’industrie pharmaceutique - the semi-conductor business : l’industrie des semi-conducteurs * business-friendly (ac) : favorable aux entreprises (anton. business-unfriendly : peu favorable aux entreprises) * business-unfriendly (ac) : peu favorable aux entreprises (anton. business-friendly : favorable aux entreprises) - business-unfriendly regulatory regime : législation faisant peu de cas des besoins des entreprises * busing (amér.) / bussing (brit.) (n) : ramassage scolaire * busk (v) (intr.) : chanter dans les rues, jouer de la musique dans les rues * busker (n) : chanteur des rues, musicien ambulant, musicien des rues * buskin (n) : cothurne * busking (n) : chanter dans les rues, être musicien ambulant * bust (a) : 1/ foutu(e), fichu(e) ; 2/ en faillite - to go bust : faire faillite * bust (n) (amér.) : effondrement, échec * bust (n) : poitrine, buste * bust (v) (bust, bust ou régulier (brit.)) : 1/ (tr.) casser, péter (fam.), abîmer, bousiller ; (intr.) casser, péter - Anything that busts we fix : Tout ce qui pète, on le répare ; 2/ (tr.) acculer à la faillite ; (intr.) faire faillite * bust (prét. de to bust) * bust (pp de to bust) * bust and fix (ac) (formé sur It busts and we fix : Ça pète et on répare) : - a bust and fix approach : la méthode « Ça pète et on répare » / « On attend que ça pète pour réparer (var. ortho. bust ’n’ fix) * buster (n) : 1/ bousilleur, casseur, briseur - bunker buster : bombe pénétrante ; 2/ (fig.) pourfendeur - tax haven buster : pourfendeur des paradis fiscaux ; 2/ démystificateur, déboulonneur (syn. debunker) - myth buster : démystificateur ; 3/ dissolvant - clot buster : dissolvant de caillots ; 4/ - jargon buster : glossaire, explication de termes ; 5/ dresseur - bronco buster : champion de rodéo * bustle (n) : remue-ménage * bustle (v) (tr.) : s’affairer * bustless (a) : qui n’a pas de poitrine * busty (a) : à forte poitrine, à la poitrine plantureuse, (hum.) qui a du monde au balcon * busy (a) : 1/ occupé(e) - I’m busy : J’ai à faire - to be busy + gér. : être occupé à + inf. 2/ [rue] animé(e) * but (prép.) (après any et composés, all, none) : si ce n’est, excepté, sauf, à part * but (conj. de coord.) : 1/ mais ; 2/ (suivi de then) en revanche ; 3/ But… (en tête de phrase) : En revanche, Cependant * but (conj. de restriction) : sans que - It never rains in California but it pours : Il ne pleut jamais en Californie sans qu’il pleuve à flots * butcher (n) : boucher - a butcher’s knife / butcher knife : un couteau de boucher - a butcher’s slicer : trancheuse (f) * but for (loc. prép.) : sans * butler (n) : maître d’hôtel - the butler’s pantry : l’office * butt (n) (fa) : 1/ derrière, popotin (fam.) - to wipe one’s butt : s’essuyer les fesses - big butt : gros popotin - butt licker (vulg.) : lèche-cul (vulg.) - butt plug : bouchon anal ; 2/ a/ mégot, b/ cigarette (f), clope (f) (arg.) ; 3/ crosse (f) (de fusil) ; 4/ cible (f) (de plaisanteries) * butt (v) (tr.) : enfoncer, (with one’s head) donner un coup de tête à * butte (n) : butte (f), motte (f) * butter (n) : beurre - butter market : marché au beurre * butter (v) (tr.) : beurrer * buttercup (n) : bouton d’or * buttered (ppa) : burré(e), au beurre - buttered popcorn : pop-corn au beurre * butterfly (n) (pl. butterflies) : papillon * butthole (n) (amér.) (vulg.) : troufignon (vulg.) * butt in (v) (intr.) : s’ingérer * button (n) : 1/ bouton, touche (f) - focus button : (Photog.) touche de mise au point - like button : (le) bouton j’aime (anton. dislike button : (le) bouton je n’aime pas) - snooze button : bouton d’arrêt momentané (d’un réveil) ; 2/ nombril - belly button : nombril * button up (v) (tr.) : boutonner (un vêtement) * buttoned up (ppa) : [vêtement] boutonné(e) * buttonhole (n) : 1/ boutonnière (f) ; 2/ fleur à la boutonnière * buttonhook (n) : tire-bouton (masc.) * buttress (n) : 1/ contrefort ; 2/ (fig.) soutien * butty (n) (brit.) : sandwich - chip butty : sandwich aux frites - fried egg butty : sandwich aux œufs frits - sausage butty : sandwich à la saucisse * buy (v) (bought, bought) (tr.) : acheter - to buy oneself sth : s’acheter qch * buy and pay for (v coord.) (tr.) : acheter et payer (des biens, des services) * buyer (n) : acheteur - (a) new group of buyers : (une) nouvelle clientèle * buying (n) : 1/ (l’action) achat ; 2/ achats (pl.) - panic buying : achats dictés par la panique - buying spree : fièvre d’achats * buy out (v) (bought, bought) (tr.) : 1/ acheter la totalité de ; 2/ louer la totalité de – Did you buy this restaurant out? : Tu as loué tout le resto pour toi seul ? ; 3/ racheter * buy up (v) (bought, bought) (tr.) : racheter * buzz (n) : 1/ bourdonnement (des abeilles), chant (des cigales) ; 2/ vrombissement (de moteur) ; 3/ bruit des machines, brouhaha ; 4/ bouche-à-oreille, rumeur (sing.), rumeurs (pl.) - There has been a lot of buzz about the actor’s divorce : les rumeurs au sujet du divorce de l’acteur vont bon train - buzz phrase : locution à la mode - buzz word : mot à la mode, mot branché, terme ronflant, formule en vogue, expression qui fait fureur (aussi buzzword) ; 4/ sentiment de plaisir, sentiment d’exaltation (lié à la prise de drogue) - You get a buzz from it : Tu t’éclates ; 5/ coup de téléphone * buzz (v) : 1/ (intr.) bourdonner ; 2/ (tr.) [hélicoptère] survoler - [car] to be buzzed : [voiture] se faire survoler (par un hélicoptère) ; 3/ to buzz for sb : appeler qn (au téléphone, par sonnerie, par bip) ; 4/ répandre (une rumeur) * buzz about (v) (tr.) : - to buzz sth about : divulguer une chose, faire courir le bruit de qch * buzzard (n) : buse * buzz off (v) (intr.) : se tirer, dégager - Buzz off! : Tire-toi / Tirez-vous!, Dégage / Dégagez ! * buzzword (n) : mot à la mode, mot branché, terme ronflant, formule en vogue, expression qui fait fureur (var. aussi buzz word) * by (prép.) : 1/ par + complément d'agent de la voie passive ; 2/ (expression du moyen) par, au moyen de ; 3/ + mode de transport : par, en ; 4/ (+ forme -ing, expression du moyen) en + p. prés. ; 5/ d'après, en fonction de, à ; 6/ (expression d'une surface) sur ; 7/ (+ proportion) de - by a third : d'un tiers - to reduce plant design time by a half : réduire de moitié le temps de conception des équipements ; 8/ (+ mesure) de - to vary by only two inches : varier seulement de deux pouces ; 9/ (+ indication de date ou d’heure) avant, dès, d’ici - by 1987 : a/ dès 1987 ; b/ d’ici 1987 - I’ll be back by midnight : Je serai de retour avant minuit - by the end of the year : d’ici la fin de l’année ; 10/ à côté de, à la hauteur de, près de - to stand by sb : soutenir qn ; 11/ en bordure de - by the Persian Gulf : en bordure du Golfe persique, sur le Golfe persique ; 12/ (dans certaines expressions) après, sur - layer by layer : couche après couche * by and large (loc. adv.) : dans l’ensemble * by comparison to / with (loc. prép.) : en comparaison de, par rapport à, auprès de, à côté de (cf in comparison to / with) * by means of (loc. prép.) : au moyen de, par l'intermédiaire de * bypass (v) (tr.) : contourner, mettre en dérivation, découpler * by-product (nc) : 1/ sous-produit ; 2/ effet indirect, résultat * bystander (n) : spectateur, témoin * by the time (loc. conj.) : le temps que * by virtue of (loc. prép.) : en vertu de, du seul fait de, de par * by-word (nc) : proverbe - to have become a by-word : être passé(e) en proverbe - He is the by-word of the village : Il est la fable du village gy0my48mpar5vfkln2eb9777jt7boem Vocabulaire anglais-français à l'intention des apprenants avancés/C 0 78008 767827 759929 2026-06-16T13:59:25Z Elnon 41284 /* C */ compléments 767827 wikitext text/x-wiki {{../Index}} === C === * C : (note scolaire) passable * c. cf. circa * ca. / ca cf. circa * cab (n) : 1/ calèche (f) ; 2/ taxi - cab rank : station de taxis ; 3/ cabine (f) (de camion) - lorry cab : cabine de camion * cabaret (n) : 1/ cabaret (restaurant où l’on danse ou regarde un spectacle) ; 2/ spectacle de cabaret - cabaret spot : numéro de spectacle * cabbage (n) : chou - cabbage leaf : feuille de chou * cabbie / cabby (n) (pl. cabbies) : chauffeur de taxi * caber (n) (Écosse) : tronc (de mélèze) - tossing the caber : (le) lancer de troncs - caber tosser : lanceur de troncs * cabin (n) : cabine (f) - dining cabin : cabine de restauration (dans un avion de ligne) - log cabin : cabane en rondins * cabinet (n) : 1/ meuble à tiroirs - filing cabinet : classeur à tiroirs - cabinet maker : ébéniste ; 2/ coffret ; 3/ armoire (f) - bathroom cabinet : armoire de salle de bain(s) - control cabinet : armoire de commande - liquor cabinet : bar domestique - refrigeration cabinet : armoire froide * cable (n) : câble - aerial cable : câble aérien - electric cable : câble électrique - coaxial cable : câble coaxial - screened cable : câble blindé - power cable : câble d’alimentation - screened cable : câble blindé - undersea cable : câble sous-marin - cable car : téléphérique - cable holder : porte-câble - cable television : (la) télévision par câble, (le) câble * cable (v) (tr.) : câbler - to be cabled with optical fibre : être câblé en fibre optique * cable-stayed (ac) : à haubans - cable-stayed bridge : pont à haubans * caboodle (n) : dans l’expression the whole caboodle : et tout le bazar, et tout le bataclan, et tout le tintouin, et tout le fourbi, et tout le tas * cache (n) : 1/ cache (f) (d’argent, d’armes), dépôt secret ; 2/ cachette (f) (dans un mur) ; 3/ (Inf.) mémoire-tampon (f) * cache (v) (tr.) : 1/ cacher, dissimuler ; 2/ (Inf.) mettre en mémoire-tampon * cache-sexe (n) : cache-sexe (masc.) (syn. loincloth) * cachet (n) : cachet (signe de qualité) - to hold cachet : avoir du cachet * cachinnate (v) (intr.) : rire aux éclats, rire à gorge déployée * cackle (n) : gloussement (de l’oie, de la poule), caquètement (de la poule), cacardement (de l’oie) - Let’s cut the cackle! : Cessons de caqueter ! * cackle (v) (intr.) : 1/ [poule] glousser, caqueter, [oie] cancarder ; 2/ [personne] glousser * cactus (n) (pl. cactuses ou cacti) cactus * cad (n) : mufle, goujat * cadaver (n) : cadavre, corps - cadaver dog : chien renifleur (de cadavres) * caddie (n) : 1/ garçon écossais ; 2/ commissionnaire ; 3/ aide du golfeur, porteur, caddie, cadet (Q) * caddie (v) (intr.) : (Golf) servir de porteur (for sb, à qqn) * cadenced (a) : cadencé(e) * cadge (v) (tr.) : quémander (syn. to beg) * cadger (n) : 1/ vagabond ; 2/ pique-assiette, parasite, profiteur, tapeur * cadmium (n) : cadmium * cadmium-laden (ac) : plein(e) de cadmium - cadmium-laden dust : poussière chargée de cadmium * Caesarean (a) : césarien(ne) - a Caesarean birth : une mise au monde par césarienne - a Caesarean operation : une césarienne * cafeteria (n) : cafétéria (f) * cafetière / cafetiere (n) : cafetière à piston (f) (syn. amér. French press) * caffeine (n) : caféine (f) - caffeine withdrawal : manque de caféine * cage (n) : cage (f) - Faraday cage : cage de Faraday - rib cage : cage thoracique * caged (ppa) : en cage, en captivité, captif/-ive - caged hens : poules élévées en batterie * cairn (n) : tas de pierres, monjoie (f) - base stone cairn : cairn sur socle de pierre - clearance cairn : tas d’épierrement - ground cairn : cairn à même le sol - split stone cairn : cairn à fentes * cajole (v) (tr.) (fa) : amadouer * cake (n) : 1/ gateau - cup cake : petit gâteau individuel ; 2/ tourteau - cattle cake : tourteau pour le bétail - cow cake : tourteau pour les vaches - linseed cake : tourteau de graines de lin - rapeseed pressing cake : tourteau (de presse) de colza - sunflower seed cake : tourteau de (graines de) tournesol ; 3/ (locution-) - That takes the cake! : Ça, c’est le bouquet !, Il n’y a plus qu’à tirer l’échelle après ça ! - the icing on the cake : (fig.) la cerise sur le gateau * caked (ppa) : recouvert(e) (with blood, de sang, with mud, de boue séchée) * cakehole (n) (arg.) : gueule (f) (vulg.), clapet (fam.) - Shut your cakehole! : Ferme ton clapet ! * calculation (n) (svt au pl.) : 1/ (le) calcul ; 2/ (calculations, pl.) calculs - according to my calculations : d’après mes calculs - conservative calculations : calculs prudents * calculation-laden (ac) : - calculation-laden process : traitement comportant une foule de calculs * calculator (n) : 1/ machine à calculer ; 2/ calculatrice (f) - pocket calculator : calculatrice de poche, calculette * calculator-tapper (nc) : pianoteur de clavier * calculate (v) (tr.) : calculer * calculus (n) (fa) : 1/ analyse (f) (branche des mathématiques) ; 2/ (n ind. sing.) tartre - dental calculus : tartre dentaire * calendar (n) : calendrier - the school calendar : le calendrier scolaire * calender (v) (tr.) : laminer * calendering (n) : laminage - calendering roller : cylindre à laminer * calf (n) : mollet * Calif. : abr. de California, (la) Californie * California (n pr.) : (la) Californie * Californian (a) : californien(ne) (sans maj.) * Californian (n pr.) : Californien (l’habitant) * CALL (n) (abr. de computer-aided language learning : apprentissage des langues assisté par ordinateur) * call (n) : 1/ appel (for, à, de) - the call of nature : l’appel de la nature - a call of nature : un besoin naturel ; 2/ appel (téléphonique), communication (téléphonique) (f) - courtesy call : appel de courtoisie, appel amical - call charges : coût des communications ; 3/ visite (f) - to pay a call on sb : passer voir qn - courtesy call : visite de courtoisie, visite de politesse ; 4/ jugement - judgement call (brit.) : cas de conscience (ortho. amér. judgment call) * call (v) : 1/ (tr.) appeler, nommer - to be called : s'appeler, avoir pour nom ; 2/ (tr.) (Téléph.) appeler - Thanks for calling : Merci d’avoir appelé ; 3/ (intr.) to call on sb : rendre visite à qn, passer voir (qn) - Call on me : Passez me voir ; 4/ (intr.) - to call for sth : a/ appeler à qch, exhorter à qch, plaider pour qch, préconiser qch - to call for an end to… : demander la fin de… ; b/ exiger, nécessiter, passer par - Desperate situations call for desperate remedies : Aux grands maux les grands remèdes (var.) - Desperate times call for desperate measures : Aux grand maux, les grands remèdes ; 5/ (tr.) faire venir * call back (v) (tr.) : rappeler * caller (n) : (Téléph.) demandeur, appelant, correspondant * call in (v) : 1/ (tr.) faire rentrer (par ex. les enfants) ; 2/ convoquer ; 3/ (intr.) (Radio, Télé ; Travail) appeler (par téléphone) - to call in sick : se faire porter pâle (fam.) ; 4/ (intr.) (brit.) passer (chez qn) - to call in on sb : passer voir qn * call-in (a) (amér.) : de libre antenne, à ligne ouverte - call-in programme : émission de libre antenne - call-in show : émission à ligne ouverte * call off (v) (tr.) : annuler, revenir sur - to call off an interview : annuler une interview * callous (a) : dur(e), cruel(le) (syn. cruel), insensible (syn. insensitive) * callousness (n) : dureté (f), cruauté (f), insensibilité (f) * call out (v) (tr.) : 1/ faire venir (un médecin, un plombier, etc.) ; 2/ (fam.) critiquer, dénigrer (qn), dénoncer (qn) - to call out sb on sth : critiquer qn sur qch, dénoncer qn à propos de qch * call-out (n) : intervention (f) (d’un médecin), déplacement (d’un plombier) * call-out (a) : d’intervention, de déplaceemnt * call up (v) (tr.) : appeler (au téléphone) * calm (a) : calme, serein(e) * calm (n) : calme * calmly (adv.) : calmement * calmness (n) : calme, sérénité (f) * calque (n) : calque, traduction littérale (f), traduction mot pour mot * calque (v) (tr.) : traduire littéralement * calvary (n) (pl. calvaries) : calvaire (le monument) * calve (v) (intr.) : véler * calvinism (n) : (le) calvinisme * Calvinist (a) : calviniste (sans maj.) * Calvinist (n pr.) : (la personne) Calviniste (n m/f) * Cambodia (n pr.) : (le) Cambodge * Cambodian (a) : cambodgien(ne) (sans maj.) * Cambodian (n pr.) : Cambodgien (le ressortissant), Cambodgienne (la ressortissante) * camcorder (n) (contr. de camera cum recorder) : camescope - digital camcorder : camescope numérique * came (prét. de to come) * cameo (n) : camée (masc.) - cameo role : brève apparition (d'une vedette) * camel (n) : chameau - camel trader : marchand de chameaux * camera (n) (fa) : 1/ appareil photo(graphique) - the box camera : la « boîte à photos » - camera maker : fabricant d’appareils photo ; 2/ caméra (f) (de cinéma, de télé, de vidéo) - film camera : caméra cinématographique (syn. cine-camera (brit.) / movie camera (amér.) - hand-held camera : (Cin.) caméra à l’épaule - hidden camera : (Journ.) caméra cachée (syn. spy camera) - lipstick camera : caméra-crayon, mini-caméra - surveillance camera : caméra de surveillance - video camara : caméra vidéo - Camera! (Cin.) : On tourne ! (syn. Action!) - the camera's eye : l'œil de la caméra - the camera's movement : le mouvement de la caméra; 3/ dans l’expression in camera : à huis clos * cameraman (n) : opérateur (de prises de vue), cadreur (syn. amér. camera operator) - first cameraman : chef opérateur * caminickers (n pl.) (brit.) : combinaison-culotte (de femme) * camo (n) (tronc. de camouflage) : camouflage - camo gear : tenue de camouflage - camo net : filet de camouflage - camo paint : peinture de camouflage * camouflage (n) : camouflage * camp (n) : 1/ camp, campement - homeless camp : campement de sans-abri, campement de sans-domicile-fixe / de SDF ; 2/ colonie de vacances ; 3/ (Polit.) camp * camp (v) (intr.) : camper * campaign (n) : campagne - advertising campaign : campagne de publicité - bombing campaign : campagne de bombardement - clean-up campaign : campagne de nettoyage -misinformation campaign : campagne mensongère - quality campaign : campagne en faveur de la qualité * campaign (v) (intr.) : faire campagne (for sth, pour qch, against sth, contre qch) * campaigner (n) : personne faisant campagne (for sth, pour qch), partisan (for sth, de qch) - climate campaigner : militant pour le climat * camping (n) : (le) camping, (les) vacances sous la tente (f pl.) - luxury camping : camping de luxe - stealth camping : camping en mode furtif, camping furtif * campus (n) (pl. campuses) (abr. de university campus) : campus universitaire, domaine universitaire - to live on campus : habiter sur le campus - to live off campus : habiter en ville * can (aux.) (prét. could) auxiliaire de modalité exprimant 1/ la capacité, l'aptitude du sujet - trad. : outre « savoir » dans le sens de « pouvoir », aussi « être capable de » / « à même de » / « en mesure de » ou « avoir la faculté de » ; 2/ la possibilité matérielle - trad. : « pouvoir », « avoir la possibilité de » ; 3/ l'autorisation, la permission (à l'instar de may) - trad. : « pouvoir », « être permis » ; 4/ une éventualité, une conséquence possible, un risque probable (à l'instar de may) - trad. : « être susceptible de », « risquer de » * can (n) (amér.) : 1/ boîte (de conserve) - beverage can : canette / cannette (f) - can opener : ouvre-boîte (masc.) (syn. brit. tin opener) ; 2/ poubelle (f) - garbage can : poubelle ; 3/ bombe (f) - spray can : bombe aérosol * Canada (n pr.) : (le) Canada * Canadian (a) : canadien(ne) (sans maj.) * Canadian (n pr.) : Canadien(ne) (le ressortissant, la resortissante) * Canadian-based (ac) : établi au Canada, installé au Canada, canadien(ne) * canal (n) : canal - the Panama Canal : le Canal de Panama - the Suez Canal : le Canal de Suez * canal tile-roofed (ac) : couvert de tuiles canal, au toit de tuiles canal * cancel (v) (tr.) (pp -lled en brit., -led en amér.) : 1/ annuler ; 2/ (Postes) oblitérer - to cancel a stamp : oblitérer un timbre ; 3/ ostraciser, frapper d’ostracisme, condamner à la mort sociale * cancellation (brit.) / cancelation (amér.) (n) : 1/ annulation (f), résiliation (f) (d’un contrat) ; 2/ (Postes) oblitération (f) ; 3/ ostracisation (f), condamnation à la mort sociale * canceller (brit.) / canceller (amér.) (n) : neutralisateur (le dispositif) * cancel out (v) (tr.) : annuler (une fête), mettre fin à, résilier (un contrat, un abonnement), neutraliser, éliminer, faire disparaître * cancer (n) : cancer - to have cancer : avoir le cancer - brain cancer : cancer au cerveau - breast cancer : cancer du sein - lung cancer : cancer des poumons - ovarian cancer : cancer des ovaires - pancreatic cancer : cancer du pancréas - prostate cancer : cancer de la prostate * cancer-attacking (a) : anti-cancéreux/-euse * cancerous (a) : cancéreux/-euse * candelabra (n) : candélabre * candid (a) (fa) : 1/ franc/-che, sincère - I'm going to be candid with you : Je vais être franc avec vous ; 2/ (Photog.) pris(e) sur le vif - candid pictures : photos prises sur le vif * candid (n) : photo prise sur le vif (f), instantané * candidacy (n) : candidature (f) * candidate (n) : candidat(e) * candidly (adv.) (fa) : franchement, sincèrement * candle (n) : bougie (f) - scented candle : bougie parfumée * candled (ppa) : en torche - chute candled : parachute en torche * candleholder (n) : chandelier * candour (n) (fa) : 1/ sincérité (f) ; 2/ franchise (f) * candy (n) (pl. candies) : bonbon, friandise (f) - candy floss : barbe à papa * cane (n) : 1/ canne (f) ; 2/ verge (f), bâton, baguette (f) * cane (v) (tr.) : donner des coups de canne / de bâton à… * canid (n) : canidé (n) * canister (n) : 1/ boîte (f), boîtier - film canister : (Cin.) boîte de film / à film, boîtier de film / à film ; 2/ aspirateur-traîneau * cannabis (n) : cannabis - cannabis grower : producteur de cannabis * cannery (n) : conserverie (f) * canning (n) : (la) conserve - the canning industry : l’industrie de la conserve * cannon (n) : canon - anti-aircraft cannon : canon anti-aérien - cannon fodder : chair à canon * cannot : forme négative de l'auxiliaire de modalité can, exprimant 1/ une incapacité, une inaptitude du sujet - trad. : « ne pas pouvoir », « être incapable de » ; 2/ une impossibilité matérielle - trad. : « il est impossible de » ; 3/ une quasi-interdiction - trad. : « ne savoir » au conditionnel présent * canny (a) : rusé(e), malin/-igne * canon (n) (fa p) : 1/ (Rel.) canon (= règles) - canon law : droit canonique ; 2/ chanoine * canonise (brit.) / canonize (amér.) (v) (tr.) : canoniser * canopy (n) (fa) : 1/ dais (over an altar, au-dessus d’un autel) ; 2/ baldaquin (over a bed, au-dessus d’un lit) - canopy bed : lit à baldaquin (syn. four-post bed) ; 3/ abat-voix (masc.) (over a pulpit, au-dessus d’une chaire) * cant (n) : 1/ paroles creuses (f pl.) - cant phrase : expression toute faite (f) (syn. stock phrase) ; 2/ argot, jargon ; 3/ dévers ; 4/ gîte (d’un navire) * canteen (n) (fa p) : 1/ gourde (f) ; 2/ cantine (f) * canter (n) : petit galop * canter (v) (intr.) : aller au petit galop * cantilever (n) : construction en porte-à-faux (f) - cantilever chair : chaise en porte-à-faux (f) * Canuck (n pr.) (arg.) : Canadien (fam.) * canvas (n) (pl. canvases) (fa p) : 1/ canevas (grosse toile pour la confection), toile (épaisse) (f) - canvas shoe : chaussure en toile (f) - Penelope’s Canvas : la tapisserie de Pénélope ; 2/ toile (f) (à peindre ou peinte), tableau * canvas (v) (tr.) : entoiler * canvassing (n) : démarchage électoral * cap (n) : 1/ casquette (f) - to go cap in hand to sb : aller quémander auprès de qn ; 2/ capsule (f), bouchon (de bouteille) - flip cap : bouchon rabattable - twist-off cap : bouchon dévissable ; 3/ capuchon (de stylo) ; 4/ capote (f) - French cap : capote anglaise (f) (syn. French letter) ; 5/ plafond (au fig.) - to set a cap on pay-outs awarded to workers : fixer un plafond aux versements faits aux ouvriers - price cap : prix plafond - to put a price cap on petroleum oil : fixer un prix plafond au pétrole * cap (n) (pl. caps) (abr. de capital, n, majuscule) : majuscule (f) - to be all caps : être entièrement en majuscules * cap (v) (tr.) : 1/ boucher, reboucher (une bouteille) ; 2/ surpasser ; 3/ (mot de liaison) and to cap it all : pour couronner le tout (syn. and to cap it off) * capability (n) (pl. capabilities) : capacité (f), aptitude (f), faculté (f), possibilité (f) * capable (a) : capable, apte - capable of + subst. ou gér. : pouvant faire * capacious (a) : de grande contenance * capacity (n) : 1/ aptitude (f); 2/ contenance (f) ; 3/ capacité (f) (de production), régime - industrial capacity : capacités (f pl.) de production - to operate at full capacity : fonctionner à plein régime * caper (n) : 1/ cabriole (f) ; 2/ virée (f) (fam.) * caper (v) (intr.) : cabrioler, gambader * capital (a) : majuscule - capital letters : lettres majuscules * capital (n) : capital (n), capitaux (pl.) - to raise capital : lever des capitaux, réunir des capitaux - share capital : capital en actions - venture capital : capital-risque - capital equipment : moyens (pl.) de production, biens (pl.) d’équipements, capital technique - capital goods : biens d’équipement * capital (n) : capitale (f) - provincial capital : capitale provinciale * capital (n) : majuscule (f) * capital (n) : (Archi.) chapiteau * capital-intensive (ac) : à forte concentration de capitaux - capital-intensive business : entreprise à à forte concentration de capitaux * capitalist (n) : capitaliste (n) - venture capitalist : détenteur de capital-risque * capitalisation (brit.) / capitalization (amér.) (n) : 1/ emploi de majuscules, mise en majuscule - capitalisation of language names : mise de la majuscule aux noms de langue ; 2/ (Fin.) conversion en capitaux, capitalisation (f) * capitalise (brit.) / capitalize (amér.) (v) : 1/ (tr.) mettre en majuscules - to be capitalised : être mis(e) en majuscules ; 2/ (tr.) (Fin.) convertir en capitaux, capitaliser ; 3/ (intr.) tirer parti (on, de) - to capitalize on the knowhow of another plant : tirer parti du savoir-faire d'une autre usine * capitalised (brit.) / -ized (amér.) (ppa) : mis(e) en majuscules - capitalized hyphenated name : nom à trait d’union mis en majuscules * cap off (v) (tr.) : finir, terminer - and to cap it off (mot de liaison) : et pour couronner le tout (syn. and to cap it all) * capstan (n) : cabestan * capsule (n) : 1/ capsule (f) (de graine) ; 2/ capsule (de café) ; 3/ capsule (spatiale) - non-winged space capsule : capsule spatiale non ailée ; 4/ (Presse) condensé (n), sommaire (n) (avant un article de revue) * capsule (a) : très court(e), très succinct(e), condensé(e) * caption (n) : légende (f) (d’un dessin) * caption (v) (tr.) : 1/ mettre une légende à, légender (une image) ; 2/ sous-titrer (un film) * captioning (n) : légendage * captor (n) : ravisseur * capture (n) : capture (f) * capture (v) (tr.) : capturer * capuchin (n) : 1/ Capucin ; 2/ (abr. de capuchin monkey) capucin, sapajou ; 3/ cape (f), capeline (f) * capybara (n) (Zoo.) : capybara, cabiai * car (n) (fa) : 1/ voiture (automobile) (f) - biodiesel car : voiture roulant au biodiesel - continuation car : réédition d’une voiture - kit car : auto prête à monter, voiture en kit - passenger car : véhicule de tourisme, voiture individuelle - pedal car : voiture à pédales (pour enfants) - push car : poussette (f) (aussi pushcar) - race car : voiture de course - racing car : voiture de course - small cars : petites cylindrées (f pl.) - car dismantler : casse autos (f) - car maker : constructeur automobile - car manufacturer : fabricant d’automobiles - car park : parking - car shredder : broyeur d’autos - car spotter : observateur de voitures, passionné de voitures - car spotting : observation de voitures - car stylist : styliste d’automobiles - car wash : lave-auto (Q) (masc.) - car wreck : épave de voiture ; 2/ (amér.) voiture (de train) - passenger car : voiture (de train) (syn. brit. passenger carriage) - rail car : wagon - the street car (amér.) : le tram * carb (n) (tronc. de carbohydrate) : glucide - to cut out carbs : supprimer les glucides * carb (n) (tronc. de carburettor : carburateur) : carbu * carbide (n) : carbure * carbohydrate (n) : 1/ hydrate de carbone ; 2/ glucide * carbon (n) : carbone - to emit carbon : émettre du carbone - zero carbon : (le) zéro carbone, (le) zéro émission de carbone - carbon dioxide : dioxyde de carbone, gaz carbonique (var. CO2) - carbon emissions : émissions de carbone (var. CO2 emissions) - carbon monoxide : monoxyde de carbone - carbon steel : acier au carbone * carbon-date / carbon date (v) (tr.) : dater au carbone 14 * carbon-intensive (ac) : à forte teneur en carbone - carbon-intensive product : produit à forte teneur en carbone * car-bound (ac) : rivé(e) à sa voiture * carboy (n) : bombonne / bonbonne (f) * carburettor (n) : carburateur * carcass (n) (pl. carcasses) : carcasse (f) * carcinogen (n) : cancérigène (n) * card (n) : 1/ carte (f) (à jouer, etc.) - house of cards : château de cartes (var. card house) - trade card : image à collectionner ; 2/ (Banq.) carte (de crédit) - credit/debit card : carte de crédit et de débit ; 3/ (Électron.) carte (électronique) - full-length card (Inf.) : carte longue - sound card (Inf.) : carte-son, carte sonore (aussi soundcard) ; 4/ (Télévision) - the test card : la mire ; 5/ (Football) carton - yellow card : carton jaune - red card : carton rouge ; 6/ affichette (f) - pricer card : affichette de prix ; 7/ photo - lobby card (amér.) : photo d’exploitation, photo de film * cardboard (n) : carton (le matériau) - cardboard box (brit.) : carton (l’emballage) * cardiac (a) : cardiaque, du cœur - cardiac arrest : arrêt cardiaque * cardinal (n) : cardinal (n) * cardinalship (n) : cardinalat * card-operated (ac) : fonctionnant à l’aide d’une carte * care (n) : 1/ précaution (f), soin, attention (f) - Handle with care : À manipuler avec précaution, « Fragile » - to take care of : a/ + subst. : prendre soin de ; b/ + gér. : s'occuper de + inf. - Take care! : Prends bien soin de toi ! / Prenez bien soin de vous ! ; 2/ soins (médicaux) (pl.) - eye care : soins oculaires (pl.) - health care : a/ soins (pl.) de santé ; b/ domaine de la santé - intensive care : soins intensifs (pl.), réanimation - to put sb in intensive care : mettre qn en réanimation - [injured person] to receive intensive care : [blessé] recevoir des soins intensifs - urgent care : (les) urgences (f pl.) - to be rushed to urgent care : être conduit aux urgences - care home : maison de retraite, ehpad (établissement d’hébergement pour personnes âgées dépendantes) ; 3/ souci ; 4/ garde (f), charge (f) - (sur une lettre) care of (so and so) : chez (untel) ; 5/ problème, affaire (f) * care (v) (intr.) : 1/ s’intéresser (about, à), tenir (about, à) - Money is all he cares about : Il n’y a que l’argent qui compte pour lui - I don’t care! : Je m’en fiche ! - What do I care? : Qu’est-ce que ça peut me faire ? ; 2/ être attaché(e) (for, à), aimer ; 3/ apprécier - Would you care for a cup of tea? : Est-ce que cela vous dirait de prendre un thé ? ; 4/ s’occuper (for, de), prendre soin (for, de) - to care for an invalid : s’occuper d’un malade * career (n) : carrière (f) - to pursue a career in journalism : faire carrière dans le journalisme - career history : expérience professionnelle (f) - career objective : objectif professionnel - career plan : plan de carrière - careers advisor : conseiller / conseillère d’orientation professionnelle * careerist (n) : arriviste (m/f) * career-oriented (ac) : désireux/-euse de réussir dans sa carrière * care-free / carefree (ac/a) : insouciant(e) - care-free childhood : enfance insouciante (f) * careful (a) : 1/ prudent(e), attentif/-ive - be very careful to + inf. : prenez bien soin de + inf., faites très attention à + inf. ; 2/ soigneux/-euse * carefully (adv.) : 1/ prudemment, attentivement ; 2/ soigneusement, avec soin * carefully scripted (ac) : soigneusement rédigé(e), dont chaque mot est pesé - carefully-scripted statement : déclaration dont chaque mot est pesé * carefully-thought out (ac) : bien étudié(e), bien pesé(e) * caregiver (n) : soignant(e) * care-intensive (ac) : exigeant beaucoup de soin - care-intensive work : travail exigeant beaucoup de soin * careless (a) : négligent(e) * carelessness (n) : négligence (f) * caret (n) : (Inf.) signe d’insertion * caretaker (n) (brit.) : concierge (m/f) (amér. janitor) * cargo (n) (fa) : cargaison (f), chargement, fret, marchandises (pl.) - [plane] to deliver urgent cargo : [avion] acheminer des cargaisons urgentes - The ship sank with its cargo of gold : Le navire sombra avec toute sa cargaison d'or - backhaul cargo : cargaison de retour - bulk cargo : fret en vrac, marchandises en vrac - cargo aircraft : avion cargo, gros appareil de transport - cargo container : conteneur de marchandises - cargo pants (pl.) (amér.) : pantalon de treillis (syn. brit. cargo trousers) - cargo plane : avion cargo - cargo ship : cargo - cargo spacecraft : cargo spatial, vaisseau cargo * cargo-laden (ac) : chargé(e) de marchandises - cargo-laden container : conteneur chargé de marchandises * cargo-worthy (ac) : [navire] sans danger pour la cargaison * caring (a) : attentif/-ve, attentionné(e) * carjacking (n) : détournement de véhicules, éjection d’un conducteur de son véhicule * carjacker (n) : adepte du détournement de véhicules * carmaker (n) (amér.) cf car maker * carnal (a) : charnel(le) * carnival (n) : carnaval * carol (n) : chant de Noël * caroller (brit.) / caroler (amér.) (n) : chanteur de chants de Noël, choriste de Noël * carom (n) : 1/ (le) carambole - carom billiards : (le) billard (de) carambole, (le) billard français - carom player : joueur de billard français - to take carom shots : regarder par la bande, regarder indirectement; 2/ carambolage * carom (v) (intr.) : rebondir * carouse (v) (intr.) : faire la fête * carousel (n) : manège (de chevaux de bois), carrousel (en Suisse) (noter la différence d’orthographe) - on a carousel : sur un manège - carousel ride : tour de manège * carpenter (n) : charpentier * carpet (n) : tapis - carpet made of long wool : tapis de haute laine - tiger carpet : tapis en forme de peau de tigre (aussi tiger-skin carpet) * carpet bomb (vc) (tr.) : bombarder intensivement, arroser de bombes, ensevelir sous les bombes * carpet bombing (nc) : bombardement intensif, pratique du tapis de bombes * carriage (n) : 1/ voiture (f) (tirée par des chevaux) ; 2/ (brit.) wagon (de chemin de fer), voiture (de train) - passenger carriage : voiture (de train) ; 3/ (amér.) - baby carriage : landau * carrier (n) : 1/ chariot ; 2/ (en compo.) porte-[qch] (masc.) - aircraft carrier : porte-avion, porte-aéronef - bicycle carrier : porte-vélo (var. bike carrier) - bottle carrier : porte-bouteille (le casier mobile) ; 3/ transporteur (de passagers aériens, etc.), société de transport, entreprise de transport - air carrier : transporteur aérien - bulk carrier : vraquier, transporteur de vrac - passenger carrier : transporteur de voyageurs ; 3/ affrêteur ; 4/ opérateur de réseau, opérateur télécom - telecommunications carrier : exploitant de réseau de télécommunications ; 5/ sac de courses (syn. carrier bag) ; 6/ harnais - baby carrier : porte-bébé * carrion (n) : charogne (f) - carrion bird : charognard * carry (v) (tr.) : 1/ porter, transporter ; 2/ détenir - to carry large stocks : détenir de grosses réserves (of, de) * carry-all / carryall (n) : fourre-tout, cabas (syn. holdall) * carry away (v) (tr.) : emporter - I got carried away : Je me suis emporté * carrying (n) : transport * carry off (v) (tr.) : emporter * carry on (v) (intr.) : 1/ continuer - to carry on doing sth : continuer à faire qch ; 2/ (fam.) faire des histoires * carry-on (n) (brit.) (fam.) : histoires (f pl.) - to make a carry-on : faire des histoires * carry out (v) (tr.) : exécuter, effectuer, réaliser, procéder à - to carry out a poll : effectuer un sondage - to carry out a task : effectuer une tâche - to carry out sampling checks : procéder à des contrôles par prélèvements * cart (n) : 1/ harrette (f), voiture à bras (f), voiturette (f) - (a) horse and cart : (une) charrette tirée par un cheval - hay cart : charrette à foin ; 2/ chariot - rail cart : a/ wagonnet ; b/ chariot sur rails - self-propelled cart : chariot automoteur * cart about (v) (tr.) : trimbaler (qch), promener (qn) * Cartesian (a) : cartésien (sans maj.) - Cartesian coordinates : coordonnées cartésiennes - Cartesian robot : robot cartésien * cart off (v) (tr.) : emporter (dans une charrette) * carton (n) (fa) : boîte en carton, brique (f) (de lait, de jus de fruit) * cartoon (n) : dessin humoristique - cartoon character : personnage animé * cartoonish (a) : digne d’un dessin animé, caricatural(e) * cartridge (n) : cartouche (f) * carve (v) (tr.) : 1/ découper ; 2/ sculpter * carved (ppa) : sculpté(e) - carved baluster : balustre sculpté * car wash (n) : lave-auto (masc.) (Q) * case (n) : 1/ mallette (f) ; 2/ boîtier, étui, trousse (f), caisse (f) - cigarette case : porte-cigarette (syn. cigarette holder) - needle case : porte-aiguille - pencil case : trousse (d’élève) * case (n) : 1/ cas - a case in point : un parfait exemple, une bonne illustration ; 2/ (fa) procès, affaire criminelle (f), cause judiciaire (f) - to be on a case : s’occuper d’une affaire - the case for… : les arguments en faveur de… - Case closed : L’affaire est close, Affaire classée - cold case : affaire non élucidée, affaire non résolue, affaire classée sans suite - inexplicable case : cas impossible à élucider - textbook case : cas typique, cas d’école - unsolved case : affaire non résolue - in many cases dans bien des cas ; 3/ (Ovni) affaire, incident, cas - abduction case : cas d’enlèvement (par un ovni) - landing case : cas d’atterrissage (d’ovni) - UFO case : affaire ayant trait à un ovni ; 4/ (Gram.) cas (d’une déclinaison) - case endings : désinences casuelles (f pl.) ; 5/ (fam.) numéro (en parlant d’une personne) - He’s a hard case ! : C’est un dur à cuire !, C’est un dur ! * case harden / case-harden (vc) (tr.) : cémenter, durcir en surface * cash (n) : argent comptant, argent liquide, espèces (f pl.), liquidités (f pl.) - (fig.) to hemorrhage cash : perdre de l’argent en abondance - ready cash : argent liquide - cash cow : mine d’or (au fig.) - cash donation : don en espèces - cash flow : marge brute d'autofinancement (MBA), liquidités (f pl.) (d'une entreprise), flux de trésorerie - cash infusion : apport d’argent - cash register : caisse enregistreuse (f) * cash-hemorrhaging (ac) : qui perd de l’argent en abondance, qui est un gouffre financier * cashew (n) : 1/ (l’arbre) anacardier (aussi cashew tree) ; 2/ noix de cajou (aussi cashew nut) * cashier (n) : caissier * cash in (v) (intr.) (fam.) : profiter - to cash in on sth : profiter de qch, tirer profit de qch, exploiter qch * cashless (a) : sans espèces, sans argent comptant, sans pièces de monnaie - the cashless smart card : la carte à puce téléphonique, la télécarte * cash-strapped (ac) : 1/ à court de liquidités ; 2/ à court d’argent * casing (n) : enveloppe (f) - concrete casing : enveloppe de béton * casino (n) : casino - casino resort : établissement de jeu, casino * cask (n) (fa) : 1/ tonneau, fût ; 2/ barrique (f) ; 3/ baril * casket (n) (fa) : (amér.) cercueil - closed casket : cercueil fermé * Caspian (a) : caspien(ne) - the Caspian Sea : la mer Caspienne * Cassandras (sing. Cassandra) : des Cassandre - the Cassandras say that... : les Cassandre disent que... * casserole (n) (fa) : ragoût (cuit et servi dans une cocotte) * cassock (n) : soutane (f) * cassowary (n) (pl. cassowaries) : casoar * cast (n) : 1/ moule, moulage - plaster cast : moulage en plâtre ; 2/ plâtre (pour un membre cassé) - plaster cast : plâtre ; 3/ distribution (f) (des acteurs), acteurs - The film has got a great cast : La distribution est impressionnante * cast (v) (cast, cast) (tr.) : 1/ lancer, jeter - to cast a glance : jeter un coup d’œil - to cast a stone : jeter une pierre ; 2/ fondre, couler (metal, du métal) - to cast in a mould : jeter au moule ; 3/ mouler ; 4/ attribuer les rôles, distribuer les rôles * cast (prét. de to cast) * cast (pp de to cast) * cast back (v) (intr.) : jeter un regard rétrospectif sur - to cast back into the decade that is closing : se reporter à la décennie qui s’achève * -caster (en compo., à droite) : - broadcaster : diffuseur - forecaster : prévisionniste - newscaster (amér.) : présentateur (du journal) - sportscaster : présentateur sportif * castigate (v) (tr.) : 1/ châtier, punir ; 2/ blâmer * casting (n) : 1/ moulage ; 2/ choix des rôles, attribution des rôles, distribution des rôles (l'activité) * castle (n) : château, château-fort * cast off (v) (cast, cast) : (tr.) se défaire de, se débarrasser de ; (intr.) larguer les amarres * castor oil (n) : huile de ricin * casual (a) : 1/ détendu(e), décontracté(e) ; 2/ désinvolte ; 3/ distrait(e) ; 4/ fortuit(e), accidentel(le) ; 5/ occasionnel(le), temporaire - casual gamer : joueur occasionnel * casually (adv.) : 1/ de façon décontractée ; 2/ d’un air désinvolte, avec désinvolture ; 3/ d’un œil distrait ; 4/ fortuitement, par hasard * casualness (n) : 1/ décontraction (f) ; 2/ désinvolture (f), légèreté (f) ; 3/ attitude distraite (f) ; 4/ caractère fortuit ; 5/ caractère occasionnel * casualty (n) (pl. casualties) : victime (f) * casus belli (n) (Lat.) : casus belli (motif d’entrée en guerre) - There is no casus belli : Il n’y a pas de casus belli * cat (n) (fa p): 1/ chat - domestic cat : chat domestique - wild cat : chat sauvage - cat burglar : monte-en-l’air - cat sitter : garde-chat - cat sitting : (la) garde de chats - to let the cat out of the bag : vendre la mèche ; 2/ félin - The leopard is a big cat : Le léopard est un grand félin ; 3/ (= fouet) - cat o’ nine tails : chat à neuf queues * cataclysm (n) : cataclysme, catastrophe (f), calamité (f) * cataclysmic (a) : cataclysmique, catastrophique - a cataclysmic chain of events : une suite catastrophique d’événements * Catalan (n) : Catalan * Catalan (a) : catalan(e) * catalepsy (n) : catalepsie (f) - a case of catalepsy : un cas de catalepsie - catalepsis symptoms : symptômes de catalepsie * catalogue (brit.) / catalog (amér.) : catalogue - spares catalogue : catalogue de pièces de rechange * Catalonia (n pr.) : (la) Catalogne * Catalonian (a) : catalan(e) (sans maj.) * Catalonian (n pr.) : Catalan(e) (l’habitant(e)) * catalytic (a) : catalytique - catalytic converter : pot catalytique * catalyse (brit.) / catalyze (amér.) (v) (tr.) : catalyser * catalysis (n) (pl. catalyses) : catalyse (f) * catapult (n) (fa p) : 1/ catapulte (f) ; 2/ (brit.) lance-pierre (masc.) * catastrophe (n) : catastrophe (f) - to avert a catastrophe : éviter une catastrophe - catastrophe bonds : obligations catastrophe (f pl.) (abr. cat bonds) * catastrophic (a) : catastrophique * catastrophise (brit.) / catastrophize (amér.) (v) (intr.) : mettre les choses au pire, paniquer, dramatiser * catastrophising (brit.) / catastrophizing (amér.) (n) : catastrophisme * catastrophist (n) : adepte du catastrophisme * catch (n) (pl. catches) : 1/ prise (f), pêche (f) - auctioning of the catch : criée (f) ; 2/ piège (syn. trick, snare), entourloupette (f) ; 3/ fermeture (f) * catch (v) (caught, caught) (tr.) : 1/ attraper, prendre - to catch a glimpse of sth : apercevoir qch - to catch olives in the mouth : attraper des olives avec la bouche - to catch sight of sth : apercevoir qch; 2/ déceler, détecter - to catch a problem : repérer une anomalie * catchall (n) : fourre-tout (masc.) * catching (a) : prenant(e) * catch on (v) (caught, caught) (intr.) : marcher bien (with, chez), avoir du succès (with, auprès de), prendre - That won’t catch on! : Ça ne prendra pas ! * catch-penny (nc) : camelote (f) * Catch-22 (n) : dilemme insoluble, cercle vicieux - to face a Catch-22 : être pris dans un cercle vicieux * catch up (v) (tr.) : rattraper - to be caught up in… : se retrouver pris dans…, se retrouver en plein milieu de… * catch-up (mod.) : - catch-up TV : (la) télé de rattrapage (syn. replay TV) * catchword (n) : mot de ralliement, slogan * catchy (a) : 1/ (Mus.) entraînant(e) - catchy tune : air entraînant ; 2/ (Pub.) accrocheur/-euse * category (n) (pl. categories) : catégorie (f) * cater (v) (intr.) : pourvoir aux besoins (for, de (brit.) / to, de (amér.)) - to cater for the needs of : satisfaire les besoins de, pourvoir aux besoins de * caterwaul (n) : 1/ sabbat de chats ; 2/ miaulement * caterwaul (v) (intr.) : faire un sabbat de chats qui se battent ; 2/ miauler * caterwauling (n) : 1/ sabbat de chats, miaulements (pl.) ; 2/ charivari, musique discordante (f) * catfish (n) : 1/ poisson-chat ; 2/ escroc, arnaqueur * catfish (v) (tr.) : escroquer, arnaquer * catgut (n) : boyau * cathedral (n) : cathédrale (f) * Catherine (n pr.) : Catherine - Catherine wheel : soleil (de feu d’artifice) * catnip (n) : herbe aux chats, herbe à chats (fam.), chataire, cataire * cattle (n ind. sing.) : bétail, bêtes (f pl.), bestiaux (pl.) - cattle branding : marquage du bétail, ferrage du bétail - cattle breeder : éleveur de bovins - cattle cake : tourteau pour le bétail - cattle farmer : éleveur de bétail (syn. cattle rancher) * catty (a) : méchant(e), malveillant(e), rosse, vache (fam.) (syn. bitchy) * caucus (n) (pl. caucuses) (amér.) : 1/ réunion d’état-major ; 2/ réunion de militants d’un parti, comité électoral * caught (prét. de to catch) * caught (pp de to catch) * cauldron (n) : chaudron * causation (n) : 1/ action de causer (qch) ; 2/ (Didact.) causation (f) * cause (n) : 1/ cause (f), raison (f) - root cause : cause première, cause fondamentale, source ; 2/ cause (à défendre) - great cause : grande cause – lost cause : a/ cause perdue, cause désespérée ; b/ peine perdue (f) - It’s a lost cause : C’est peine perdue - worthy cause : bonne cause, noble cause * cause (v) (tr.) : 1/ causer, entraîner - to cause a breach of the peace : troubler l'ordre public - to cause confusion : être source de méprises - to cause havoc : causer des dégâts ; 2/ (+ prop. inf.) faire + inf. - to cause the ruin of… : entraîner la ruine de… * causeway (n) : chaussée (f) * caution (n) (fa) : 1/ prudence (f) - Drive with caution : Soyez prudent en conduisant ; 2/ avertissement, appel à la prudence * caution (v) (tr.) (fa) : avertir, mettre en garde * cautionary (a) : d’avertissement * cautious (a) : prudent(e), circonspect(e) * cautiously (adv.) : prudemment, avec circonspection * cautiously optimistic (ac) : d’un optimisme prudent * cavalcade (n) : cavalcade (f) - horse cavalcade : (Camargue) abrivade (f), charge (f) * cave (n) (fa) : caverne (f), grotte (f) - blowing cave : caverne respirante - breathing cave : caverne respirante - cave lion : lion des cavernes * caveat (n) : avertissement, mise en garde - The source can be cited, but with the proper caveats : On peut citer la source mais avec les réserves d’usage * cave in (v) (intr.) : s'affaisser * cave-in (n) : affaissement - cave-in at a mine : affaissement dans une mine * caveman (n) : homme des cavernes * caver (n) (amér.) : spéléologue (m/f), spéléo (abr.)- (syn. brit. potholer) - pro caver : spéléo professionnel * caving (n) (amér.) : spéléologie (f) (syn. brit. potholing) * cavity (n) : cavité (f) * cavort (v) (intr.) : cabrioler (fam.) * caw (n) : croassement * caw (v) (intr.) : croasser * C-collar (n) : minerve (f) - to put sb in a C-collar : mettre une minerve à qn * CD (n) (init. de civil defence (brit.) / civil defense (amér.) : (la) défense civile) * CD (n) (pl. CDs) (init. de compact disc) : (Mus.) disque audionumérique, CD (inv.), disque argenté, galette (f) (fam.) - to burn files to a CD : graver des fichiers sur un CD - to copy from a CD : copier à partir d’un CD - to pop a CD into one's CD drive : glisser un CD dans son lecteur de CD - audio CD : CD audio - blank CD : CD vierge - recovery CD : CD de réinstallation - CD burner : graveur de CD - CD player : lecteur de CD * CE (n) : 1/ init. de concurrent engineering : (l’)ingénierie en parallèle (intégration de la concption et de la production) ; 2/ init. de Common Era (lit. ère courante (f), ère en cours) : de notre ère, apr. J.-C., AD (Anno Domini) * cease (v) : (tr.) cesser, arrêter - to cease operations : cesser ses activités - to cease production of : arrêter la production de - to cease to exist : cesser d’exister ; (intr.) cesser * cease and desist (v coord.) (Droit amér.) : (intr.) s’abstenir définitivement (from sth / doing sth, de qch / de faire qch) - to cease and desist from a pratice : cesser immédiatement une pratique * cease-and-desist (mod.) : - cease-and-desist letter : lettre de mise en demeure - cease-and-desist order : ordonnance de cessation et d’abstention * ceasefire (n) : cessez-le-feu (var. ortho. cease-fire) * cedilla (n) : cédille (f) - the c-cedilla : le c-cédille * ceiling (n) : 1/ plafond - ceiling covings : voussures de plafond - ceiling light : plafonnier ; 2/ (fig.) plafond - service ceiling : (Aéro.) plafond d’exploitation * celebrity (n) : 1/ célébrité (f) (la chose) ; 2/ célébrité (f) (la personne) - celebrity fluff : ragots mondains (pl.) (syn. celebrity gossip) - celebrity photographer : photographe des célébrités - celebrity roast : mise en boîte de célébrités, bien-cuit de célébrités (Q) - celebrity worship : culte des célébrités * celestial (a) : céleste * celibacy (n) : célibat * celibate (a) : célibataire * cell (n) : 1/ cellule (f) (de prison) - a row of cells une rangée de cellules ; 2/ cellule (d’usinage) - machining cell : cellule d'usinage, cellule de tournage ; 3/ cellule (d’électrolyse) - electrolysis cell : cellule d’électrolyse ; 4/ cellule (du corps humain) - grey cells : cellules grises (f pl.), matière grise (f), cerveau - nerve cell : cellule nerveuse * cell (n) (abr. de cell phone : téléphone portable) (amér.) : portable (n) - My cell is ringing : Mon portable sonne * cellar (n) : 1/ cave (f) - coal cellar : cave à charbon - wine cellar : cave à vin ; 2/ caveau - cellar club : caveau (où joue un orchestre de jazz) * cello (n) : violoncelle * cellophane (n) : cellophane - cellophane packet : sachet en cellophane * cellist (n) : 1/ violoncelliste ; 2/ celluliste * cellphone (n) (amér.) : téléphone cellulaire * cellular (a) : cellulaire - cellular manufacturing : (Usin.) fabrication en cellules (flexibles) - the cellular phone : le téléphone cellulaire * cement (n) : ciment - cement mixer : bétonnière (f), bétonneuse (f) * cement (v) (tr.) : cimenter * cemetery (n) (pl. cemeteries) : cimetière * censer (n) : encensoir * censor (n) : censeur * censor (v) (tr.) : censurer * censorious (a) : [attitude] de censure, [individu] porté(e) à la censure - censorious attitude : attitude de censure - censorious site : site porté à la censure * censorship (n) : censure - censorship board : commission de censure * censorware (n ind. sing.) : logiciels de censure (pl.) * census (n) : recensement * cent (n) : 1/ centième partie d’un dollar - Your two cents? : Deux petits ronds pour vos pensées ? (in Duel dans la boue de Richard Fleischer, 1959) ; 2/ centime ; 3/ sou * center (amér.) / centre (brit.) (n) : 1/ centre - to be the centre of attention : être le centre d’attention, être le point de mire ; 2/ (selon le cas) foyer, bureau, centre - business centre : quartier d’affaires, quartier commercial - community center (amér.) : foyer municipal - decision-making centre : centre décisionnel, centre de décision - design centre : bureau d’études - fulfilment centre : centre logistique - job centre : agence pour l’emploi - learning centre : centre éducatif - space center : (États-Unis) centre spatial ; cosmodrome (Russie) - test centre : centre d’essais ; 3/ (Usin.) poste, unité, centre - machining centre : poste d’usinage, centre d’usinage, unité d’usinage * center (amér.) / centre (brit.) (v) (tr.) : centrer * centerfold (amér.) / centrefold (brit.) : 1/ pages centrales détachables (pl.) ; 2/ photo de fille sur double page * centering (amér.) / centring (brit.) (n) : centrage * central (a) : central(e) - central bank : banque centrale - central planning : planification centralisée * centre left (ac) : de centre-gauche - centre left party : parti de centre-gauche * centre right (ac) de centre-droit * centric (a) (en compo., à droite d’une subst.) : centré(e) sur, focalisé(e) sur, se focalisant sur * centricity (n) : centrage, focalisation (f) - buyer centricity : focalisation (sur l’)acheteur - customer centricity : centrage (sur le) client, focalisation (sur le) client (syn. client centricity - anton. product centricity : focalisation (sur le) produit) - data centricity : focalisation (sur les) données numériques - employee centricity : focalisation (sur l’)employé - Net centricity : focalisation sur la Toile - service centricity : focalisation (sur l’)après-vente - user centricity : focalisation (sur l’)utilisateur * centrifugal (a) : centrifuge (a) * centrifuge (n) : centrifugeuse (f) * centripetal (a) : centripète - centripetal force : force centripète (f) * century (n) (pl. centuries) : siècle - the 21st century : le 21e siècle - to be centuries old : être vieux/vieille de plusieurs siècles * centuries-old (ac) : vieux/vieille de plusieurs siècles, séculaire - centuries-old tradition : tradition séculaire (f) * CEO (n) (init. de chief executive officer) : directeur général, directrice générale * ceramic (a) : en céramique - ceramic insert : (Usin.) plaquette en céramique * ceramics (n) : 1/ (sing.) (la) céramique ; 2/ (pl.) matériaux céramiques * ceremony (n) (pl. ceremonies) : cérémonie (f) - graduation ceremony : cérémonie de remise des diplômes - maiden ceremony : cérémonie inaugurale, inauguration (f) * cert (n) (tronc.de certificate : certificat) * cert (n) (tronc. fam. de certainty : certitude) - It’s a cert : Rien n’est plus sûr - a dead cert : une certitude absolue * certain (a) : certain(e) * certainly (adv.) : certainement * certificate (n) : 1/ certificat - certificate of completion of training : certificat de fin de stage - training certificate : certificat de stage ; 2/ brevet - the junior school certificate (France) : le brevet des collèges * certification (n) : homologation (f) * certify (v) (tr.) : certifier * cesspool (n) : fosse septique (f) * chafe (v) (lit.) : 1/ (tr.) frotter ; 2/ (tr.) irriter ; (intr.) s'irriter * chaff (n) : 1/ (de la) balle - wheat chaff : balle de blé ; 2/ (l’)ivraie (f) * chaff (v) (tr.) : taquiner * chagrin (n) (fa) : (vif) dépit, (grande) déception (f), contrariété (f) - much to my chagrin : à ma grande déception * chagrin (v) (tr.) (fa) : dépiter, décevoir, contrarier * chain (n) : 1/ (en métal) chaîne (f) - key chain : porte-clé - watch chain : chaîne de montre - chain making : fabrication de chaînes ; 2/ (fig.) chaîne (de magasins, de fabrication industrielle) - food chain : chaîne alimentaire - manufacturing chain : chaîne de production - supply chain : chaîne d’approvisionnement, chaîne logistique - welding chain : chaîne de soudage * chain (v) (tr.) : chaîner * chain-driven (ac) : actionné(e) par chaîne, à chaîne - chain-driven rear wheel : roue arrière entraînée par chaîne * chain smoke (v) (intr.) : fumer cigarette sur cigarette * chair (n) (fa) : 1/ chaise (f) - push chair (brit.) : poussette (f) ; 2/ (pour armchair) fauteuil ; 3/ chaire (universitaire) (f) ; 4/ (pour chairperson) président * chairman (n) : président - Chairman Roger B. Smith : (titre) le président Roger B. Smith * chairmanship (n) : présidence (f) (la position mais aussi la durée) * chairwoman (n) : présidente (f) * chalk (n) : craie (f) - piece of chalk : bout de craie * chalkboard (n) : tableau noir (syn. blackboard) * challenge (n) : 1/ défi (à relever) - to address a challenge : relever un défi (syn. to take up a challenge, to accept a challenge) - to rise to the challenge : se montrer à la hauteur du défi ; 2/ remise en cause, remise en question, contestation * challenge (v) (tr.) : 1/ défier ; 2/ remettre en cause, remettre en question, contester * challenging (a) : qui implique des efforts * chamber (n) : chambre (f) * champ (v) (tr.) : mâchonner * champing (n) : mâchonnement * champion (n) : champion/-ionne * champion (v) (tr.) : se faire le champion de, défendre - to champion the truth : se faire le défenseur de la vérité * chance (n) (fa) : 1/ possibilité (f), éventualité (f), occasion (f) - the chance to + inf. : la possibilité de + inf. - No chance! (fam.) : Tu peux / Vous pouvez toujours courir !, Ce n'est pas demain la veille ! - whenever you get a chance : chaque fois que vous en avez l’occasion ; 2/ probabilité (f), hasard, risque - by chance : par hasard - the chance of error : les risques d'erreur - the chances are that... : il y a toutes les probabilités pour que... - to take chances : prendre des risques * chancellor (n) : chancelier - the Lord Chancellor (brit.) : le Grand Chancelier, le Ministre de la justice, le Garde des sceaux * chancellorship (n) : chancelariat * chancy (a) : hasardeux/-euse, risqué(e) * chandelier (n) (fa) : lustre * change (n) (fa) : 1/ changement, dérèglement - (abrupt) climate change : dérèglement climatique (brusque) - human-induced climate change : dérèglement climatique provoqué par l'homme (syn. man-made) - to tackle climate change : s'attaquer au dérèglement climatique ; 2/ monnaie (rendue) (f), monnaie (en poche) - You haven't given me my change : Vous ne m'avez pas rendu la monnaie - Have you got change for a five-pound note? : Avez-vous la monnaie d'un billet de 5 livres ? - the small change in my pocket : la menue monnaie dans ma poche - change purse (amér.) : porte-monnaie (masc.) * change (v) (tr.) : changer de - to change colours : changer de couleur - to change horizons : changer d’horizon - to change shape : changer de forme * changeability (n) : versatilité (f) * changeable (a) : versatile * changed (ppa) : changé(e) - That’s all changed! : Tout cela est changé ! * changer (n) : 1/ système de changement, changeur - tool changer (Usin.) : système de changement d’outils, changeur d’outils ; 2/ - game changer (fig.) : élément qui change la donne, renversement des choses, renversement de situation * changing (n) : (l’)action de changer, (le) changement - diaper changing : (le) changement des couches(-culottes) * Channel (n pr.) : (Géogr.) (la) Manche - the Channel Tunnel : le tunnel sous la Manche * channel (n) : 1/ canal ; 2/ voie (f) ; 3/ chaîne (f) (de télé) - cable channel : chaîne câblée - pay channel : chaîne payante - satellite channel : chaîne diffusée par satellite * chant (n) : 1/ chant scandé ; 2/ mélopée (f) * chant (v) : 1/ (tr.) scander ; (intr.) scander des slogans ; 2/ (tr. et intr.) psalmodier * chanteuse (n) (pron. shantoosee) : chanteuse de cabaret * chaos (n) : chaos - utter chaos : chaos absolu - to be in utter chaos : être en plein chaos * chap (n) (fam.) : type, gars, individu - old chap! : mon vieux ! * chap (v) : (tr.) gercer ; (intr.) se gercer * chapped (ppa) : gercé(e) - chapped lips : lèvres gercées (f pl.) * chapel (n) : chapelle (f) * chaplain (n) : aumônier * chaplaincy (n) : aumônerie (f) * ChapStick / chapstick (n de marque) : baume à lèvres, baume pour les lèvres (aussi Chap Stick / chap stick) * chapter (n) : chapitre - book chapter : chapitre de livre * char (n) (brit.) : thé * char (n) (abr. de charwoman : femme de ménage) * char (v) (tr.) : 1/ faire brûler, brûler ; 2/ carboniser * character (n) (fa) : 1/ caractère (d'un personnage de roman, etc.) - cartoon character : personnage animé ; 2/ personnage - He is a great character : c'est un original ; 3/ réputation (f) * charade (n) : 1/ (au pl. charades) charades (le jeu) (f pl.) - to play charades : jouer aux charades ; 2/ mascarade (f), parodie (f), simulacre (m), comédie (f) * charcoal (n) : 1/ charbon de bois - charcoal burner charbonnier ; 2/ fusain - to sketch with charcoal : dessiner au fusain - charcoal drawing : dessin au fusain ; 3/ (pl. charcoals) dessin au fusain, croquis au fusain * charge (n) (fa p) : 1/ charge (f), attaque (f) ; 2/ inculpation (f), mise en examen - He's on a charge of murder : Il est inculpé de meurtre ; 3/ (svt au plur.) accusation (f) - The government rejected charges that it was mismanaging the economy : Le gouvernement a rejeté l'accusation selon laquelle il gérait mal l'économie - damaging charges : accusations préjudiciables - treason charges : accusations de trahison ; 4/ (svt au pluriel) poursuites (f pl.) - to press charges against sb : engager des poursuites contre qn ; 5/ prix à payer - What is the charge for delivery? : Combien coûte la livraison ? - free of charge : gratuit(e) - charges (pl.) : frais - to incur extra charges : encourir des frais supplémentaires – impound towing charges : frais de remorquage d’un véhicule saisi ; 6/ (idée de responsabilité) Who is in charge? : Qui est le responsable ? ; 7/ meuble héraldique - The three lions are charges on the English coat of arms : Les trois lions sont les meubles sur les armoiries d'Angleterre * charge (v) (tr.) (fa) : 1/ charger (une pile, un fusil ; aussi un blason ou un drapeau) ; 2/ inculper, mettre en examen - The police have charged him with murder : La police l’a inculpé de meurtre - to be charged on the count of manslaughter : être accusé d’homicide ; 3/ faire payer, facturer - Do you charge for this service? : Ce service est-il gratuit ? - to charge highly : faire payer cher * charge back (v) (tr.) : - to charge back sth to sb : se faire rembourser qch par qn, facturer qch à qn - to charge back the costs to sb : imputer les coûts à qn * charge back / charge-back (mod.) : de remboursement, de rétrofacturation - charge back system : système de remboursement * charger (n) : destrier (cheval de bataille) * chariot (n) (fa) : char * charitable (a) : 1/ charitable ; 2/ de charité, de bienfaisance * charity (n) (fa p) : 1/ charité (f) ; 2/ (pl. charities) œuvre de bienfaisance, association caritative (f) * charm (n) : 1/ charme, sortilège - bad-luck charm : porte-bonheur (masc.) - good-luck charm : porte-malheur (masc.) - lucky charm : porte-bonheur ; 2 / charme, séduction (f) * charm (v) (tr.) : charmer, séduire * charmer (n) : charmeur - snake charmer : charmeur de serpents * charming (a) : charmant(e) * charmless (a) : sans charme, dénué(e) de charme * charred (ppa) : carbonisé(e) * chart (n) (fa) : 1/ charte - charter school : école privée sous contrat ; 2/ diagramme, schéma - pie chart : diagramme circulaire, camembert ; 3/ (pl. charts) classements, meilleures ventes (f pl.) , palmarès (sing.) - to be in the charts : être dans les classements - to get into the charts : parvenir au rang des grands sucès du disque - the albums charts : le classement des albums - the singles chart : le classement des singles * chart (v) (tr.) : porter sur une carte, porter sur un graphique * charter (n) : charte (f), statuts (pl.) * charter (mod.) : affrété(e), nolisé(e) (Q) - charter firm : société d'affrètement * charter (v) (tr.) : affréter (un véhicule), louer (un véhicule) * chartered (ppa) : affrété(e), nolisé(e) (Q) * chart-topping (ac) : (Mus.) qui est en tête des classements, qui est classé premier/première * chary (a) : 1/ prudent(e), circonspect(e) ; 2/ réservé(e) (of, en matière de), peu prodigue (of, de) - He is chary of compliments : Il est avare de compliments * chase (v) (fa) : 1/ (tr.) poursuivre, courir après ; (intr.) to chase after sth : courir après qch ; 2/ (tr.) graver, ciseler, relever en bosse (sur du métal) * chase (n) : poursuite (f), chasse (f), traque (f) - high-speed chase : poursuite à grande vitesse - police chase : course de police, course-poursuite (f) - chase scene : (Cin.) scène de poursuite - to give chase to a UFO : se lancer à la poursuite d'un ovni – (fig.) to cut to the chase : aller droit au but, aller à l’essentiel * chaser (n) : poursuivant, chasseur - fly chaser : chasse-mouche (masc.) - storm chaser : chasseur d’orages - tornado chaser : chasseur de tornades * chasing (n) : poursuite (f), traque (f), chasse (f) - storm chasing : chasse à l’orage, chasse aux orages, traque des orages - tornado chasing : chasse à la tornade, chasse aux tornades, traque des tornades * chasings (n pl.) : saignées (f pl.) - masonry chasings : saignées de maçonnerie * chasm (n) : 1/ (au pr.) gouffre, abîme ; 2/ (au fig.) gouffre ; 3/ faille (temporelle) (f) * chassis (n) : 1/ châssis (d’auto, d’engin) - steel chassis : châssis en acier - tubular spaceframe chassis : châssis à structure spatiale tubulaire ; 2/ cadre (de moto) * chasten (v) (tr.) (lit.) : châtier (syn. to punish) * chastise (v) (tr.) : 1/ châtier, punir ; 2/ réprimander - to chastise sb for sth : reprocher qch à qn -to chastise sb for doing sth : reprocher à qn d’avoir fait qch * chastity (n) : chasteté (f) - girdle of chastity : ceinture de chasteté * chat (n) (brit.) (fa) : bavardage, causerie (f), (brin de) causette (f), conversation (f) - fireside chat : causerie au coin du feu - chat show : débat télévisé, émission-débat (f) (syn. talk show) * chatbot (n) : (IA) agent conversationnel * chateau (n) (pl. chateaux) : château * chattel (n) : bien meuble - He went away with all his goods and chattels : Il s’en est allé avec ses cliques et ses claques * chatter (n) : bavardage * chatter (v) (intr.) : jacasser * chatty (a) : causant(e), qui aime bavarder, bavard(e) (syn. talkative) * chauvinism (n) : 1/ chauvinisme . 2/ machisme * chauvinist (a) (fa p) : 1/ chauvin(e) ; 2/ machiste, macho (fam.) * cheap (a) : 1/ (à) bon marché, à bas prix, pas cher (fam.) - cheap imports : importations à bon marché - cheap labour heaven : pays à la main-d’œuvre bon marché ; 2/ (de) bas de gamme, de qualité médiocre ; 3/ [plaisanterie, remarque] facile - cheap jest : plaisanterie facile : 4/ [individu] radin(e) ; 5/ dans expression on the cheap : au rabais, pour pas cher * cheap (adv.) : à bon marché - I got it cheap : Je l’ai eu pour pas cher * cheapen (v) (tr.) : 1/ abaisser le prix de, déprécier, abaisser la valeur de, dévaloriser, brader ; 2/ rabaisser, avilir * cheaply (adv.) : 1/ à bas prix, à petit prix, à peu de frais, pour pas cher (fam.) ; 2/ avec mauvais goût * cheapskate (n) : pique-sou, radin (syn. : tight arses (vulg.) - I never saw such cheapskates : Je n’ai jamais vu des gens aussi radins * cheat (v) (tr.) : (tr.) tromper ; (intr.) tricher, frauder - to cheat on a test : (Éduc.) tricher à une interro, frauder à un contrôle - to cheat oneself with words : se payer de mots * cheating (n) : triche (f), fraude (f) (à un examen) * cheat-proof (ac) : à l’épreuve des filous * check (n) : étoffe à carreaux - check shirt : chemise à carreaux * check (n) : 1/ vérification (f), contrôle - to undergo checks : subir des vérifications, être soumis(e) à des vérifications - consistency checks : tests de cohérence - final check : vérification ultime - regular check : visite d’inspection programmée - sampling check : contrôle par prélèvement d’un échantillon - ultraviolet checks : contrôles aux (rayons) ultraviolets - check list : voir checklist ; 2/ frein (au fig.) - checks and balances : (Pol.) freins et contrepoids, équilibre des pouvoirs - to keep in check : tenir en bride ; 3/ chèque ; 4/ (pour pay check) paie (f) - to receive one’s check : toucher sa paie * check (v) (tr.) : 1/ vérifier, contrôler (syn. to verify) - to check one’s diary : vérifier son agenda - to check... for... : vérifier sur ... s'il n'y a pas de... - to check sth with a manufacturer : vérifier qch auprès d'un fabricant ; 2/ contenir, réfréner ; 3/ mettre en échec, neutraliser ; 4/ faire enregistrer (un bagage) ; 5/ cocher * check back (v) (intr.) : revenir vérifier, revenir voir (sur un site web) - Check back for updates : Revenez sur le site pour voir s’il y a du neuf * check-in (n) : 1/ enregistrement ; 2/ inspection - check-in point : point où l’on signale sa présence, point de contrôle (dans une ronde) * check in (v) : 1/ (tr.) enregistrer ; (intr.) s’enregistrer ; 2/ pointer (le matin) à l’arrivé ; 3 / (intr.) faire le point * checklist (n) : liste à cocher, liste de choses à faire, liste récapitulative, liste de vérification(s), liste de contrôle(s), bordereau de contrôle, contrôles à effectuer * check off (v) (tr.) : marquer comme étant vérifié - to check off a box : cocher une case * check-out / checkout (n) : contrôle, vérification, test - final check-out : contrôle final - checkout software : logiciels (pl.) de tests * check out (v) : 1/ (tr.) vérifier, tester, mettre au point - to check out prices : relever et comparer les prix ; 2/ (intr.) pointer (le soir) à la sortie * checkpoint (n) : point de contrôle, poste de contrôle - airport security checkpoint : point de contrôle de la sécurité dans un aéroport * check-up (n) : examen (médical), visite médicale * cheek (n) : joue * cheer (n) : 1/ acclamation, hourra, ovation - A cheer goes up : Il y a une ovation - Cheers! a/ À la tienne / vôtre !, Santé !, Tchin tchin ! ; b/ (brit.) Merci ! - Cheers, mate ! : Merci, vieux ; c/ (brit.) Salut ! ; 2/ encouragement - cheer leader : meneur/-euse de claque (Q) - cheer team : troupe de chauffeurs de salle ; 3/ liesse, réjouissance * cheer (v) : 1/ (tr.) acclamer, applaudir ; (intr.) pousser des hourras ; 2/ (tr.) encourager ; (intr.) pousser des cris d’encouragement ; 3/ (tr.) réjouir * cheerful (a) : joyeux/-euse, gai(e), enjoué(e), jovial(e) * cheerfully (adv.) : joyeusement, gaiement, avec entrain * cheerily (adv.) : joyeusement * cheerless (a) : déprimant, triste, morne * cheerleader (n) : meneur de claque (si homme), meneuse de claque (si femme) (Q) (aussi cheer leader) * cheerleading (n) : (la) claque (Q) * cheer up (v) : (tr.) dérider ; (intr.) se dérider * cheery (a) : gai(e), joyeux/-euse * cheese (n) : fromage - cheese with rind : fromage en croûte - hard cheese : fromage à pâte dure - That’s hard cheese! : C’est pas de veine ! - cheese mite : mite du fromage * cheese off (v) (tr.) (arg. brit.) : énerver (qn), agacer (qn), gonfler (qn) (fam.) - to be cheesed off : en avoir marre * cheesy (a) : 1/ au fromage ; 2/ qui a un goût de fromage ; 3/ (fam.) ringard(e) * cheetah (n) : guépard * chef (n) (fa) : cuisinier * chemical (a) : chimique - chemical farming : agriculture chimique - chemical works : usine de produits chimiques * chemical (n) : produit chimique * chemically (adv.) : chimiquement * chemically correct (ac) : stoëchiométrique - chemically correct mixture : mélange stoëchiométrique * chemically etch (vc) (tr.) : usiner chimiquement * chemically intensive (ac) : à fort usage de produits chimiques - chemically intensive agricultural practices : pratiques agricoles à fort usage de produits chimiques * chemical-resistant (ac) : résistant aux produits chimiques - chemical-resistant overalls : salopette résistant aux produits chimiques * chemi-etch (vc) (abr. de chemically etch) : (tr.) usiner chimiquement * chemist (n) (fa p) : 1/ chimiste (m/f) ; 2/ (brit.) pharmacien, pharmacienne * chemistry (n) : (Éduc.) (la) chimie - physics and chemistry : (la) physique-chimie * chemo (n) (tronc. de chemotherapy : chimiothérapie) (f), chimio (f) * Chernobyl-like (ac) : du type Tchernobyl - Chernobyl-like disaster : catastrophe du type Tchernobyl * cherry (n) (pl. cherries) : cerise (f) * cherry pick / cherry-pick (v) (tr.) : trier sur le volet, sélectionner, choisir le meilleur * cherry picker / cherry-picker (n) : coureur de bonnes affaires, acheteur opportuniste * cherry picking / cherry-picking (n) : 1/ tri sur le volet, tri sélectif, sélection (f) ; 2/ sélection arbitraire (f), sélection biaisée, choix partial * cherub (n) (pl. cherubim) : chérubin * chest (n) : 1/ poitrine (f) - to get something off one's chest : vider son sac - flat chest : poitrine plate ; 2/ coffre - chest of drawers : commode (n) (f) - war chest : trésor de guerre * chestnut (n) : 1/ châtaigne (f) - horse chestnut : marron (le fruit) - chestnut tree : châtaignier ; 2/ (fig.) - old chestnut : vieille rengaine (f), vieille scie (f), plaisanterie usée (f) ; 3/ (Journ.) sujet revenant de manière cyclique, marronnier (syn. amér. evergreen) * chestnut (a) : châtain (pour des cheveux), marron, noisette (pour des yeux) - chestnut hair : cheveux châtains * chevy (n) (abr. de Chevrolet, nom de marque automobile) : Chevrolet * chew (v) (tr.) : mâcher * chewable (a) : à mâcher, à croquer * chewing (n) : mâchage - chewing gum : (de la) gomme à mâcher * chew up (v) (tr.) : mettre en morceaux * chicanery (n) : fourberies (f pl.), ruses (f pl.) - political chicanery : magouilles politiques (f pl.), manœuvres politiques (f pl.) * chick (n) : 1/ poussin ; 2/ (fig.) (amér.) fille (f), poule (f), pépée (f) - Look at that chick! : Regarde-moi / Regardez-moi cette nana ! * chicken (n) : 1/ poulet - chicken escalope : escalope de poulet - chicken farmer : éleveur de poulets, aviculteur ; 2/ poule mouillée (f), poltron, poltronne - Chicken! (insulte) : Poule mouillée ! * chickpea (n) : pois chiche - chickpea fritter : beignet au pois chiche * chide (v) (tr.) : gronder * chief (a) : principal(e), en chef - chief designer : concepteur en chef - chief executive : président directeur général, PDG * chief (n) : chef, patron, responsable - production chief : responsable de la production, chef de fabrication - station chief : (Intel.) chef de station, chef d’antenne * chieftain (n) (fa) : chef de clan, chef de tribu * chilblain (n) : engelure (f) * child (n) (pl. children) : enfant (m/f) - to be with child : attendre un enfant - brain child : idée personnelle (f), invention personnelle (f) - disadvantaged children : enfants défavorisés - the golden child : a/ l’enfant chéri ; b/ l’enfant prodige - child abuse : violences contre les enfants - child prodigy : jeune prodige - child rapist : violeur d’enfants, pédophile - children’s home : foyer pour enfants - child molestation : atteintes sexuelles sur mineurs, corruption de mineurs * childbirth (n) : accouchement - to die in childbirth : mourir lors de l’accouchement * childe (n) : fils de famille noble * child-friendly (ac) : conçu(e) pour les enfants, aménagé(e) pour les enfants * childhood (n) : enfance (f) - early childhood : petite enfance - to regress to childhood : retomber en enfance * childish (a) : enfantin(e), puéril(e) * childishly (adv.) : de façon puérile * childless (a) : sans enfants - childless couple : couple sans enfants * childlessness (n) : 1/ fait de ne pas avoir d’enfants, absence d’enfants (dans un couple) ; 2/ infécondité * children (pl. irrég. de child) : enfants (pl.) * Chile (n pr.) : (le) Chili * Chilean (a) : chilien(ne) (sans maj.) * Chilean (n pr.) : Chilien (le ressortissant) * chill (a) : glacial(e) * chill (n) : coup de froid, refroidissement * chill (v) (tr.) : mettre au frais, tenir au frais * chilled (ppa) : tenu(e) au frais, frais/fraîche - chilled beer : bière fraîche (f) * chilling (a) : à glacer le sang, qui glace le sang - chilling prediction : prédiction glaçante * chilling (n) : mise au frais * chill out (v) : (tr.) détendre ; (intr.) se détendre, se relaxer, décompresser * chill-out (a) : relaxant(e) - chill-out music : musique relaxante (f) * chime (n) : carillon, sonnerie (f) - wind chime : carillon éolien * chime (v) (intr .) : [cloches] sonner * chimera (n) (pl. chimeras) : 1/ (la créature) chimère (f) ; 2/ (que l’on poursuit) chimère (f), rêve irréalisable * chimerical (a) : chimérique * chimney (n) : cheminée (f) - chimney stack : souche de cheminée * chin (n) : menton - to stroke one's chin : se caresser le menton - to keep one’s chin up : garder courage - chin dimple : fossette (f) au menton * China (n pr.) : (la) Chine * China (n ind. sing.) : porcelaine (f) - China shop : magasin de porcelaine * Chinese (a) : chinois(e) (sans maj.) - Chinese lantern : lanterne chinoise (f) * Chinese (n pr.) : Chinois (le ressortissant) * Chink (n) (péj.) : Chinetoque (péj.) * chink (n) : fente (f) * chinless (a) : 1/ au menton fuyant ; 2/ (fig.) lâche * chinwag (n) (arg. brit.) : causette, papotages - to have a chinwag : papoter * chip (n) : 1/ copeau - chip disposal : (Usin.) évacuation des copeaux ; 2/ frite - chip shop : friterie, marchand de frites ; 3/ jeton - blue chips : valeurs refuge, valeurs vedette ; 4/ puce (électronique) - image sensor chip : puce de capteur d’images - memory chip : puce de mémoire - RAM chip : circuit de mémoire vive - ROM chip : circuit de mémoire morte - silicon chip : puce de silicium - chip maker : fabricant de puces - chip manufacturer : fabricant de puces ; 5/ (expressions) to have a chip on one’s shoulders : être aigri(e), en vouloir au monde entier * chip (v) (tr.) : ébrécher * chipless (a) : sans copeaux - chipless profiling (Usin.) : façonnage sans copeaux * chipmunk (n) : écureuil (d’Amérique du Nord), tamia (masc.) * chipper (n) : broyeuse (f), déchiqueteuse (f) - wood chipper : broyeuse à bois, broyeuse de branches, déchiqueteuse à bois * chippings (n pl.) (brit.) : éclats (pl.), copeaux (pl.), gravillons (pl.) - Loose chippings : « Attention, gravillons » * chippy (n) : baraque à frites, marchand de frites, friterie (f) * chipset (n) : (Inf.) jeu de circuits, circuit primordial * chiromancy (n) : chiromancie (f) (syn. palmistry) * chirp (n) : pépiement * chirp (v) (intr.) : pépier * chirpy (a) : qui bavarde gaiement * chisel (n) : ciseau - chisel marks (on a stone) : marques de taille au ciseau (sur une pierre) * chives (n) : ciboulette (f), civette (f) * chocolate (n) : chocolat - chocolate bun : petit pain au chocolat * choice (n) : choix - to make a choice : faire un choix * chock–a-block (brit.) / chockablock (amér.) (a) : 1/ plein à craquer, plein à ras bord, plein comme un œuf ; 2/ noir de monde * choir (n) : chœur * choke (v) : (tr.) étouffer ; (intr.) s’étouffer - to choke on sth : suffoquer au contact de qch * chokehold (n) : prise d’étranglement - to put sb in a chokehold : faire une prise d’étranglement à qn (aussi choke hold) * chokingly (adv.) : d’une voie étranglée * chomp (v) (intr.) : mâcher (bruyamment) - to chomp on sth : mâchonner qch * chomper (n) : mâchonneur/-euse - cigar chomper : mâchonneur de cigares * choose (v) (chose, chosen) (tr.) : choisir (from, parmi) * choosy (a) : difficile, qui fait des manières * chop (n) : côtelette (f) - chop house : petit restaurant * chop (v) (tr.) : couper, découper, hacher - to chop to death : tuer à coups de hache * chop down (v) (tr.) : abattre à coups de hache * chopper (n) : 1/ couperet, hachoir ; 2/ coupeur - head chopper : coupeur de têtes ; 3/ (amér.) (= chopped bike) moto modifiée (f), moto réduite ; 4/ hélico (fam.) * chopping (n) : découpage, hachage - chopping board : planche à découper, planche à hacher * choppy (a) : [mer, fleuve] agité(e) * chopstick (n) : baguette (f) (servant à manger) * chord (n) : (Mus.) accord - to strike a chord with sb : faire vibrer la corde sensible chez qn * chore (n) : tâche (f), corvée (f) * chorister (n) : choriste (m/f) * chortle (n) : gloussement * chortle (v) (intr.) : glousser * chorus (n) : 1/ chœur, chorale (f) - chorus girl : a/ choriste ; 2/ danseuse (f) ; 2/ refrain ; 3/ (Jazz) thème de départ, solo improvisé (sur ce thème) * chose (prét. de to choose) * chosen (p. passé de to choose) * chosen (a) : élu(e) - the chosen people : le peuple élu - the chosen (a. subst. pl.) : les élus * chowder (n) (amér.) : soupe épaisse à base de fruits de mer - clam chowder : soupe de palourdes * christen (v) (tr.) : baptiser * Christendom (n) : chrétienté (f) * Christian (a) : chrétien(ne) (sans maj.) * Christian (n pr.) : chrétien, chrétienne (la personne) (sans maj.) * Christianity (n pr.) : christianisme, fait d’être chrétien * Christmas (n pr.) : Noël - We wish you a merry Christmas : Nous vous souhaitons un joyeux Noël * Christmassy (a) : 1/ de Noël ; 2/ dans l’esprit de Noël * chrome (n) : chrome * chrome-plated (ac) : chromé(e) * chronological (a) : chronologique * chronologically (adv.) : chronologiquement * chronology (n) : chronologie (f) * chronometer (n) : chronomètre * chubby-cheeked (ac) : joufflu(e) * chuck (n) : mandrin creux - drill chuck : porte-foret (masc.) * chuck away (v) (tr.) : jeter, balancer (fam.), balarguer (fam.) (syn. to throw away) * chuck in (v) (tr.) (brit.) : laisser tomber - to chuck in the towel : jeter l’éponge - I chucked it all in! : J’ai tout laissé tomber, J’ai tout envoyé promener / balader * chuckle (n) : gloussement, petit rire * chuckle (v) (intr.) : glousser, rire, rigoler (fam.) * chuckle-worthy (ac) : qui fait rigoler * chuck out (v) (tr.) (fam.) : 1/ jeter à la poubelle, virer (fam.), bazarder (fam.), balancer (fam.) ; 2/ mettre à la porte, virer (fam.), éjecter (fam.) (sb, qn) - I’ve chucked him out at last : Je l’ai enfin viré * chuffed (pp) (brit.) : ravi(e), enchanté(e) - I’m chuffed to bits by this decision : Vous me voyez ravi(e) de cette décision * chump (n) : 1/ gros morceau de bois ; 2/ tête (f), boule (f) (fam.) - He is off his chump : Il a perdu la boule ; 3/ sot, imbécile * chunk (n) : part (f), morceau, gros morceau (syn. piece) * church (n) (pl. churches) : église (f) - church service : office religieux * churl (n) : rustre, malotru * churlish (a) : grossier/-ière * churn (n) : 1/ baratte (f) (syn. churner); 2/ (brit.) bison de lait ; 3/ attrition (f), perte de clientèle, perte d’abonnés * churn (v) : 1/ (tr.) baratter (butter, du beurre) ; 2/ (intr.) bouillonner * churner (n) : baratte (f) (syn. churn) * churn out (v) (tr.) : produire à tour de bras, sortir en grandes quantités (fam.) - to churn out propaganda : débiter de la propagande * chute (n) : 1/ glissière (f), toboggan - escape chute : toboggan de secours ; 2/ abr. de garbage chute (amér.) / rubbish chute (brit.) : vide-ordures (masc.) ; 3/ tronc. de parachute : parachute - chute candled : parachute en torche * chutney (n) : chutney (sauce indienne) * chutzpah (n) (terme yiddish) : audace (f), impertinence (f), effronterie (f), culot (fam.) * cider (n) : cidre - apple cider : cidre de pommes - cider making : fabrication du cidre * cig (n) (tronc. fam. de cigarette) : sèche (n) (fém.) * cigar (n) : cigare - cigar chomper : mâchonneur de cigares - cigar holder : porte-cigare (masc.) * cigarette (n) : cigarette (f) - pack of cigarettes (amér.) : paquet de cigarettes - candy cigarette : cigarette en sucre, cigarette en chocolat - king-size cigarettes : cigarettes longues - cigarette case : porte-cigarette (masc.) (syn. cigarette holder) - cigarette girl : vendeuse de cigarettes * cigarette-resistant (a) : à l’épreuve des cigarettes - cigarette-resistant cover : revêtement de siège résistant aux cigarettes * cigar-shaped (ac) : en forme de cigare * ciggie (n) (brit.) (dim. fam. de cig) : sèche (f), clope (f) * cilantro (n) (amér.) : (la) coriandre (l’herbe) (syn. brit. coriander) * cinch (n) : 1/ sangle (f) ; 2/ prise (f), étreinte (f) - to have a cinch on sth : tenir qch solidement ; 3/ certitude (f) - It’s almost a cinch : C’est presque sûr - That’s a cinch : C’est certain, Cela ne fait aucun doute * cinch (v) (tr.) : sangler, serrer solidement * cincher (n) : corset - waist cincher : serre-taille (masc.) * cinders (n pl.) (fa p) : 1/ (rarement) cendres (f pl.) - to turn sth to cinders : réduire qch en cendres ; 2/ (généralement) escarbilles (f pl.), scories (f pl.), mâchefer (sing.) * cinema (n) : 1/ (le) cinéma (l'art) ; 2/ (brit.) (abr. de cinema house) cinéma (la salle) (syn. amér. theater) - to go to the cinema : aller au cinéma (syn. brit. to go to the pictures - syn. amér. to go to the movies) - cinema complex : complexe multisalle (syn. multiplex) - cinema goer : spectateur habitué des salles - cinema going : fréquentation des salles de cinéma - cinema lover : cinéphile * cinematic (a) : cinématographique, du cinéma - the first film in cinematic history : le premier film de l’histoire du cinéma - cinematic conventions : conventions cinématographiques (pl.) * CIR (n) (init. de citizen-initiated referendum : référendum d’initiative populaire) * circa (abr. ca. / ca ou c.) (prop. d'origine latine) : 1/ environ (env.) + mesure ; 2/ vers + millésime * circle (n) : cercle - his close circle : le cercle de ses proches, son entourage (syn. his inner circle) - (the) dress circle (brit.) (Théât.) : (le) premier balcon - quality circle : cercle de qualité * circuit (n) : circuit - circuit breaker : disjoncteur, coupe-circuit * circuit board-esque (a) : en forme de carte à circuit imprimé - The town takes on the appearance of a circuit board-esque pattern from above : Vue du ciel, la ville a l’aspect d’une carte à circuit imprimé * circuitry (n) : circuiterie, circuits (pl.) (d’une carte électronique) * circular (a) : circulaire - circular saw : scie circulaire * circular (n) : prospectus - No circulars : Prospectus interdits * circulate (v) : (tr.) faire circuler ; (intr.) circuler * circulation (n) (fa) : 1/ diffusion, nombre d'exemplaires vendus (= circulation figure) (syn. sales) ; 2/ (impropre) tirage (syn. print run) * circumcise (v) (tr.) : circoncire * circumcision (n) : circoncision - to perform a circumcision : procéder à une circoncision * circumscribe (v) : 1/ (tr.) a/ circonscrire (to, à) - to circumscribe an equilateral triangle to a circle : tracer un triangle équilatéral circonscrit à un cercle ; b/ circonscrire (about, passant par les sommets de, touchant les côtés de) - to circumscribe a circle about an equilateral triangle : tracer un cercle passant par les sommets d’un triangle – You can both inscribe a circle in a given hexagon and circumscribe one about it : On peut à la fois inscrire un cercle dans un hexagone donné et circonscrire un cercle à ce dernier ; 2/ (tr.) circonscrire, limiter (to, à) - These measures cannot be circumscribed to one country : Ces mesures ne sauraient être limitées à un seul pays ; (intr.) se limiter (to, à), se borner (to, à) - For this brief tutorial, we will circumscribe to a few elementary procedures : Dans ce court tutoriel, nous nous limiterons à quelques façons de procéder élémentaires * circumscription (n) : contours (pl.) * circumstances (n pl.) : circonstances - under no circumstances : en aucun cas * circumstantial (a) : 1/ accidentel(le), fortuit(e) ; 2/ indirect(e) - circumstantial evidence (n ind. sing.) : faisceau d’indices, preuves indiciaires, preuves indirectes ; 3/ circonstancié(e), détaillé(e) * circumvent (v) (tr.) : contourner, tourner - to circumvent the problem : tourner la difficulté * citation (n) (fa) : référence (f) (d’un article, d’un livre) - to copy a citation : recopier une référence * cite (v) (tr.) (fa p) : indiquer, mentionner, citer, faire référence à (un article, un livre) * citizen (n) : citoyen, national (n), habitant, administré - senior citizen : personne du 3e âge, retraité * citizen-initiated (ac) tenue(e) à l’initiative des citoyens, d’initiative citoyenne - citizen-initiated referendum : référendum d’initiative populaire * citizenry (n) : (les) citoyens (pl.) * citizenship (n) : 1/ citoyenneté, nationalité - to be granted Canadian citizenship : obtenir la nationalité canadienne - to lose one’s citizenship : être déchu de sa nationalité - to take out the French citizenship : adopter la citoyenneté française - dual citizenship : double nationalité - to hold dual citizenship : détenir la double nationalité ; 2/ civisme - (the) study of citizenship : (l’)éducation civique * citrus (n ) : agrumes (pl.) - citrus grove : verger d’agrumes - citrus squeezer : presse-agrumes * city (n) (pl. cities) : 1/ cité, ville - inner city (amér.) : centre-ville - the city dump : la décharge municipale - city dweller : citadin ; 2/ the City (avec majuscule) : la Cité (de Londres), la place financière de Londres * civ (n) (pl. civs) (abr. de civilian) : civil (n) * civic (a) : civique - civic lessons (pl.) : (l’)instruction civique * civics (n sing.) (amér.) : (l’)éducation civique (syn. (the) study of citizenship) * civil (a) : 1/ civil(e) - civil engineer : ingénieur du bâtiment - civil engineering : (le) génie civil - civil law : (le) droit civil - civil war : guerre civile ; 2/ civique - civil rights : droits civiques * civilian (a) : civil(e) - a civilian aircraft : un aéronef civil, un avion civil - civil aviation : aviation civile (f) * civilian (n) : civil (n) * civilization (n) : civilisation (f) - advanced civilization une civilisation évoluée - ancient civilization : ancienne civilisation - unknown civilization : civilisation inconnue * civvy (a) (abr. de l’adj. civilian) : civil(e) (non militaire) * civvy (n) (abr. du nom civilian) : civil (n) * clack (v) (intr.) : jaser * clad (a) : 1/ vêtu(e), habillé(e) ; 2/ revêtu(e), couvert(e), enveloppé(e) - hill clad in mist : colline enveloppée de brume * claim (n) : 1/ réclamation ; 2/ revendication - to lay claims to the 4th place : revendiquer la 4e place ; 3/ demande d'indemnisation ; 4/ affirmation, assertion - claim accompanied by no evidence : affirmation sans la moindre preuve / sans même un début de preuve * claim (v) (tr.) : 1/ réclamer ; 2/ revendiquer ; 3/ prétendre, affirmer - He claims to be a journalist : Il prétend être journaliste * claimed (ppa) : prétendu(e) - claimed sighting : prétendue observation (d’un ovni) * clairvoyance (n) : clairvoyance (f) * clairvoyant (a) (fa) : extralucide * clam (n) : palourde (f) - clam chowder (amér.) : soupe de palourdes * clamber (up) (v) (intr.) : grimper - to clamber up a ladder ; grimper à une échelle * clamor (amér.) / clamour (brit.) (n) : cris (pl.), réclamations (f pl.) * clamp (n) : serre-joint (de menuisier, de charpentier) (masc.) * clamp (v) (tr.) : serrer, brider * clampdown (n) : mesures de répression (f pl.) * clamp down (v) (intr.) : mettre un frein (on, à), prendre des mesures draconiennes (on, contre) * clamping (n) : serrage (de pièces à usiner), bridage (d’outils de coupe) (Usin.) - workpiece clamping : serrage de pièces - clamping bolt : boulon de serrage * clanger (n) : gaffe (f) - to drop a clanger : faire une gaffe * clapman (n) : machiniste à la claquette * claptrap (n) : baratin, boniments (pl.) - to talk claptrap : raconter des boniments - It’s all claptrap : c’est du baratin, ce sont de grands mots à effet * claret (n) : vin rouge de Bordeaux * clash (n) (pl. clashes) : désaccord, heurt, affrontement - to avert clashes : éviter des affrontements * clash (v) (intr.) : s’entrechoquer * class (n) (pl. classes) : 1/ classe (f), catégorie (f) - to stand in a class by oneself : former une classe à soi seul ; 2/ classe (sociale) (f) - the upper class : la haute bourgeoisie (f) - the middle class : la classe moyenne - the working class : la classe ouvrière - class consciousness : (la) conscience de classe - class struggle : (la) lutte des classes ; 3/ (Éduc.) classe (f) - the class list : la liste des élèves - sink class : classe dépotoir - class representative : délégué de classe - smaller class sizes : des classes plus petites ; 4/ (Éduc.) cours - in class : en cours - out of class : en dehors du cours - the boys had classes in English : les élèves avaient des cours d'anglais - to attend university classes : suivre des cours à l’université - to come to class : venir en cours - to miss a class : manquer un cours - afternoon classes : cours de l’après-midi - French immersion classes : cours de français en immersion - morning classes : cours du matin - class period : heure de cours * class-conscious (ac) : qui fait des distinctions sociales * classic (a) : 1/ classique, courant(e) ; 2/ classique, typique * classic (n) (pl. classics) : classique (n) - nature writing classics : classiques de la littérature de la nature * classification (n) (fa p) : 1/ classement (alors que la classification est l’établissement de classes ou de catégories, le classement est l’insertion selon un ordre donné, d’individus ou d’objets à l’intérieur des classes) ; 2/ confidentialisation (f) * classical (a) : classique * classified (ppa) (fa) : confidentiel(le) - to be classified information : être confidentiel - to release classified documents about UFOs : mettre à la disposition du public des documents confidentiels sur les ovnis * classify (v) (tr.) : 1/ classer (selon un ordre) ; 2/ classer secret, classer secret défense, rendre confidentiel, confidentialiser * classroom (n) : salle de classe * clatter (n) : 1/ cliquetis ; 2/ bruit fort, fracas * clatter (v) (intr.) : cliqueter, s’entrechoquer * clause (n) (fa p) : 1/ clause (f) (d’un contrat) - get-out clause : clause d’exception ; 2/ (Gram.) proposition (f) - adverbial clause : proposition adverbiale - conditional clause : proposition conditionnelle - dependent clause : proposition subordonnée - independent clause : proposition indépendante - relative clause : proposition relative * claustrophobia (n) : claustrophobie (f) * claustrophobic (a) : claustrophobique * claw (n) : 1/ griffe (f) (de mammifère); 2/ serre (f) (d’oiseau) ; 3/ pince (f) (de crabe) - prehensile claw : pince de préhension, préhenseur * claw (v) : (tr.) griffer ; (intr.) to claw at sb / sth : griffer qn /qch * clay (a) : en argile, de glaise * clay (n) : argile (f), glaise (f) * clayey (a) : argileux/-euse, glaiseux/-euse * clean (a) : 1/ propre - clean water : eau propre - clean work area : aire de travail propre - clean technogy (abr. clean tech) : technologies propres (f pl.), écotechnologies (f pl.) (syn. green technology, abr. green tech : technologies vertes) (anton. dirty); 2/ - clean room : salle blanche (f) * clean (adv.) (fam.) : 1/ selon les règles, réglo - He doesn’t play clean : Il ne joue pas réglo ; 2/ complètement, carrément (fam.) - I clean forgot : J’ai carrément oublié * clean (v) (tr.) : nettoyer * clean-cut (a) : bien découpé(e) * cleaner (n) : 1/ (la personne) nettoyeur ; 2/ (la machine) nettoyeuse - beach cleaner : nettoyeuse de plage * cleaning (n) : nettoyage - cleaning costs : coûts de nettoyage * cleanliness (n) : propreté habituelle (f), propreté par habitude * cleanly (a) : propre par habitude * cleanse (v) (tr.) : nettoyer, purifier (syn. to purify) * cleansing (a) : nettoyant(e) - cleansing fluid : fluide nettoyant * cleansing (n) : nettoyage, purification (f) - ethnic cleansing : nettoyage ethnique * cleantech (n) : technologies (f pl.) propres (aussi clean tech) - the cleantech revolution : la révolution des technologies propres * clean up (v) (tr.) : nettoyer - to clean up the Mediterranean : nettoyer la Méditerranée * cleanup (n) : 1/ nettoyage - clean-up campaign : campagne de nettoyage ; 2/ mise au propre * clear (a) : 1/ clair(e) - clear sky : ciel clair ; 2/ évident(e) - to become clear : devenir évident - to make it clear (to sb) that… : expliquer clairement (à qn) que…, faire clairement comprendre (à qn) que… ; 3/ dégagé(e), libre * clear (v) : 1/ (tr.) effacer ; 2/ (tr.) vider ; (intr.) [écran] se vider ; 3/ (tr.) débarrasser - to clear the table : débarrasser la table ; 4/ (tr.) disculper, innocenter - I shall easily clear myself : Je me disculperai facilement * clearance (n) : 1/ enlèvement, évacuation (f) - mine clearance : déminage - clearance cairn : (Agric.) tas d’épierrement ; 2/ jeu (au sens de déplacement) * clear away (v) (tr.) : débarrasser * clear-headed / clearheaded (ac) : lucide * clearing (n) : 1/ clairière (f) ; 2/ compensation (f) - clearing bank : chambre de compensation * clearly (adv.) : clairement * clear off (v) : (tr.) débarrasser (une table) ; (intr.) débarrasser le plancher (fam.), dégager (fam.) * clear-polish (vc) (tr.) : polir (un verre) * clear-sighted (ac) : clairvoyant(e) * clear up (v) : (tr.) éclaircir ; (intr.) s’éclaircir * cleavage (n) : 1/ décolleté (n) - to wear a cleavage : porter un décolleté ; 2/ scission (f) ; 3/ (Géol.) clivage * cleave (v) (tr.) : fendre * cleaver (n) : couperet, fendoir - meat cleaver : coupe-viande (masc.) * clench (v) (tr.) : serrer * clencher (n) : argument sans réplique - That was a clencher for him : Cela lui a rivé son clou * clerical (a) (fa p) : 1/ clérical(e) - clerical regime : régime clérical ; 2/ de bureau - clerical work : travail de bureau - clerical worker : employé de bureau * clericalism (n) : (le) cléricalisme (anton. anticlericalism : (l’)anticléricalisme) * clerk (n) : 1/ vendeur/-euse (de magasin) (syn. shop assistant) ; 2/ commis (n), employé (n) - confidential clerk : homme de confiance - shipping clerk : expéditionnaire - sollicitor’s clerk : clerc de notaire * clerkship (n) (amér.) : externat en médecine * clever (a) : intelligent(e), astucieux/-euse, ingénieux/-euse, habile * cleverly (adv.) : intelligemment, astucieusement, ingénieusement, habilement * cleverness (n) : intelligence (f), astuce (f), ingéniosité (f), habileté (f) * clew (n) : pelote (f) * click (v) : 1/ (tr.) cliquer sur - to click a button for advice : cliquer sur un bouton pour obtenir des conseils ; (intr.) émettre un déclic - to click into place : se mettre en place avec un déclic ; 2/ (intr.) piger, comprendre, saisir - I’ve clicked! : J’ai pigé ! * clickbait (n) : (Inf.) piège à clics, attrape-clics, pute à clics (vulg.), putaclic (vulg.) - clickbait headline : titre accrocheur * click-drag (v double) (tr.) : (Inf.) cliquer et faire glisser, cliquer et déplacer (une icône) - to click-drag an icon : cliquer et déplacer une icône * click-drag-drop (v triple) (tr.) : (Inf.) cliquer, déplacer et déposer * clickety-clack (n) : claquement, clic-clac - the clickety-clack of clogs : le claquement des sabots, le clic-clac des sabots * client (n) : 1/ client - client file : fichier clientèle ; 2/ (Inf.) client, programme qui reçoit des données, récepteur, destinataire * clientele (n) : clientèle, clients (pl.) * cliff (n) : falaise (f), paroi rocheuse (f) * climate (n) : climat - climate activist : militant climatique - climate change : changement climatique, dérèglement climatique - climate scientist : climatologue (syn. climatologist) * climatologist (n) : climatologue (syn. climate scientist) * climax (n) : point culminant * climb (v) : (tr.) grimper, escalader ; (intr.) grimper, prendre de la hauteur * climbing (a) : grimpant(e) - climbing vine : vigne grimpante (f) * climbing (n) : 1/ escalade (f) - roof climbing : toiturophilie (f) - urban climbing : (la) grimpe urbaine, (l’)escalade urbaine - wall and roof climbing : stégophilie (f) ; 2/ ascension (f) - social climbing : (l’)ascension sociale *climes (n pl.) : cieux (pl.) - more salubrious climes : cieux plus salubres * cling (v) (clung, clung) (intr.) : s’accrocher (to, à) * clinging (a) : (fig.) collant(e) * clinically dead (ac) : cliniquement mort(e) * clink (v) (tr.) : faire tinter * clip (n) : agrafe (f), attache (f), pince (f) - paper clip : attache-feuilles - clip pen : stylo à pince - clip strip : barrette d’agrafes * clip (v) (tr.) : 1/ agrafer ; 2/ tailler ; 3/ estamper (au fig.) - to get clipped in a clip joint : se faire estamper dans un bar à gogos * clipboard (n) : (Inf.) presse-papier (m) * clip-clop (v. double) (intr.) : [cheval] aller cahin-caha * clip joint / clipjoint (n) (arg.) : boîte où l’on se fait estamper, bar à gogos, boîte à gogos, boîte à entraîneuses * clippers (n pl.) : tondeuse à cheveux * clippings (n pl.) : coupures (de presse) (f pl.) - news clippings : coupures de presse (syn. news cuttings) * cloak (n) : manteau - cloak room : consigne (f), vestiaire - invisibility cloak : cape d’invisibilité * cloaking (n) : occultation - cloaking device : (Star Trek) bouclier occulteur * cloakroom (n) : 1/ consigne (f), vestiaire ; 2/ (brit.) toilettes (publiques) (f pl.) * clobber (n ind. sing.) (arg. brit.) : 1/ barda, fourbi, affaires (f pl.) ; 2/ matos ; 3/ fringues (f pl.), frusques (f pl.) * clobber (v) (tr.) (arg.) : tabasser * clock (n) : horloge (f) - to work around the clock : travailler 24 heures sur 24 / jour et nuit - availability round the clock : disponibilité 24 h sur 24 - alarm clock : réveille-matin, réveil - atomic clock : horloge atomique - biological clock : horloge biologique - body clock : horloge interne - cuckoo clock : pendule à coucou, coucou - grandfather clock : horloge de parquet - speaking clock : horloge parlante - wall clock : horloge murale - water clock : clepsydre (f) - clock face : cadran - clock tower : clocher * clock (v) (tr.) : chronométrer * clock in (v) (intr.) : pointer (au travail) * clocking-in (n) : pointage - clocking-in card : carte de pointage - clocking-in machine : pointeuse (f) * clockwise (a) : [sens] horaire, dextrorsum * clockwise (adv.) : dans le sens horaire * clod (n) : motte (f) (of earth, de terre) * clog (n) : 1/ sabot ; 2/ galoche (f) * clog (v) (tr.) : obstruer, boucher * clog up (v) (tr.) : encombrer, boucher * clone (n) : clone, copie conforme (f), imitation (f) * clone (v) (tr.) : copier, dupliquer * cloning (n) : clonage * clop along (v) (intr.) : trotter * close (a) : 1/ proche (to, de), rapproché(e) (to, de) - his close circle : le cercle de ses proches, son entourage ; 2/ étroit(e), serré(e) * close (adv.) : 1/ de près, tout près - to be close behind : être immédiatement derrière, suivre de près - to get close : s’approcher - to come close : s’approcher ; 2/ étroitement, bien hermétiquement * close (n) : fin (f), terme - at the close of… : à la fin de… - to come to a close : arriver à son terme * close (v) : (tr.) fermer, clore - to close a plant : fermer une usine ; (intr.) fermer boutique, terminer - Now I must close : (à la fin d’un lettre) Il me faut maintenant terminer * close-banded (ac) : à bandes rapprochées, à bandes serrées * closed (ppa) : 1/ clos(e), fermé(e), aux portes fermées ; 2/ classé(e) - Case closed : L’affaire est close, Affaire classée * close-by (a) : qui est tout près, qui est à côté, qui n’est pas loin * close by (adv.) : tout près, à côté, à deux pas d’ici, pas loin (fam.) * closed-door (ac) : (qui se tient) à huit clos - closed-door meeting : réunion à huis clos * close down (v) : (tr.) fermer (une usine, etc.) ; (intr.) clorefermer boutique * closedown (n) : fermeture (f) (d’une usine, etc.) - plant closedown : fermeture d’usine * closely (adv.) : 1/ de près, de très près - to follow the news very closely : suivre les nouvelles de très près - to closely watch a situation : surveiller attentivement une situation, suivre de près une situation ; 2/ étroitement * closely set (ac) : rapproché(e), serré(e) (syn. close-set) * closely watching (ac) : qui suit de près, très attentif/-ive - closely watching observer : observateur très attentif * closer (compar. de close, proche, approchant) : - to take a closer look : y regarder de plus près * close-set (ac) : rapproché(e), serré(e) - close-set eyes : yeux rapprochés (syn. closely set) * close-shaven (ac) : rasé de près * closest (superlatif de close, proche, rapproché(e) * closet (n) : placard * closeted (ppa) : honteux/-euse, refoulé(e) - closeted homosexual : homosexuel honteux, homosexuel refoulé * close to (loc. prép.) : tout près de, à proximité de * close-up (n) : gros plan, plan serré * closing (n) : fermeture - plant closing : fermeture d’usines - closing period : heures (pl.) de fermeture * closure (n) : fermeture - closure of an assembly plant : fermeture d'une usine d'assemblage * clot (n) : caillot - blood clot : caillot de sang, caillot sanguin * clot (v) : (tr.) coaguler (le sang) ; (intr.) [blood, sang] caillot, coaguler * cloth (n) : 1/ tissu, étoffe ; 2/ toile - backing cloth : (Théât.) toile arrière ; 3/ linge, chiffon - dry cloth : chiffon sec ; 4/ the cloth : le clergé - a man of the cloth : un homme d’église * clothes (n pl.) : 1/ vêtements - ready-made clothes : vêtements de confection - clothes dryer : sèche-linge, sécheuse (Q) (le cintre) - clothes hanger : cintre - clothes line : corde à linge (syn. washing line) ; 2/ linge - clothes beater : battoir à linge * clothing (n) : 1/ habillement ; 2/ vêtements (pl.) - brand name clothing : vêtements de marque - female clothing : vêtements féminins - fire-resistant clothing : vêtements résistant au feu - loose clothing : vêtements amples - male clothing : vêtements masculins - vintage clothing : vêtements rétro - clothing warehouse : entrepôt à vêtements * cloud (n) : nuage - to be on cloud number nine : être aux anges, être au septième ciel - tag cloud (Inf.) : nuage de mots-clés (syn. word cloud) - cloud computing : informatique en nuage, infonuagique (n) (Q) * cloud up (v) (tr.) : obscurcir * clout (n) : 1/ pièce de cuir ; 2/ claque (f), taloche (f); 3/ influence (f), poids (sing.) * clove (n) : 1/ gousse (f) - clove of garlic : gousse d’ail ; 2/ clou de girofle - clove oil : huile de clou de girofle * clover (n) : trèfle * cloverleaf (n) : feuille de trèfle - cloverleaf junction : jonction en forme de trèfle * clown (n) : 1/ clown (au cirque) : 2/ (fig.) clown, pitre * clownery (n) : clowneries (f pl.), pitreries (f pl.) - to take clownery to the next level : hisser le métier de pitre à un niveau supérieur * cloying (a) : [odeur, sentiment] écœurant(e) * club (n) : 1/ bâton, massue (f), matraque (f), casse-tête (l’arme) - iron-headed club : bâton à tête de fer, bâton ferré - wooden-headed club : bâton à tête de bois ; 2/ club, cercle, comité - cellar club : caveau (où joue un orchestre de jazz) - film club : ciné-club (syn. film soc) - youth club : patronage * clue (n) : indice - I haven’t got any clue : Je n’en ai aucune idée * clump (n) : massif (of flowers, de fleurs, of trees, d'arbres) * clumsiness (n) : maladresse (f) * clumsy (a) : 1/ maladroit(e), malhabile ; 2/ d’emploi malaisé * clung (prét. de to cling) * clung (pp de to cling) * cluster (n) : 1/ grappe (f), groupe, ensemble - cluster of buildings : ensemble de bâtiments - cluster of nouns / noun cluster : empilement de noms, empilement nominal (syn. string of nouns) - cluster of more than three nouns : empilement de plus de trois noms - disease cluster : foyer de contagion - cluster bomb : bombe à fragmentation ; 2/ (Inf.) granule (masc.) * cluster (v) : (tr.) grouper, regrouper ; (intr.) s'agglutiner (around, autour de) * clustering (n) : (Inf.) mise en grappe (de serveurs) * clutch (n) (pl. clutches) : 1/ griffe (f), serre (f) - to reclaim from the clutches of : arracher aux griffes de ; 2/ embrayage * clutter (n) : fouillis, désordre - Take away all this clutter! : Vire-moi / Virez-moi tout ce bordel ! - paper clutter on a desk : (l’)encombrement d’un bureau par la paperasse * clutter (v) (tr.) : encombrer * CNC (n) (init. de computer(ised) numerical control : commande numérique par ordinateur) - CNC machinery : machines à CNC (f pl.) * CO (n pr.) : abr. écrite de Colorado, (le) Colorado (autre abr. Colo / Colo.) * Co. / Co (tronc. de company : compagnie, société) : Cie - & Co. : & Cie * CO2 (n) (abr. de carbon dioxide) : CO2 - CO2 emissions : émissions de CO2 - the CO2 level in the atmosphere : le niveau de CO2 dans l'atmosphère (syn. the level of atmospheric carbon dioxide) * coach (n) (pl. coaches) : 1/ carrosse ; 2/ autocar ; 3/ entraîneur, entraîneuse, conseiller, conseillère - health and wellness coach : conseiller en santé et bien-être * coach (v) (tr.) : entraîner, former * coach-friendly (ac) : pro-car - coach-friendly city : ville accueillante pour les cars * coach-unfriendly (ac) : anti-car - coach-unfriendly city : ville peu accueillante pour les cars * coal (n) : charbon * coal-laden (ac) : empli(e) de charbon, rempli(e) de charbon - coal-laden barge : chaland empli de charbon * coalesce (v) (intr.) : s’unir, se fondre ensemble * coalition (n) : coalition (f) - to form a coalition : former une coalition * coarse-grained (ac) : à gros grains * coast (n) : côte, bord de mer, littoral - The coast is clear : La voie est libre - the Levantine coast : le littoral du Levant * coastal (a) : côtier/-ière - coastal missile : missile côtier * coaster (n) : 1/ (Naut.) caboteur ; 2/ dessous de verre, sous-verre * coastline (n) : littoral - coasline prone to erosion : littoral sensible à l’érosion * coat (n) : 1/ habit - morning coat : jaquette (f) (de cérémonie) - coat-hanger : cintre (syn. clothes-hanger) - coat rack : porte-manteau (le support de vêtements) ; 2/ couche (f) (de peinture, etc.) * coat (v) (tr.) : passer une couche (with, de) sur * coating (n) : couche (f), revêtement * coatroom (n) : vestiaire * co-author / coauthor (n) : co-auteur * co-author / coauthor (v) (tr.) : co-écrire * co-authorship / coauthorship (n) : co-autorat * coax (v) (tr.) : amadouer, cajoler * coaxial (a) : coaxial(e) - coaxial cable : cable coaxial * cob (n) : bauge (f) - cob construction : (la) construction en bauge - cob wall : mur de bauge * cobalt (n) : (le) cobalt * cobble (n) : 1/ pavé ; 2/ gros galet * cobble (v) (tr.) : 1/ paver ; 2/ (arch.) réparer (des chaussures) * cobbled (ppa) : pavé(e) * co-browsing (n) : (Int.) navigation conjointe (f), navigation simultanée, co-navigation (f) * cocaine (n) : cocaïne (f) - to be on cocaine : prendre de la cocaïne, se droguer à la cocaïne * cocaine-snorting (ac) : qui prise de la cocaïne, qui renifle de la cocaïne * cock (n) : 1/ coq - moor cock : coq de bruyère ; 2/ pénis, verge (f), queue (f), bite (f) (vulg.), biloute (f) (fam.) - wart on the cock : verrue sur le pénis - cock gobbler : avaleur/-euse de bites - cock ring : anneau pénien, bague à bite (aussi cockring) * cockatiel (n) : calopsitte élégante (f) * cockerel (n) : 1/ cochet, jeune coq ; 2/ (fig.) jeune garçon batailleur, jeune coq en colère * cockeyed (a) : 1/ qui louche, qui les yeux de travers ; 2/ (fig.) de travers, mal fichu(e) * cock-hungry (ac) : ( ex.) affamé de bites * cockle (n) : coque (f) * Cockney (a) : relatif au cockney, du cockney, cockney - Cockney speech : (le) parler cockney * Cockney (n) : 1/ (le) cockney (l'anglais parlé par la classe ouvrière dans les quartiers est de Londres) ; 2/ habitant du quartier est de Londres, Cockney * cockpit (n) : poste de pilotage - cockpit instruments : instruments du poste de pilotage, instruments de bord * cockring (n) voir cock * cockroach (n) : cafard (l’insecte) * coconut (n) : noix de cocoe - coconut oil : huile de noix de coco * cod (n) : morue (f) - Atlantic cod : morue de l’Atlantique - cod liver oil : huile de fois de morue * cod (a) : 1/ décalé(e), loufoque - cod humour : humour loufoque- cod story : histoire abracadabrante (f) ; 2/ fictif/-ive - cod byline : (Presse) signature fictive (f) - cod science : pseudo-science (f) * cod (v) (tr.) : chambrer (qn), taquiner (qn) * code (n) : code - a code of conduct : un code de conduite * code (n ind sing.) : 1/ indicatif (n) - STD code (brit.) : indicatif téléphonique ; 2/ code - bar code : code à barres, code-barres - securiy code : code confidentiel ; 3/ (Inf.) lignes de programme, code - code review : révision du code * code (v) (tr.) : coder * co-design / codesign (v) (tr.) : (Ing.) [deux pays, deux entreprises] concevoir en commun, étudier conjointement (un avion, etc.) * coding (n) : codage * codger (n) (fam.) : individu, type, drôle de type - old codger : vieux bonhomme, vieux type, vieux de la vieille (syn. old timer) * co-ed / coed (a) (tronc. de co-educational / coeducational) (amér.) : [école, enseignement] mixte * co-education / coeducation (n) (amér.) : mixité scolaire (f) * co-educational / coeducational (a) (amér.) : [école, enseignement] mixte (syn. mixed) * coerce (v) (tr.) : contraindre, forcer - to coerce sb into sth : contraindre qn à qch - to coerce sb into doing sth : contraindre qn à faire qch - to coerce sb back in line : forcer qn à rentrer dans le rang * C of E (n pr.) : abr. de Church of England, Église d’Angleterre * coffee (n) : café (la boisson) - to have sb in for coffee : inviter qn à prendre le café chez soi - decaffeinated coffee : café décaféiné - coffee beans : grains de café - coffee grinder : moulin à café * coffin (n) : cercueil * coffle (n) : caravane (f) (d’esclaves) * cog (n) : (fig.) rouage (syn. tooth of wheel) * cognate (a) : apparenté(e), parent(e), de même origine * cognate (n) : mot apparenté - false cognate : faux-ami * cognitive (a) : cognitif/-ive * cognitively (adv.) : du point de vue cognitif, sur le plan cognitif * cohesive (a) : 1/ [argumentation] cohérent(e) : 2/ cohésif/-ive, [groupe] soudé(e) * cohesiveness (n) : cohésion (f) * cohort (n) (fa p) : acolyte (m/f) * co-host (v) (tr.) : (Radio, Télé) co-animer, co-présenter (une émission) * coil (n) : 1/ enroulement - coil cord : cordon spiralé, cordon torsadé ; 2/ stérilet * coil (v) : (tr.) enrouler, torsader ; (intr.) s’enrouler * coiled (ppa) : spiralé(e), torsadé(e) * coin (n) (fa) : 1/ pièce (f) (de monnaie) ; 2/ (aussi orthographié quoin) pierre d'angle * coin (v) (tr.) : (fig.) inventer, forger (un mot) * coinage (n) : monnaie (f) (syn. coins) * coincidence (n) : coïncidence (f) - by a curious coincidence : par un curieux hasard * Coincidentally, … (a m p) (t d p) : Pure coïncidence, … * coinless (a) : sans utiliser de pièces, sans pièces, sans encaissement - coinless public telephone : téléphone publique sans encaissement * Col. (tronc. de Colorado : (le) Colorado) (voir aussi CO et Colo / Colo.) * colander (n) : passoire (f) * cold (a) : 1/ froid(e) - cold room : local réfrigéré - cold water : eau froide (f) ; 2/ à froid - cold start : démarrage à froid ; 3/ - cold case : affaire non élucidée (f), affaire non résolue, affaire classée sans suite - The case goes cold / grows cold : L’affaire est au point mort, l’affaire est oubliée ; 4/ - cold gun : arme non chargée (f), arme vide - cold war : gerre froide (f) * cold (n) : 1/ froid (n) ; 2/ rhume - a nasty cold : un mauvais rhume, un vilain rhume, un gros rhume - the common cold : le rhume banal * cold-hearted (ac) : insensible, sans pitié * coldness (n) : froideur (f) (d’une personne) * cold-rivet (vc) (tr.) : riveter à froid * cold-roll (vc) (tr.) : écrouir * cold-start (vc) (tr.) : démarrer (un véhicule) à froid - to be cold-started : être démarré(e) à froid, être lancé(e) à froid * collaborate (v) (intr.) : collaborer (on, à) * collaboration (n) : collaboration (f) - industry-university collaboration : collaboration entre l’industrie et l’université * collaborative (a) : en collaboration, de collaboration * collapse (n) : effondrement - economic collapse : effondrement économique * collapse (v) : (tr.) effondrer - to collapse a building : provoquer l’effondrement d’un bâtiment ; (intr.) : s’effondrer * collapsible (a) : pliant(e) - collapsible workbench : établi étau * collar (n) : 1/ col (de vêtement) - It makes me feel all hot under the collar (fig.) : J’ai la moutarde qui me monte au nez ; 2/ collier (d’un animal) ; 3/ (Méd.) minerve (f) * collar (v) (tr.) : 1/ saisir au collier ; 2/ (fig.) mettre le grappin sur, alpaguer (fam.) * collarless (n) : sans col - collarless jacket : veste sans col * collect (v) (tr.) : 1/ recueillir, ramasser ; 2/ rassembler, réunir - to collect UFO data : réunir des données sur les ovnis ; 3/ aller chercher, passer prendre * collectible (a) : collectionnable - [car] to become collectible : devenir objet de collection * collecting (n) : collecte (f) - fossil collecting : (la) collecte de fossiles - collecting tub : bac de collecte * collection (n) : 1/ collecte (f) - curbside collection : collecte porte-à-porte - data collection : collecte de données ; 2/ recouvrement - tax collection : recouvrement de l’impôt ; 3/ collection (f) * college (n) (fa) : 1/ faculté (f) (États-Unis) - to go to college : aller en faculté (= aller à l'université, faire des études supérieures) - junior college : institut universitaire (deux années d’études) ; 2/ lycée (G.-B.) * collegiate (a) : 1/ universitaire - collegiate institute : institut universitaire - collegiate sport : sport universitaire ; 2/ des étudiants, estudiantin(e) * collet (n) (fa) : 1/ douille conique (f) ; 2/ pince de serrage (f) * collide (v) (intr.) : [deux objets] entrer en collision, se percuter - to collide head-on : entrer en collision, se percuter de plein front * collie (n) : chien de berger écossais, collie * collision (n) : collision (f) - traffic collision : collision de véhicules * colloquial (a) : 1/ [registre] familier ; 2/ [langue] parlé(e) - colloquial English : (l’)anglais parlé * colloquialism (n) : expression familière (f) * Colo / Colo. (tronc. de Colorado) : (le) Colorado (voir aussi CO et Col.) * colon (n) : côlon * colon (n) : (Ponct.) (les) deux points * colonial (a) : colonial(e) * colonisation (brit.) / colonization (amér.) (n) : colonisation (f) * colonise (brit.) / colonize (amér.) (v) (tr.) : coloniser - to colonize the moon : coloniser la lune * colonist (n) : colon (syn. settler) - lunar colonist : colon lunaire * colony (n) : colonie (f) - lunar colony : colonie lunaire * color (amér.) / colour (brit.) (n) : couleur (f) - colour photo : photo en couleur - colour piece : (Presse) papier d’ambiance - (Presse) colour supplement : supplément (en) couleurs * color (amér.) / colour (brit.) (v) (tr.) : coloriser - to color a movie : coloriser un film * colored (amér.) / coloured (brit.) (a) : de couleur * color-coded (amér.) / colour-coded (brit.) (ac) : respectant une convention de couleurs, repéré(e) par la couleur, muni(e) de repères de couleur * colossus (n) (pl. colossuses ou colossi) : colosse - the colossus of Rhodes : le colosse de Rhodes * colt (n) : poulain * column (n) (fa p) : 1/ (Archi.) colonne (f) ; 2/ poteau ; 3/ levier - control column : levier de commande (d'avion), manche à balai (fam.) ; 4/ (Presse) rubrique (journalistique) (f) - advice column : courrier du cœur - food column : rubrique gastronomique - fudge column : espace réservé aux nouvelles de dernière minute - opinion column : tribune libre (f) - society column : carnet mondain ; 5/ (Inf.) ligne verticale (f) * columnist (n) (Presse) : chroniqueur - leading columnist : chroniqueur de premier plan * column-supported (ac) : (Arch.) soutenu(e) par des colonnes * coma (n) : coma - to wake out of a coma : sortir du coma - medically-induced coma : coma artificiel * co-manage / comanage (v) (tr.) : gérer conjointement, cogérer (un projet) * co-managed / comanaged (ac/a) : [projet] géré(e) en commun, cogéré(e) * comatose (a) : comateux/-euse, qui est dans le coma - He is no longer comatose : Il n’est plus dans le coma * co-manufacture (v) : (tr.) co-fabriquer, partager la fabrication de ; (intr.) co-fabriquer (for, pour le compte de) * co-manufacturer (n) : co-fabricant * co-manufacturing (n) : fabrication partagée (f), co-fabrication (f) (entre industriel et prestataire de services) * comb (n) : 1/ peigne ; 2/ (Reliure) dos spiralé, spirale (f) * comb and paper / comb-and-paper (n. coord.) : peigne et papier, peigne musical (instrument de musique formé d’un peigne à cheveux et d’une feuille de papier et sur lequel on souffle) - to play a comb and paper : jouer du peigne musical * combat (n) : combat - combat aviation : aviation de combat * combat (v) (tr.) : combattre, lutter contre - to combat climate change : lutter contre le dérèglement climatique - to combat terrorism : combattre le terrorisme * combatant (a) : combattant(e) (anton. non-combatant) * combatant (n) : combattant (n) (anton. non-combatant) * combat-proven (ac) : ayant fait ses preuves au combat * combat-tested (ac) : [avion, char, etc.] mis(e) à l’épreuve au combat, testé(e) au combat * combe (n) : vallée (f), combe (f) * combine (n) (tronc. de combine-harvester) : moissonneuse-batteuse (f) * combine (v) : (tr.) associer, combiner (with, à) ; (intr.) se combiner, s'associer * combined (ppa) : combiné’e), associé(e), mixte * combine-harvester (n) : moissonneuse-batteuse (f) * combo (n) : (Mus.) petite formation (f) (de jazz), petit groupe (de rap) * combust (n) (intr.) : s’enflammer - to spontaneously combust : prendre feu spontanément * combustible (a) : combustible * combustion (n) : combustion (f) - human combustion : combustion spontanée (d’un être humain) * come (v) (came, come) (intr.) : 1/ venir - to come to + inf. : en venir à + inf. - to come to oneself : revenir à soi ; 2/ être disponible - to come in two models : être disponible sous deux versions - to come with… : être équipé(e) en série de..., être équipé(e) d'origine de..., être vendu(e) avec… * come (pp de to come) * come along (v) (came, come) (intr.) : 1/ se ramener (fam.), se pointer (fam.) - I’ll come along shortly : Je viendrai tout à l’heure ; 2/ se présenter - if the right person comes along : si la bonne personne se présente * come apart (v) (came, come) (intr.) : se séparer - to come apart at the seams : tomber en morceaux * come back (v) (came, come) (intr.) : revenir - When do you come back here? : Quand est-ce que tu reviens ici ? - to come back home : revenir chez soi * comeback (n) : retour, rentrée (f) - to make a comeback : [individu] faire son grand retour, [chose] revenir à la mode * comedian (n) (fa p) : 1/ acteur, actrice ; 2/ comique (n) - stand-up comedian : humoriste ; 3/ pitre * come down (v) (intr.) : baisser * comedy (n) : comédie (f) - musical comedy : comédie musicale - screwball comedy (Cin.) : comédie loufoque * comedy-centric (ac) : centré(e) (sur la) comédie / (sur les) comédies - comedy-centric channel : chaîne centrée (sur la) comédie / (sur les) comédies * come on (v) (intr.) : 1/ venir ensuite - What is coming on next? : Qu’est-ce qu’il y a ensuite ? ; 2/ avancer, progresser ; 3/ faire du plat à (une fille) - to come on to a girl : draguer une fille * Come on! (interj.) : 1/ Allez ! ; 2/ Allons donc ! * come round (v) (came, come) (intr.) : 1/ faire un détour - We came round by the farm : Nous avons fait le détour par la ferme ; 2/ venir - Come round and see us : Venez nous voir - Come round to my place : Passez chez moi ; 3/ reprendre conscience, revenir à soi ; 4/ changer d’avis - They came round after examining the facts : Ils changèrent d’avis après avoir examiné les faits * comet (n) : comète (f) * comet-like (ac) : en forme de comète * come to (v) (came, come) (intr.) : 1/ revenir à soi, reprendre connaissance ; 2/ retrouver ses esprits * come up (v) (came, come) (intr.) : - to come up with… : trouver, inventer - to come up with an alternative : trouver une solution de rechange * comfort (n) : confort * comfort (v) (tr.) (fa) : réconforter, consoler * comfortable (a) (fa p) : 1/ confortable (noter la différence d'orthographe) ; 3/ à l’aise - to be comfortable with + matière / domaine : être à l’aise dans * comforter (n) : 1/ (dans la religion chrétienne) consolateur/-trice ; 2/ couvre-lit, couvre-pied ; 3/ couette (f) - duvet comforter : couette à duvet - feather comforter : couette à plumes * comforting (a) : réconfortant(e), rassurant(e) * comfy (a) (fam.) : confortable * comic (a) : comique - comic actor : acteur comique - comic book : illustré (n), bande dessinée (f) * coming (a) : qui vient/viennent - in the coming days : dans les jours qui viennent * coming and going (n double) : (les) allées et venues (pl.), (le) va-et-vient * coming out (n) : 1/ entrée dans le monde (f) ; 2/ profession de foi homosexuelle (f) * comma (n) : virgule (f) - inverted comma (brit.) : guillemet inversé, guillemet anglais * command (n) (fa) : 1/ ordre ; 2/ commande (f) - voice command : commande vocale * command (v) (tr.) : 1/ (fa) ordonner ; 2/ commander * commander (n) : commandant * commemorative (a) : commémoratif/-ive * Commencement (n) (amér.) (fa) : remise des diplômes (f) - Commencement Day : le jour de la remise des diplômes * commend (v) (tr.) : louer (syn. to praise) * commendably (adv.) : de façon louable * commensurate (a) : proportionnel(le) - to be commensurate with… : être proportionné(e) à…, avoir une commune mesure avec… * comment (n) : commentaire, observation (f) - Another point is worthy of comment : Un autre point mérite une observation * comment (v) (intr.) : commenter (on sth, qch) * commentary (n) : 1/ (a commentary) analyse (f) (on, de) ; 2/ (ind. sing.) analyses (pl.) - [website] to publish commentary that is not presented in major news outlets : [site web] publier des analyses qui ne figurent pas dans la presse grand public - political commentary : analyses politiques (f pl.) * commentator (n) : commentateur/-trice * comment-worthy (ac) : [texte, question] digne de mention, qui appelle un commentaire - comment-worthy issue : question qui mérite qu’on s’y arrête, question qui mérite d’être notée * commerce-enabling (ac) : propice au commerce, favorable au commerce * commercial (a) (fa p) : 1/ commercial(e) - to go commercial : passer au stade de l'exploitation commerciale - commercial aircraft : (Av.) aéronef commercial - commercial airplane : (Av.) avion commercial - commercial enterprise : exploitation commerciale (f) - commercial flight : (Av.) vol commercial ; 2/ utilitaire - commercial van : fourgonnette utilitaire (f) - commercial vehicle : véhicule utilitaire * commercial (n) (fa) : (Radio) annonce publicitaire (f), (Télé.) publicité (télévisée) (f) * commercial-free (ac) : exempt(e) de publicité, sans annonces publicitaires, sans pauses publicitaires - commercial-free music : (Radio) musique sans pub * commercially (adv.) : commercialement, sur le plan commercial * commercially available (ac) : disponible dans le commerce * commission (v) (tr.) : 1/ charger (sb to do sth, qn de faire qch) ; 2/ commanditer, commander, faire réaliser ; 3/ mettre en service * commissioner (n) : commissaire (n), délégué((e) (m/f) - high commisioner : haut(e) commissaire, haut délégué / haute déléguée *commissionership (n) : commissariat - high commisionership : haut commissariat * commissioning (n) : 1/ commandite (f) ; 2/ mise en service (f) (d'un outillage, d'une machine, d'une usine, d'un bateau) * commit (v) (tr.) : 1/ commettre - to commit atrocities : commettre des atrocités ; 2/ consacrer (des énergies, des efforts, etc.) (syn. (to devote) ; 3/ confier - to commit the care of one's children to sb : confier la garde de ses enfants à qn ; 4/ engager, impliquer - to commit oneself to + forme -ing : s'engager à + inf. - to be committed : être engagé (to, dans), se consacrer (to, à) * commitment (n) : engagement (to, en faveur de), implication (f) - community commitment : engagement civique * committed (ppa) (fa) : engagé(e), militant(e) - I am committed : Je m’y suis engagé(e), J’en ai pris l’engagement - committed writer : écrivain engagé * committee (n) : commission (f) * commodifiable (a) : transformable en produit, transformable en marchandise, marchandisable * commodious (a) (fa) : vaste, spacieux/-euse * commodity (n) (pl. commodities) (fa) : denrée (f), produit - commodity trade : commerce des produits de base * common (a) : 1/ commun(e), partagé(e) - common hall : pièce commune (f) ; 2/ (Gram.) commun(e) - common noun : nom commun - common phrase : expression courante ; 3/ ordinaire - common stocks : actions ordinaires (f pl.) ; 4/ courant(e) - common peripherals (Inf.) : périphériques courants - common term : (selon le cas) terme courant, mot courant, expression courante (f), locution courante (f) ; 4/ (Droit) common law (Irlande, Canada, États-Unis) (litt. (la) loi commune) : (le) droit commun * commoner (n) : 1/ roturier, roturière ; 2/ prolétaire, prolo (fam.) * commonly (adv.) : 1/ couramment, fréquemment ; 2/ Commonly, … (a m p) (t d p) : Fréquemment … , Souvent … * commonly encountered (ac) : couramment rencontré(e), très courant(e) - commonly encountered problem : problème couramment rencontré, problème très courant * commonplace (a) : banal(e), terre-à-terre * commotion (n) (fa) : remue-ménage (masc.) * communicable (a) : 1/ transmissible - communicable disease : maladie transmissible (f) ; 2/ communicable * communicant (n) : (Rel.) communiant(e) * communicate (v) : (tr.) communiquer - to communicate an emotion to sb : communiquer une émotion à qn ; (intr.) communiquer - to communicate with a spirit : communiquer avec un esprit * communication (n) : (la) communication - one-to-one communication : communication d’une personne à une autre, communication bi-univoque - one-to-many communication : commnication d’une personne à plusieurs - many-to-one communication : communication de plusieurs personnes à une seule - many-to-many communication : communication de plusieurs personnes à plusieurs * communications (n pl.) : communications (pl.) - audiovisual communications : communications audiovisuelles - data communications : communications de données - voice communications : communications vocales - communications network : réseau de communication - communications server : serveur de communications * communicator (n) : 1/ (l’objet) dispositif de communication, module de communication ; 2/ (la personne) communicateur/-trice * communism (n) : communisme - godless communism : (le) communisme athée * communist (a) : communiste * communist (n) : communiste (n) - dyed-in-the wool communist : communiste pur et dur * community (n) (pl. communities) : communauté (f) (l’organisation) - bedroom community : ville dortoir - the Internet community : la communauté des internautes - the medical community : les milieux médicaux - community center (amér.) : foyer municipal - community commitment : engagement civique - community journalism : journalisme des nouvelles locales - community service (sing.) : travaux (pl.) d'intérêt public (syn. community work) * commute (v) : 1/ (tr.) commuer (to, en) ; 2/ (intr.) faire la navette (entre domicile et travail) * commute (n) : trajet (entre maison et travail), trajet du matin - My commute takes 50 minutes : J’ai un trajet de 50 minutes jusqu’au boulot * commuter (n) : automobiliste qui fait la navette entre banlieue et centre-ville (ou inversement), navetteur/-euse (B) * comorbid (a) : souffrant de comorbidités - comorbid patient : malade souffrant de comorbidités * compact (a) (fa) : 1/ trapu(e), resserré(e) ; 2/ (anglic.) compact(e) - compact car : petite cylindrée (f) - compact music system : chaîne stéréo compacte * compact-sized (ac) : de faible encombrement * companion (n) : compagnon (masc.), compagne (fém.) * companionship (n) : 1/ camaraderie (f) ; 2/ amitié (f) * company (n) (pl. companies) (fa p) : 1/ compagnie (au sens d’entité commerciale) - joint-stock company : société par actions - oil company : compagnie pétrolière - private company : société privée - private limited company : société anonyme à responsabilité limitée (SARL) - public limited company : société anonyme (SA) ; 2/ société, entreprise - to start up a company : monter une société - biotech company : société de biotech - consumer electronics company : société d’électronique grand public - engineering company : société d'ingénierie, bureau d'ingénieurs - high-tech company : entreprise de haute technologie - house-moving company : déménageur - pharmaceutical company : société pharmaceutique, laboratoire pharmaceutique - pharma company : société pharmaceutique, laboratoire pharmaceutique - publishing company : maison d’édition (syn. publishing house) - pure play company : entreprise de monoactivité - company name : nom de société * company-issue (ac) : fourni(e) par la société - company-issue phone : téléphone fourni par la société * company-specific (a) : propre à une société - company-specific terminology : vocabulaire propre à une société * company-trained (ac) : formé(e) par l’entreprise - company-trained engineer : ingénieur maison * Comparably, … ( a m p) (t d p) : De façon comparable * comparative (a) : comparatif/-ive, de comparaison - comparative tests : essais comparatifs * comparative (n) : (Gram.) comparatif (n) * compare (n) (litt.) : - to be beyond compare : être sans pareil * compare (v) (tr.) : comparer, confronter (with, à) * compare and contrast (v coord.) : (tr.) faire l’analyse comparative de (two things, deux choses) ; (intr.) faire ressortir les similitudes et les différences (between two things, entre deux choses) * compared to (loc. prép.) : en comparaison de, comparé à, par rapport à, auprès de, à côté de (cf. (as) compared to) -This is as nothing compared to… : Cela n’est rien comparé à … * compared with (loc. prép.) : en comparaison de, comparé à, par rapport à, auprès de, à côté de (cf. (as) compared with) * comparison (n) : comparaison (f) * compartment (n) : compartiment - door compartment : vide-poche (dans une portière de voiture) - glove compartment : boîte à gants (d’une auto) - storage compartment : vide-poche (dans une voiture) - stowage compartment : compartiment de rangement * compartimentalise (brit.) / compartmentalize (amér.) (v) (tr.) : compartimenter, cloisonner * compartimentalised (brit.) / compartimentalized (amér.) (ppa) : compartimenté(e), cloisonné(e) * compass (n) (fa) : 1/ (compasses, pl.) compas à dessin - a pair of compasses : un compas ; 2/ boussole (f) - the points of the compass : les points cardinaux ; 3/ étendue (f), portée (f) - within the compass of : dans les limites de * compatibility (n) : compatibilité (f) *compatible (a) : compatible (with, avec) * compel (v) (prét. et pp -lled) (tr.) : 1/ forcer (to, à), contraindre (to, à), obliger (to, à), pousser (to, à), astreindre (to, à) - Do not feel compelled to reply : Ne vous sentez pas obligé de répondre ; 2/ imposer (le respect), retenir (l'attention) - to compel sb's respect : imposer le respect à qn - to compel sb's attention : retenir l'attention de qn * compelling (a) : 1/ irrésistible, impératif/-ive - compelling reason : raison impérative (f) ; 2/ irréfutable - compelling argument : argument irréfutable - compelling evidence : des éléments de preuves irréfutables ; 3/ captivant(e), fascinant(e) - compelling orator : orateur captivant - compelling story : un récit fascinant * compendium (n) (pl. compendia ou compendiums) : recueil, résumé - data-driven compendium : recueil construit à partir de données réelles * compensate (v) (intr.) : - to compensate for a defect : compenser un défaut * compensation (n) : compensation (f), dédommagement ; 2/ (Usin., commande numérique) correction (f) - tool compensation : correction d’outils * compete (v) (intr.) : 1/ être compétitif/-ive, être concurrentiel(le) ; 2/ être en compétition (with, avec), être en concurrence (with, avec) * competence (n) : compétence (f), aptitude (f) * competency (n) (var. ortho. de competence) : compétence (f), aptitude (f) - to lack competency (in an area) : manquer de compétence, ne pas avoir les compétences nécessaires (dans un domaine) * competing (a) : en compétition, en lice, concurrent(e) * competition (n) (fa) : concurrence (f) (mais aussi la compétition comme « rivalité sportive » et comme « concours », « défi à relever ») - competition flight (Av.) : vol de compétition * competitive (a) : 1/ concurrentiel(le), compétitif/-ive ; 2/ de compétition- competitive surfer : surfeur de compétition * competitively priced (ac) : d’un prix concurrentiel, au prix compétitif - competitively priced steel : acier au prix compétitif * competitiveness (n) : compétitivité (f) * competitor (n) : concurrent - competitors (pl.) : la concurrence * compile (v) : compiler * compilation (n) : compilation * complacent (a) : content(e) de soi * complain (v) (intr.) : se plaindre (about, de) * complaint (n) : plainte (f) - they assailed our ears with complaints : ils nous rebattirent les oreilles de leurs plaintes - She had room for complaint : Elle avait lieu de se plaindre - to file a complaint : déposer une plainte * complete (a) : 1/ entier/-ière ; 2/ au grand complet - (a) complete turnkey robotic cell : (une) cellule robotique clés en mains au grand complet * complete (v) (tr.) (fa p) : 1/ mener à son terme, terminer, mener à bien, achever, parachever, accomplir jusqu'au bout, effectuer - to complete an autopsy : effectuer une autopsie - to complete a specific task : mener à bien une tâche précise ; 2/ remplir (un formulaire) * complete and utter (paire adj.) : complet et total, complète et totale, complet/-ète, total(e), absolu(e) - a complete and utter failure : un échec sans nuances - a complete and utter cave-in : un effondrement total, un effondrement complet - This story is complete and utter bullshit : Cette histoire est un tissu de conneries du début à la fin * completed (ppa) : accompli(e) - Mission completed! : Mission accomplie ! * completely (adv.) : complètement, totalement, entièrement * completely and utterly (paire adverbiale) : complètement, totalement, entièrement * completeness (n) : exhaustivité (f), état complet, caractère achevé, complétude (f) * completion (n) : terminaison (f), achèvement, réalisation (f), aboutissement - completion of a plant : achèvement d’une centrale - at the completion of the placement period : à l’achèvement de la période de stage - to be slated for completion in 2016 : devoir être achevé en 2016 * complex (a) : complexe * complex (n) (pl. complexes) : 1/ complexe (n) - factory complex : complexe d’usines, complexe industriel - the military industrial complex : (É.-U.) le complexe militaro-industriel ; 2/ (Psycho.) complexe (n) - to develop a complex : attraper un complexe - inferiority complex : un complexe d’infériorité - superiority complex : complexe de supériorité * complexion (n) : teint - to set off complexion : rehausser le teint * complexity (n) : complexité (f) * compliance (n) : 1/ conformité (f) (with, à), respect (with, de) - compliance with product specifications : conformité avec le cahier des charges ; 2/ effet de ressort, élasticité (f), souplesse (f), mobilité (f), compliance (f) - compliance of a spring : élasticité d’un ressort * compliant (a) : qui satisfait (with, à), conforme (to, à) * complicitous (a) : complice (in sth, de qch) - [country] to be complicitous in a genocide : [pays] être complice d’un génocide * compliment (n) : compliment - He is chary of compliments : Il est avare de compliments * comply (v) (intr.) : 1/ obéir, céder ; 2/ être en conformité (with, avec) - to comply with… : se conformer à…, respecter, observer * component (a) : constituant(e), constitutif/-ive * component (n) : 1/ élément constitutif, constituant (n), composant (n), composante (n) (f), organe, module - component music system : chaîne stéréo modulaire (f), chaîne musicale à éléments ; 2/ pièce détachée (f) - automobile components : pièces pour automobiles - component supplier : sous-traitant ; 3/ pièce, composant (électronique, matériel(le)) - electronic components : composants électroniques * comport (v) : 1/ (tr.) (to comport oneself) se comporter, se conduire, se tenir, réagir ; 2/ (intr.) (fa) (amér.) correspondre (with, à), être en accord (with, avec), s’accorder (with, avec), aller dans le sens (with, de) - These outrages do not comport with the image Americans have of their country : Ces scandales ne correspondent pas à l’image que les Américains se font de leur pays * componentry (n ind. sing) : ensemble des pièces (d’une auto, d’une machine), pièces (f pl.), ensemble des composants (d’un appareil électronique), composants (pl.) - As the cars progress down the line, the cars get more componentry : En avançant dans la chaîne de montage, les voitures reçoivent plus de pièces * compose (v) (tr.) : 1/ composer (de la musique), rédiger (une lettre), créer (un récit) ; 2/ composer, constituer - to be composed of… : être constitué(e) de ; 3/ - to compose oneself : se calmer * composing (n) : (Impr.) composition (f) * composition (n) : 1/ composition (f) - page composition : composition de pages - composition software : logiciels (pl.) de composition (de pages) ; 2/ (Éduc.) dissertation (f) * compositor (n) (fa) : typographe * compost (n) : compost * compost (v) : (tr.) transformer en compost, composter ; (intr.) se transformer en compost, se composter * compostable (a) : compostable * composure (n) : calme, tranquillité (f) * compound (a) : [susbtance, mot, intérêt] composé(e), [phrase, nombre] complexe - compound noun : nom composé * compound (n) : 1/ mélange, combinaison (f) ; 2/ composé (n) ; 3/ produit (n) - sealing compound : produit d’étanchéité * compound (n) : enclos, enceinte (f), camp * compound (v) (tr.) : aggraver, compliquer (syn. to make worse) * comprehensive (a) (fa) : 1/ total(e), complet/-ète, exhaustif/-ive ; 2/ polyvalent(e), universel(le) * comprehensively (adv.) : complètement, de manière exhaustive * comprehensiveness (n) : exhaustivité (f) * compress (v) (tr.) : comprimer, compacter, compresser (anglic.) * compressed (ppa) : compressé(e) (anglic.), compacté(e) - compressed air : air comprimé - compressed file (Inf.) : fichier compressé, fichier compacté * comprise (v) (tr.) : 1/ comporter, comprendre, renfermer, contenir, inclure ; 2/ composer, constituer * compromise (n) : compromis - to reach a compromise : parvenir à un compromis * compu-jargon (nc) : jargon informatique - It is just 7,000 pages of compu-jargon * compulsion (n) : contrainte (f), pression (f) - under compulsion : sous la contrainte * compulsive (a) : obsessionnel(le), invétéré(e) - compulsive smoker : fumeur invétéré * compulsively (adv.) : de façon obsessionnelle * compulsorily (adv.) : obligatoirement, d’office * compulsory (a) : 1/ obligatoire (syn. obligatory) - compulsory education : enseignement obligatoire ; 2/ forcé(e) - compulsory furloughs : congés forcés * computational (a) : de calcul - computational technologist : technicien de calcul * computationally intensive (ac) : (Inf.) à fort pourcentage de calcul - computationally intensive industrial applications : applications industrielles à fort pourcentage de calcul * compute (v) : 1/ (tr.) calculer (sur une machine) ; (intr.) être calculé, se calculer ; 2/ (tr.) traiter par ordinateur * computer (n) : 1/ calculateur ; 2/ ordinateur - desktop computer : ordinateur de bureau, ordinateur de table - home computer : ordinateur domestique, ordinateur familial - mainframe computer : ordinateur central - portable computer : ordinateur portable - computer animator : spécialiste de l’animation assistée par ordinateur - computer display : écran d’ordinateur- computer file : fichier informatique - computer graphics : a/ (sing.) (l’)infographie (f) ; b/ (pl.) images infographiques (f pl.), images informatiques (f pl.) - computer prank : canular informatique - computer security : (la) sécurité informatique - computer table : table d'ordinateur, table pour ordinateur, pupitre pour ordinateur * computer-aided (ac) : assisté(e) par ordinateur, informatisé(e) - computer-aided publishing system : système d’édition assistée par ordinateur * computer-assisted (ac) : assisté(e) par ordinateur, informatisé(e) - computer-aided design : conception assistée par ordinateur - computer-aided manufacturing : fabrication assistée par ordinateur * computer-based (ac) : géré(e) par ordinateur * computer-controlled (ac) : commandé(e) par ordinateur, géré(e) par ordinateur - computer-controlled digital switching system : commutateur numérique commandé par ordinateur * computerdom (n) : univers de l’informatique * computer-generated (ac) : créé(e) par ordinateur - computer-generated cartoon character : personnage animé créé par ordinateur * computer-integrated (ac) : intégré(e) par ordinateur - (the) computer-integrated factory : (l’)usine intégrée * computerization (brit.) / computerization (amér.) (n) : informatisation (f) * computerise (brit.) / computerize (amér.) (v) (tr.) : informatiser * computerised (brit.) / computerized (amér.) (ppa) : informatisé(e) * computerkind (n) : (le) monde des informaticiens * computer-savvy (ac) : calé(e) en informatique, qui s’y connaît en informatique * computerspeak : (le) parler informatique, (le) jargon informatique * computing (n) : 1/ calcul ; 2/ informatique (n) (f) - cloud computing : informatique en nuage, infonuagique (n) (Q) - context-aware computing : informatique sensible au contexte - industrial computing : informatique industrielle - computing power : puissance de calcul, puissance de traitement * comrade (n) : camarade * comradeship (n) : camaraderie (f) * comsat (n) (pl. comsats) (abr. de communication satellite) : satellite de communications * con (tronc. de confidence) : dans les expressions con artist et con man : escroc, arnaqueur * con (n) (tronc. fam. de convention : colloque, congrès) * con (v) (tr.) : duper, escroquer - to be conned : se laisser duper, se faire avoir (fam.) - We have all been conned : Nous sommes tous tombés dans le panneau * conceal (v) (tr.) : dissimuler * concealer (n) : dissimulateur * concealment (n) : dissimulation (f) * concede (v) (tr.) : 1/ admettre, reconnaître ; 2/ concéder, accorder * conceit (n) : vanité (f), suffisance (f) * conceited (a) : vaniteux/-euse, suffisant(e) * conceivable (a) : concevable, imaginable, envisageable - every conceivable topic : tous les sujets qu'on peut imaginer * conceivably (adv.) : probablement, sans doute * concentrate (v) (tr.) concentrer - to concentrate production facilities : regrouper les moyens de production - to be concentrated : se concentrer (on, sur) ; (intr.) se concentrer * concept (n) : concept * conceptual (a) : conceptuel(le) * conceptually (adv.) : sur le plan conceptuel, du point de vue conceptuel * conceptualisation (brit.) / conceptualization (amér.) : conceptualisation * conceptualise (brit.) / conceptualize (amér.) : conceptualiser * concern (n) : 1/ souci, préoccupation (f), sujet d’inquiétude - to address a concern : régler un souci - That’s no concern of yours : Cela ne te regarde pas ; 2/ inquiétude (f), crainte (f) ; 3/ entreprise (f) * concern (v) (tr.) : 1/ concerner - as concerns … : au sujet de, pour ce qui concerne ; 2/ préoccuper, inquiéter - to be concerned over sth : s’inquiéter de qch * concerned (a) (fa p) : 1/ concerné(e) - the people concerned : les gens concernés ; 2/ inquiet/-ète, soucieux/-euse * concerning (prép.) : au sujet de, pour ce qui concerne * concert (n) : concert - I'd like to see them in concert : J’aimerais bien les voir en concert - symphony concert : concert symphonique * concession (n) : 1/ concession (f), point concédé ; 2/ concession (to a mine, à une mine) * conch (n) : conque (f) * concise (a) : concis(e) * concisely (adv.) : concisément, avec concision * conciseness (n) : concision (f) (syn. : concision) * concision (n) : concision (f) (syn. : conciseness) * conclude (v) (tr.) : conclure * conclusion (n) : 1/ conclusion (f) - to draw conclusions : tirer des conclusions - to leap to a conclusion : en arriver à une conclusion hâtive - to turn in one’s conclusions : remettre ses conclusions ; 2/ achèvement - at the conclusion of the placement period : à l’achèvement de la période de stage * conclusive (a) : 1/ concluant(e), probant(e) ; 2/ décisif/-ive * conclusively (adv.) : 1/ de façon concluante, de façon probante ; 2/ définitivement * concoct (v) (tr.) : 1/ composer (une boisson avec divers ingédients) ; 2/ (fig.) concocter, mijoter, inventer, fabriquer - Did you concoct this story? : Est-ce vous qui avez inventé cette histoire ? * concoction (n) : 1/ mélange (à boire), mixture (f) ; 2/ élaboration (f), conception (f) * concordancer (n) : concordancier - bilingual concordancer : concordancier bilingue - multilingual concordancer : concordancier multilingue * concrete (a) : 1/ concret/-ète ; 2/ effectif/-ive - concrete orders : commandes effectives (f pl.), commandes en bonne et due forme * concrete (n) (fa) : béton - post-tensioned concrete : béton post-contraint - concrete casing : enveloppe de béton - concrete mixer : bétonnière (f), bétonneuse (f) * concur (v) (intr.) : être d’accord, plussoyer – I concur : Je plussoie * concurrence (n) (fa) : 1/ concomitance (f), simultanéité (f) ; 2/ concours de circonstance, coïncidence (f) * concurrent (a) (fa) : concomitant(e), simultané(e) - concurrent engineering : ingénierie simultanée, ingénierie en parallèle * concurrently (adv.) (fa) : de façon concomitante, simultanément * concurrently running (ac) : concomitant(e), s'exécutant simultanément * concussion (n) (fa) : 1/ commotion (cérébrale) (f) ; 2/ ébranlement, secousse violente (f) * condition (n) (fa p) : 1/ état - to be in substandard condition : être dans un état en dessous de la norme - to be in serious condition : être dans un état grave - original condition : état premier, état d’origine - operating condition : état de fonctionnement ; 2/ condition (f) (au sens de stipulation) - on condtion that... : à condition que... ; 3/ (pl. conditions) a/ conditions - working conditons : conditions de travail ; b/ milieu - under sterile conditions : dans un milieu stérile * conditional (a) : 1/ conditionnel(le) ; 2/ (Gram.) conditionnel(le) - conditional clause : proposition conditionnelle - the conditional mood : le mode conditionnel, le conditionnel * conditioner (n) : agent de conditionnement - air conditioner : climatiseur * condo (n) (tronc. de condominium : immeuble en copropriété, copropriété (f)) * condom (n) : préservatif (n), capote (f) (fam.) - to have sex with a condom on : faire l’amour en mettant un préservatif * condom-dispensing (ac) : de distribution de préservatifs / de capotes – condom-dispensing machine : distributeur de capotes * condominium (n) : immeuble en copropriété, copropriété (f) * condone (v) (tr.) : fermer les yeux sur, excuser * conduce (v) (intr.) : 1/ inciter (to sth, à qch), conduire (to sth, à qch), contribuer (to sth, à qch), favoriser (sth, qch), être favorable (to sth, à qch), être propice (to sth, à qch) - Rising early conduces to health : Se lever tôt contribue à une bonne santé ; 2/ [événement] conduire (to sth, à qch) * conducive (a) : propice, favorable - conducive atmosphere : ambiance favorable - conducive political context : contexte politique propice - to be conducive to sth : être propice à qch, être favorable à qch - an environment conducive to economic growth : un milieu propice à la croissance économique * conduct (n) : conduite, comportement - code of conduct : code de conduite - blameworthy conduct : conduite répréhensible * conduct (v) (tr.) : conduire, mener, réalisser, procéder à, se livrer à - to conduct an audit : effectuer un audit - to conduct a poll : réaliser un sondage - to conduct high-precision strikes : procéder à des frappes très précises - to conduct demographic searches : se livrer à des recherches démographiques - to conduct tests : procéder à des essais * conducting (a) : conducteur/-trice - conducting medium : milieu conducteur * conductivity (n) : conductibilité (f) * conductor (n) (fa) : 1/ (brit.) contrôleur (dans un bus), receveur (d'autobus) ; 2/ (amér.) chef de train ; 3/ chef d'orchestre - The conductor bowed to the audience : Le chef d'orchestre salua l'auditoire ; 4/ (Élect.) conducteur - good conductor : bon conducteur * conduit (n) : 1/ canalisation (f), tuyau ; 2/ (fig.) tribune (f) ; 3/ intermédiaire * confect (v) (tr.) : confectionner (des gâteaux, des objets), fabriquer * confection (n) : 1/ (ind. sing.) (fa) friandises (f pl.), sucreries (f pl.), pâtisseries (f pl.) - bowl of confection : bol de friandises ; 2/ invention (f), création (f), fabrication (f) * confectioner (n) (fa) : confiseur * conference (n) (fa) : 1/ réunion (f) - to come in for a conference (brit.) : (Éduc.) venir rencontrer les professeurs - to be attending a sales conference : assister à une réunion commerciale - conference with parents : réunion avec les parents d'élèves (var. parent-teacher conference) ; 2/ colloque - on the sidelines of the conference : en marge du colloque * conference (v) (intr.) : se réunir, tenir une réunion * confess (v) (fa p) : 1/ (intr.) se confesser ; 2/ (tr.) avouer * confetti (subst. adj.) : réduit(e) à l’état de confettis, émietté(e) * confidant (n) : confident(e) (n) * confidence (n) (fa p) : 1/ confidence (f) - This is in strict confidence : Cela reste entre nous ; 2/ confiance (f) - to lose confidence in sb : ne plus avoir confiance en qn (syn. to lose faith in sb) - confidence game (abr. con game) : abus de confiance ; 3/ assurance (f) - She lacks confidence : Elle manque d’assurance * confident (a) (fa) : 1/ confiant(e) ; 2/ convaincu(e), persuadé(e) - I am confident that… : Je suis persuadé que… * confidential (a) (fa p) : 1/ de confiance - confidential servant : serviteur de confiance - confidential clerk : homme de confiance : 2/ confidentiel(le) - confidential letter : lettre confidentielle (f) - confidential report : rapport confidentiel * confidentiality (n) : 1/ caractère confidentiel, confidentialité (f) ; 2/ (le) secret professionnel * confidentially (adv.) : confidentiellement * confident-looking (ac) : qui a l’air confiant * configure (v) (tr.) : configurer, paramétrer * confirm (v) (tr.) : confirmer * confirmed (ppa) : confirmé(e) * conflate (v) : 1/ (tr.) regrouper, réunir, assembler, associer, combiner, fusionner (plusieurs choses) - to conflate research and practice : combiner recherche et pratique - to conflate several characters into one : fusionner plusieurs personnages en un seul ; 2/ (tr.) faire l'amalgame entre, amalgamer, confondre (deux choses) ; assimiler (with, à), confondre (with, avec) - to conflate two separate notions : faire l'amalgame entre deux notions distinctes - to conflate correlations with causation : confondre corrélations et rapport de cause à effet * conflation 1/ regroupement, réunion (f), assemblage, association (f), combinaison (f), mélange, fusion (f) ; 2/ amalgame, assimilation (f), confusion (f) * conflict (n) : 1/ conflit - conflict of interests : conflit d’intérêts - a protracted conflict : un conflit qui traîne en longueur ; 2/ différend, désaccord, mésentente (f) * conflict (v) (intr.) : être en désaccord, ne pas s’entendre * conflict-affected (ac) : touché(e) par un conflit - conflict-affected countries : pays touchés par un conflit * conflicting (a) : incompatible, contradictoire * conflict-prone (ac) : [région] exposé(e) à des conflits * conform (v) (intr.) : se conformer (to, à) * confront (v) (tr.) : affronter, faire face à * confrontation (n) : affrontement * confrontational (a) : 1/ de confrontation - confrontational policy : politique de confrontation ; 2/ agressif/-ive - to be confrontational : être porté à la confrontation * confrontative (a) : 1/ comparé(e) - confrontative study of preverbs ad-, in- and per- : étude comparée des préverbes ad-, in- et per- ; 2/ porté à la confrontation, conflictuel(le) - to get confrontative : chercher la confrontation - confrontative attitude : attitude conflictuelle * confrontive (a) : voir confrontative * confusing (a) : 1/ déroutant(e) ; 2/ qui prête à confusion, qui n’est pas clair(e) * confusion (n) : confusion (f), trouble, désordre - to cause confusion : être source de méprises * congeal (v) (intr.) : 1/ [sang] coaguler ; 2/ [lait] cailler * congealed (ppa) (fa) : 1/ [sang] coagulé(e) ; 2/ [lait] caillé(e) * congenial (a) : sympathique * congest (v) : (tr.) congestionner, boucher ; (intr.) se congestionner, se boucher * congested (ppa) : congestionné(e) - congested airways : voies respiratoires congestionnées (f pl.) * congratulations (n pl.) (fa) : félicitations (f pl.) * congratulate (v) (tr.) : féliciter * congregate (v) (intr.) [gens] se rassembler * congregation (n) : fidèles (pl.) (d’une église) * congress (n) : 1/ congrès - a party congress : le congrès d’un parti ; 2/ rapports sexuels (pl.) * Congress (n pr.) : (le) Congrès américain * Congressional (a) : 1/ du Congrès américain ; 2/ (congressional) du congrès * Congressman (n) : [homme] membre du Congrès américain, élu * Congresswoman (n) : [femme] membre du Congrès américain, élue (f) * conjoin (v) (tr.) : conjoindre (vieil.), unir, lier, souder, fusionner * conjugate (v) (tr.) : (Gram.) conjuguer * conjugated (ppa) : (Gram.) conjugué(e) - conjugated verb : verbe conjugué * conjugation (n) : (Gram.) conjugaison (f) * conjunction (n) : (Gram.) conjonction (f) * conjure (v) (tr.) (fa p) : 1/ (conjure) faire apparaître (comme par magie), évoquer - to conjure up : évoquer (à l'esprit) ; 2/ (conjure) implorer, supplier (de faire qch) * conjurer (n) : prestidigitateur, illusionniste * conjuring (n) : prestidigitation (f) - conjuring trick : tour de prestidigitation * conk (n) : 1/ coup (sur la tête), gnon ; 2/ (arg. brit.) tête (f), caboche (f); 3/ (arg. brit.) nez, pif, tarin * conker (n) : marron (d’Inde) - conkers : jeu de marrons (au bout d’un fil) * conk out (v) (intr.) (fam.) : tomber en panne * Conn. : abr. de Connecticut, (le) Connecticut * conned (prét. et p. passé de to con) * connect (v) (tr.) : connecter, raccorder, brancher * connectable (a) : connectable, raccordable, branchable * connected (ppa) : connecté(e), lié(e), relié(e), branché(e), raccordé(e) * connectedness (n) : connexion (f), lien * connection (n) : 1/ connexion (f), raccordement, raccord, branchement - parallel connection : connexion en parallèle - connection point : point de raccordement, point de branchement - dial-up connection : connexion par ligne commutée - Wheaton connection : raccord Wheaton ; 2/ relation (f) - to have connections : avoir des relations * connector (n) : connecteur * conquer (v) (tr.) : 1/ conquérir - to conquer Mars : conquérir Mars ; 2/ subjuguer, vaincre * conqueror (n) : conquérant (n) * conscious (a) : conscient(e) * consciously (adv.) : consciemment * consciousness (n) : (la) conscience (psychologique) - class consciousness : (la) conscience de classe * conscript (n) : (Mil.) conscrit, appelé(e) (n m/f) * conscript (v) (tr.) : appeler sous les drapeaux * conscripted (ppa) : appelé(e) sous les drapeaux * conscription (n) : conscription (f) * consecutive (a) : consécutif/-ive * consecutively (adv.) : consécutivement * consecutively numbered (ac) : numéroté(e) dans l'ordre de sa succession - consecutively numbered sectors : (Inf.) secteurs numérotés dans l'ordre où ils se suivent * consensual (a) : consensuel(le) * consent (n) : consentement, adhésion (f) - to fabricate consent : engendrer l’adhésion - to give one's consent : donner son consentement * consent (v) : (intr.) être d’accord, consentir - to consent to sth : consentir à qch - to consent to do sth : consentir à faire qch * Consequence: … (m d l) (t d p) (fam.) : Conséquence : …, Résultat : … * consequence (n) : conséquence (f), résultat, effet - I cannot be responsible for the consequences : Je ne réponds pas des conséquences - unintended consequence : effet pervers * consequent (a) : qui en résulte, consécutif/-ive * consequential (a) : 1/ qui s’ensuit, consecutif/-ive ; 2/ important(e) * consequentially (adv.) : consécutivement * consequently (adv.) : 1/ ensuite, par la suite ; 2/ alors, donc, par conséquent, c’est ainsi que… - Consequently, ... (a m p) (t d p) : Par conséquent…, Dès lors…, De ce fait…, Ce qui fait que ... * conservancy (n) : (la) défense de l'environnement (syn. conservation) * conservation (n) : (la) défense de l'environnement (syn. conservancy) - nature conservation : (la) défense de la nature - conservation area : zone protégée (f) * conservationism (n) : (la) défense de la nature, (la) défense de l’environnement * conservationist (n) : défenseur de la nature, défenseur de l'environnement - nature conservationist : défenseur de la nature * conservatism (n) : conservatisme - religious conservatism : conservatime religieux * conservative (a) (fa p) : 1/ (Polit.) conservateur/-trice ; 2/ [opinion] conformiste, classique ; 3/ prudent(e) - conservative calculations : calculs prudents * conservatively (adv.) (fa) : prudemment * conserve (n) : (de la) confiture * conserve (v) (tr.) : 1/ économiser, préserver ; 2/ économiser, conserver * consider (v) (tr.) (fa p) : 1/ considérer (as, comme) - to consider sth to be… : considérer que qch est… ; 2/ prendre en considération, tenir compte de ; 3/ envisager, réfléchir à, songer à - to consider + gér. : envisager de + inf. * considerate (a) : attentif/-ive ; prévenant(e) * considerately (adv.) : avec des égards * consideration (n) : 1/ considération (f) - There are two areas worthy of consideration : deux points méritent d’être pris en considération - to give special consideration to… : étudier plus particulièrement ; 2/ (au pl., considerations) : considérations, soucis - cost considerations : considérations de coût * considering (prép.) : compte tenu de, eu égard à, vu, étant donné * considering (that) (loc. conj.) : étant donné que, vu que, attendu que * consist (v) (intr.) : - to consist of : se composer de - to consist in : consister à * consistency (n) : cohérence (f) - consistency checks : tests de cohérence * consistent (a) (fa) : 1/ [individu] conséquent(e), cohérent(e), logique ; 2/ [conduite] uniforme - to be consistent with… : être conforme à…, être compatible avec… * consistently (adv.) (fa) : 1/ de façon cohérente ; 2/ de façon uniforme * consolation (n) : consolation (f) - If it’s any consolation : Si ça peut vous consoler * console (n) : 1/ console (f) (de jeu) ; 2/ - console table : console (la table) * console (v) (tr.) : consoler, réconforter * consolidated (ppa) : central(e) - consolidated reconditioning station : installation centrale de reconditionnement * consonant (n) : consonne (f) - double consonant : consonne double * consort (v) (intr.) : fréquenter (with addicts, des drogués, with criminals, des délinquants) * consortium (n) (pl. consortia) : consortium * conspicuous (a) : 1/ visible, en évidence (syn. noticeable) ; 2/ ostensible ; 3/ remarquable (syn. striking) * conspicuously (adv.) : 1/ visiblement, de façon évidente ; 2/ ostensiblement ; 3/ remarquablement - to be conspicuously absent : briller par son absence * conspiracy (n) : conspiration (f), complot - conspiracy nut : obsédé des complots - conspiracy theorist : partisan de la thèse du complot, conspirationniste - conspiracy theory : a/ thèse conspirationniste, thèse du complot ; b/ conspirationnisme * conspiratorial (a) : de conspirateur - conspiratorial thinking : raisonnements conspirationnistes (pl.) * constant (a) : constant(e) - at constant speed : à vitesse constante * constantly (adv.) : constamment * consternation (n) : consternation (f) (syn. dismay) * constitutional (a) : constitutionnel(le) - constitutional law : (le) droit constitutionnel * constrain (v) (tr.) : 1/ restreindre, limiter ; 2/ contraindre - to constrain sb to do sth : obliger qn à faire qch * constraint (n) : 1/ gêne (f), contrainte (f) - to put a constraint on sth : gêner qch, entraver qch ; 2/ limitation (f), goulet d’étranglement - (the) theory of constraints (technique de planification de la production visant à supprimer les goulets d'étranglement et les temps d'attente nécessaires) * construe (v) (tr.) : interpréter, comprendre * construct (n) : chose construite (f), construction (f), chose créée (f), création (f) (la chose), chose fabriquée (f), fabrication (f) - grammatical construct : construction grammaticale (f) - mental construct : vue de l’esprit (f) - theoretical construct : construction théorique * construct (v) (tr.) (fa p) : 1/ concevoir ; 2/ construire, fabriquer, créer - to construct a space station : construire une station spatiale * constructed (ppa) : (en parlant d’une langue) construit(e), fabriqué(e) - constructed language : langue construite (f) (par ex. espéranto, interlingua, klingon) * construction (n) : construction (f) - to be under construction : être en construction, être en cours de construction - to complete construction of a manufacturing facility : achever la construction d'une installation industrielle - cut-stone construction : (la) construction en pierre de taille * construe (v) (tr.) : interpréter * consult (v) (tr.) (fa p): 1/ (tr.) s'adresser à, prendre conseil auprès de ; (intr.) être conseiller, faire du conseil (on sth, sur qch) ; 2/ (tr.) consulter (un manuel, etc.) - to consult a map : consulter une carte ; (intr.) - to consult with a partner : se concerter avec un associé (about sth, sur qch), discuter (about sth, de qch) avec un associé * consultancy (n) : conseil, expertise-conseil (l’activité) - management consultancy : expertise-conseil en gestion * consultant (n) (fa) : conseil (la personne), expert-conseil (l’expert) (éviter l'anglic. « consultant »), conseiller - to hire a consultant : engager un expert - management consultant : conseil en gestion, expert en gestion - media consultant : conseiller en médias * consulting (n) : (le)conseil (l’activité) - consulting room : cabinet de consultation, cabinet médical, salle de consultation * consume (v) (tr.) : consumer - to consume intoxicating liquor : consommer des boissons enivrantes * consumer (n) : consommateur, consommatrice - a consumers’ magazine : une revue de consommateurs - a consumers’ union : une association de consommateurs (syn. a consumers’ organization) - consumer durables : biens de consommation durables - consumer electronics : (l’)électronique grand public (f) - consumer goods : biens de consommation * consumerism (n) : (la) défense des consommateurs * consummation (n) (fa) : achèvement, couronnement * consumption (n) : consommation (f) - profligate consumption : consommation effrénée - fuel consumption : consommation de carburant * contact (n) : contact - to be in contact : être en contact (with, avec) - to make contact : entrer en contact (with, avec) - the first contact of two races : la première rencontre entre deux races - to make first contact with a new civilisation : (Star Trek) entrer en contact avec une autre civilisation - contact info : coordonnées (pl.) * contact (v) (tr.) : contacter (sb, qn), se mettre en rapport avec (sb, qn) * contactee (n) : personne ayant approché des extraterrestres - contactee stories : récits de personnes ayant approché des extraterrestres * contact-free (ac) : sans contact direct * contactless (a) : sans contact - contactless key switches : touches à contact magnétique * contactor (n) : contacteur, interrupteur automatique * contain (v) (tr.) : contenir, comporter * container (n) : 1/ conteneur - cargo container : conteneur de marchandises - shipping container : conteneur de transport, conteneur de fret - container carrier : porte-conteneur - container ship : porte-conteneur ; 2/ récipient, bac - isothermal container : bac isotherme * contaminant (n) : polluant (n), contaminant (n) - waterborne contaminants contaminants flottant dans l'eau / en suspension dans l'eau * contaminate (v) (tr.) : contaminer, polluer * contaminated (ppa) contaminé(e), pollué(e) - contaminated food and water : nourriture et eau polluées * contamination (n) : contamination (f), pollution (f) - groundwater contamination : pollution des nappes phréatiques - radioactive contamination : contamination radioactive * contemn (v) (tr.) (rare) : mépriser, traiter ave mépris * contemplate (v) (tr.) (fa) : envisager * contempt (n) : mépris (for, de) (syn. scorn) - to hold in contempt : tenir pour méprisable * contemptuous (a) : méprisant(e) * contemptuously (adv.) : avec mépris * contend (v) : 1/ (tr.) prétendre, soutenir) ; 2/ (intr.) rivaliser (syn. to compete with) * content (a) (fa) : satisfait(e) (with, de) - to be content with sth : se contenter de qch - to be content to + inf. : se contenter de + inf. * content (n) (fa p) : 1/ teneur ; 2/ fond, matière (f), contenu - form and content : la forme et le fond - irrelevant content : contenu hors sujet - outrageous content : contenu choquant - content aggregating : (Toile) agrégation de contenus - content aggregation : (Toile) agrégation de contenus - content aggregator : agrégateur de contenus ; 3/ contentement * content-centric (ac) : centré(e) sur le contenu - content-centric networking : utilisation des réseaux où le contenu est roi * contented (a) : 1/ content(e), heureux/-euse ; 2/ satisfait(e) * contentedly (adv) : - to live contentedly : vivre heureux - to sigh contentedly : pousser un soupir d’aise * content-heavy (ac) : (Toile) au contenu surabondant - content-heavy site : site au contenu très abondant * contention (n) (fa) : 1/ dispute (f), conflit, désaccord - bone of contention : pomme de discorde ; 2/ affirmation (f), assertion (f) * contentious (a) : litigieux/-euse * contents (n pl.) 1/ contenu ; 2/ matières (f pl.), sommaire - table of contents : table des matières, sommaire * contest (n) (fa) : 1/ contestation (f) ; 2/ lutte (f), concours, joute (f), débat, rencontre (f) - a contest of eloquence : une joute oratoire * contestant (n) : concurrent(e) * context (n) : contexte * context-aware(ac) : (Inf.) sensible au contexte, attentif au contexte, réagissant au contexte, s’adaptant au contexte, adaptatif/-ive, tenant compte du contexte - context-aware computing : informatique sensible au contexte * contextualise (brit.) / contextualize (amér.) (v) (tr.) : contextualiser * continent (n) : continent * continental (a) : continental(e) - a continental holiday : (pour un Britannique) des vacances sur le continent * continual (a) : continuel(le), constant(e) * continually (adv.) : continuellement, sans cesse, constamment * continuation (n) : 1/ continuation (f) - continuation car : réédition d’une voiture ; 2/ prolongement, extension (f) ; 3/ suite (f), poursuite (f) * continue (v) : (intr.) continuer - We continued straight : Nous continuâmes tout droit- to continue unabated : continuer avec la même intensité * continuing (ppra) : continuel(le), permanent(e) - (the) continuing quest for still better quality : (la) quête incessante d'une qualité toujours plus grande * continuity (n) : continuité (f) - continuity of production : production ininterrompue - continuity girl : scripte (f), secrétaire de plateau (f) (syn. script-girl) - continuity shot : plan de liaison, raccord * continuous (a) : 1/ continu(e) - continuous improvement : amélioration continue ; 2/ (Gram.) - the present continuous : le présent progressif * continuously (adv.) : de façon continue, en continu - [factory] to operate continuously : [Usine] fonctionner en continu - to continuously monitor : surveiller en continu * continuously available (ac) : disponible en permanance - continuously available server : (Inf.) serveur disponible en permanence * continuously monitoring (ac) : surveillant de façon continue - continuously monitoring turbidimeter : opacimètre pour la surveillance en continu * continuously moving (ac) : à mouvement continu - continuously moving assembly line : chaîne d'assemblage à mouvement continu * contort (v) (tr.) : tordre - to contort oneself : se contorsionner * contour (n) : 1/ contour ; 2/ courbe de niveau - contour ploughing : culture en courbes de niveau * contract (n) : 1/ contrat - the effective date of a contract : la date d’effet d’un contrat, la prise d’effet d’un contrat - the specifics of your contract : les détails de votre contrat - to enter into a contract : passer un contrat - to sign a contract : signer un contrat (with, avec) - to terminate a contract : résilier un contrat (syn. to end a contract : annuler un contrat) - no-bid contract : contrat (octroyé) sans appel d’offres - recording contract : contrat avec une maison de disques - support contract : contrat de maintenance (syn. service contract) ; 2/ marché - public contract : marché public - supply contract : marché de fournitures * contract (v) (tr.) : contracter, attraper - to contract an illness : attraper une maladie * contracting (n) : passage de marchés * contractor (n) : 1/ entrepreneur, entreprise (f), fournisseur - contractor’s duties : responsabilité de l’entreprise - building contractor : entreprise du bâtiment - defense contractor : entreprise travaillant pour la Défense (nationale) - haulage contractor : entrepreneur de transports routiers ; 2/ maître d’œuvre - (the) main contractor : (le) maître d’œuvre (syn. lead contractor, prime contractor) ; 3/ adjudicataire (de marchés publics) * contraption (n) (fam.) : engin, machin, truc * contradict (v) (tr.) : contredire - to contradict oneself : se contredire * contradiction (n) : contradiction * contradictory (a) : contradictoire * contrail (n) (tronc. de condensation trail) : (Aéro.) traînée de condensation - launch contrail : traînée de lancement (d’un missile) * contrarotary (a) : contrarotatif/-ive - two contrarotary fans : deux ventilateurs contrarotatifs - contrarotary shafts : arbres contrarotatifs * contra-rotate / contrarotate (v) (intr.) : tourner en sens inverse, tourner en contrarotation * contrary (a) : contraire * contrary (n) : contraire (n) * contrary to (loc. prép.) : contrairement à, au contraire de, à l'inverse de * contrast (n) : contraste - by contrast : par contre * contrib (n) (tronc. de contributor : collaborateur) * contribute (v) (fa) : (tr.) donner (un article) ; (intr.) concourir (to, à), collaborer (to, à) * contribution (n) (fa) : 1/ apport, participation (f) ; 2/ article (de revue) - with contributions from : avec la collaboration de * contributor (n) (fa) : collaborateur (à un journal, une revue), auteur d’articles * contrivance (n) : 1/ machine (f), appareil, dispositif ; 2/ stratagème * contrive (v) : 1/ imaginer, inventer ; 2/ + inf. avec to : s’arranger pour + inf., réussir à + inf., trouver le moyen de + inf. * contrived (ppa) : artificiel(le), forcé(e) * control (n) : 1/ maîtrise (f) - self control : maîtrise de soi - (to be) under control : (être) maîtrisé(e) - to bring sth within one’s control : faire passer qch sous son contrôle - to return control to : rendre la main à ; 2/ limitation (f), atténuation (f) - damage control : atténuation des dégâts ; 3/ commande (f) - numerical control : (la) commande numérique - computer numerical control : commande numérique par ordinateur (var. computerised/-zed numerical control) - remote control : télécommande (f) (litt. « commande à distance ») - control bay : armoire de commande - control column (Aéro.) : levier de commande - control panel : tableau de commande - control system : système de commande - control unit : unité de commande ; 4/ au pl., controls : commandes (d'un appareil) - fly-by-wire controls (Av.) : commandes de vol électroniques ; 5/ asservissement - electrical control : asservissement électrique ; 6/ réglage - exposure control (Photog.) : réglage de l’exposition ; 7/ gestion (f) - production control : gestion de la production ; 8/ contrôle (anglic.) - ground control (dans un aéroport) contrôle au sol * control (v) (tr.) (fa p) : 1/ maîtriser - to control the narrative : maîtriser le discours; 2/ commander ; 3/ gérer * controlled (pp de to control) : 1/ [langue] normalisé(e), rationalisé(e) - controlled language : langue normalisée, langue rationalisée ; 2/ (en compo.) commandé(e) par, piloté(e) par * controller (n) : 1/ directeur, directrice ; 2/ (Av.) contrôleur, contrôleuse - ground controller : contrôleur au sol, contrôleur sol ; 3/ (Inf.) unité de commande ; 4/ (Électron.) variateur - thyristor controller : variateur à thyristor * controversial (a) : 1/ [individu] controversé(e) ; 2/ [question, point] controversé(e), discutable - controversial subject : sujet controversé * controversially (adv.) : 1/ de façon controversée ; 2/ (a m p) (t d p) Controversially, … Non sans susciter la controverse, … , Non sans controverse, … , De quoi susciter la controverse, … (var. Even more controversially, … , And most controversially, …) * controversy (n) (pl. controversies) : controverse (f), polémique (f) - to spark a controversy : déclencher une controverse - to stir controversy : susciter la controverse * conundrum (n) : énigme (f), casse-tête (syn puzzle) * convene (v) (fa) : (tr.) a/ organiser (une réunion), b/ réunir (un groupe), convoquer (des personnes) ; (intr.) [personnes] se réunir, s’assembler * convener (n) : membre d’une commission chargé de convoquer ses collègues * convenience (n) : 1/ commodité - convenience mart : commerce de proximité, dépanneur (Q) (syn. convenience store) ; 2/ conveniences (pl.) : éléments de confort - modern conveniences : le confort moderne - The house has all modern conveniences (abr. all mod cons) : La maison possède tout le confort moderne * convenient (a) (fa) : commode (qui arrange, qui facilite), pratique (anton. inconvenient) * conveniently (adv.) : commodément * conveniently located (ac) : disposé(e) rationnellement - conveniently-located push buttons : boutons-poussoirs disposés rationnellement * convent (n) : couvent * convention (n) (fa p) : 1/ convention (f) (au sens de coutume) - cinematic conventions : conventions cinématographiques (pl.) ; 2/ usage, convenances (f pl.) ; 3/ traité (n) ; 4/ congrès, colloque * conventional (a) (fa p) : 1/ conventionnel(le) ; 2/ classique, traditionnel(le), normal(e) (anton. non-conventional) * conventionally (adv.) (fa p) : 1/ par convention ; 2/ traditionnellement * conversant (adj. attribut) (fa) : dans l’expression to be conversant with… : s’y connaître en…, être très au fait de… - to be fully conversant with… : connaître parfaitement, maîtriser complètement - to be conversant in Japanese : connaître le japonais * conversation (n) : conversation (f) - to overhear a conversation : surpendre une conversation * converse (v) (intr.) : deviser (about, de) * Conversely, … (a m p) (t d p) : Réciproquement, …, Inversement, … * conversion (n) : 1/ transformation (f), conversion (f), aménagement ; 2/ conversion (religieuse) * convert (v) : (tr.) convertir ; (intr.) to convert to sth : adopter qch - to convert to natural gas : adopter le gas naturel * converter (n) : convertisseur - catalytic converter : pot catalytique (var. ortho. convertor) * convertibility (n) : convertibilité (f) (to, en + monnaie) - convertibility of the dollar to gold : convertibilité du dollar en or * convertible (a) : convertible (to, en + monnaie) * convertor (n) : voir converter * convey (v) (tr.) : 1/ transporter (goods, des marchandises, people, des gens) ; 2/ transmettre, communiquer ; 3/ rendre, traduire ; 4/ évoquer (syn. evoke) * conveyance (n) : convoyage, transport, acheminement * conveyer (n) voir conveyor * conveyor (n) : convoyeur - to be pushed along a conveyor : être poussé(e) sur un convoyeur, avancer sur un convoyeur - to pull sth along a conveyor : tirer qch sur un convoyeur, faire avancer qch sur un convoyeur - roller belt conveyor : convoyeur à bande sur rouleaux - travelling conveyor : bande transporteuse (f) - conveyor belt : transporteur à bande, bande de manutention, bande transporteuse, tapis roulant (var. ortho. conveyer) * convinced (ppa) : convaincu(e) - I am convinced that… : Je suis convaincu(e) que… * convincer (n) : argument convaincant, de quoi convaincre - It is certainly not a convincer for people who are not keen on getting jabbed : Ce n’est certainement pas un argument convainquant pour ceux qui ne sont pas très chauds pour se faire vacciner * convict (v) (tr.) : reconnaître coupable (of, de) * convicted (a) : reconnu(e) coupable - convicted felon : repris de justice * conviction (n) (fa) : 1/ conviction (f) - to carry conviction : être convaincant(e) ; 2/ déclaration de culpabilité, inculpation (f), mise en examen ; 3/ condamnation (f) * convoy (n) : convoi - humanitarian aid convoy : convoi d’aide humanitaire * coo (v) (intr.) : [pigeon] roucouler * cook (n) : cuisinier * cook (v) : (tr.) cuisiner - to cook lunch / dinner : préparer le déjeuner / le dîner ; (intr.) faire la cuisine * cooker (n) : cuisinière (f) - electric cooker : cuisinière électrique - gas cooker : gazinière (f) * cookie (n) (amér.) : 1/ (Cuis.) biscuit - cookie cutter (amér.) : emporte-pièce (masc.) (syn. brit. pastry-cutter) - cookie pusher : a/ petit vendeur de biscuits maison ; b/ (péj.) diplomate américain ; 2/ (Net) témoin (de connexion), mouchard (électronique) * cooking (n) : 1/ cuisson (f) - cooking pot : marmite (f) ; 2/ (la) cuisine * cool (a) : 1/ frais/fraîche ; 2/ indifférent(e), détaché(e) - to play it cool : jouer l’indifférent * cool (v) (tr.) : rafraîchir * coolant (n) : 1/ fluide réfrigérant ; 2/ huile de refroidissement * cool down (v) (tr.) : faire baisser la température * cool off (v) (intr.) : se calmer * cooper (n) : tonnelier * co-operate (v) (intr.) : coopérer, collaborer * co-ordinate / coordinate (v) (tr.) : coordonner * coordinates (n pl.) : coordonnées (f pl.) - Cartesian coordinates : coordonnées cartésiennes - GPS coordinates : coordonnées de géolocalisation * coordination (n) : coordination (f) - in coordination with… : en coordination avec… * cop (n) (argot) : flic (syn. brit. copper) - motorcycle cop : motard de la police - to play cops and robbers : jouer aux gendarmes et aux voleurs * cop (v) (arg.) (tr.) : attraper, prendre, pincer - She is going to cop the lot : Elle va mettre la main sur le tout - to cop it : en prendre plein la tronche * cope (v) (intr.) : faire face (with, à), affronter, venir à bout (with, de) * copier (n) : photocopieur - office copier : photocopieur de bureau * copper (n) : 1/ cuivre - an oxide of copper : un oxyde de cuivre - nickel-plated copper : cuivre nickelé - tin-plated copper : cuivre étamé - copper cable : câble en cuivre ; 2/ (brit.) flic * coprocessor (n) : (Inf.) coprocesseur * co-produce (v) (tr.) : co-financer (un film) * Copt (n) : (Rel.) Copte (n) * Coptic (a) : (Rel.) copte * Coptic (n) : copte (n) (la langue) * copy (n) (fa p) : 1/ copie (f) - hard copy : (Inf.) impression sur papier; 2/ exemplaire ; 3/ (ind. sing.) (Presse) articles (pl.) * copy (v) (tr.) : 1/ copier ; 2/ dupliquer - to copy oneself : se dupliquer ; 3/ recopier - to copy a citation : recopier une référence * copy and paste (v coord.) : recopier-coller (du texte) (into, dans) (var. copy-and-paste) - to copy-and-paste a statement : recopier-coller une déclaration * copycat (a) : identique * copycat (n) : imitateur, imitatrice * copying (n) : 1/ copiage ; 2/ duplication (f) ; 3/ recopiage * copy out (v) (tr.) : recopier - to copy out sentences from a book : recopier des phrases d’un livre * copyright (n) : droit d’auteur - copyright holder : détenteur des droits de reproduction * copy-writer (n) : rédacteur publicitaire (aussi copywriter) * coquettish (a) : 1/ coquet(te) ; 2/ aguicheur(e), provocant(e) * coquettishly (adv.) : 1/ avec coquetterie, coquettement ; 2/ de façon provocante * coracle (n) : coracle * corbel (n) : (Arch.) corbeau * corbelled (a) : (Arch.) encorbellé(e) - corbelled vault : voûte encorbellée (f) * corbie (n) : corneille (f) - corbie step : (Arch.) redan, pas de moineau * corbie-stepped (ac) : (Arch.) à redents, à pas de moineau (syn. crow-stepped) * cor blimey (interj.) (brit.) : bon dieu ! * cord (n) (fa p) : 1/ cordon, cordelette (f) ; 2/ (amér.) câble électrique, fil électrique, cordon (syn. brit. flex) - coiled cord : cordon spiralé - power cord : fil d’alimentation (électrique), cordon d’alimentation (électrique) - twisted cord : cordon spiralé - cord clip : fixe cordon (masc.) ; 3/ - the spinal cord : la moelle épinière ; 4/ (mesure = 3,53 m3 (brit.), 3,62 m3 (amér.)) corde (de bois) * cordless (a) : sans fil - cordless plug : cavalier * cordon sanitaire (n) : cordon sanitaire (against sth, contre qch) - to set up a cordon sanitaire around an area : mettre en place un cordon sanitaire autour d’une zone * core (n) : 1/ cœur (de fruit), centre (de qch), partie centrale (f) (de qch) ; (fig.) cœur, parties profondes (f pl.) (d’une personne) - at the core : au fond - rotten to the core : pourri jusqu’à la moelle - mid core : noyau central - core business : cœur de métier ; 2/ (Géol.) carotte (f) - ice core : carotte de glace * coriander (n) (brit.) : (la) coriandre (l’herbe) (syn. amér. cilantro) * cork (n) : 1/ liège - artificial cork : liège reconstitué ; 2/ bouchon - cork screw : tire-bouchon (masc.) (aussi corkscrew) * corker (n) : 1/ boucheuse (f) ; 2/ (arg.) qch qui vous en bouche un coin - That was a corker : Ça m’en a bouché un coin ; 3/ (arg.) (selon le cas) mec épatant, fille épatante (f) * corkscrew (n) : tire-bouchon (masc.) (aussi cork-screw) * corn (n) : cor (au pied) - to remove a corn : enlever un cor au pied * corn (n) : 1/ maïs ; 2/ (brit.) (n ind. sing.) blé * corner (n) : 1/ coin (d'une rue) - on the corner : au coin de la rue ; 2/ coin (au sens d’endroit) - a forgotten corner of the universe : un coin oublié de l'univers * corner (v) (tr.) : 1/ acculer ; 2/ mettre au pied du mur * cornered (ppa) : 1/ acculé(e) - a cornered rat : un rat acculé; 2/ (qui est) mis au pied du mur, (qui a) le dos au mur * cornerstone (n) : pierre angulaire (f) * cornflower (n) : bleuet * Cornish (a) : cornouaillais(e), de Cornouaille - the Cornish hedge : la haie de Cornouaille * cornucopia (n) : corne d’abondance * Cornwall (n pr.) : (la) Cornouaille * corny (a) : 1/ [joke, plaisanterie, etc.] rebattu(e) ; 2/ débile, pitoyable * coronation (n) : couronnement * coroner (n) (brit.) : expert médico-légal * Corp. (abr. de Corporation : société de capitaux) * corpora (voir corpus) * corporate (a) : qui concerne les sociétés, des grandes sociétés, qui a trait aux entreprises, d’entreprise, d’industrie - corporate culture : culture d’entreprise - a company’s corporate image : l’image de marque d’une entreprise - corporate name : dénomination sociale, raison sociale - corporate speak : jargon des entreprises * corporates (n pl.) : entreprises (f pl.) * corporation (n) (fa) : 1/ (amér.) société (par actions), grosse entreprise (f), compagnie (f) - banking corporation : compagnie bancaire - major corporation : grande société - multinational corporation : société multinationale ; 2/ (brit.) (= organisme public, organisme semi-public) société (f), organisme - the British Broadcasting corporation : la société de radiodiffusion britannique * corps (n) : (Milit.) corps (d’armée) * corpse (n) : cadavre (syn. dead body) - bloated corpse : cadavre boursouflé * corpus (n) (pl. corpora) : corpus - bilingual corpus : corpus bilingue - parallel corpora : corpus parallèles * corral (n) : enclos (à bœufs, à chevaux) (aux États-Unis, en Amérique du Sud) * correct (a) : 1/ juste ; 2/ correct(e) ; 3/ adéquat(e), approprié(e), ad hoc * correct (v) (tr.) : corriger - to correct mistakes : corriger des erreurs * corrected (ppa) : corrigé(e) - I stand corrected : au temps pour moi, je reconnais mon erreur * correctly (adv.) : correctement, bien (anton. incorrectly) * correctly designed (ac) : bien conçu(e) * correctly timed (ac) : bien réglé(e) - correctly timed ignition : allumage bien réglé * correctness (n) : 1/ justesse (f) ; 2/ correction (f), conformité (f), bienséance (f) - political correctness : bienséance politique, (le) politiquement correct - stylistic correctness : bienséance stylistique * correspondent (n) : 1/ correspondant, envoyé - special correspondent : envoyé spécial - war correspondent : correspondant de guerre ; 2/ journaliste spécialisé - foreign affairs correspondent : spécialiste de politique internationale - legal correspondent : journaliste juridique - military correspondent : journaliste aux armées * corresponding (a) : correspondant(e) * correspondingly (adv.) : 1/ de la même façon ; 2/ proportionnellement * corridor (n) : corridor, couloir (syn. passage) - wildlife corridor : corridor faunique * corrode (v) : (tr.) corroder ; (intr.) rouiller * corrosion (n) : corrosion - to resist corrosion : résister à la corrosion * corrosion-proof (vc) (tr.) : traiter contre la corrosion * corrosion-resistant (ac) : anti-corrosion * corrugated (a) : ondulé(e) - corrugated cardboard : carton ondulé - corrugated iron : tôle ondulée (f) - corrugated roofing : toiture en tôle ondulée * corrupt (a) : corrompu(e) * corrupt (v) (tr.) : 1/ corrompre (qn) ; 2/ altérer (qch) * corruption (n) : corruption (f) * corset (n) : corcet (de femme) * Corsica (n pr.) : (la) Corse * Corsican (a) : corse (sans maj.) * Corsican (n pr.) : Corse (l’habitant ou l’habitante) * co-sign (v) (tr.) : cosigner * co-signature (n) : cosignature (f) * cosmetic (a) (fa) : 1/ cosmétique ; 2/ [mesure] superficiel(le), symbolique * cosmodrome (n) : cosmodrome - [rocket] to take off from the Plesetsk osmodrome : [fusée] décoller du cosmodrome de Plesetsk * cosmologist (n) : cosmologue (m/f) * cosmonaut (n) : cosmonaute (m/f) * cosplay (n) : pratique consistant à incarner des personnages de fiction * cost (n) : coût - to cut costs : réduire les coûts - to force down costs : faire baisser les coûts - to succeed at a cost : réussir coûte que coûte - cleaning costs : coûts de nettoyage - handling costs : frais de manutention - operating costs : coûts d’exploitation - processing costs : coûts de traitement - production costs : coûts de production - tardiness costs : coûts liés aux retards - cost cutting : réduction des coûts - cost metrics : données relatives aux coûts, évaluation des coûts * cost (v) (cost, cost) (tr.) : coûter - to cost from $50,000 to $200,000 : coûter de 50 000 à 200 000 dollars - It costs a bomb : Ça coûte un argent fou * cost (prét. de to cost) * cost (pp de to cost) * costal (a) : côtier/-ière - costal liner : paquebot côtier * cost-effective (ac) : d’un prix compétitif, d’un bon rapport qualité/prix, rentable * cost-effectively (adv.) : de façon compétitive sur le plan des coûts, de façon économique, de façon rentable * cost-effectiveness (nc) : rentabilité (f) * costing (n) : établissement du prix de revient * cost-intensive (ac) : très coûteux/-euse, trop coûteux/-euse - cost-intensive army : armée très coûteuse (f), armée trop coûteuse * costly (a) : coûteux/-euse, onéreux/-euse * costume (n) : 1/ costume, déguisement - to wear a costume : porter un déguisement, venir déguisé, être costumé - costume(s) party : bal masqué ; 2/ costume (traditionnel) * cosy (brit.) / cozy (amér.) (a) : 1/ douillet(te), confortable - cosy nest : nid douillet ; 2/ [individu] bien au chaud * cosy up (brit.) / cozy up (amér.) (v) (intr.) : 1/ se mettre à l’aise, s’installer confortablement ; 2/ se pelotonner (to sb, contre qn), se blottir (to sb, contre qn) ; 3/ faire ami-ami (to sb, avec qn) ; 4/ [deux personnes] se rapprocher * coterminous (a) : 1/ adjacent(e), attenant(e), voisin(e) ; 2/ coïncident(e) - Amdo is mostly coterminous with present-day Qinghai : Les limites de l’Amdo coïncident en grande partie avec celles du Qinghai actuel * cottage (n) : 1/ maison de paysan ; 2/ maisonnette (f) * cotton (n) : coton - cotton picker : ramasseur de coton, cueilleur de coton * couch (n) (fa) : canapé, divan - couch potato : mollasson passant son temps devant la télé * cougar (n) (fa p) : 1/ couguar ; 2/ puma * cough (n) : toux (f) * cough (v) (intr.) : tousser * cough up (v) (intr.) : payer, casquer (fam.), abouler (fam.) * coulee (n) : ravin, ravine (f) * concern (n) : 1/ souci ; 2/ intérêt ; 3/ entreprise (f), affaire (f) * concern (v) (tr.) : 1/ - to be concerned about : s’inquiéter de ; 2/ - to be concerned with : avoir pour objet, se rapporter à * council (n) : conseil (au sens de réunion) - council estate : cité HLM * councilman (n) (amér.) : conseiller municipal * councilwoman (n) (amér.) : conseillère municipale (f) * counsel (v) (tr.) : conseiller (sb, qn) (syn. to advise) * counsellor (brit.) / counselor (amér.) (n) : conseiller - grief counsellor : psychologue spécialiste du deuil - job counsellor : conseiller pour l’emploi, conseiller pour l’embauche * count (n) : comte (le titre) * count (n) : compte * count (v) (tr. et intr.) : compter - Don't count on it! : N'y compte pas ! / N’y comptez pas ! * countable (a) : dénombrable - countable noun : nom dénombrable (anton. uncountable : indénombrable) * count down (v) (intr.) : faire le compte à rebours, compter à rebours - to count down to… : compter les jours jusqu’à… * countdown (n) : compte-à-rebours * countenance (v) (tr.) : consentir à, accorder * countenance (n) (fa) : expression (du visage) (f) * counter (v) (tr.) : s’opposer à - to counter that… : répliquer que… * counter (n) : compteur - revolution counter : compte-tour (abr. rev counter) - thread counter : compte-fil (masc.) * counteract (v) (tr.) : 1/ contrecarrer, contrer ; 2/ neutraliser (un effet) * counter-attack / counterattack (n) : contre-attaque (f) - to launch a counterattack : lancer une contre-attaque - to fend off a counter-attack : repousser une contre-attaque * counterattack (v) (tr. et intr.) : contre-attaquer * countercheck (v) (tr.) : contre-vérifier ; (intr.) faire une contre-vérification * countercoup (n) : contre coup d’État - to stage a countercoup : organiser un contre coup d’État * counterespionage (n) : (le) contre-espionnage (noter les deux « n » en français) * counter-example (n) : contre-exemple (to sth, de qch) * counterfeited (a) : de contrefaçon - counterfeited football merchandise : produits dérivés footballistiques contrefaits (pl.) * counterfeiting (n) : contrefaçon (de passeports, de monnaie) - a currency prone to counterfeiting : une monnaie exposée à la contrefaçon * counterfort (n) : contrefort * counterpane (n) : courtepointe (f) * counterpart (n) : homologue (n) - the US president and his Russian counterpart : le président américain et son homologue russe * counterproductive (a) : qui a l’effet inverse de celui escompté, qui est contraire à l’objectif recherché, qui se retourne contre son auteur * counterproductively (adv.) : de façon négative * counter protest / counter-protest (n) : contre-manifestation (f) * counter protest / counter-protest (v) (intr.) : contre-manifester * counterstrike (n) : contre-attaque, riposte (anton. strike) - to lauch a counterstrike : lancer une contre-attaque * counterstrike (v) (intr.) : contre-attaquer (anton. to strike) * countersurveillance (n) : (la) contre-surveillance * counterweigh (v) (tr.) : faire contrepoids à * counterweight (n) : contrepoids * countess (n) : comtesse (f) * counting (prép.) : en comptant, y compris * countless (a) : innombrable - countless reports : un nombre incalculable de rapports * country (n) (pl. countries) : pays - to betray one’s country : vendre son pays (to, à) - to quit (amér.) a country : quitter un pays - EU countries : (les) pays de l’UE - land-locked country : pays enclavé - the Nordic countries : les pays nordiques - country music : musique paysanne traditionnelle * countryside (n) : campagne - to spoil the countryside : souiller la campagne * county (n) (pl. counties) : comté - Los Angeles County : le comté de Los Angeless * coup (n) : 1/ coup d’État - to foment a coup : fomenter un coup d’État - to ignite a coup : susciter un coup d’État - attempted coup : tentative de coup d’État - military coup : coup d’État militaire - coup attempt : tentative de coup d’État ; 2/ joli coup, beau coup * couple (n) : deux - a couple of centuries : deux siècles * couple (v) (tr.) : coupler, connecter, raccorder ; (intr.) s’accoupler (syn. to mate) * coupon (n) : bon (n) - coupon to be cut out : bon à découper * courage (n) : courage - I have run out of courage : Je n’ai plus le courage, Le courage me manque * courier (n) : 1/ courrier, messager, (Milit.) estafette (f) ; 2/ coursier ; 3/ (brit.) (Tour.) accompagnateur * course (n) (fa) : 1/ cap, route (f) - Let's change course! : Changeons de cap ! - to stay the course : garder le cap, maintenir le cap ; 2/ cours (d’une rivière) ; 3/ trajectoire (f), parcours ; 4/ évolution (f), tournure (f) ; 5/ a/ série de cours, enseignement - compulsory course : enseignement obligatoire (anton. optional : facultatif) - sandwich course (brit.) : formation en alternance, formation alternée (f) ; 6/ stage (enseigné) - training course : stage de formation ; 7/ (Cuis.) plat (partie d’un repas) * course (v) (fa) (intr.) : circuler à toute vitesse * courseware (n ind. sing.) : logiciels (pl.) d’enseignement * coursework (n ind. sing.) : 1/ (Éduc.) devoirs (pl.) (à remettre) ; 2/ (Éduc.) travaux (pl.) ou projets (pl.) entrant dans le cadre d'un contrôle continu, (le) contrôle continu - to produce one piece of coursework : réaliser un projet * court (n) : 1/ cour (f) (d’un roi) - court historian : historien de la cour, historien officiel ; 2/ cour (de justice), tribunal - kangaroo court : a/ tribunal fantoche, tribunal irrégulier, parodie de tribunal, tribunal bidon, pseudo tribunal, simulacre de tribunal ; b/ (métonymie) procès monté de toutes pièces, simulacre de procès, parodie de justice (var. kangaroo tribunal) - court reporter : greffier ; 3/ (Sport) terrain (de tennis ,etc.) - pelota court : fronton * court (v) (tr.) : faire la cour à - to court disaster : jouer avec le feu - to court the press : courtiser la presse * courteous (a) : courtois(e) - Be courteous! : Soyez courtois ! * courteous and polite (paire adj.) : courtois et poli, courtoise et polie - The staff were courteous and polite with customers : le personnel était courtois et poli à l’égard des clients * courteously (adv.) : avec couroisie, courtoisement * courtesy (n) : courtoisie (f), politesse (f), galanterie (f) - courtesy call : a/ visite de courtoisie, visite de politesse ; b/ appel de courtoisie, appel amical * courtier (n) (fa) : courtisan, courtisane * courtship (n) : cour (f) (que l’on fait), période de fréquentation (d’un couple avant le mariage) * cousin (n) : cousin, cousine - first cousin : cousin(e) germain(e) - secondary cousin : cousin(e) au second degré * cove (n) : anse (f) (syn. bay) * covenant (n) : convention (juridique) (f), alliance (religieuse) (f) * cover (n) : 1/ couverture (f), couv (f) (abr. fam.) (de livre, de revue, etc.) ; 2/ pages (f pl.) de couverture - cover story : (Presse) article (annoncé) en couverture (renvoyant aux pages intérieures), article principal (illustré en couverture) ; 3/ housse (f) - mattress cover : couvre-matelas (masc.) - cover pad : (Auto.) revêtement de protection -; 4/ cache - radiator cover : cache-radiateur (masc.) ; 5/ abri - to take cover : s’abriter ; 5/ (Mus.) reprise (f) - drum cover : reprise à la batterie * cover (v) (tr.) : 1/ (tr.) couvrir, recouvrir (with sth, de qch) - to be covered with dust : être couvert de poussière ; 2/ (tr.) couvrir, s’étendre sur, occuper - [quarry] to cover three hectares : couvrir trois hectares ; 3/ (tr.) couvrir (un toit) - to cover a roof in tile : couvrir de tuiles un toit ; 4/ (tr.) (Usin.) munir de protections (une machine) ; 5/ (tr.) (Journ.) couvrir (des événements), assurer la couverture de, rendre compte de - to cover a war : couvrir une guerre ; (intr.) être correspondant ; 6/ traiter, couvrir - to cover a subject : traiter un sujet ; 6/ (tr.) s’appliquer à, concerner - [warranty] to cover parts : [garantie] s’étendre aux pièces * coverage (n) : 1/ couverture (médiatique), façon de rendre compte (d'un événement, d'une question) - The event got a lot of coverage in the press : La presse a rendu compte de cet événement en long et en large - heavy coverage : forte couverture médiatique - news coverage : façon de rendre compte de l'actualité ; 2/ prise en charge * covering (n) : 1/ revêtement - covering fabric : tissu de revêtement ; 2/ masque - to wear a face covering : se couvrir le visage * coverings (n pl.) : - fabric wall coverings : textiles muraux * coverlet (n) : couvre-lit (masc.) * covert (a) : clandestin(e), souterrain(e), caché(e), secret/-ète (anton. overt) - covert action : menées souterraines (f pl) (syn. covert activities) - covert listening device : dispositif d'écoute clandestin - covert operation : opération clandestine (f), opération secrète (syn. undercover operation) - covert plans : plans secrets * cover up (v) : 1/ (tr.) couvrir, recouvrir ; 2/ (tr.) dissimuler, cacher- to cover up one’s tracks effacer ses traces ; 3/ (intr.) se couvrir, se vêtir entièremnt * covet (v) (tr.) : convoiter * coveted (ppa) : convoité(e) * covetous (a) : avide * covings (n pl.) : voussures (f pl.) - ceiling covings : voussures de plafond * cow (n) : 1/ vache (f) - cash cow : mine d’or (au fig.) - cow cake : tourteau pour les vaches ; 2/ (brit.) a/ conne (f), connasse (f) - an old cow : a/ une vieille conne ; b/ une peau de vache (au fig.) ; 3/ (amér.) grosse vache, grosse baleine (f), grosse (n f) * cow (v) (tr.) : intimider * coward (n) : couard (n) * cowardice (n) : couardise (f), lâcheté (f) * cowardly (a) : lâche, couard(e) * cowcatcher (n) : chasse-pierre (de locomotive) (masc.) * cowed (ppa) : intimidé(e) - to be cowed : être intimidé(e) (by, par) * cowpox (n) : variole de la vache * co-write (v) (tr.) : coécrire * cowslip (n) : coucou (la plante) * coxswain (n) : barreur - lifeboat coxswain : timonier (de canot de sauvetage) * coy (a) : faussement modeste, faussement timide, faussement pudique, faussement effarouché(e) * coyly (adv.) : avec une fausse timidité, d’un air faussement pudique, d’un air faussement effarouché * coyness (n) : fausse timidité (f), fausse pudeur (f) * cozy (a) : voir cosy (a) * crab (n) : 1/ a/ crabe (l’animal) - ghost crab : crabe fantôme ; b/ (du) crabe (la chair) ; 2/ (fig.) rouspéteur, râleur, grincheux ; 3/ au pl. crabs : morpions, morbaques (vulg.) * crab (v) : 1/ (tr.) déplacer de côté ; (intr.) marcher de côté, marcher comme un crabe ; 2/ (intr.) pêcher des crabes - to go crabbing : aller pêcher des crabes, aller à la pêche aux crabes ; 3/ (intr.) se plaindre (about sth, de qch) * crabbing (n) : pêche aux crabes * crabby (a) : rouspéteur, râleur, grincheux/-euse * crack (n) : 1/ craquement ; 2/ fente (f), fissure (f), lézarde (dans un mur), crevasse (dans le sol), fêlure (dans du verre, de la céramique) - surface cracks : fissures de surface ; 3/ (amér.) vanne (f), blague (f) ; 4/ (le) crack (la drogue) ; 5/ (the) crack of dawn : (l’)aurore (f), (l’)aube (f), (le) lever du jour, (le) point du jour, (la) pointe du jour - at the crak of dawn : lorsque le jour se lève * crack (v) : 1/ (tr.) faire craquer - to crack one’s knuckles : faire craquer les articulations de ses doigts ; (intr.) craquer ; 2/ (tr.) fêler, fissurer, craqueler ; (intr.) se fêler, se fissurer, se craqueler ; 3/ (tr.) ébranler, détruire (le crédit de qn) ; (intr.) s’effondrer, craquer - to crack at the seams : craquer de toutes parts * crack down (v) (intr.) : sévir (on sb, contre qn) - to crack down on polluters : réprimer les pollueurs * cracked (ppa) : craquelé(e) * cracker (n) : biscuit (salé) * cracking (a) (brit.) (fam.) : épatant(e), super (inv.), génial(e) (syn. smashing) * crackle (n) : crépitement (des flammes), grésillement (du beurre dans une poêle) * crackle (v) (intr.) : [flammes] crépiter, [beurre] grésiller * crackling (a) : crépitant(e), grésillant(e) * crackling (n) : crépitement (des flammes), grésillement (du beurre dans une poêle) * cradle (n) : 1/ berceau ; 2/ (Téléph.) support (de combiné) * craft (n) : 1/ embarcation (f) ; 2/ engin - to intercept an unknown craft : intercepter un engin inconnu ; 3/ métier, art - the craft of fiction : l’art du romancier ; 4/ métier artisanal, artisanat ; 5/ travaux manuels (pl.) - We do craft at school : Nous avons des cours de travaux manuels à l'école * craft (v) (tr.) : 1/ réaliser, confectionner (un objet) ; 2/ travailler (à une œuvre), élaborer, créer (un récit, un roman), écrire (un article) - to craft news stories : écrire des articles d’information * craftsman (n) (pl. craftsmen) : artisan, compagnon * craftsmanship (n) : (le) savoir-faire, (le) métier * craftsperson (n) : artisan - a maintenance craftsperson : un technicien de maintenance * craftwork (n sing.) : travail artisanal, artisanat * crag (n) : 1/ rocher à pic ; 2/ visage taillé à coups de serpe * cram (v) : 1/ (tr.) fourrer, entasser (sth into, qch dans) ; 2/ (intr.) potasser - to cram for an exam : potasser en vue d'un examen * crammer (n) : - a crammer’s school : une boîte à bachot (var. a cramming school) * cramming (n) : bachotage - cramming school : boîte à bachot * cramp (n) : crampe (f) * cramp (v) : 1/ (intr.) [muscle] se contracter ; 2/ (tr.) (fig.) gêner, entraver - to cramp sb’s style : priver qn de ses moyens, être un boulet pour qn, mettre des bâtons dans les roues de qn * cramped (a) : à l’étroit - in cramped conditions : à l’étroit * cranberry (n) : airelle (f) * crane (n) (fa) : 1/ grue (l’oiseau) (f) ; 2/ grue (l’engin) (f) * crane (v) (tr.) : tendre (one’s neck, le cou) * crank (n) : 1/ manivelle (f) - window crank : lève-vitre (d’auto) ; 2/ personne loufoque, personne excentrique, original (n), huluberlu, olibrius, taré (n) - crank calls and letters : appels (téléphoniques) et lettres d’un taré - to take a crank call : répondre à l’appel d’un taré - crank stuff : trucs délirants (pl.) * crank (v) : (tr.) 1/ tourner (la manivelle) - to crank the handle : tourner la manivelle ; 2/ démarrer à la manivelle (un moteur) * cranking (n) : tours de manivelle (pl.), démarrage à la manivelle - during cranking : lors du démarrage à la manivelle - manual cranking : démarrage manuel - the cranking handle : la manivelle * crank out (v) : (tr.) produire, sortir (en grande série) - to crank out 350,000 cars a year : sortir 350 000 voitures par an * crankshaft (n) : arbre-vilebrequin, arbre moteur * cranky (a) : loufoque * cranny (n) : fissure (f), fente (f) - nooks and crannies : coin et recoins * crap (n) (amér.) : 1/ merde (f) - to take a crap : chier un coup ; 2/ foutaise (f), foutaises (f pl.) * crap (v) (amér.) : 1/ (tr.) chier dans (vulg.) - to crap one’s pants : chier dans son froc ; (intr.) chier (vulg.) * crapware (n ind. sing.) : logiciels de merde (vulg.), logiciels pourris (pl.) * crape (n) : crêpe (m) (de deuil) * crappy (a) : merdique, nul(le) à chier - to have done a crappy job on sth : avoir salopé un travail * crash (n) (pl. crashes) : 1/ écrasement - plane crash : accident d'avion - crash pad : tapis de réception ; 2/ collision (f) - crash barrier (brit.) : glissière de sécurité - crash helmet : casque de protection, casque antichoc - crash pad : tapis de réception - crash test : simulation de collisions ; 3/ (fig.) effondrement, débâcle - the Wall Street crash : l’effondrement de la bourse américaine, la débâcle de Wall Street (en 1929) * crash (v) : 1/ (tr.) faire s’écraser ; (intr.) s’écraser ; 2/ (tr.) faire s’effondrer - That would crash the dollar : Cela ferait s’effondrer le dollar ; (intr.) s’effondrer * crash and burn (v coord.) (intr.) : brûler, se consumer ; (intr .) s’effondrer, aller droit dans le mur (au fig.), se planter (fam.) * crashed (ppa) : qui s’est écrasé(e) - crashed UFO : ovni qui s’est écrasé * crasher (n) (en compo., à droite) : - gate crasher : resquilleur (à un événement payant) intrus(e) - party crasher : personne qui s’invite à une soirée, personne qui vient sans invitation (à une soirée), intrus(e) * crash-land (vc) (intr.) : [avion] s’écraser au sol * crash-proof / crashproof (v) (tr.) : prévenir une panne sur * crass (a) : 1/ insensible ; 2/ crasse, rustre * crate (n) : (large) caisse (f) * crater (n) : cratère - the rim of a crater : le bord d’un cratère - bomb crater : cratère de bombe * crave (v) (tr.) : désirer ardemment (qch) * craven (a) (lit.) : lâche, poltron(ne) * craven (n) (lit.) : poltron(ne) (n), lâche (n) * craw (n) : 1/ jabot ; 2/ estomac * crawl (v) (intr.) : 1/ ramper - It made my skin crawl : Ça m’a fait frisonner, Ça a m’a glacé le sang ; 2/ avancer au ralenti, rouler au pas * crawling (a) : rampant(e) * crayon (n) (fa) : crayon de couleur ou de cire * craze (n) : engouement, mode (f) - to start a new craze : lancer une nouvelle mode * crazing (n) : tressaillage - crazing resistance (of ceramic tiles) : résistance au tressaillage (pour des carreaux) * crazy (a) : 1/ fou / folle ; 2/ délirant(e), insensé(e) * crazy (n) (pl. crazies) : fou / folle, fada * creak (v) (intr.) : grincer * creaky (a) : qui grince, grinçant - a creaky old house : une vieille bicoque branlante (f) * cream (n) : crème - cream pie (amér.) : tarte à la crème (syn. brit. custard pie) * cream off (v) (tr.) : écrémer - to cream off profitable markets : écrémer les marchés rentables * crease (n) : 1/ pli (de pantalon, etc.) - knife-edge crease : pli impeccable ; 2/ ride (f) * crease (v) (tr.) : (tr.) plisser ; (intr.) [front] se plisser, [visage] se contracter, [tissu, papier] se froisser * creased (ppa) : 1/ plissé(e) ; 2/ froissé(e) (anton. uncreased) * creaseproof (a) : infroissable * create (v) (tr.) : 1/ créer - to create jobs : créer des emplois ; 2/ causer, provoquer - to create a diversion : faire diversion - to create a domino effect : créer un effet domino * creation (n) : création (f) * creationism (n) : (le) créationisme * creationist (a) : créationniste * creationist (n) : créationniste (n) * creative (a) : créateur/-trice, créatif/-ive - creative publishing : (l‘)édition créative * creatively (adv.) : avec créativité * creator (n) : créateur * creature (n) : 1/ créature (f) - living creatures : créatures vivantes ; 2/ créature de rêve - bikini-clad creature : belle fille en bikini * cred (n) (tronc. de credibility, crédibilité) * credentials (pl.) : 1/ états de service (pl.), titres (pl.) ; 2/ (Inf.) justificatif d'identité, informations d'identification (nom d'utilisatur + mot de passe) * credibility (n) : crédibilité (f) - credibility gap : manque de crédibilité, fossé entre déclarations et réalité * credible (a) : crédible * credit (n) : 1/ (Fin.) crédit - to buy sth on credit : acheter qch à crédit - easy credit : (le) crédit facile, (les) facilités de crédit - credit/debit card : carte de crédit et de débit ; 2/ crédit, honneur - He deserves most credit : C’est à lui que revient l’essentiel du mérite ; 2/ (Univ.) unité de valeur ; 3/ credits, pl. : mentions de source (f pl.), crédits (pl.) - end credits : (Cin., Télé) générique (sing.) - closing credits : (Cin., Télé) générique de fin - opening credits : (Cin., Télé) générique de début - picture credits : crédits photographiques * credit (v) (tr.) : attribuer (sth to sb, qch à qn) - I don’t credit him with much courage : Je ne pense pas qu’il ait beaucoup de courage * credit-driven (ac) : [économie] fondé(e) sur le crédit * creditworthiness (n) : solvabilité (f) * creditworthy (a) : 1/ qui a une réputation de solvabilité ; 2/ digne de foi * creed (n) : credo, croyance (f) * creek (n) (amér.) (fa) : petit cours d’eau, ru * creep (n) : 1/ (Mat.) fluage ; 2/ crétin(e) - Where have you picked up that creep? : Où as tu déniché ce crétin ? * creep (v) (crept, crept) (intr.) : ramper - to creep into… : s’insinuer dans… * creeper (n) : liane (f), plante grimpante (f) * creeping (a) : grimpant(e) - creeping wine : vigne grimpante (f) * creep-resistant (ac) : résistant au fluage - creep-resistant material : matériau résistant au fluage * creepy-crawly (n double) : bestiole (f), petite bête (f), bébête qui rampe * cremains (n pl.) : cendres (f pl.) (d’une personne incinérée) * creole (n) : (le) créole (langue véhiculaire simplifiée dérivée du français) * crept (prét. de to creep) * crept (pp de to creep) * crescent (n) : croissant * cresset (n) : torchère (f) * crest (n) : crête (f) (of wave, de vague, of mountain, de montagne, of bird, d'oiseau) * crest (v) (tr.) : 1/ franchir la crête de ; 2/ (intr.) atteindre son niveau maximum * crew (n) : 1/ équipage - crew member : membre d’équipage ; 2/ équipe - daytime crew : équipe de jour - the (film) crew : les techniciens (au tournage d’un film) * crew-cut (ac) (amér.) : en brosse - crew-cut hair : cheveux coupés en brosse * crewed (a) : à équipage - crewed spacecraft : engin habité (anton. uncrewed : sans équipage, non habité(e)) * crew neck (n) : 1/ col ras-du-cou ; 2/ pull ras-du-cou, ras-du-cou (inv.) * crib (n) : plagiat * crick (n) : crampe - crick in the back : tour de reins - crick in the neck : torticolis * crick (v) (tr.) : donner une crampe à - to crick one’s neck : attraper le torticolis * crier (n) : 1/ (Hist.) crieur public ; 2/ pleureur/-euse * crime (n) (fa p) : 1/ a crime (= pénalement répréhensible) contravention (f), infraction (f), délit, crime - to commit a crime : commettre un délit - heinous crime : forfait - a crime scene : la scène d'un crime, la scène du crime ; 2/ crime (n ind. sing.) : criminalité (f), délinquance (f) - crime in California : (la) criminalité en Californie - to control crime : enrayer la criminalité - to engage in crime : se livrer à des activités criminelles - organised/-ized crime : (le) grand banditisme - petty crime : (la) petite délinquance - railway crime : (la) criminalité dans le transport ferroviaire, (la) criminalité ferroviaire - violent crime : (les) délits avec violence - white-collar crime : (les) délits financiers - crime prevention : (la) prévention de la criminalité - crime rate : taux de criminalité - crime reporter : chroniqueur judiciaire * (the) Crimea (n pr.) : (la) Crimée * Crimean (a) : de Crimée - the Crimean War : la Guerre de Crimée * Crimean (n pr.) : habitant(e) de la Crimée * criminal (a) : criminel(le) - to have a criminal record : avoir un casier judiciaire - criminal damage : dégradation de biens, dégradation volontaire (f) * criminal (n) (fa p) : 1/ contrevenant (n), délinquant (n) ; 2/ criminel (n) - a hardened criminal : un criminel endurci * criminalise (brit.) / criminalize (amér.) (v) (tr.) : criminaliser * criminally insane (ac) : psychopathe * criminology (n) : criminologie (f) * crimp (v) (tr.) : sertir * crimping (n) : sertissage * cripes (interj., mise pour Christ) : crédieu (vieilli), crénom (vieilli) * crisis (n) (pl. crises) : crise (f) - the Great Financial Crisis : la Grande crise financière de 2008 - liquidity crisis : crise de trésorerie * crisp (a) : 1/ croustillant(e), croquant(e), craquant(e) ; 2/ [air, style] vif/vive ; 3/ [son] vif et clair (syn. sharp and clear) * crisp (n) (svt au pl.) (brit.) : croustille (Q) * criteria (n pl.) : voir criterion (n) * criterion (n) (pl. criterions ou criteria) critère - to meet criteria : satisfaire à des critères * critic (n) : critique (cinématographique, littéraire) (la personne) (syn. reviewer) - theatrical critic : critique de théâtre * critical (a) (fa p) : 1/ critique - to be sharply critical of sth : adresser de vives critiques à qch, être très critique de qch - critical thinker : esprit critique (la personne) - critical thinking : (l’)esprit critique (la qualité) ; 2/ relevant de la critique - [book] to be a critical success : [livre] être applaudi par la critique ; 3/ crucial(e), vital(e), d'une importance vitale, primordial(e) - to be critical to… : être crucial pour…, être vital pour… - critical update : mise à jour primordiale (f) * critically (adv.) : de façon critique, d’un œil critique (anton. uncritically) - to be able to think critically : avoir l’esprit critique * critically acclaimed (ac) : salué(e) par la critique * criticism (n) : 1/ (l'activité) (la) critique - film criticism : (la) critique de films ; 2/ (l’analyse) critique - a criticism : une critique * criticise (brit.) / criticize (amér.) (v) (tr.) : blâmer * critique (n) : analyse critique (f) / critique (f) (d’un livre, d’un article, etc.) (syn. review) * critique (v) (tr.) : faire la critique de (un livre, un article, etc.) (syn. to review) * croak (v) : 1/ (intr.) [grenouille] coasser, [corbeau, corneille] croasser ; (tr.) dire d’une voix rauque ; 2/ (intr.) décéder, rendre l’âme, crever * Croatia (n pr.) : (la) Croatie * Croatian (a) : croate (sans maj.) * Croatian (n pr.) : Croate (le ressortissant) * croc (n) (pl. crocs) (tronc. de crocodile) : croco * crockery (n ind. sing.) : vaisselle (f) * crocodile (n) : crocodile - crocodile clip : pince crocodile (f) (syn. amér. alligator clip) * crocus (n) : crocus * croft (n) (brit.) : petite ferme (f) * crone (n) : vieille bique (f), vieille mégère (f) * crony (n) (pl. cronies) (arg., péj.) : pote (fam.), copin * cronyism (n) : copinage, népotisme - to practise cronyism : pratiquer le népotisme * crook (n) : escroc - bunch of crooks : bande d’escrocs * crooked (a) : tortueux/-euse * croon (v) : chanter (à voix basse), chanter d'une voix de velours, roucouler * crooner (n) : chanteur de charme, chanteur à la voix de velours * crop (n) : 1/ récolte (f) - crops resistant to herbicides : cultures résistant aux herbicides ; 2/ - crop of hair : chevelure (f) * cropped (ppa) : [photo] recadrée - cropped picture : image recadrée (f) * cropping (n) : 1/ découpage, détourage ; 2/ mise en culture (f) - strip cropping : culture en bandes (f) * cross (a) : 1/ transversal(e) ; 2/ contraire ; 3/ contrarié(e), fâché(e), en colère - to get cross : se fâcher, devenir mauvais(e) * cross (n) : 1/ croix (f) - cross bearer : porte-croix (la personne) ; 2/ croisement * cross (v) : 1/ (tr.) traverser, franchir - to cross the Rubicon : franchir le Rubicon ; (intr.) traverser ; 2/ (tr.) croiser ; (intr.) se croiser ; 3/ (tr.) contrarier * cross-border (ac) : frontalier/-ière - cross-border worker : travailleur frontalier * cross-breed / crossbreed (n) : [animal] produit d’un croisement, [plante] hybride * crossbreed (v) (-bred, -bred) : (tr.) reproduire (des animaux) par croisement, reproduire (des plantes) par hybridation ; (intr.) [animal] se reproduire par croisement * crossbreeding (n) : croisement (d’animaux), hybridation (f) (de plantes) * cross-check (v) (tr.) : contre-vérifier * cross-checking (n) : contre-vérification (f) * cross dresser / cross-dresser (n) : travesti (masc.) - to be outed as a cross-dresser : être dénoncé comme étant un travesti * crossing (n) : 1/ traversée (f) (en mer) ; 2/ passage - pedestrian crossing : passage pour piétons - crossing guard : surveillant des traversées piétonnes ; 3/ croisement, carrefour, intersection (f) * crossly (adv.) : d’un air fâché * crossover (a) : 1/ croisé(e) - crossover design (Pharma.) : plan d’étude croisé ; 2/ métis(se), métissé(e) - crossover music : musique métisse (f), musique métissée, musique appréciée de toutes les communautés * crossover (n) : 1/ mélange ; 2/ (Bio.) croisement, hybride ; 3/ transition (f) - to make the crossover from actor to singer : passer du métier d’acteur à celui de chanteur ; 4/ (Théât.) passerelle (f), coulisse de fond (f) ; 5/ pont routier (à un croisement) ; 6/ passage pour piétons ; 7/ (Ch. de fer) voie de croisement (f) * cross out (v) (tr.) : barrer, biffer * crosspatch (n) (fam.) : grincheux/-euse (n), grognon (n), pisse-vinaigre (masc.) * cross-platform (ac) : multiplate-forme * cross section / cross-section (n) : 1/ coupe transversale (f) ; 2/ échantillon représentatif * cross-shaped (ac) : en forme de croix * (v) (tr.) : former (à différentes tâches) * cross-training (n) : multi-entraînement, entraînement polyvalent (en sport) ; 2/ formation polyvalente (f), formation transversale (en affaires) * cross-writing (n) : écriture pour plusieurs tranches d’âge * crotch (n) (pl. crotches) : 1/ entrejambe (f) ; 2/ enfourchure (f), fourche (f) * crouch (v) (intr.) : s'accroupir * crow (n) : (selon le cas) corbeau, corneille (f) - to eat crow (amér.) : admettre que l’on a tort, reconnaître ses erreurs * crowbar (n) : pince-monseigneur (f), pied-de-biche (masc.) * crowd (n) : foule (f) - crowd pleaser : qn qui plaît au public, amuseur des foules, démagogue * crowd (v) : (tr.) bousculer - Don’t crowd me ! : Ne me bousculez pas !, Ne m’écrasez pas !, Laissez-moi respirer ! ; (intr.) s’attrouper, se presser * crowded (ppa) : bondé(e), plein(e) à craquer * crowd-funded / crowdfunded (n) : à financement participatif * crowd-funding / crowdfunding (n) : financement participatif * crowd-sourced / crowdsourced (ac/a) : (Toile) alimenté(e) collectivement par des bénévoles, modifié(e) collectivement par des bénévoles - crowdsourced editing : modifications (f pl.) collectives * crowd-sourcing / crowdsourcing (n) : collaboration d’internautes, production participative (f) (off.), externalisation ouverte (f) (Q) * crown (n) : 1/ couronne (f) - the crown of thorns : la couronne d’épines ; 2/ sommet (of a head, de la tête, of a hill, d'une colline) * crowned (a) (Hérald.) : à couronne * crow-stepped (ac) : (Archi.) à redents, à pas de moineau - crow-stepped gable : pignon à redents, pignon à pas de moineau (syn. corbie-stepped) * CRT (n) (init. de critical race theory : théorie critique de la race) * crucial (a) : crucial(e), d’une importance décisive (to, pour) - crucial issue : question cruciale (f) * crucially (adv.) : de manière cruciale, de manière décisive * cruciform (a) : cruciforme, en forme de croix * cruck (n) : (Charp.) arbalétrier courbe - a pair of crucks : un couple d’arbalétriers courbes * crude (a) : 1/ rudimentaire ; 2/ grossier/-ière ; 3/ [pétrole] brut(e) - crude oil : pétrole brut, brut (n) * crude (n) (abr. de crude oil) : pétrole brut, brut (n) * crudely (adv.) : 1/ vulgairement, grossièrement, crûment ; 2/ sommairement, grossièrement, dans les grandes lignes * crudeness (n) : vulgarité (f), grossièreté (f) * cruel (a) : cruel(le) * cruelly (adv.) : cruellement, sans pitié * cruelty (n) : cruauté (f) * cruet (n) : service à huile et vinaigre * cruft (n ind. sing.) : (jargon des bidouilleurs) fichiers inutiles (pl.), code redondant, code mal écrit * cruft-free (ac) : [logiciel] sans fioritures * cruftsmanship (n) (démarquage humoristique de craftsmanship) : réalisation professionnelle de piètre qualité * cruise (n) : croisière (f) - cruise missile : missile de croisière - cruise ship : navire de croisière - cruise wear : tenues pour les croisières, collections de croisière * cruise (v) (intr.) : croiser, être en croisière * cruiser (n) : 1/ croiseur ; 2/ voiture (f) (de patrouille) - police cruiser : voiture de police ; 3/ moto (f) de grosse cylindrée, grosse cylindrée (f) * cruising (n) : croisières (f pl.) - cruising speed : vitesse de croisière * crumb (n) : miette (f) - bread crumb : miette de pain * crumble (v) (intr.) : 1/ s’émietter, se désagréger ; 2/ s’écrouler, s’effondrer * crumbling (a) : en voie de délabrement, délabré(e), en train de crouler, croulant(e) * crumbs (interj.) (brit.) : mince alors, sapristi * crummy (a) (amér.) (arg.) : minable - that crummy old park : ce vieux parc minable * crumple (v) (tr.) : froisser * crunch (n) : 1/ craquement, crissement ; 2/ situation critique (f), moment crucial, moment décisif - when it comes to the crunch : dans une situation critique - crunch talks : pourparlers de crise * crusade (n) : (prop. et fig.) croisade (f) - to be on a crusade againt sth : être en croisade contre qch - to go on a crusade against sth : partir en croisade contre qch * crusade (v) (intr.) : se battre, mener une croisade (for sth, pour qch) - to go crusading : partir en croisade * crusader (n) : croisé (n) * crusading (a) : croisé(e) - a crusading knight : un croisé * crush (n) : béguin - to have / to get a crush on sb : avoir le béguin pour qn * crush (v) (tr.) : 1/ broyer, concasser - to crush doubts : réduire des doutes à néant ; 2/ écraser * crusher (n) : broyeur, concasseur - rock crusher : concasseur de roches, concasseur de pierres ; presse (f) (de casse automobile) - [vehicle] to be sent to the crusher : [véhicule] être envoyé à la casse * crushing (n) : 1/ broyage, concassage ; 2/ écrasement - crushing resistance : résistance à l’écrasement * crushproof (a) : résistant(e) à l’écrasement, indéformable * crust (n) : croûte (f) - the Earth's crust : la croûte terrestre * crustacean (n) : crustacé * crutch (n) (pl. crutches) : béquille (f) * crux (n) : point difficile, nœud (au fig.) - the crux of the matter/problem : le nœud de l’affaire/du problème * cry (n) (pl. cries) : 1/ cri - heart cry : cri du cœur ; 2/ cries, pl. : appels ; 3/ cries, pl. : demandes * cry (v) (fa p) : 1/ (intr.) pleurer (about sth, à propos de qch) ; 2/ (intr.) (fig.) se lamenter (about sth, sur qch), déplorer (sth, qch) ; 3/ (intr.) s’écrier, s’exclamer ; 4/ (intr.) pousser des cris, crier ; 5/ (tr.) - to cry wolf : crier au loup ; 6/ (tr.) verser - to cry crocodle tears : verser des larmes de crocodile * crybaby (n) : pleurnicheur, pleurnichard * crypt (n) : crypte (f) * crypto (n) (pl. cryptos) (tronc. de cryptocurrency : cryptomonnaie, f) * cryptocurrency (n) (pl. cryptocurrencies) : cryptomonnaie (f) - cryptocurrency mining : production d’une monnaie virtuelle, cryptominage - cryptocurrency trading : opérations en cryptomonnaie * cryptojacking (n) : cryptominage illicite * cryptomining (n) : production d’une monnaie virtuelle, cryptominage * cub (n) : petit (of animal, d'animal) - lion cub : lionceau - cub reporter : jeune reporter, apprenti reporter, reporter en herbe * Cuba (n pr.) : Cuba * Cuban (a) : cubain(e) * Cuban (n) : Cubain (le ressortissant) * Cuban-heeled (ac) : [chaussures] à talon cubain * cubbyhole (n) (fam.) : cagibi * cube (n) : 1/ cube - a cube of sugar : un morceau de sucre, un sucre ; 2/ (Cuis.) dé * cube (v) (tr.) : 1/ (Math.) élever au cube ; 2/ découper en cubes, découpés en dés * cubed (ppa) : (Math.) au cube - ten cubed : dix au cube * cubicle (n) : cagibi * cubmaster (n) : (personne de moins de 12 ans) chef de groupe de scouts * cuckoo (n) : coucou - cuckoo clock : pendule à coucou, coucou * cuddle (v) (tr.) : serrer (syn. to hug) * cuddly (a) : câlin(e) * cudgel (n) : gourdin, trique (f), matraque (f) - to take the cudgels for sb : prendre la défense de qn * cudgel (v) (tr.) : matraquer * cue (n) : (Théât.) réplique (f) * cue (v) : donner le signal * cuff (n) : 1/ poignet, manchette (of shirt, etc.), (amér.) revers (of pants) ; 2/ au pl. cuffs : menottes - to be in cuffs : porter des menottes, être menotté(e) ; 3/ gifle, claque, tape (derrière la tête) * cuff (v) (tr.) : donner une gifle à, donner une claque à, donner une tape à * culinary (a) : culinaire - culinary stylist : styliste culinaire * cull (v) (tr.) : 1/ abattre - to cull the herd : abattre une partie du troupeau ; 2/ sélectionner * culmination (n) : aboutissement * culpability (n) : culpabilité (syn. guilt) - to admit one’s culpability : reconnaître sa culpabilité * culpable (a) : coupable (syn. guilty) - [government] to be culpable of war crimes : [gouvernement] être coupable de crimes de guerre * culprit (n) : coupable (n) * cult (n) : 1/ culte, vénération ; 2/ (fa) secte * cultist (n) : membre d’une secte, sectateur, adepte, fidèle * cultivate (v) (tr.) : cultiver * cultivation (n) : 1/ culture - fields under cultivation : champs cultivés, cultures - cultivation lynchet : rideau de culture - cultivation methods : méthodes de culture ; 2/ entretien (des relations) ; 3/ éducation (du goût) * cultivated (ppa) : cultivé(e), de culture - cultivated terrace : terrasse de culture, terrasse agricole * culture (n) : 1/ culture, civilisation - culture shock : dépaysement ; 2/ culture (de bactéries, etc.) - culture dish : boîte de culture * cultural (a) : culturel(le) - cultural studies : études culturelles, sciences de la culture - cultural theorist : théoricien de la culture * culturally (adv.) : culturellement, sur le plan culturel * culture (n) : culture (f) - corporate culture : culture d’entreprise * culvert (n) : ponceau * cum (prép. d'origine latine) : avec, combiné à, doublé de, plus - an offline database cum online Web browser une base de données hors connexion doublée d'un butineur Web en ligne * cum (n) : ( ex.) sperme, foutre (vulg.) - to eat cum : avaler le sperme - to swallow cum : avaler le sperme - cum swapping : échange de foutre * cumbersome (a) : encombrant(e) * cunning (a) : 1/ rusé(e), fourbe ; 2/ malin/maligne, astucieux/-euse, futé(e), (litt.) roué(e) * cunning (n) : 1/ ruse (f), fourberie (f) ; 2/ ingéniosité (f), astuce (f) * cunt (n) : con (masc.) (organe sexuel féminin) * cunt-struck (a) : obsédé par la chatte des femmes, obnubilé par le sexe des femmes * cup (n) (fa p) : 1/ coupe (f) (dans les sports de compétition) ; 2/ tasse (f) - tea cup : tasse à thé - cup of tea : tasse de thé - cup cake : petit gâteau individuel ; 3/ gobelet - plastic cup : gobelet en plastique - cup holder : porte-gobelet (masc.) ; 4/ cupule (f) * cup (v) (tr.) : mettre en forme de cornet * cupboard (n) : placard - built-in cupboard : placard mural - store cupboard : placard à provisions - cupboard hive : ruche-placard (f) * cup-marked (ac) : à cupules - cup-marked stone : pierre à cupules * cuppa (n) (brit.) (= cup of) : tasse de thé * cur (n) : 1/ corniaud ; 2/ misérable (n) * curate (n) (fa) : vicaire * curator (n) (fa) : 1/ conservateur, conservatrice (de musée) ; 2/ commissaire d'exposition ; 3/ programmateur, programmatrice (de festival de musique) * curatorship (n) : 1/ - museum curatorship : conservation de musée, direction de musée ; 2/ - exhibition curatorship : commissariat d’exposition ; 3/ - festival curatordhip : programmation de festival ; 4/ curatelle (f) - [natural person, personne physique] to be placed under curatorship : être placé(e) sous curatelle * curb (n) : 1/ mors ; 2/ (fig.) frein ; 3/ bord du trottoir (voir amér. kerb) * curb (v) (tr.) : réfréner, mettre un frein à - to curb crime : enrayer la criminalité * curbside (amér.) / kerbside (brit.) (n) : bord de trottoir, bordure de trottoir - at the curbside : au bord du trottoir - curbside collection : collecte porte-à-porte - curbside delivery : livraison porte-à-porte * curcumin (n) : curcumine (f) (pigment jaune) * curdle (v) (intr.) : [lait] tourner - My blood curdled (fig.) : Mon sang s’est figé * cure (n) (fa p) : 1/ cure (f) - water cure : cure par l’eau (forme de torture) ; 2/ quelque chose qui guérit, remède - instant cure : remède instantané ; 3/ guérison (f) * cure (v) (tr.) (fa) : 1/ remédier à ; 2/ guérir ; 3/ saler, fumer (de la viande) * cure-all (n) : remède miracle * curfew (n) : couvre-feu (masc.) * curiosity (n) (pl. curiosities) : curiosité (f) * curious (a) : curieux/-ieuse * curiously (adv.) : curieusement * Curiously enough (adv. d’opinion) : Chose pour le moins curieuse, …, aussi curieux que cela puisse paraître, … * curl (n) : boucle (f) (de cheveux), bouclette (f) - kiss curl (brit.) : accroche-cœur (syn. lovelock) * curl (v) : (tr.) boucler, friser ; (intr.) boucler, friser * curler (n) : bigoudi * curly (a) : bouclé(e) - curly hair : cheveux bouclés (m pl.) - curly brackets : accolades (f) (syn. braces) * currency (n) (pl. currencies) : monnaie (nationale) (f), devise (f) - gold-backed currency : monnaie-or - non-local currency : devises étrangères (f pl.) - reserve currency : monnaie de réserve - a currency peg : la fixation du taux de change, l’arrimage de la monnaie * current (a) (fa) : en cours, présent(e), actuel(le), existant(e), tout dernier / toute dernière - current account (brit.) : compte courant (à la banque) - current affairs : problèmes d’actualité, actualités (f pl.) - current events : (l’)actualité (f) - current tech : (la) techno actuelle - at the current time : à l’heure actuelle - the current version : la version en cours * current (n) : courant (électrique) - alternating current : courant alternatif - house current : (le) secteur * current-conducting (ac) : conducteur (du courant) - current-conducting material : matériau conducteur * currently (adv.) (fa) : actuellement, présentement * currently active (ac) : (Inf.) en cours d'exécution - (the) currently active task : (la) tâche en cours d'exécution * currently defined (ac) : (Inf.) du moment - currently defined variable settings : paramètres variables du moment * currently running (ac) : en cours d'exécution * currently selected (ac) : (Inf.) en activité - (the) currently selected window : (la) fenêtre en activité * curriculum (n) : (Éduc.) ensemble des matières, matières étudiées (f pl.) - a core curriculum : un tronc commun * curse (n) : 1/ malédiction (f) ; 2/ fléau - the curse of traffic noise : le fléau du bruit de la circulation * curse (v) : (tr.) maudire - to curse sb for his ignorance : pester contre l’ignorance de qn ; (intr.) jurer, proférer des jurons * cursed (a) : maudit(e) * cursor (n) : (Inf.) curseur - controllable cursor : curseur réglable * cursorily (adv.) : à la hâte, superficiellement * cursoriness (n) : hâte (f), précipitation (f) * cursory (a) : hâtif/-ive, précipité(e), (trop) rapide, superficiel(le) - cursory inspection : examen hâtif * curtail (v) (tr.) : écourter (a visit, une visite), réduire (expenses, des dépenses) * curtailment (n) : réduction (f), limitation (f) * curtain (n) : 1/ rideau - to draw the curtains : tirer les rideaux - drop curtain : (Théât.) rideau d’entracte - The curtain drops : Le rideau tombe 2/ (fig.) curtains (pl.) : (le) rideau de fin - It’s curtains for you ! : C’est la fin pour vous !, Les carottes sont cuites ! (fam.) * curtilage (n) : enceinte (f) (d’un monastère, etc.) * curtsey / curtsy (n) : révérence (f) (de femme) - to perform a small curtsey : faire une petite révérence * curtsey / curtsy (v) (intr.) : faire une révérence * curtseying / curtsying (n) : faire des révérences, faire la révérence * curvature (n) : 1/ courbure (f) ; 2/ rayon de courbure - the Earth’s curvature : le rayon de courbure de la Terre * curve (n) : 1/ courbe (f) - bell curve : courbe en cloche - learning curve : courbe d’apprentissage, période d’apprentissage - steep learning curve : courbe d’apprentissage abrupte, beaucoup à apprendre ; 2/ virage, tournant, coude * curve (v) (intr.) : 1/ se courber ; 2/ tourner, faire un coude * curvilinear (a) : curviligne - curvilinear structure : structure curviligne (f) * curvy (a) : [femme] plantureux/-euse * cushion (n) : coussin * cushion (v) (tr.) : amortir * cushy (a) : facile, peinard(e) (fam.) * cusp (n) : 1/ pointe, corne (d’un croissant de lune) ; 2/ point de transition, charnière - on the cusp of sth : à l’aube de qch, à l’orée de qch - to be on the cusp of revival : être à l’aube d’une renaissance ; 3/ cuspide (d’une dent) * custard (n) : crème épaisse (f), crème anglaise - custard pie : tarte à la crème - Oh, that cleared the custard : (vulg.) Je me suis vidé les couilles * custodian (n) (amér.) : 1/ (sens propre) gardien, agent d’entretien ; 2/ (sens figuré) gardien, conservateur, dépositaire * custody (n) : détention (f), garde à vue (f) - to be in custody : être en détention, être en garde à vue - to be remanded in custody : être placé sous mandat de dépôt, être placé en détention préventive / provisoire - to take sb into custody : mettre qn en détention préventive * custom (n) : 1/ coutume (f); 2/ clientèle (f) - custom electronics : systèmes électroniques adaptés aux besoins du client, systèmes électroniques sur mesure - custom production : production à la demande * custom-built (ac) : personnalisé(e), suivant plans client - custom-built piped cylinders : vérins tuyautés suivant plans client * custom-designed (ac) : fait(e) sur mesures * custom-engineered (ac) : contruit(e) sur mesures * customer (n) : client - the bulk of the customers : le gros des clients - the customer’s order : la commande du client - the customer's requirements : les exigences du client - customer centricity : centrage (sur le) client - customer site : (Toile) site du client * customer-centric (ac) : centré(e) (sur les) clients / (sur le) client - consumer-centric business : société mettant le client au centre de ses préoccupations * custom-designed (ac) : fait(e) sur mesure * customer-focused (ac) : centré(e) sur le(s) client(s), qui est à l'écoute du client / des clients * customer-friendly (ac) : respectueux/-euse de la clientèle - customer-friendly business : entreprise répondant aux attentes des clients * customise (brit.) / customize (amér.) (v) (tr.) : adapter aux besoins du client, personnaliser * customising (brit.) / customizing (amér.) (n) : adaptation aux besoins du client, personnalisation * custom-made (ac) : fait(e) sur demande, hors série * custom-produce (vc) (tr.) : produire à la demande - to custom-produce individual units : produire à l’unité * custom-produced (ac) : produit(e) à la demande - custom-produced goods biens fabriqués à la demande * cut (n) : 1/ coupure (f), entaille (f) ; 2/ (Cin.) montage - the director’s cut : le montage du réalisateur - rough cut : assemblage, bout-à-bout ; 3/ tranche (f) - a fine cut of meat : une belle tranche de viande ; 4/ réduction (f), baisse (f) - a cut in wages : une réduction de salaire - production cuts : réductions de la production ; 5/ suppression (f) - job cuts : suppressions d’emplois * cut (v) (cut, cut) : 1/ (tr.) couper, tailler - Cut! (Cin.) : Coupez ! ; 2/ (tr.) réduire, diminuer - to cut costs : réduire les coûts - to cut greenhouse gasses : réduire les gaz à effet de serre (syn. to curtail greenhouse gasses) - to cut working hours : réduire la durée du temps de travail ; 3/ (tr.) supprimer - to cut jobs : supprimer des emplois - Cut the foreplay! : (fig.) Arrête de tourner autour du pot !, Va droit au but ! ; 4/ (intr.) [car] to cut in front of sb : [voiture] se rabattre devant qn, faire une queue de poisson à qn * cut (prét. de to cut) * cut (pp de to cut) * cut away (v) (cut, cut) (tr.) : (Usin.) enlever, retirer (de la matière) * cutaway (n) : redingote (f) * cut down (v) (cut, cut) (tr.) : 1/ (tr.) couper (a tree, un arbre) ; 2/ (tr.) réduire - to cut down cost : réduire le prix de revient - to cut down waiting times : réduire les temps d’attente ; (intr.) opérer des réductions (on, dans), réduire - to cut down on the number of robots used : réduire le nombre de robots utilisés * cut-down / cutdown (a) : réduit(e), allégé(e) - cut-down version : version réduite, version allégée * cute (a) (amér.) : mignon(ne) * cutie (n) : chose mignonne (f), fille mignonne (f) - She’s definitely a cutie! : Elle est vraiment mignonne ! * cutlery (n ind. sing.) : 1/ coutellerie (f), couteaux (pl.) ; 2/ couverts (pl.) * cutline (n) (amér.) : légende (f) (syn. caption) - photo caption : légende de photo * cut off (v) (cut, cut) (tr.) : 1/ couper, trancher, sectionner ; 2/ - to cut sb off : rompre les liens avec qn, couper les ponts avec qn ; 3/ - We’ve been cut off by the tide : Nous avons été coupé de la terre par la marée, Nous avons été surpris par la marée ; 4/ - to cut sb off : couper qn (dans la conversation), interrompre qn qui parle ; 5/ - [car] be cut off : [voiture] être victime d’une queue de poisson * cut out (v) (cut, cut) (tr.) : 1/ retirer (en découpant) ; 2/ supprimer, éliminer - to cut out carbs : supprimer les glucides - to cut out the middlemen : supprimer les intermédiaires - Cut out the acting! : Arrête ton cinéma ! * cut-resistant (ac) : résistant aux entailles - cut-resistant glove : gant] résistant aux entailles * cutter (n) : 1/ lame (f) - box cutter : couteau à lame rétractable, cutter (anglic.) - paper cutter : massicot ; 2/ (Usin.) fraise (f) ; 3/ (Cuis.) - cookie cutter (amér.) : emporte-pièce (syn. brit. pastry cutter) * cutting (n) : 1/ coupe (f), taille (f) - stone cutting : taille de la pierre - cutting edge (Usin.) : arête de coupe - cutting scissors : (Coif.) ciseaux de coupe - cutting tool (Usin.) : outil de coupe - cutting speed (Usin.) : vitesse de coupe (d’un tour) ; 2/ (Usin.) découpe (f) - laser cutting : découpe au laser ; 3/ réduction (f) - cost cutting : réduction des coûts * cutting-edge (ac) : d’avant-garde, de pointe - cutting-edge technology : technique de pointe * cutting-off (n) : tronçonnage - cutting-off machine : (Usin.) machine à tronçonner, tronçonneuse * cuttings (n pl.) : coupures (de presse) (f pl.) - news cuttings : coupures de presse - cuttings library : bureau recensant les coupures de presse * C.V. / CV (n) (init. de curriculum vitae) (brit.) : CV, curriculum vitae * cybernation (n) : cybernétisation (f) * cybershopping (n) : achats en ligne, courses en ligne * cyberspace (n) : cyberespace, espace virtuel * cyberspeak (n) : cyberjargon * cyborg (n) : cyborg * cycle (n) : 1/ cycle - automated cycle : cycle automatisé - design cycle : cycle de conception - menstrual cycle : cycle menstruel - news cycle : (Médias) cycle de nouvelles, cycle d’informations - processing cycle : cycle d’élaboration ; 2/ (abr. de bicycle) vélo - cycle carrier : porte-vélo * cycle (v) (intr.) : 1/ fluctuer ; 2/ faire du vélo, aller à vélo, aller en vélo * cyclic (a) : cyclique * cycling (n) : 1/ (la) bicyclette, (le) vélo (l’activité) - cycling enthusiast : adepte de la petite reine, mordu du vélo (aussi bicycle enthusiast) - cycling fan : fana de vélo ; 2/ (le) cyclisme * cyclist (n) : cycliste - boy cyclist : jeune cycliste * cyclone (n) : cyclone * cyclone-prone (ac) : exposé(e) aux cyclones - cyclone-prone region : région exposée à des risques cycloniques * cygnet (n) : jeune cygne * cylinder (n) : cylindre - brake cylinder : cylindre de frein - hot-water cylinder : chauffe-bain (syn. hot-water tank) * cylindrical (a) : cylindrique * cypress (n) : cyprès * cz (conj.) : abr. fam. de because) * Czech (a) : tchèque (sans maj.) - (the) Czech Republic : (la) République tchèque * Czech (n pr.) : (le ressortissant) Tchèque * Czechia (n pr.) : (la) Tchéquie * Czechoslovakia (n pr.) (obs.) : (la) Tchécoslovaquie (obs.) - the former Czechoslovakia : l’ancienne Tchécoslovaquie * Czechoslovakian (a) (obs.) : tchécoslovaque (sans maj.) (obs.) * Czechoslovakian (n pr.) (obs.) : Tchécoslovaque (le ressortissant) (obs.) 6ozjtesfwyjf2en2h1cxdaaaf4f0nwh Vocabulaire anglais-français à l'intention des apprenants avancés/D 0 78009 767919 759146 2026-06-17T07:12:20Z Elnon 41284 Compléments 767919 wikitext text/x-wiki {{../Index}} === D === * D : (note scolaire) insuffisant * dab (v) (tr.) : tamponner * dabble (v) (intr.) : s’occuper (in sth, de qch), se mêler un peu (in sth, de qch) - to dabble on the stock exchange : boursicoter * dace (n) : vandoise (poisson d’élevage) * daffy (a) (fam.) : farfelu(e), loufoque - How daffy you can get! : Ce que tu peux être idiot ! * daft (a) : un peu fou/folle, timbré(e) (fam.), toqué(e) (fam.), cinglé(e) (fam.) - to go daft : perdre la boule * dafty (n) (pl. dafties) : cinglé(e) (n) * dagger (n) : poignard * daily (a) : journalier/-ière, quotidien(ne) - daily benefit : indemnité journalière - the regional daily press : la presse quotidienne régionale * daily (n) (pl. dailies) : (Presse) quotidien (n) * dairy (n) (pl. dairies) : laiterie (f) * daisy (n) (pl. daisies) : pâquerette (f) - to be pushing up the daisies : manger les pissenlits par la racine * dale (lit.) (n) : vallée (f) * dalliance (n) : flirtage * dally (v) (intr.) : lambiner, traîner, lanterner * dam (n) : barrage - check dam : barrage de retenue, restanque (f) (dans le lit d’un torrent) (syn. rock dam) - dam spillway : déversoir de barrage * damage (n) (fa p) : 1/ (ind. sing.) dégâts (pl.), dommages subis (pl.) - to minimise damage : limiter les dégâts - criminal damage : dégradation de biens, dégradation volontaire - serious damage : graves dégâts - damage control : limitation des dégâts, atténuation des dégats, réparation des dégâts, sauvetage des meubles (fam.) - damage limitation : limitation des dégâts ; 2/ (ind. sing.) pertes (humaines) (f pl.) - collateral damage : pertes civiles (pl.) ; 3/ (pl. damages) dommages-intérêts (pl.) * damage (v) (tr.) : endommager, abîmer, détériorer * damage-resistant (ac) : résistant aux détériorations - damage-resistant coating : revêtement résistant aux agressions * damaging (a) : préjudiciable, dommageable - damaging charges : accusations préjudiciables * dame (n) : 1/ dame (f) ; 2/ (brit.) (titre) dame - Dame Maggie Smith : Dame Maggie Smith ; 3/ (amér.) (péj.) bonne femme (f) * damn (n) : juron * damn (a) : satané(e), fichu(e), maudit(e) * damn (adv.) : vachement (arg.) * damn ! (interj.) : zut ! (fam.), mince ! (fam.), merde ! (vulg.), bordel ! (vulg.) * damn (v) (tr.) : 1/ damner ; 2/ condamner * damnable (a) : maudit(e), satané(e) * damned (a) : 1/ (Rel.) damné(e) ; 2/ maudit(e), foutu(e) (fam.) - Stop being such a damned nuisance! : Arrête d’enquiquiner le monde ! * dammit! (interj.) (forme faible de damn it!) : mince ! * damning (a) : accablant(e) - damning evidence : éléments de preuve accablants, indices accablants * damp (a) : humide, moite - damp location : endroit humide * damp (v) (tr.) : amortir * dampen (v) : (tr.) rendre humide, rendre moite ; (intr.) devenir humide, devenir moite * dampness (n) : humidité (f), moiteur (f) * damp-proof (vc) (tr.) : isoler contre l'humidité, hydrofuger * Dane (n pr.) : Danois (le ressortissant) * dancing (n) : (la) dance - pole dancing : danse à la barre verticale - tap dancing : (les) claquettes * danger (n) : danger * dangerous (a) : dangereux/-euse * dangerousness (n) : caractère dangereux, nature dangereuse (f), dangerosité (f) * dangle (n) : chose qu’on fait miroiter (f), carotte (f), appât, leurre, piège * dangle (v) : (tr.) laisser pendre, suspendre, agiter (before sb, devant qn) ; (intr.) [clés, etc.] se balancer, pendiller, pendouiller * Danish (a) : danois(e) (sans maj.) * dank (a) : humide (et froid(e)) * dankness (n) : (un) froid humide * D&T (n) (G.-B.) (init. de design and technology : conception et fabrication (de produits industriels)) (var. DT) * dapper (a) : fringant(e) * dare (v) (tr.) : 1/ oser - I dare say : probablement ; 2/ mettre au défi - to dare sb to do sth : mettre qn au défi de faire qch * daredevil (n) : casse-cou * daring (a) : audacieux/-euse * daring (n) : audace (f) * dark (a) : 1/ sombre, noir(e) - dark light : lumière sombre (f) - dark room (Photog.) : chambre noire (f) ; 2/ [couleur] foncé(e) * dark (n) : - the dark : a/ l’obscurité (f), le noir ; b/ l’ignorance (f) - to keep sb in the dark : maintenir qn dans l’ignorance, cacher la vérité à qn, cacher qch à qn * darken (v) : (tr.) obscurcir ; (intr.) s’obscurcir * darkness (n) : obscurité (f) * darling (n) : 1/ chéri, chérie (en s’adressant à qn) ; 2/ bien-aimé(e), amour, favori(e) - a newfound darling of the media : la toute nouvelle coqueluche des médias * darling (a) : 1/ chéri(e), adoré(e) ; 2/ bien-aimé(e) * darn (a) (amér.) (= damn) : satané(e), fichu(e), maudit(e) * darn (adv.) (amér.) (= damn) : drôlement, vachement - It’s a darn good job… : C’est une drôlement bonne chose que… * darn (v) (tr.) : repriser * dart (n) (fa) : fléchette (f) * dart (v) (intr.) : filer comme une flèche * dart-like (ac) : ressemblant à une fléchette * dart out (v) (intr.) : surgir comme une flèche * dash (n) : (Ponct.) tiret - em dash : tiret cadratin, tiret long (syn. long dash) - en dash : tiret demi-cadratin / semi-cadratin, demi-tiret, tiret moyen (syn. middle dash) - short dash : tiret court (syn. hyphen) * dastard (a) : poltron(ne) * dastardly (a) : infâme * data (n ind. sg.) : 1/ données (f pl.) - to triangulate data : recouper des données - a piece of data : une donnée - empirical data : données empiriques - personal data : données personnelles, informations nominatives (f pl.) - raw data : données brutes - data item : donnée ; 2/ (Inf.) données (informatiques) - big data : gros corpus de données - data acquisition : saisie automatique de données - data centre (brit.) / data center (amér.) : centre de traitement de données, centre informatique, infocentre - data collection : collecte de données - data file : fichier de données - data mart : dépôt de données - data medium : support de données - data mining : exploitation de gisements d’informations, pêche aux renseignements (fam.) - data network : réseau de communication de données - data sheet : fiche technique, feuille de programmation (Inf.) (aussi datasheet) ; 3/ données numériques (pl.), données statistiques (pl.), statistiques (pl.) - data journalism : journalisme de données numériques, journalisme de statistiques * database (n) : base de données - to access a database : consulter une base de données * database-centric (ac) : centré(e) (sur les) bases de données - database-centric architecture : architecture centrée sur les bases de données, architecture centrée bases de données * data-driven (ac) : piloté(e) par les données, guidé(e) par les données - data-driven compendium : recueil construit à partir de données réelles - data-driven learning : apprentissage piloté par les données * date (n) (fa p) : 1/ date (f) - to bring up to date : mettre à jour - to date : à ce jour - To date, nothing has been heard from them : Jusque ici, on n’a pas eu de nouvelles d’eux - to be out of date : être démodé, être dépassé, être obsolète, être caduc/caduque, être périmé, être suranné - Baby, you’re out of date! : Ma petite, t’es plus dans le coup ! - That info is out of date : Cette info n’est plus d’actualité ; 2/ rendez-vous (souvent amoureux) - to make a date with sb : prendre rendez-vous avec qn * date (v): 1/ (tr.) dater ; 2/ (tr.) to date sb : sortir avec (a boyfriend, un petit ami, a girlfriend, une petite amie) ; (intr.) sortir - Bill and I dated the next night : Bill et moi sommes sortis ensemble le lendemain soir * dateless (a) : sans date * dating (n) : 1/ datation (f) ; 2/ rendez-vous (pl.) (avec une(e) petit(e) ami(e) - dating agency : agence de rencontres * daub (v) (tr.) : barbouiller (with, de) - to daub with graffiti : barbouiller de graffitis * daughter (n) : fille (f) * daughter-in-law (n) : belle-fille (f) * daughterboard (n) : (Inf.) carte-fille (f) * daunt (v) (tr.) : décourager, intimider, abattre * daunting (a) : décourageant(e) * daw (n) (abr. de jackdaw) : choucas * dawdle (n) : flâneur * dawdle (v) (intr.) : 1/ traîner, traînasser, lambiner ; 2/ flâner, musarder * dawdle away (v) (tr.) : gaspiller - to dawdle one’s time away : gaspiller son temps * dawn (n) : aube - by dawn’s early light : dès les premières lueurs de l’aube * day (n) : 1/ jour, journée (f) - Make my day! : Fais-moi plaisir ! - You’ve made my day : Rien ne saurait me faire plus plaisir - business day : jour ouvrable, jour ouvré - full-on day : journée bien chargée - working day : a/ jour ouvrable ; b/ journée de travail - day trader : courtier réalisant ses opérations sur une journée, négociateur sur séance - day tripper : touriste d’un jour ; 2/ journée, fête - field day a/ journée champêtre ; b/ grand jour, jour faste - to have a field day : s’en donner à cœur joie, se régaler - flag day : journée de quête (pour une œuvre de bienfaisance) - national day : journée nationale - to hold a national day of courtesy : organiser la journée nationale de la courtoisie - Speech Day : (Éduc.) journée de distribution des prix - sports day : fête des sports - day return ticket (brit.) : billet aller-retour dans la journée ; 3/ bataille - to win the day : gagner la bataille - to lose the day : perdre la bataille - It saves the day : Cela limite les dégâts ; 4/ (pl. days) jours (pl.), période, époque - (in) these days : de nos jours - in those days : à cette époque, en ce temps-là * daybreak (n) : aurore, point du jour * day-for-night (ac) : - day-for-night shooting : prises de vues en nuit américaine (f pl.) * daylight (n) : lumière du jour - in broad daylight : en plein jour * daymare (n) : cauchemar diurne * daytime (n) : (le) jour (par oppo. à la nuit) - daytime crew : équipe de jour * daze (n) : hébétement, confusion - to be in a daze : être hébété(e), être étourdi(e) * dazed (a) : stupéfait(e), abasourdi(e), hébété(e) * dazzle (v) (tr.) : éblouir * dazzling (a) : éblouissant(e) * DC : abr. de District of Columbia, (le) District de Columbia * DDL (n) (init. de data-driven learning : apprentissage piloté par les données) * deacon (n) : diacre * deactivate (v) (tr.) : 1/ désactiver, mettre hors service, mettre hors fonction, mettre en sommeil ; 2/ mettre hors tension (un appareil, une ligne) * deactuate (v) (tr.) : mettre hors service, mettre hors fonction * dead (a) : 1/ mort(e) - dead and buried : mort et enterré, morte et enterrée - a dead man walking : un mort en sursis - dead language : langue morte (f) - dead zone : zone morte (f) (zone marine déficitaire en oxygène) ; 2/ (fig.) mort(e), où il ne se passe rien - This place is as dead as a graveyard : C’est mort ici dedans ce soir, On se croirait dans un cimetière ; 2/ calme - dead hours : heures creuses (f pl.) ; 3/ absolu(e) - a dead cert : une certitude absolue * dead (a. subst. sing.) : - in the dead of night : au beau milieu de la nuit - in the dead of winter : au cœur de l'hiver * dead (a. subst. pl.) : - the dead : les morts * dead (adv.) : absolument, à fond - to be dead against sth : être à fond contre qch * dead and buried (paire adj .) : mort et enterré, morte et enterrée, six pieds sous terre - She wants to see me dead and buried : Elle veut me voir six pieds sous terre - Our old ideals are now dead and buried : Nos anciens idéaux sont désormais morts et enterrés * dead and gone (paire adj.) : qui est disparu(e), qui s’est évanoui(e), qui est définitivement révolu(e), qui n’est plus, qui n’est plus de ce monde - Her childhood’s dreams are dead and gone : Ses rêves d’enfant se sont évanouis - The old barn is dead and gone : La vieille grange n’est plus * deadbeat (a) (fam.) : épuisé(e), vanné(e) (fam.) * deaden (v) : (tr.) amortir, assourdir ; (intr.) s’amortir, s’assourdir * dead-end (ac) : 1/ sans issue - dead-end street (amér.) : voie sans issue, impasse (f) ; 2/ sans avenir, sans aucune perspective - dead-end job : boulot sans avenir * deadfall (n) : 1/ piège à assommoir, assommoir ; 2/ (ind. sing.) arbres abattus (pl.), arbres morts (pl.) ; 3/ (amér.) bar ouvert toute la nuit, tripot * deadlock (n) : impasse (f) (la situation) * deadly (a) : mortel(le) (syn. lethal) * deaf (a) : sourd(e) - the deaf (adj. subst. pl.) les sourds - a deaf aid (brit.) : un appareil auditif * deafen (v) (tr.) : 1/ rendre sourd(e) ; 2/ assourdir * deafening (a) : assourdissant(e) * deal (n) : 1/ accord, affaire conclue (f), marché - We have a deal! : Affaire conclue ! - under the deal : selon cet accord - one-shot deal : mesure ponctuelle (f), cas unique ; 2/ contrat ; 3/ opération (boursière) (f) ; 4/ - a great deal of : une grande quantité de * deal (v) (dealt, dealt) : 1/ (tr.) porter, asséner (un coup) - to deal a serious blow : porter un rude coup (to, à) ; 2/ (intr.) to deal with sb : se comporter envers qn, traiter qn - to deal with sth : s’occuper de qch, traiter de qch - to deal with a challenge : relever un défi, être à la hauteur d’un défi ; 3/ (intr.) - to deal in sth : faire commerce de qch * dealer (n) : 1/ marchand, négociant - antique dealer : antiquaire - arms dealer : trafiquant d’armes ; 2/ (Fin.) intermédiaire financier - primary dealer : courtier opérant sur le marché primaire, négociant principal (d’obligations) ; 3/ distributeur, revendeur, concessionnaire - authorised dealer : concessionnaire agréé ; 4/ croupier, croupière * dealership (n) : place de concessionnaire * dealing (n) : 1/ (Bourse) commerce, transactions (f pl.), opérations (f pl.) - Dealing resumed this morning (brit.) : Les transactions ont repris ce matin - share dealing : commerce des actions, transactions (f pl.) sur titres - dealing room : salle des opérations ; 2/ trafic - arms dealing : trafic d’armes * dealt (prét. de to deal) * dealt (pp de to deal) * dean (n) : doyen * deanship (n) : 1/ décanat (la charge mais aussi la durée) ; 2/ doyenné (la charge mais aussi la demeure et la circonscription) * dear (a) : cher/-ère * dearth (n) : 1/ disette, famine ; 2/ manque (of sth, de qch) * dearly (adv.) : 1/ chèrement, très cher ; 2/ énormément, beaucoup, de tout son cœur * death (n) : 1/ mort (f) - if death supervenes : si la mort survient - to predict one’s own death : prédire sa propre mort - death by misadventure : mort accidentelle - life after death : la vie après la mort - pangs of death : affres de la mort - grim death : mort sinistre, mort horrible - sudden death : mort subite - wrongful death : mort causée par la faute d’autrui - death duties : droits de succession - the death penalty : la peine de mort, la peine capitale (syn. the death sentence : la peine de mort) - death rate : taux de mortalité - death row (amér.) : couloir de la mort - death throes : (l’)agonie de la mort ; 2/ (expressions diverses) - to beat sb to death : rosser qn jusqu’à ce que mort s’ensuive - to chop to death : tuer à coups de hache - to fall to one’s death : faire une chute mortelle - [patient] to be snatched from the jaws of death : [malade] être arraché aux griffes de la mort * deb (n) (fam.) (tronc. de debutante : débutante) : débutante (f) * debacle (n) : débâcle (f) - economic debacle : débâcle économique * de-ball / deball (v) (tr.) : (prop. et fig.) couper les couilles à * debar (v) (tr.) : - to debar sb from sth : exclure qn de qch, interdire qch à qn * debase (v) (tr.) : 1/ avilir, rabaisser ; 2/ altérer (une monnaie) * debasement (n) : 1/ avilissement, rabaissement ; 2/ altération (f) (d’une monnaie) * debasing (n) : altération (f), dégradation (f) - the debasing of English : la dégradation de l’anglais * debate (n) : débat - face-to-face debate : face à face - illuminating debate : débat éclairant – There s no debate that… : Il est incontestable que… * debate (v) (tr.) : débattre de * debit (n) : débit - credit/debit card : carte de crédit et de débit * debenture (n) : obligation (f) (sans garantie) - debenture holder : obligataire (n) * debonair (a) (fa) : raffiné(e), élégant(e), d’une élégance nonchalante * debond (v) : (tr.) déliaisonner, décoller ; (intr .) se déliaisonner, se décoller * debone (v) (tr.) : désosser * deboned (ppa) : désossé(e) - deboned meat : viande sans os * debris (n ind. sing.) : débris (pl.), décombres (pl.) - debris build-up : accumulation de débris * debt (n) : dette (f) - gambling debt : dette de jeu - the debt burden : le fardeau de la dette * debt-laden (ac) : criblé(e) de dettes, croulant sous les dettes, surendetté(e) - debt-laden airline : compagnie aérienne criblée de dettes - debt-laden country : pays croulant sous les dettes * debug (v) (tr.) : (Inf.) corriger les erreurs de, mettre au point, déboguer (un programme) * debunk (v) (tr.) : 1/ discréditer (une théorie), tordre le coup à (une idée reçue) (fam.), faire un sort à (une théorie), déboulonner (un mythe) (fig.), briser (un mythe), démystifier - to debunk a case : éclaircir une affaire ; 2/ tourner (une chose) en ridicule * debunker (n) : déboulonneur, déboulonneuse (fig.), démystificateur, démystificatrice - a UFO debunker : un déboulonneur d’ovnis * debunking (n) : déboulonnage, démystification (f) - debunking piece : article de démystification * debut (n) : 1/ entrée dans le monde, baptême social ; 2/ débuts (pl.) - she made her debut as one of Madonna's dancers : Elle fit ses premiers pas en tant que danseuse de Madonna - debut album : premier album * debut (v) : (tr.) présenter pour la première fois au public ; (intr.) faire ses débuts * decade (n) (fa p) : 1/ décennie (f) (10 ans) ; 2/ (Maths, Phys.) décade (groupe de dix) * decade-old (ac) : vieux/vieille de plusieurs décennies * decadence (n) : décadence (f) * decadent (a) : décadent(e) * decaffeinated (ppa) : décaféiné(e) - decaffeinated coffee : café décaféiné * decagon (n) : décagone * decanter (n) : carafe (f) * decapitalisation (brit.) / decapitalisation (amér.) (n) : décapitalisation (f) * decapitalise (brit.) / decapitalize (amér.) (n) : décapitaliser * decarbonisation (brit.) / decarbonization (amér.) (n) : 1/ décalaminage ; 2/ décarbonisation (f), décarbonation (f) * decarbonise (brit.) / decarbonize (amér.) (v) (tr.) : 1/ décalaminer ; 2/ décarboniser, décarboner * decay (n) : 1/ décomposition (f), pourrissement, carie (f) ; 2/ (fig.) décadence (f), déclin, décrépitude (f) * decay (v) : (tr.) décomposer, faire pourrir, carier (une dent) ; (intr.) se décomposer, pourrir, [dent] se carier * decaying (a) : 1/ en décomposition ; 2/ (fig.) en décadence, en déclin, décrépit(e) * deceit (n) : tromperie (f), fraude (f), duperie (f) * deceitful (a) : trompeur/-euse, mensonger/-ère - deceitful words : paroles mensongères (f pl.) * deceive (v) (tr.) (fa) : (tr.) tromper, duper, leurrer ; (intr.) être trompeur - Appearances deceive : Les apparences sont trompeuses * deceived (ppa) (fa) : trompé(e), leurré(e) - Youth is easily deceived, because it is quick to hope (Aristotle) : La jeunesse est facile à abuser car elle est prompte à espérer (Aristote). * deceiver (n) : imposteur, escroc, arnaqueur - media deceivers : escrocs des médias * decel (n) (pl. decels) (tronc. de deceleration) * decelerate (v) (tr. et intr.) : décélérer * deceleration (n) : décélération (f) * decency (n) (fa) : 1/ décence (f) (= honnêteté morale) ; 2/ politesse (f), correction (f), bonnes manières (f pl.) * decent (a) (fa) : convenable, honnête, acceptable - a decent education : une éducation convenable - a decent family : une famille respectable - a decent fellow : un brave type - decent people : honnêtes gens (m pl.) * deception (n) (fa) : tromperie (f), duperie (f) * deceptive (a) : trompeur/-euse - Appearances are deceptive : Les apparences sont trompeuses * decide (v) (tr.) : décider - to decide whether… : décider si oui ou non… * decidedly (adv.) : 1/ résolument, fermement, décidément (syn. definitely) ; 2/ vraiment, franchement * decimal (a) : décimal(e) - the decimal point : (équivalent anglais de) la virgule décimale * decipher (v) (tr.) : déchiffrer * decision (n) : décision (f) - to make a bold decision : prendre une décision hardie - to make shitty decisions : prendre des décisions merdiques - difficult, time-sensitive decisions : décisions difficiles, urgentes - short-sighted decision : décision à courte vuen- decision maker : décideur, décisionnaire - decision making : prise de décisions * deck (n) : 1/ pont (de navire, de plateforme pétrolière) - on deck : sur le pont ; 2/ (Aéro.) flight deck : cabine de pilotage ; 3/ - record deck : tourne-disque (masc.) * declaration (n) : déclaration (f) - declaration of war : déclaration de guerre * declare (v) (tr.) : 1/ déclarer ; 2/ (diverses expressions) - to declare a state of emergency : déclarer l’état d’urgence * declassified (ppa) : rendu(e) public/-ique * declassify (v) (tr.) : rendre public, lever le secret sur, mettre à la disposition du public, rendre public, déconfidentialiser - to declassify government records about UFOs : rendre publiques les archives gouvernementales sur les ovnis * declination (n) : refus * decline (n) : déclin (f), baisse (f), diminution (f) - to be in decline : être en déclin (syn. to be on the wane) - a decline in enrolment (brit.) / enrollment (amér.) : a/ une baisse du recrutement ; b/ une baisse de l’effectif - precipitous decline : déclin vertigineux ; 2/ pente (f), déclivité (f), inclinaison (f) * decline (v) : 1/ (tr.) décliner ; (intr.) refuser (de faire qch) ; 2/ (intr.) décliner, diminuer, baisser * declining (a) : en baisse - declining sales : ventes en baisse * declinism (n) : déclinisme * declinist (n) : décliniste (m/f), déclinologue (m/f) * declog (v) (tr.) : décolmater, déboucher * decode (v) (tr.) : décoder * decoder (n) : décodeur * decolonise (brit.) / decolonize (amér.) (v) (tr.) : décoloniser * decom (v) (tr.) (tronc. de to decommission) : 1/ déclasser, désactiver, mettre hors service (une installation), désarmer (un navire) ; 2/ démanteler * decommission (v) (tr.) : 1/ déclasser, désactiver, mettre hors service (une installation), désarmer (un navire) ; 2/ démanteler * decommissioned (ppa) : [navire] désarmé(e) ; [installation] mis(e) hors service * decompile (v) (tr.) : (Inf.) décompiler * decompo (n) (tronc. de decomposition) : décomposition (f) (d’un cadavre) * decompose (v) : (tr.) décomposer ; (intr.) se décomposer * decomposition (n) : décomposition (f) (d’un cadavre) * decompress (v) (tr.) : (Inf.) décompresser (un programme) * deconfliction (n) : déconfliction (f) * decon (v) (tr.) (tronc. de to decontaminate) * deconstruction (n) : démontage (d’un bâtiment) * decontaminate (v) (tr.) : décontaminer * decontamination (n) : décontamination (f) * decontextualise (brit.) / decontextualize (amér.) (v) (tr.) : contextualiser * decorous (a) : convenable, comme il faut * decoupage (n) (fa) : collage - the art of decoupage : l’art du collage * decouple (v) (tr.) : découpler, désaccoupler * decrease (n) : baisse (f), diminution (f) * decrease (v) : (tr.) baisser, réduire, diminuer ; (intr.) baisser, décroître, diminuer * decree (n) : décret, arrêt * decree (v) (tr.) : décréter, arrêter * decry (v) (tr.) : dénoncer, contester * decuple (v) : (tr.) décupler ; (intr.) décupler * dedicate (v) (tr.) : 1/ dédier (to, à) ; 2/ spécialiser (to, dans) * dedicated (a) : 1/ passionné(e) ; 2/ spécialisé(e), spécialement conçu(e) - dedicated production line : ligne de production spécialisée * dedication (n) : spécialisation (f) * de-dollarisation (brit.) / de-dollarization (amér.) (v) (tr.) : dé-dollarisation * de-dollarise (brit.) / de-dollarize (amér.) (v) (tr.) : dé-dollariser * deduce (v) (tr.) : déduire (une conclusion) - to deduce sth from sth : déduire qch de qch - to deduce that… : (en) déduire que… - I deduced from it that I was wrong : J'en ai déduit que j'avais tort * deducible (a) : que l'on peut déduire, déduisible - to be deducible from sth : être déduisible de qch * de-dust (v) (tr.) : dépoussiérer (de l’air, des fumées) (aussi to dedust) * deed (n) : 1/ acte - foul deed : acte crapuleux ; 2/ acte (notarié) - to draw up a deed : rédiger un acte * deed poll (n) (brit.) : (Droit) acte unilatéral, acte à titre gratuit * de-embrittle (v) (tr.) : défragiliser (du métal) * de-energise (brit.) / de-energize (amér.) (v) (tr.) : (Élect.) mettre hors tension, couper le courant à * deep (a) : 1/ profond(e) - the Deep State : l’État profond ; 2/ intersidéral(e) - deep space : espace intersidéral * deep (adv.) : profondément - to dig deep in the ground : creuser orofondément dans le sol * deep down (adv.) : au fond de soi-même - deep down in his heart : en son for intérieur - deep down inside : tout au fond de soi * deepen (v) : (tr.) approfondir ; (intr.) s’approfondir * deep end (n) : (dans une piscine) grand bain - to go off the deep end (fig.) : piquer une crise, se mettre dans tous ses états * deepfake (n) (tronc. de deep learning fake) : vidéo truquée (f), hypertrucage (Q) (aussi deep fake) * deep-felt (ac) : sincère * deep-laid (ac) : [plan] secret/-ète * deeply (adv.) : profondément * deep-lying (ac) : profond(e) - deep-lying crack : fissure profonde * deep-rooted (ac) : profondément enraciné(e), profondément ancré(e) - deep-rooted problems : problèmes profondément ancrés - deep-rooted trend : tendance de fond * deep-seated (ac) : (fig.) profondément ancré(e) - deep-rooted belief : croyance profondément ancrée * deep-set (ac) : enfoncé(e) - deep-set eyes : yeux enfoncés * deep stater (n) (amér.) : membre de l’État profond * deep-water (ac) : en eaux profondes - deep-water port : port en eaux profondes * deescalate (v) (tr.) : désamorcer - to deescalate a tense situation : désamorcer une situation tendue * deface (v) (tr.) : 1/ défigurer ; 2/ mutiler, dégrader * de facto (a) : de fait (anton. de jure : de droit) * de facto (adv) : de fait, dans les faits (anton. de jure : de droit) * defamatory (a) : diffamatoire - defamatory statement : propos diffamatoire * defamer (n) : diffamateur/-trice * de-fang / defang (v) (tr.) : 1/ couper les griffes à (un chat), limer les crocs d’(un chien) ; 2/ (fig.) rendre inoffensif, neutraliser (un adversaire) * defanging / defanging (n) : 1/ (le) fait de couper les griffes, (le) fait de limer les crocs ; 2/ (fig.) neutralisation (f) * defatted (a) : dégraissé(e) - defatted meat : viande sans gras, viande dégraissée * default (n) : 1/ défectuosité (f) ; 2/ carence (f) - default of contractor : carence de l’entrepreneur - default settngs : paramètres par défaut, paramètres implicites * default (v) (intr.) : 1/ ne pas s’acquitter d’une dette ; 2/ to default on sth : ne pas rembourser qch - to default on a house loan : ne plus rembourser un crédit immobilier * defeat (n) : défaite (f) - the defeat of Nazism : la défaite du nazisme - resounding defeat : défaite retentissante * defeat (v) (tr.) : défaire, vaincre * defecate (v) (intr.) : déféquer - to defecate in one’s pants (fig.) : faire dans son froc * defect (n) : défaut, défectuosité (f), imperfection (f), vice (de construction) - to eliminate all defects : éliminer tous les défauts - nil defect : (le) zéro défaut (jarg.), (le) zéro défectuosité (jarg.) - zero defects : (le) zéro défaut (jarg.), (le) zéro défectuosité (jarg.) - to achieve zero defects : atteindre une qualité parfaite * defective (a) : défectueux/-euse, en mauvais état - defective returns : articles défectueux renvoyés * defector (n) : transfuge (m/f) * defence (brit.) / defense (amér.) (n) : 1/ (Milit.) (la) défense - defense contractor : entreprise travaillant pour la Défense (nationale) ; 2/ (au pl. defences) ouvrages défensifs, défenses (f pl.) ; 3/ défense (f), justification (f) - defence of the indefensible : défense de l’indéfendable, justification de l’injustifiable ; 4/ (Sport) (la) défense ; 5/ (Droit) (la) défense, (les) avocats ; 6/ defense (amér.) soutenance de rapport devant un jury * defend (v) (tr.) : défendre - Defending the indefensible : Défendre l'indéfendable * defender (n) : (Droit) défendeur/défenderesse * defender (n) : défenseur * defenestrate (v) (tr.) : défenestrer * defenestration (n) : défenestration (f) * defer (v) (tr.) : ajourner, différer, reporter à plus tard, remettre à plus tard * deferred (ppa) : ajourné(e), différé(e), reporté(e) à plus tard, remis(e) à plus tard * deferment (n) : ajournement, report * defiance (n) (fa) : défi * defiant (a) : rebelle * deficiency (n) : déficience (f) * deficient (a) : déficient(e) * defile (v) (tr.) : souiller, salir * define (v) (tr.) : définir, déterminer * defined (pp de to define) : (en compo.) défini(e) par, déterminé(e) par * definite (a) : 1/ défini(e), clair(e), précis(e), net(te) - definite article : (Gram.) article défini ; 2/ formel(le) - definite promise : promesse formelle ; 3/ certain(e) * definiteness (n) : 1/ caractère défini, caractère précis, précision (f), caractère net, netteté (f) ; 2/ caractère formel ; 3/ certitude (f) * definitely (adv.) : décidément, à coup sûr, sans aucun doute * definitive (a) : définitif/-ive * deflate (v) : 1/ (tr.) dégonfler (un pneu, un ballon) ; (intr.) [pneu, ballon, bulle] se dégonfler, désenfler - Deflate the tyre by pressing on the valve : Dégonfler le pneu en appuyant sur valve - The bond bubble is doomed to deflate : La bulle obligataire est condamnée à se dégonfler ; 2/ (tr.) faire baisser (les prix, ls coûts), faire tomber, faire chuter, provoquer la baisse de ; (intr.) [actifs] perdre de la valeur - This measure is intended to deflate the economy : Cette mesure est destinée à relancer l'activité économique ; 3/ (tr.) faire retomber (des espoirs) - The news is sure to deflate the hopes of climate activists : Ces nouvelles vont certainement faire retomber les espoirs des militants du climat ; 4/ (tr.) rabattre le caquet à (qn), démonter (qn), décontenancer (qn), désemparer (qn), décourager (qn) - I think I have worked out how to deflate him : Je pense avoir trouvé le moyen de lui rabattre le caquet * deflation (n) : 1/ dégonflage (volontaire), dégonflement (involontaire), désenflement, crevaison (f) - [tyre] to be prone to deflation : [pneu] avoir tendance à se dégonfler ; 2/ déflation (en économie) - to fight off deflation : lutter contre la déflation * deflator (n) : 1/ dégonfleur - tyre deflator : dégonfle-pneu, dégonfleur de pneus ; 2/ déflateur (en économie) - GDP deflator : déflateur du PIB (indicateur économique) * deflect (v) (tr.) : défléchir, dévier, faire dévier (a bullet, une balle) * deflection (n) : déviation (f), déformation (f), flexion (f) * deforest (v) (tr.) : déboiser, détruire la forêt de * deforestation (n) : déboisement, destruction de la forêt * deforester (n) : déboiseur, destructeur de la forêt * deformation (n) : déformation (f) - shear deformation : déformation par cisaillement - deformation resistance : résistance à la déformation * defrag (v) (tronc. de to defragment) * defragment (v) (tr.) : (Inf.) défragmenter, défractionner, remembrer (a file, un fichier) * defraud (v) (tr.) : escroquer (qn), frauder (le fisc) - to defraud the treasury : frauder le fisc * defrost (v) (tr.) : 1/ dégivrer ; 2/ décongeler * defrosting (n) : 1/ dégivrage - defrosting operation : dégivrage ; 2/ décongélation (f) * deft (a) : adroit(e) (with, de), preste * deftly (adv.) : adroitement, prestement *defunct (a) : 1/ défunt(e), disparu(e) ; 2/ désaffecté(e), abandonné(e) ; 3/ (fig.) [projet] mort(e), enterré(e), mort(e), mort(e) et enterré(e) * defund (v) (tr.) : couper le financement de * defy (v) (tr.) : défier - to defy explanation : défier l'entendement - to defy the doomsayers : défier les pronostics des Cassandre * degauss (v) (tr.) : démagnétiser * degenerate (a) : dégénéré(e) * degenerate (n) : dégénéré (n) * degenerate (v) (intr.) : dégénérer (into, en) * degeneration (n) : dégénérescence (f) - macular degeneration : dégénérescence maculaire * deglitch (v) (tr.) : 1/ (Élect.) supprimer les pointes de, dépointer ; 2/ supprimer les défauts de (fichiers audio-numériques) ; 3/ (Inf.) supprimer les bogues de * degrease (v) (tr.) : dégraisser * degree (n) (fa p) : 1/ degré, niveau - degree of finish : degré de finition ; 2/ degré (de température) - a full 360-degree turn : un tour complet; 3/ diplôme - to earn a degree : décrocher (fam.) une licence - a degree from Tokyo University : un diplôme obtenu à l’université de Tokyo - a bachelor’s degree : une licence - a bachelor of science degree : une licence ès sciences - a junk degree : un diplôme sans valeur - a master’s degree : un diplôme de maîtrise ; un master - an honours degree : un diplôme (avec mention bien) (amér. honors degree) * degree-laden (ac) : bardé(e) de diplômes - degree-laden denizen : habitant bardé de diplômes * degrowth (n) : décroissance (f) * dehighlight (v) (tr.) : (Inf.) supprimer la mise en surbrillance, désélectionner * dehumidify (v) (tr.) : déshumidifier, assécher * de-ice (v) (tr.) : dégivrer (un pare-brise, un avion) (aussi to deice) * de-icer (n) : 1/ (l’appareil) dégivreur ; 2/ (la subststance) antigel - runway de-icer : (Av.) produit de dégivrage des pistes (aussi deicer) * deign (v) (tr.) : deigner, condescendre à * de-industrialise (brit.) / de-industrialize (amér.) (v) (tr.) : désindustrialiser * deionise (brit.) / deionize (amér.) (v) (tr.) : déminéraliser * de-install (v) (tr.) : désinstaller, démonter (aussi to deinstall) * dejag (v) (tr.) : (CAO-DAO) lisser * de-jam / dejam (v) (tr.) : débloquer, dégripper, décoincer (Méca.) * de-jamming / dejamming (n) : décoincement, dégagement - dejamming bar : barre de décoincemnt - dejamming wrench : clé de décoincement * dejected (a) : abattu(e), découragé(e), qui fait grise mine * dejectedly (adv .) : d’un air abattu, d’un air découragé * Del. : abr. de Delaware, (le) Delaware * delaminate (v) : 1/ (tr.) délaminer ; (intr.) se délaminer ; 2/ (tr.) décoller (from, de) * Delaware (n pr.) : (le) Delaware * delay (n) (fa) : perte de temps, retard, lenteur (f), contretemps, empêchement - to eliminate the delays along the supply chain : éliminer les lenteurs affectant la chaîne d'approvisionnement - repeated delays : retards à répétition * delay (v) : 1/ (tr.) différer, reporter, remettre à plus tard - to be repeatedly delayed : être différé(e) à plusieurs reprises ; 2/ (tr.) retarder ; (intr.) tarder - The plane was delayed by fog : L’avion a été retardé par du brouillard - Don’t delay! : Ne tarde pas / Ne tardez pas !, Dépêche-toi / Dépêchez-vous ! * delayed (ppa) : remis(e) à plus tard, retardé(e), différé(e), reporté(e) * delayer (v) (tr.) : déstratifier la pyramide hiérarchique de, éliminer des échelons hiérarchiques de, aplatir la structure hiérarchique de * delayering (n) : déstratification de la pyramide hiérarchique, élimination d’échelons hiérarchiques intermédiaires, aplatissement de la structure hiérarchique - the delayering of hierarchies : (l’)effeuillage des structures hiérarchiques * delegation (n) : délégation (f) * delegitimise (brit.) / delegitimize (amér.) (v) (tr.) : délégitimer * delete (v) (tr.) : effacer, oblitérer * deleterious (a) : délétère * deletion (n) : 1/ effacement ; 2/ suppression (f) * deliberate (a) : délibéré(e), intentionnel(le), mûrement réfléchi(e), bien pesé(e) * deliberately (adv.) : délibérément, intentionnellement, exprès (fam.) * deliberately provocative (ac) : volontairement provocateur, donnant dans la provocation - deliberately provocative opinion piece : article d’opinion donnant délibérément dans la provocation * delicate (a) : délicat(e) * delight (v) : (tr.) ravir (with, de) ; (intr.) trouver son bonheur (in, à, dans) * delighted (a) : ravi(e) - I’m delighted with (var. at) your remarks : Je suis ravi de vos remarques * delightful (a) : délicieux/-euse, charmant(e) * delinquent (a) : 1/ délinquant(e) ; 2/ négligent(e) ; 3/ défaillant(e), en défaut - delinquent home owner : propriétaire en défaut * delinquency (n) : délinquance (f) * delinquent (n) : délinquant (n) - juvenile delinquent : jeune délinquant (éviter le calque « délinquant juvénile ») (syn. teenage delinquent) * delish (a) (tronc. fam. de delicious) : délicieux/-euse * de-list (v) (tr.) : retirer d’une liste, radier d’une liste * deliver (v) (fa) : 1/ (tr.) acheminer ; distribuer, remettre - to deliver mail : remettre du courrier ; 2/ (tr.) fournir, apporter, procurer, livrer - to deliver urgent cargo : livrer des cargaisons en urgence ; 3/ (intr.) [pompe] débiter ; 3/ (tr.) prononcer - to deliver a sermon : prononcer un sermon ; 4/ (intr.) tenir ses promesses, « assurer » - to have to deliver all the time : devoir « assurer » tout le temps * delivery (n) (pl. deliveries) : 1/ mise à disposition, livraison (f) - We do deliveries : Nous livrons à domicile - to take delivery of : prendre livraison de - delivery of information : fourniture d’informations - curbside delivery : livraison porte-à-porte - fast-tracked delivery : livraison accélérée - guaranteed delivery : livraison garantie - just-in-time delivery : livraison juste-à-temps, (le) zéro délai à la livraison (jarg.) - delivery date : date de livraison - delivery lead time : délai de livraison - delivery man : livreur - delivery time : délai de livraison, délai de mise à disposition - delivery van : camionnette de livraison ; 2/ sortie (f), expulsion (f) - delivery rate : débit d’expulsion ; 3/ accouchement * delouse (v) (tr.) : épouiller * delousing (n) : épouillage - delousing agent : produit anti-poux * delta-shaped (ac) : en forme de delta * delta-winged (ac) : (Av.) à aile en delta * delude (v) (tr.) : 1/ tromper, leurrer ; 2/ - to delude oneself : se leurrer, se faire des illusions, se faire des idées * delurk (v) (intr.) : sortir de l’anonymat * delusion (n) : illusion (f) * delusional (a) : délirant(e) - delusional megalomania : délire mégalomane (f) * de-luxe (a) : de luxe - de-luxe funeral : funérailles de luxe * delve (v) (intr.) : fouiller (into, dans) * demagogue (n) : démagogue (m/f) * demagoguery (n) : démagogie (f) * demagogy (n) : démagogie (f) * demake (n) : version rétro (d’un jeu vidéo) * demake up (mod.) : à démaquiller - demake-up milk : lait à démaquiller, lait démaquillant * demand (n) (fa p) : 1/ exigence (f) - to meet the demands of… : satisfaire aux exigences de… - market demands : exigences du marché ; 2/ (la) demande (anton. supply : (l’)offre) - fluctuating demand : demande fluctuante - strong demand : (une) forte demande (for sth, de qch) - demand fluctuations : fluctuations de la demande * demand (v) (tr.) (fa) : 1/ exiger - to be demanded by law : être exigé par la loi ; 2/ réclamer * demand-driven (ac) : impulsé(e) par la demande, répondant à la demande - demand-driven agricultural research : recherches agricoles impulsées par la demande - demand-driven policy : politique des besoins (des clients) * demanding (a) (fa) : exigeant(e) * demanning (n) : dégraissage(s) (f) (des effectifs) * demean (v) (tr.) : rabaisser, avilir - to demean oneself : s’abaisser, s’avilir - Would you demean yourself so far? : Vous iriez vous abaisser à ce point ? * demeanour (n) : comportement, conduite (f), tenue (f), maintien (syn. behaviour) * dementia (n) : démence (f) - early-onset dementia : démence précoce (f), début précoce de démence * demerit (n) : démérite - the merits and demerits of… : les mérites et démérites de…, les avantages et les inconvénients de… * demesh (v) (tr.) : désengrener *demigod (n) : demi-dieu * demijhon (n) : dame-jeanne (pl. dames-jeannes) (f), bombonne / bonbonne (f) * de-mine / demine (v) (tr.) : déminer * deminer (n) : démineur/-euse * demineralise (brit.) / demineralize (amér.) (tr.) : 1/ déminéraliser ; 2/ distiller (de l’eau) * demineralised (brit.) / demineralized (amér.) (ppa) : 1/ démineralisé(e) ; 2/ distillé(e) - demineralised water : eau distillée * de-mining / demining (n) : déminage - demining operations : opérations de déminage - demining plough : charrue de déminage, charrue à déminer * demise (n) : 1/ décès, trépas, mort (f), disparition (f) (d’une personne) ; 2/ chute (f), fin (f), disparition (f) (d’un empire) * demist (v) (tr.) : désembuer * demister (n) (brit.) : dispositif anti-buée * demisting (n) : désembuage * demo (n) (tronc. de demonstration) : démo (f) - air demo : démo aérienne (syn. aerial demo) * demobilise (brit.) / demobilize (amér.) (v) (tr.) : démobiliser * democracy (n) (pl. democracies) : démocratie (f) - direct democracy : démocratie directe - representative democracy : démocratie représentative * democrat (n) : démocrate (m/f) * democratic (a) : démocratique * democratically (a) : démocratiquement * demographic (a) : démographique - demographic research : études démographiques (pl.) * demolish (v) (tr.) : démolir, abattre (au prop. comme au fig.) * demolition (n) : démolition (f) - controlled demolition : démolition télécommandée, démolition par implosion * demon (n) : démon * demoness (n) : démonesse (f) - supine demoness : une démonesse terrassée * demoniacal (a) : démoniaque * demonisation (brit.) / demonization (amér.) (n) : diabolisation (f) * demonise (brit.) / demonize (amér.) (v) (tr.) : diaboliser, noircir - to get demonised/-ized: se faire diaboliser * demon-possessed (ac) : possédé du démon, démoniaque * demonstrable (a) : 1/ démontrable ; 2/ patent(e) - demonstrable lie : mensonge patent * demonstrably (adv.) : manifestement, visiblement - demonstrably false : manifestement faux/fausse * demonstrate (v) (tr.) (fa p) : 1/ manifester (sur la voie publique) ; 2/ faire la démonstration de, faire l'essai de ; 3/ démontrer, prouver - to demonstrate that… : faire la preuve que… * demonstration (n) (fa p) : 1/ manifestation (f) (sur la voie publique) ; 2/ (Aéro.) démonstration - aerobatics demonstration : démonstration d’acrobaties aériennes - air demonstration : démonstration aérienne - demonstration flight : vol de démonstration * demonstrative (a) : 1/ (Gram.) démonstratif/-ive - demonstrative adjective : adjectif démonstratif - demonstrative pronoun : pronom démonstratif ; 2/ - to be demonstrative of sth : montrer qch, témoigner de qch * demonstrator (n) (fa) : manifestant(e) * demoralising (brit.) / demoralizing (amér.) (a) : démoralisant(e) * demothball (v) (tr.) : 1/ sortir de la naphtaline (une installation) ; 2/ faire redémarrer (une centrale) * de-mould / demould (v) (tr.) : décoffrer, démouler * demount (v) (tr.) : démonter, désassembler (anton. to mount) * demur (n) : objection (f) * demur (v) (intr.) : objecter, faire une objection * demure (a) : 1/ discret/-ète, réservé(e) et modeste ; 2/ qui affecte la réserve, qui affecte la modestie, qui a un air de Sainte Nitouche * demurely (adv.) : 1/ avec réserve, avec modestie ; 2/ d’un air faussement modeste, d’un air de Sainte Nitouche * demureness (n) : 1/ modestie (f) ; 2/ fausse modestie * demystification (n) : démystification (f) (syn. debunking) * demystify (v) (tr.) : démystifier (syn. to debunk) * den (n) : antre - dope den : fumerie d’opium * dengue (n) : dengue (f) (fièvre tropicale) * denial (n) : refus, dénégation (f) - Holocaust denial : négation de l’Holocauste * denialism (n) : négationnisme * denialist (a) : négationniste * denialist (n) : négationniste (n) * denier (n) : négationniste (n), sceptique (n) - climate change denier : climato-sceptique (n) (syn. global warming denier) - heliocentric denier : partisan de la Terre plate * denigrate (v) (tr.) : dénigrer * denigration (n) : dénigrement * denizen (n) : habitant(e) (n) * Denmark (n pr.) : (le) Danemark * dense (a) : 1/ dense, compact(e) ; 2/ opaque ; 3/ bête, débile, bouché(e) (à l’émeri) - the most dense viewer : le spectateur le plus abruti * dent (n) (fa) : 1/ bosse (f), bosselure (f) (dans du métal), pet (fam.) (dans une carrosserie) ; 2/ entaille (f) (dans du bois) * dent (v) (tr.) : cabosser * dental (a) dentaire - dental calculus : (le) tartre dentaire - dental plaque : (la) plaque dentaire * dent-resistant (ac) : insensible aux chocs - dent-resistant steel : acier anti-chocs, anti-bosses * denture (n) (fa) : dentier, prothèse dentaire (f) * denturist (n) : denturologue, prothésiste dentaire * denuclearisation (brit.) / denuclearization (amér.) (n) : dénucléarisation (f) * denuclearise (brit.) / denuclearize (amér.) (n) : dénucléariser * deny (v) (tr.) (fa) : 1/ nier - Nobody can deny that… : Personne ne peut nier que… ; 2/ démentir ; 3/ refuser d’admettre, s’opposer à * de-orbit (v) : (tr.) désorbiter - to de-orbit a space station : désorbiter une stations patiale ; (intr.) désorbiter * de-orbiting (n) : désorbitation (f), désorbitage * depalletise (brit .) / depalletize (amér.) (v) (tr.) : dépallétiser * depart (v) : 1/ (tr.) quitter (pour de bon) (un endroit) ; (intr.) [personne, train] partir, [avion] décoller - to depart for (a place) : partir pour (un endroit) - to depart from (a place) : partir pour (un endroit) ; 2/ - to depart from sth : s’écarter de qch, dévier de qch * department (n) (fa p) : 1/ département (la zone administrative française) ; 2/ département (d’entreprise) ; 3/ section (f) (d’une faculté), département (d’une faculté) (anglic.), service (d'un bureau) - (the) design department : (le) bureau d’études, (les) Études (f pl.) (syn. (the) design bureau) - the forensic medicine department : le service de médecine légale - the procurement department : le service des approvisionnements, le service des fournitures - the social science department : la section des sciences sociales ; 4/ rayon (d'un magasin) ; 5/ (amér.) ministère - (the) Department of Labor : (le) ministère du travail - (the) Department of Trade and Industry : (le) ministère du Commerce et de l’Industrie - (the) Justice Department : (le) ministère de la Justice - (the) State Department : (le) ministère des Affaires étrangères * departmental (a) (fa) : à l’échelle d'un bureau / d'un service * departure (n) : 1/ départ (for, pour ; from, de) ; 2/ rupture (from, avec), entorse (from, à) * depend (v) (intr.) : 1/ dépendre (upon / on, de) ; 2/ compter (upon / on, sur) - to depend on + prop. inf. s’attendre à ce que * dependability (n) : sûreté (f), fiabilité (f) * dependable (a) : de confiance, sûr/sure, fiable * dependably (adv.) : de manière sure, de manière fiable * dependence (n) : 1/ dépendance (on, à) ; 2/ subordination (on, à) * dependent (a) : 1/ dépendant (on, à) ; 2/ subordonné(e) (on, à), tributaire (on, de) - dependent clause (Gram.) : proposition subordonnée * depending on / upon (loc. prép.) : selon, en fonction de * depict (v) (tr.) : dépeindre, représenter, figurer * depiction (n) : portrait, peinture (f), représentation (f), figuration (f) * deplane (v) (intr.) : descendre d’un avion, quitter l’avion * deplatform (v) (tr.) : (Toile) exclure d’une plate-forme * deplete (v) (tr.) : épuiser (les ressources, etc.) * depletion (n) : épuisement - depletion of resources : épuisement des ressources - ozone depletion : réduction de la couche d'ozone * depoint (v) (tr.) : déjointoyer - to depoint a wall : déjointoyer un mur * depopulate (v) (tr.) : dépeupler * depopulation (n) : dépeuplement * deport (v) (tr.) : déporter * deportation (n) : déportation (f) * deportee (n) : déporté(e) * depose (v) (tr.) : destituer (un souverain) * deposit (n) : 1/ dépôt - wine deposits (pl.) : lie (f) (de vin) ; 2/ versement initial, premier acompte - to put down a deposit : verser un premier acompte ; 3/ caution (f) (en argent) - damage deposit : (Immo.) caution * deposit (v) : (tr.) déposer : (intr.) se déposer * deposition (n) : formation (f) de dépôts * deposition-prone (ac) : sujet(te) à la formation de dépôts - deposition-prone surface : surface sujette à la formation de dépôts * depot (n) : dépôt, entrepôt - ammo depot : dépôt de munitions - storage depot : lieu d'entreposage, installation d'entreposage, dépôt * deprave (v) (tr.) : dépraver, corrompre, pervertir * depraved (a) (fa) : dépravé(e), corrompu(e), perverti(e), pervers(e) * depravity (n) : dépravation (f), corruption (f), perversion (f) * deprecate (v) (tr.) : 1/ dénigrer, critiquer (qch, qn) ; 2/ rabaisser (qn) ; 3/ marquer comme obsolète ; 4/ désapprouver, déconseiller * deprecated (ppa) 1/ obsolète ; 2/ déconseillé(e) * depreciation (n) (fa p) : 1/ dépréciation (f), dévalorisation (f) ; 2/ amortissement (d'un bien) * depress (v) (tr.) : 1/ faire baisser - to depress sales : faire baisser les ventes ; 2/ appuyer sur (un bouton), abaisser (une manette) ; 3/ (fig.) déprimer, attrister * depressed (a) : en crise (économique), sinistré(e) (économiquement) - depressed region : région en crise (économique) * depression (n) : 1/ dépression (f), déprime (f) (fam.) ; 2/ - the Depression (amér.) : la grande crise de 1929 ; 3/ dépression, creux ; 4/ dépression (météorologique) * deprioritise (brit.) / deprioritize (amér.) (v) (tr.) : rendre non prioritaire * deprive (v) (tr.) : priver (of, de), déposséder (of, de) * depth (n) : profondeur (f) * deputy (n ou a) (pl. deputies) (fa p) : 1/ député (n) ; 2/ adjoint (n ou a), suppléant (n ou a) - deputy general director : directeur général adjoint * derail (v) : (tr.) faire dérailler ; (intr.) dérailler * derailed (ppa) : qui a déraillé - derailed train : train ayant déraillé * derailment (n) : déraillement * derange (v) (tr.) : 1/ déranger - This letter deranged all my projects : Celle lettre dérangea tous mes projets ; 2/ rendre fou * deranged (a) : à l’esprit dérangé - deranged person : personne au cerveau atteint, personne dérangée du cerveau * derangement (n) : 1/ désordre, chaos ; 2/ folie (f), démence (f) * derby (n) : 1/ derby (course de chevaux) ; 2/ (Sport) derby, rencontre entre voisins ; 3/ concours (de pêche), course (f) ; 4/ chapeau melon * derelict (a) : [navire, bâtiment, etc.] abandonné(e) * derelict (n) : 1/ navire abandonné en mer, épave (f) ; 2/ objet abandonné, épave * dereliction (n) : abandon * de-restriction (n) : fin d’interdiction - de-restriction sign : panneau de fin d’interdiction * deride (v) (tr.) (fa) : tourner en dérision, tourner en ridicule, ridiculiser * derisive (a) : moqueur/-euse, railleur/-euse * derivative (a) : dérivé(e) - derivative form : forme dérivée (f) * derivative (n) : (Fin.) dérivé (financier) (m) - [bank] to hold a large amount of derivatives : [banque] détenir une quantité importante de dérivés - weather derivatives : dérivés climatiques * derogation (n) : dérogation (f) - by derogation : à titre dérogatoire * derogatory (a) (fa p) : 1/ dérogatoire ; 2/ péjoratif/-ive, dépréciatif/-ive, peu flatteur/-euse, désobligeant(e) * deromanticise (brit.) / deromanticize (amér.) (v) (tr.) : déromanticiser, démystifier, cesser d'idéaliser, cesser d'enjoliver (anton. romanticise/-ize) * desalinate (v) (tr.) : désaliniser, dessaler * desalphat (v) (tr.) : désalphater * desalphalting (n) : désalphatage * desalt (v) (tr.) : dessaler * desalting (n) : 1/ dessalage (de la nourriture) ; 2/ dessalement (de l’eau de mer) * de-scale / descale (v) (tr.) : 1/ détartrer (une chaudière) ; 2/ décaper (une surface métallique) ; 3/ décalaminer (un moteur) * descending (a) : descendant(e) - descending order : ordre descendant (anton. ascending) * descent (n) : 1/ descente (f) - descent into madness : descente dans la folie ; 2/ extraction (f), origine (f) - of Tibetan descent : d’origine tibétaine * deschedule (v) (tr.) : déplanifier, déprogrammer * describe (v) (tr.) : 1/ (tr.) décrire, tracer - Describe an arc using the protractor : Tracez un arc à l'aide du rapporteur ; 2/ (tr.) décrire, rendre compte de - Can you describe it to me? : Pouvez-vous me décrire la chose ? ; 3/ (tr) décrire (as, comme étant), qualifier (as, de) - I wouldn't describe him as an idiot : Je ne le qualifierais pas d'idiot - to be described as... : être décrit(e) comme étant… * description (n) : 1/ description (f) (of sth, de qch), signalement (of sb, de qn) ; 2/ sorte (f), genre - no one of that description : personne de ce genre * desecrate (v) (tr.) : profaner * desecration (n) : profanation (f) * desecrator (n) : profanateur/-trice m/f) * desert (n) : désert * desertification (n) : désertification (f) * desertification-prone (ac) : tendant à se désertifier - desertification-prone area : zone sujette à la désertification * desertify (v) (tr.) : désertifier * deserts (n pl.) : ce qu’on mérite - They will get their just deserts when the time is right : Ils auront ce qu’ils méritent lorsque le moment viendra * desert-wise (ac) : - desert-wise living : mode de vie adapté au désert * deserve (v) (tr.) : mériter * deserving (a) : 1/ méritant(e) ; 2/ méritoire (anton. undeserving) * design (n) : 1/ dessein, intention (f), projet ; 2/ croquis, dessin ; 3/ motif ; 4/ profil - aerodynamic design : profil aérodynamique (d’un avion) ; 5/ étude (f), études (f pl.), conception (f) - crossover design (Pharma.) : plan d’étude croisé - engine designs : études de moteur - plant design : conception d'équipements - product design : conception de produits, étude de produits - (the) design bureau : (le) bureau d’études, (les) Études (f pl.) (syn. (the) design department) - design basis : (Nucl.) : base d’études, hypothèse de calcul - design change : modification d’études - design engineer : ingénieur d’études - design life : durée de vie théorique, durée de vie de calcul, durée de vie objective ; 6/ (l’activité) (la) création (f), (la) conception (f), (le) design (anglic.) - fashion design : création textile - web design : création numérique ; 7/ (selon le contexte) architecture (f), allure (f), style, plastique (visuelle) (f), esthétique (f), forme (f), ligne (f), lignes (f pl.), grandes lignes, présentation (f), habillage, carénage - aerodynamic design : ligne aérodynamique * design (v) (tr.) : 1/ dessiner ; 2/ concevoir, étudier - to be designed by… être issu de la planche à dessin de… - to be designed for + gér. : être conçu / étudié pour + inf. * designate (v) (tr.) : 1/ désigner, nommer ; 2/ indiquer, dénoter * designer (n) : 1/ concepteur/-trice - game level designer : concepteur de niveaux de jeux - mechanical designer : concepteur de véhicules, d’armes et d’objets ; 2/ créateur/-trice, styliste (m/f) - fashion designer : styliste de mode, créateur/-trice de mode - hair designer : coiffeur, coiffeuse (syn. hair stylist) - designer bag : sac de style, sac de créateur * design in (v) (tr.) : concevoir dès le départ, intégrer dès la conception * designing (n) : conception (f), création (f) * desired (ppa) : voulu(e), désiré(e), souhaité(e) - (the) desired level : (le) niveau voulu * desist (v) (intr.) : cesser - to desist from political activism : cesser toute activité politique - to desist from doing sth : cesser de faire qch * desk (n) : 1/ bureau (le meuble) - the teacher's desk : le bureau du professeur / de l’instituteur (selon le cas) - desk jockey : gratte-papier - desk lamp : lampe de bureau ; 2/ bureau (le service) - help desk : a / bureau d’accueil, accueil ; b/ (Inf.) service d’assistance - desk job : travail de bureau - desk man : réceptionniste (masc.) ; 3/ (Fin.) (salle des marchés) service * desk-bound (ac) : rivé(e) au bureau, fixe, non transportable - desk-bound personal computer : ordinateur individuel non transportable * deskew (v) (tr.) : supprimer le défaut d’alignement de (une image), redresser (une image) * deskill (v) (tr.) : déqualifier * deskilled (a) : déqualifié(e) - deskilled worker : travailleur déqualifié * desktop (a) : de bureau, de table - desktop computer : ordinateur de bureau, ordinateur de table - desktop publishing : micro-édition (f), édition assistée par ordinateur * despair (n) : désespoir - to be in dispair : désespérer * despairing (a) : désespéré(e) - despairing glance : regard désespéré * desperate (a) (fa) : prêt(e) à tout - Desperate times call for desperate measures : Aux grand maux, les grands remèdes (var. Desperate situations call for desperate remedies : Aux grands maux les grands remèdes) * desperately (adv.) (fa) : avec acharnement, avec l'énergie du désespoir, frénétiquement, éperdument, à tout prix * despicable (a) : méprisable * despise (v) (tr.) : mépriser * despite (prép.) : en dépit de, malgré (syn. in spite of) - despite + gér. : malgré le fait de + inf. – despite this : malgré cela * despoil (v) (tr.) : souiller * despondency (n) : abattement, découragement * despondent (a) : abattu(e), découragé(e) * despot (n) : despote * despotic (a) : despotique, tyrannique * despotism (n) : despotisme * destabilise (brit.) / destabilize (amér.) (v) (tr.) : déstabiliser * destiny (n) (pl. destinies) : destinée (f) * destitute (a) (fa) : sans ressources, indigent(e), démuni(e) * destitution (n) (fa) : dénuement, indigence (f), misère (f) * destroy (v) (tr.) : détruire, casser - to be destroying the planet : être en train de détruire la planète *destroyer (n) : 1/ destructeur/-trice ; 2/ (Marine) contre-torpilleur, destroyer * destruction (n) destruction (f) - environmental destruction : destruction du milieu * desultory (a) : décousu(e) (au fig.) * detach (v) (tr.) : détacher * detached (ppa) : 1/ détaché(e), indifférent(e) - to remain detached : rester indifférent(e) (from, à) ; 2/ individuel(le) - detached house : maison individuelle * detachment (n) : détachement, indifférence (f) - journalism of detachment : journalisme non émotionnel * detail (n) : 1/ (le) détail - attention to detail : (le) souci du détail ; 2/ (a detail, au pl., details) coordonnées (f pl.) - personal details (brit.) : état civil - your postal contact details : vos coordonnées postales ; 3/ (au pl., details) - dimensional details : cotes (f pl.) ; 4/ (Milit., Police) détachement, brigade (f) - security detail : gardes du corps (pl.), équipe de protection rapprochée - to get security detail : recevoir des gardes du corps, obtenir une protection rapprochée - the homicide detail : la brigade des homicides * detail (v) (tr.) : exposer en détail, indiquer de façon détaillée * detailed (a) : détaillé(e), dans le moindre détail * detail-oriented (ac) : soucieux/-euse du détail * detain (v) (tr.) : retenir * detect (v) (tr.) : déceler, détecter - to detect a maladjustment : déceler un dérèglement - to detect wear : déceler des traces d'usure * detectable (a) : décelable, détectable * detecting (n) : détection (f) - metal detecting : (la) détection de métaux * detection (n) : détection (f) - threat detection : (la) détection de menaces * detective (n) : 1/ inspecteur - homicide detective : inspecteur à la brigade criminelle, imspecteur à la criminelle, inspecteur à la crim’ (fam.) ; 2/ détective - detective film : film policier (syn. crime film) * detector (n) : détecteur - lie detector : détecteur de mensonge, polygraphe (syn. polygraph) - to be given a lie detector test : être soumis(e) au détecteur de mensonges * detectorist (n) : détectoriste (néol.) (utilisateur de détecteur de métaux) * detention (n) (fa p) : 1/ détention (f) - to be held in detention : être en détention ; 2/ (Éduc.) retenue (f), colle (f) - to be given detention for wagging off : avoir une retenue pour avoir séché les cours - to get a detention : se retrouver collé ; 3/ retenue - rock detention structure : barrage de rochers * deter (v) (tr.) : dissuader, décourager (sb from doing sth, qn de faire qch) * deteriorate (v) : (intr.) se détériorer, se dégrader * determine (v) (tr.) : déterminer, établir, décider, fixer, régler * deterrence (n) : dissuasion (f) - weapon of deterrence : arme de dissuasion * deterrent (n) : moyen de dissuasion * deterrent (a) : dissuasif/-ive, de dissuasion * dethrone (v) (tr.) : détrôner * detoxify (v) : (tr.) détoxifier, désintoxiquer ; (intr.) [individu] se désintoxiquer * detune (v) (tr.) : désaccorder * detract (v) (intr.) : porter atteinte, nuire - to detract from sth : nuire à la qualité de qch, amoindrir qch * detractor (n) : détracteur, détractrice * devastate (v) (tr.) (fa p) : 1/ dévaster ; 2/ (fig.) accabler, bouleverser * devastated (ppa) (fa p) : 1/ [bâtiment, lieu] dévasté(e), ravagé(e) ; 2/ [individu] effondré(e), accablé(e) de chagrn - to be devastated : [personne] être effondré(e) * devastating (a) (fa p) : 1/ dévastateur/-trice ; 2/ accablant(e), bouleversant(e) ; 3/ [(texte, discours] extrêmement critique, au vitriol * develop (v) (tr.) (fa) : 1/ élaborer, mettre au point, réaliser, travailler sur - to develop models : mettre au point des simulations - to develop biotech products : mettre au point des produits de biotechnologie ; 2/ mettre en valeur, aménager, exploiter ; 3/ commencer à faire, contracter - to develop an embolism : être victime d’une embolie * developed (a) (fa) : évolué(e) * developer (n) (fa) : 1/ constructeur, créateur ; 2/ - land developer : promoteur (immobilier) * developing (a) : en développement * development (n) (fa) : 1/ a/ élaboration, mise au point, réalisation - under development : en cours de réalisation, en cours d’élaboration - program development : mise au point de logiciels ; b/ chose mise au point - the new development : le nouveau système mis au point ; 2/ mise en valeur, aménagement, exploitation ; 3/ évolution - a worrying development : une évolution inquiétante ; 4/ péripétie - a new development : un rebondissement - news developments : péripéties de l’actualité * device (n) : 1/ dispositif, appareil (syn. contrivance) - answering device : répondeur automatique - cloaking device : (Star Trek) bouclier occulteur - electrically operated device : appareil électrique - positioning device : dispositif de positionnement, positionneur ; 2/ (Inf.) périphérique (n) - device list : liste des périphériques - device manager : gestionnaire de périphérique ; 3/ procédé - stylistic devices : procédés stylistiques * devil (n) : 1/ diable, démon ; 2/ the devil / the Devil : le Diable - the Devil Incarnate : le Diable incarné ; 3/ - to be a lucky devil : être un sacré veinard ; 4/ petit monstre ; 5/ tourbillon - dust devil : tourbillon de poussière ; 6/ (Imprim.) arpète - a printer’s devil : un apprenti imprimeur, un arpète * devious (a) : [esprit] tortueux/-euse * deviousness (n) : sournoiserie, perfidie * devise (v) (tr.) (fa) : imaginer, concevoir, échafauder, inventer (syn. to invent, to contrive) – to devise an algoritnm : concevoir un algorithme * devoid (a) (tjrs attribut) : dénué(e) (of, de), dépourvu(de) (of, de) * devolve (v) : 1/ (tr.) déléguer - to devolve sth to sb : déléguer qch à qn ; 2/ (intr.) to devolve on/upon : retomber sur, échoir à ; 3/ (intr.) to devolve into : dégénérer en * devote (v) (tr.) : consacrer (to, à) * devoted (a) : dévoué(e) (to, à) * devotee (n) : adepte, fidèle, fervent admirateur - music devotee : amoureux de la musique - UFO devotee : amateur d’ovnis * devotion (n) (fa) : dévouement, (profond) attachement, amour - devotion to duty : amour du travail * devotional (a) : 1/ de dévotion, de piété ; 2/ pieux/-euse, dévôt(e) - devotional painting : peinture pieuse (f) * devout (a) (fa) : fervent(e), pieux/-euse * dew (n) : rosée (f) - the morning dew : la rosée du matin * dewater (v) (tr.) : 1/ dénoyer (une mine) ; 2/ assécher (un marais) ; 3/ essorer (du linge) * dewax (v) (tr.) : déparafiner (des huiles) * dewaxing (n) : déparafinage (des huiles) * de-worm / deworm (v) (tr.) : vermifuger * de-worming / deworming (n) : vermifugation - to give a cat a deworming shot : injecter du vermifuge à un chat * dhow (n) : boutre * diacritical (a) : diacritique - diacritical mark : signe diacritique * diagnose (v) (tr.) : diagnostiquer * diagnostics (n pl.) : possibilités de diagnostic, moyens de diagnostic - fault diagnostics : moyens de diagnostic d’erreurs * diagram (n) : schéma - wiring diagram : schéma de câblage * dial (n) : cadran * dial (v) (tr.) : composer (un numéro) - to dial a phone number : composer un numéro de téléphone * dialect (n) : dialecte - A language is a dialect with an army and a navy : Une langue est un dialecte doté d'une armée et d'une marine (Max Weinreich) * dialer (amér.) / dialler (brit.) : - speed dialer : touche d’appel de numéro pré-enregistré, touche d’appel automatique * dialing (amér.) / dialling (brit.) (n) : composition de numéros, appel de numéros - dialling tone : tonalité d’appel * dialog (amér.) / dialogue (brit.) : dialogue - dialogue box (Inf.) : boîte de dialogue, case à dialogue * dial up (v) (intr.) : se connecter - to dial up to the Internet : se connecter à l'Internet (par modem classique) * dial-up (ac) : - dial-up modem : modem pour accès commuté, modem classique - dial-up internet connections : connexions Internet par ligne commutée / par téléphone * dialyse (brit.) / dialyze (amér.) (v) (tr.) : dialyser * dialysis (n) : dialyse * diamond (n) : 1/ diamant - diamond ring : bague avec diamant ; 2/ losange * diamond-shaped (ac) : en forme de losange * diaper (n) : couche (pour bébé), couche-culotte - diaper changing : (le) changement des couches(-culottes) - diaper fetishism : fétichisme des couches (syn. nappy fetishism) * diaperism (n) : fétichisme des couches * diarch (n) : diarque, dyarque * diarchy (n) : diarchie / dyarchie (f) * diaeresis / dieresis (n) : tréma * diary (n) (pl. diaries) : 1/ journal intime ; 2/ (brit.) agenda, calendrier - to check one’s diary : vérifier son agenda * diaspora (n) : diaspora (f) * diasporic (a) : relatif à la diaspora / aux diasporas, diasporique - diasporic organisation : organisation diasporique * diatribe (n) : pamphlet * dibs (interj.) (arg. amér.) : prems, preums * dibs (n) (arg. amér.) : - to have first dibs on sth : être le premier / la première à faire qch, avoir la priorité, être prems / preums pour qch - to call dibs on sth : dire prems / preums pour qch * dice (n pl.) : voir die (n) * dice (v) (tr.) : couper en petits carrés - I’ll dice the preserved fruit : Je coupe en petits carrés le fruit confit * dick (n) (vulg.) : 1/ bite (f) (vulg.), queue (f) - dick pic : photo de bite, photo de queue, photo de pénis ; 2/ con, conne (vulg.), connard, connasse (vulg.) * dickens (the) (n) ( mis pour the devil : diable) : - What the dickens did you go there for? : Pourquoi diable y êtes-vous allé ? * dictation (n) : dictée (f) * dictator (n) : dictateur * dictionary (n) (pl. dictionaries) : dictionnaire - dictionary maker : auteur de dictionnaire(s) * dictum (n) (pl. dicta) : 1/ affirmation (f) ; 2/ dicton * did (prét. de to do) * diddle (v) (tr.) (arg.) : tromper (qn), mettre (qn) dedans * diddler (n) : tricheur/-euse * die (n) (pl. dice) : 1/ dé (à jouer) ; 2/ matrice (f) * die (v) (intr.) : mourir, trépasser (fam.) - to die in childbirth : mourir lors de l’accouchement - to die from hypothermia : mourir d’hypothermie * diemaker (n) : mouliste (m/f) * die-off (n) (pl. die-offs) : épisode de mortalité massive, hécatombe (f) - fish die-off : hécatombe de poissons * diesel (n) : diesel * diesel-driven (ac) : à moteur diesel - diesel-driven water pump : pompe à eau marchant au diesel * diesel-powered (ac) : à propulsion diesel - diesel-powered vehicle : véhicule à propulsion diesel * diet (n) : régime (alimentaire) - to go on a diet : se mettre à suivre un régime - the Paleolitic diet : le régime paléolithique - starvation diet : diète (f) - well-balanced diet : régime bien équilibré * difference (n) : 1/ différence (f) - to make a difference : a/ avoir plus de poids, faire pencher la balance de son côté, faire bouger les choses en sa faveur, changer la donne ; b/ se démarquer ; 2/ différend * different (a) : différent(e) * differently (adv.) : différemment - to word sth differently : formuler qch différemment * difficult (a) : 1/ difficile ; 2/ délicat(e) * difficulty (n) (pl. difficulties) : difficulté (f) - to overcome a difficulty : surmonter une difficulté - breathing difficulties : ennuis respiratoires - Therein is the difficulty : Là est la difficulté * diffident (a) : [individu] qui manque d’assurance * dig (n) : 1/ coup de coude ; 2/ pique (f), critique (f), coup de griffe (syn. remark) ; 3/ coup de bêche ; 4/ chantier de fouilles ; 5/ pl. digs : chambre meublée (f), piaule (f) - to get digs : se trouver une piaule * dig (v) (dug, dug) (tr.) : 1/ creuser - to dig a furrow : (Agric.) creuser un sillon ; 2/ bêcher ; 3/ fouiller ; 4/ (arg.) aimer, kiffer (arg.) * dig and delve (v coord.) : (au fig.) (tr.) creuser et fouiller (sth, qch) ; (intr.) creuser et fouiller (into sth, dans qch) * digest (n) : résumé (n) * digger (n) : fouilleur * digging (n) : creusement - digging stick : bâton à fouir * digit (n) : chiffre * digital (a) (fa p) : numérique - digital copy : copie numérique - digital morphing : morphose numérique - digital multimeter : multimètre numérique - digital television : télévision numérique - digital watch : montre à affichage numérique * digitalise (brit.) / digitalize (amér.) (v) (tr.) : numériser (syn. to digitise/ize) * digitally-controlled (ac) : [machine] à commande numérique - digitally-controlled machine : (Usin.) machine à commande numérique * digitisation (brit.) / digitization (amér.) (n) : numérisation (f) * digitise (brit.) / digitize (amér.) (v) (tr.) : numériser (syn. to digitalise/ize) * digitiser (brit.) / digitizer (amér.) (n) : tablette à numériser * digitising (brit.) / digitizing (amér.) (n) : numérisation (f) - digitizing tablet : tablette graphique (Inf.) * dignified (a) : plein(e) de dignité * dig up (v) (dug, dug) (tr.) : arracher (à la terre), déterrer * dike (n) (brit.) : voir dyke (n) * dilapidated (a) (fa) : délabré(e), en ruine * dilation (n) : dilatation (f) - anal dilatation : dilatation anale - time dilation : dilatation temporelle * dilatory (a) : 1/ lent(e) ; 2/ dilatoire * dildo (n) : (Sex.) godemiché, gode (fam.) - realistic dildo : godemiché réaliste - rubber dildo : godemichet en caoutchouc * dilemma (n) : dilemme - to be caught in a dilemma : être pris dans un dilemme - to face a dilemma : être confronté(e) à un dilemme * dilettante (n) : 1/ enthousiaste (n m/f) ; 2/ dilettante (m/f) * dilettantish (a) : de dilettante, d’amateur - dilettantish attempt : tentative d’amateur * dilute (v) (tr.) : diluer (de la peinture) * dim (a) : 1/ [lumière] faible, pâle, diffus(e) - dim light : lumière diffuse (f) - dim lights (amér.) : codes ; 2/ [room, pièce] sombre ; 3/ [colour, couleur] terne ; 4/ [view, vue, noise, bruit] vague, imprécis(e), indistinct(e) - to grow increasingly dim : s'estomper de plus en plus ; 4/ (expressions) - to take a dim view of sth : voir qch d’un mauvais œil * dim (v) (tr.) : atténuer, réduire (la lumière), mettre en veilleuse (une lampe) * dime (n) : (amér.) pièce de dix cents - to stop on a dime : s’arrêter pile * dimension (n) : 1/ dimension (f) (parmi les quatre) ; 2/ dimension, cote (f), mesure(f) - dimensions (pl.) : encombrement (sing.) - actual dimensions : dimensions réelles ; 3/ taille (f), ampleur (f) * dimensional (a) : dimensionnel(le) - dimensional details : cotes - dimensional drawing : dessin coté * dimensionally stable (ac) : aux cotes stables, stable sur le plan des dimensions - dimensionally stable material : matériau à invariance dimensionnelle * diminutive (a) (fa) : minuscule, exigu/-üe * dimly lit (ac) : peu éclair(e), mal éclairé(e), faiblement éclairé(e) - dimly lit area : zone sombre * dimness (n) : obscurité (f) * dimple (n) : fossette (f) - chin dimple : fossette au menton * din (n) : vacarme * din (v) (tr.) : rabâcher (into sb that…, à qn que…) * dine (v) (intr.) : dîner * dine and dash (v coor. par and) : déjeûner et détaler (à midi), dîner et détaler (le soir), partir en courant sans payer * diner (n) (amér.) : petit restaurant * ding (n) : 1/ dring (bruit d’une sonnerie) ; 2/ pèt / pète (masc.), coup, bosse (sur une carrosserie) * ding (v) : 1/ (intr.) faire dring ; 2/ (tr.) cabosser (une voiture) * ding-a-ling (n) : 1/ digue dindon (onomatopée des cloches) ; 2/ (amér., fam.) cloche (f) (en parlant d’une personne) ; 3/ (amér., fam.) maboul (n), toqué (n) ; 4/ (fam.) pénis * dingbat (n) : 1/ idiot(e), crétin(e) ; 2/ (Typo.) rébus graphique, dingbat (anglic.) * dingus (n) (amér.) : 1/ truc, machin, chose (f) ; 2/ abruti (n), crétin (n) - I’m such a dingus! : Quel abruti je fais ! * dingy (a) : [couleur] terne * dining (n) : (le fait de) dîner - dining cabin : cabine de restauration (dans un avion de ligne) - dining hall : réfectoire (dans un établissement scolaire) * dinky (a) : 1/ tout(e) petit(e) ; 2/ mignon(ne) ; 3/ ordinaire, quelconque * dinner (n) : 1/ dîner - dinner jacket : smoking - dinner party : dîner par invitations ; 2/ (expressions diverses) - You talk to me as if I was the dog’s dinner : Tu me parles comme à un chien * dint (n) (arch.) : force (f) - by dint of : à force de * diocese (n) : diocèse * dip (v) (tr.) : 1/ enfoncer ; 2/ tremper, plonger - I dip the chips in the runny yolk : Je trempe les frites dans le jaune d’œuf qui coule * diphtheria (n) : (la) diphthérie * diplo (a) (tronc. de diplomatic : diplomatique) : - in diplo speak : en langage diplomatique - That’s diplo speak for “You’re on your own, mate !” : En langage diplomatique, cela veut dire que personne ne va venir te défendre * diplomacy (n) : diplomatie (f) - gunboat diplomacy : diplomatie de la canonnière * diplomat (n) : diplomate * diplomatic (a) : 1/ diplomatique - diplomatic gaffe : gaffe diplomatique (f) - in diplomatic parlance : en langage diplomatique ; 2/ diplomate * dire (a) : 1/ [besoin] pressant(e), urgent(e) - to be in dire need of sth : avoir un beoin urgent de qch ; 2/ [nouvelles, menaces] affreux/-euse, terrible, désastreux/-euse, dramatique, catastrophique - dire situation : situation catastrophique * direct (a) : direct(e) - direct democracy : démocratie directe (f) - indirect speech : (Gram.) discours indirect * direct (v) (tr.) : 1/ diriger (les acteurs) ; 2/ réaliser (un film) * direction (n) : 1/ consigne (f) - stage directions : indications scéniques (f pl.) ; 2/ (Cin.) mise en scène - film/movie direction : réalisation de films, mise en scène de films * directive (n) : directive (f), consigne (f) - to put out a directive : émettre une consigne (syn. to issue a directive) - airworthiness directive : consigne de navigabilité - non-interference directive : directive de non-ingérence, principe de non-ingérence * directly (adv.) : sur le champ - He’ll be here directly : Il sera là sur le champ * director (n) (fa p) : 1/ directeur, directrice - art director (Cin.) : directeur artistique - editorial director (Presse) : directeur de la rédaction - executive director : directeur-en-chef - managerial director : directeur général ; 2/ (Cin.) film/movie director : réalisateur, réalisatrice, metteur en scène - the director’s cut : le montage du réalisateur - assistant film director : assistant(e) de réalisation - feature film director : réalisateur de longs métrages ; 3/ administrateur, administratrice - board of directors : conseil d'administration * directorship (n) : 1/ poste de directeur, fonctions (f pl.) de directeur ; 2/ (la) direction, (les) directeurs (pl.) * directory (n) (pl. directories) (fa) : 1/ annuaire, répertoire - the telephone directory : l’annuaire téléphonique ; 2/ (Inf.) répertoire - to browse through a directory : parcourir un répertoire * dirge (n) : 1/ chant funèbre ; 2/ musique triste (f) * dirt (n) : saleté (f), crasse (f) - ingrained dirt : crasse bien incrustée * dirt bag / dirtbag (n) (amér.) (vulg.) : ordure, fumier, salaud, salopard - He’s a real dirtbag ! : C’est un vrai salopard ! * dirt-poor (ac) : très pauvre, miséreux/-euse ; 2/ fauché(e), sans le sou * dirt-proof (ac) : à l’abri de l’encrassement, insalissable * dirty (a) : 1/ sale ; 2/ méchant(e), déloyal(e) - dirty trick : coup tordu, sale tour, coup en vache (fam.) ; 3/ cochon(ne), obscène - dirty mags (pl.) : (la) presse du cul - dirty movie : film cochon - dirty pictures : photos obscènes (f pl.) * dis (n) (tronc. de disrespect) : (arg.) insultes (f pl.) (aussi diss) - dis song : (Mus., rap) chanson d’insultes (syn. dis track) * dis (v) (tr.) (tronc. de to disrespect) : manquer de respect à (qn), mal parler à (qn), offenser (à), traiter qn (arg.) (aussi to diss) * disability (n) (pl. disabilities) : infirmité (f) * disable (v) (tr.) : 1/ estropier ; 2/ mettre hors de combat (a soldier, un soldat) ; 3/ désactiver * disabled (a) : infirme, invalide, handicapé(e) - disabled ex-service men : mutilés de guerre * disadvantaged (a) : désavantagé(e), défavorisé(e) - disadvantaged children : enfants défavorisés - the nation’s disadvantaged (a. subst. pl.) : les défavorisés du pays * disaffected (fa) : mécontent(e), insatisfait(e) * disagree (v) (intr.) : ne pas être d'accord (with, avec) * disagreement (n) (fa) : désaccord * disambiguate (v) (tr.) : désambiguïser * disappear (v) (intr.) : disparaître * disappearance (n) : disparition (f) * disappoint (v) (tr.) (fa) : décevoir * disappointment (n) (fa) : déception (f) * disapprove (v) (tr.) : 1/ ne pas voir d’un bon œil, voir d’un mauvais œil, être opposé(e) à ; 2/ refuser, rejter * disarm (v) : (tr.) désarmer ; (intr.) désarmer * disarmament (n) : désarmement - Campaign for Nuclear Disarmament (CND) : Campagne pour le désarmement nucléaire (l’organisation) * disarmer (n) : partisan du désarmement, militant pour le désarmement - nuclear disarmer : partisan du désarmement nucléaire * disarray (n) (fa) : confusion (f), désordre * disassemble (v) (tr.) : démonter * disassembly (n) : démontage * disaster (n) (fa p) : 1/ désastre ; 2/ catastrophe (f), sinistre - at the scene of the disaster : sur les lieux du sinistre - to court disaster : jouer avec le feu - air disaster : catastrophe aérienne - disaster film : film catastrophe - Chernobyl-like disaster : catastrophe du type Tchernobyl * disaster-prone (ac) : ayant tendance à susciter des catastrophes * disaster-proneness (nc) : tendance à susciter des catastrophes * disaster-proof (ac) : qui résiste à toutes les catastropes - disaster-proof government : gouvernement qui résiste à toutes les catastrophes * disband (v) : 1/ (tr.) disperser ; 2/ (tr.) congédier, licencier ; (intr.) [troupes] se débander * disbandment (n) : licenciement * disbar (v) (disbarred2) (tr.) : (Just.) radier du barreau * disbarrable (a) : [acte] qui peut entraîner la radiation (du bureau) - disbarrable offence (brit.) / offense (amér.) : délit susceptible d’entraîner la radiation (du bureau) * disbarred (ppa) : (Just.) radié du barreau * disbelief (n) : incrédulité (f), septicisme, doute - willing suspension of disbelief : suspension volontaire de l’incrédulité, (litt.) foi poétique (f) * disbelieve (v) (tr.) : ne pas croire * disc (n) : 1/ disque - flying disc : disque volant ; 2/ (Mus.) disque * discard (v) (tr.) : se débarrasser de, mettre au rebut, jeter (syn. to throw away, to reject) * discharge (n) : 1/ renvoi, licenciement ; 2/ destitution * discharge (v) (tr.) (fa) : 1/ renvoyer (qn), licencier (qn) ; 2/ destituer * disciple (n) : disciple (m/f) * discipline (n) : discipline (f) * disciplinary (a) : disciplinaire - disciplinary problems (Éduc.) : problèmes de discipline * disc jockey (brit.) / disk jockey (amér.) (n) : 1/ (Radio) présentateur de disques, animateur de radio ; 2/ (en discothèque) préposé aux manettes * disclaimer (n) : 1/ démenti, désaveu ; 2/ désistement, renonciation (f) * disco (n) (tronc. de discotheque) (fa) : discothèque (f) * discoidal (a) : discoïdal(e) - discoidal object : objet discoïdal * discombobulated (ppa) : déconcerté(e), décontenancé(e), désorienté(e), en désarroi * discommode (v) (tr.) : incommoder, gêner * discourage (v) (tr.) : décourager * discouragement (n) : découragement * discourteous (a) : discourteois(e), peu courteois(e) - discourteous refusal : refus peu courtois * discontent (n) : mécontentement * discount (n) : rabais, remise (f), ristourne (f) * discount (v) : (tr.) (+ somme d’argent) faire un rabais de ; (intr.) (+ un article) solder * discounting (n) : rabais (pl.), remises (f pl.) - to do some discounting : faire des rabais, des remises * discover (v) (tr.) : 1/ découvrir, trouver (des erreurs) - to discover bugs in a program : découvrir des bogues dans un programme ; 2/ découvrir, dénicher (de jeunes talents) - to discover talent : découvrir de nouveaux talents ; 3/ to discover that… : se rendre compte que…, s’apercevoir que… * discovery (n) : découverte (f), trouvaille (f) * discredit (n) : discrédit * discredit (v) (tr.) : discréditer, déconsidérer * discredited (ppa) : discrédité(e) * discreet (a) (fa p) : 1/ judicieux/-euse, prudent(e), avisé(e) ; 2/ discret/-ète, réservé(e) dans ses paroles * discreetly (adv.) (fa p) : 1/ de façon judicieuse ; 2/ discrètement * discrete (a) (fa) : (Électron.) séparé(e), isolé(e), individualisé(e) * discretion (n) (fa p) : 1/ réserve (f), retenue (f), discrétion (f)- duty of discretion devoir de réserve ; 2/ (fa p) jugement - to use one's discretion : s'en remettre à son propre jugement - Your own discretion : À vous de juger * discretional (a) : discrétionnaire (syn. discretionary) * discretionary (a) : discrétionnaire (syn. discretional) * discriminate (v) (intr.) : faire une distinction - to discriminate between… : faire la distinction entre… * disc-shaped (ac) : en forme de disque - disc-shaped object : objet en forme de disque * discus (n) : 1/ disque (l'objet) ; 2/ - the discus (le sport) : le lancer du disque, le lancer de disque, le disque * discuss (v) (tr.) : aborder, traiter * discussant (n) : participant (à une discussion) * discussion (n) : discussion (f) * disdain (n) : dédain - to be held in disdain by sb : avoir droit au mépris deqn, être tenu en peu d’estime par qn * disdainful (a) : dédaigneux/-euse * disease (n) : maladie (f) - Mad Cow disease : maladie de la vache folle - pandemic disease : maladie pandémique - preventable disease : maladie pouvant être évitée * disempower (v) (tr.) : ébranler le pouvoir de, priver de ses/leurs moyens, rogner les ailes de, affaiblir le pouvoir d’action de, affaiblir, fragiliser, marginaliser * disenfranchised (a) : exclu(e), laissé(e)-pour-compte - the disenfranchised (a. subst. pl.) : les exclus de la société * disengage (v) : (tr.) dégager, libérer, relâcher, enlever - to disengage oneself : se dépêtrer (from sth, de qch) ; (intr.) se désengager (from sth, de qch), se retirer (from sth, de qch) * disenrollment (amér.) / disenrolment (brit.) (n) : désinscription (f) ( à une université, etc.) (anton. enrollment / enrolment : inscription (f)) * disfigure (v) (tr.) : défigurer * disgrace (n) (fa p) : 1/ honte (f), déshonneur ; 2/ disgrâce (f) * disgraceful (a) : honteux/-euse, scandaleux/-euse * disgracefully (adv.) : de manière honteuse, de façon scandaleuse * disgruntled (a) : mécontent(e) - to be disgrunted with sth : être mécontent de qch * disguise (n) : déguisement - in disguise : a/ déguisé(e) ; b/ incognito - a blessing in disguise : un mal pour un bien * disguise (v) (tr.) déguiser - to be disguised in drag : être déguisé en femme * disgust (n) (fa) : dégoût * disgust (v) (tr.) (fa) : dégoûter * disgusting (a) (fa) : dégoûtant(e) * disgustingly (adv.) : 1/ affreusement, épouvantablement, atrocement - disgustingly fat : effroyablement obèse ; 2/ (ironique) - [man] to be disgustingly gorgeous : [homme] être un si beau mec que c’en est écœurant * dish (n) (pl. dishes) : 1/ plat (n) - meat dish : plat de viande, de la viande - ready-made dish : plat cuisiné ; 2/ - the dishes : la vaisselle (sing.) - to do the dishes : faire la vaisselle - to dry the dishes : sécher la vaisselle - to put away the dishes : ranger la vaisselle - dish towel : torchon - dish washer : lave-vaisselle (masc.) (voir aussi dishwasher) ; 3/ boîte (f) (de culture) - culture dish : boîte de culture - petri dish : boîte de Petri ; 4/ - soap dish : porte-savon (masc.) (syn. soap holder) * dish (n) (abr. de dish antenna : antenne parabolique) : parabole (f) * dishcloth (n) : torchon à vaisselle, lavette (f) * dishearten (v) (tr.) : décourager, démoraliser * disheartening (a) : décourageant(e), démoralisant(e) * dishevelled (a) : [personne, chevelure] hirsute, ébouriffé(e) * dishonest (a) : malhonnête * dish up (v) (tr.) : 1/ servir (un plat) ; 2/ (fig.) sortir, ressortir, présenter (des explications, justifications, etc.) * dishwasher (n) : 1/ (la machine) lave-vaisselle (masc.) (autre ortho. dish washer) (syn. dishwashing machine) ; 2/ (la personne) plongeur, plongeuse * dishwashing (n) : (la) vaisselle (l’opération) * dishy (a) (brit.) : 1/ appétissant(e) ; 2/ séduisant(e), attirant(e) - He is so dishy! : Je me le taperais bien ! * disincentive (n) : 1/ effet dissuasif - to be a disincentive : avoir un effet dissuasif ; 2/ frein (to sth, à qch), obstacle (to sth, à qch) - to be a disincentive to do sth : ne pas inciter à faire qch * disincentivise/-ize (v) (tr.) : dissuader (sb from doing sth, qn de faire qch) * disinclination (n) : manque d’enthousiasme (to + inf., pour + inf.) * disinfect (v) (tr.) : désinfecter * disinfo (n) (tronc. de disinformation, désinformation) : désinfo (f) - disinfo op : opération de désinfo, entreprise de désinfo * disinformation (n) : désinformation (f) - a piece of disinformation : un article de désinformation, un article mensonger - to fight disinformation : lutter contre la désinformation - disinformation expert : expert en désinformation * disinformationist (n) : désinformateur, désinformatrice, source de désinformation (syn. disinformer) * disinformer (n) : désinformateur/-trice, source de désinformation (f) (syn. disinformationist) * disintegrate (v) : (tr.) désintégrer ; (intr.) se désintégrer * disintegration (n) : désintégration (f) * disintegrator (n) : désintégrateur - disintegrator gun : pistolet désintégrant * disintermediation (n) : suppression des intermédiaires (f) * dismal (a) : épouvantable - dismal failure : échec épouvantable * dismally (adv.) : 1/ sombrement, lugubrement ; 2/ lamentablement * dismantle (v) (tr.) : démanteler * dismantlement (n) : démantèlement * dismantler (n) : démolisseur - car dismantler : casse autos * dismantling (n) : démantèlement * dismay (n) : désarroi, consternation (f) - to one’s dismay : à son grand effroi, non sans effroi * dismay (v) (tr.) : consterner * dismember (v) (tr.) : démembrer * dismemberment (n) : démembrement * dismiss (v) : 1/ (tr.) congédier, renvoyer (from a job, du boulot), licencier, révoquer, destituer (an official, un responsable) ; 2/ (intr.) (Milit.) rompre les rangs - Dismiss ! : Rompez ! - Permission to be dismissed, sir : Permission de me retirer, monsieur ; 2/ (tr.) écarter (a thought, une pensée), rejeter - to dismiss sb as being… : rejeter qn comme étant… * dismissal (n) : 1/ congédiement, renvoi, licenciement, révocation (f), destitution (f) ; 2/ (Éduc.) fin des cours - dismissal at 12 : fin des cours à midi * dismissive (a) : dédaigneux/-euse, méprisant(e) - a dismissive term : un terme méprisant * dismissively (adv.) : dédaigneusement, avec dédain, d’un ton méprisant, avec mépris * disobedience (n) : désobéissance (f) (to, à) * disobedient (a) : désobéissant(e), rétif/-ive * disorder (n) (fa p) 1/ trouble, maladie (f), dérèglement - alcohol-related disorders : troubles liés à l’alcool - eating disorder : trouble du comportement alimentaire ; 2/ ennui - mechanical disorder : ennui mécanique * disorderly (a) : turbulent(e) * disown (v) (tr.) : renier * disparage (v) (tr.) : dénigrer, décrier * disparaging (a) : critique, méprisant(e) * dispatch (v) (tr.) : envoyer, expédier * dispatcher (n) : 1/ (Transports) régulateur, régulatrice ; 2/ expéditeur, expéditrice ; 3/ répartiteur, répartitrice, aiguilleur/-euse * dispel (v) (prét. et pp -lled) (tr.) : 1/ (au sens propre) dissiper (l'obscurité, la brume) - The darkness was soon dispelled : L'obscurité eut tôt fait de se dissiper ; 2/ chasser (une idée), dissiper (une crainte, un doute, une illusion, un mythe), faire taire (la rumeur) - His appearance dispelled rumours that he had died : Son apparition dissipa la rumeur de sa mort * dispensatory (a) : dérogatoire * dispenser (n) : distributeur (la chose) - desktop dispenser : dévidoir de bureau - soap dispenser : distributeur de savon * disperse (v) (tr.) : diffuser, répandre, disséminer * dispirited (a) : découragé(e) * displace (v) (tr.) : déplacer * displacement (n) : 1/ déplacement - rate of displacement : vitesse de déplacement ; 2/ échange - engine displacement : échange standard de moteur * display (n) : 1/ étalage, manifestation (f) - to make a display of … : faire montre de… - display advertisement : (Presse) annonce grand format (f), annonce de grande surface (f), grande annonce (f), annonce presse (f), pavé publicitaire (aussi display ad) ; 2/ exposition (f) - to be on display : être en évidence, être exposé à la vue de tous - [object] to be put on display (Muséologie) : [objet] être mis(e) en montre, être exposé(e) ; 3/ (Inf.) a/ affichage - display quality : qualité d’affichage ; b/ écran - computer display : écran d’ordinateur ; 3/ (Av.) spectacle, démonstration (f) - air display : spectacle aérien, démonstration aérienne (syn. flying display) * display (v) (tr.) : 1/ montrer, témoigner de ; 2/ afficher - to display sth on screen : afficher qch à l’écran * displeasure (n) : 1/ mécontentement, insatisfaction (f) ; 2/ désapprobation (f) * disposable (a) : jetable, à jeter - disposable camera : appareil photo jetable * disposal (n) : 1/ disposition (f) - to have at one’s disposal : avoir à sa disposition ; 2/ rejet, élimination (f), évacuation (f) - chip disposal : (Usin.) évacuation des copeaux - waste disposal : élimination des déchets ; 3/ enlèvement, ramassage (des ordures) - garbage disposal enlèvement des ordures ; 4/ traitement (des déchets) - disposal facilities installations de traitement * dispose (v) (fa) : 1/ (tr.) se défaire de, jeter ; (intr.) to dispose of : se débarrasser de - [ship] to be disposed of : [bateau] être réformé ; 2/ faire un sort à (a dish, un plat, a bottle, une bouteille) * disproof (n) : réfutation (f) - burden of disproof : obligation de réfuter * disproven (a) : [théorie, etc.] réfuté(e) * dispute (n) (fa) : controverse (f), débat, conflit, désaccord, contentieux - to mediate a dispute : arbitrer un conflit * dispute (v) (tr.) : contester - He doesn’t dispute the facts : Il ne conteste pas les faits * disputed (a) : litigieux/-euse * disregard (v) (tr.) : ne pas tenir compte, ne pas respecter, ignorer - Disregard my previous instructions : Ne tenez pas compte de mes instructions précédentes * disrespect (n) : irrespect, manque de respect * disrespect (v) (tr.) : manquer de respect à * disrespectful (a) : irrespectueux/-euse * disrespectfully (adv.) : irrespectueusement, de manière irrespectueuse * disrupt (v) (tr.) : perturber (traffic, la circulation), déranger - to disrupt a class : perturber un cours - to disrupt public order : troubler l’ordre public * disruption (n) : perturbation (f) - supply chain disruption : perturbation(s) de la chaîne d’approvisionnement * disruptive (a) : 1/ [individu] perturbateur/-trice, turbulent(e), [comportement] dérangeant(e) - disruptive behaviour : comportement de perturbateur ; 2/ [facteur, élément] de perturbation - disruptive factor : élément de perturbation * disruptor (n) : perturbateur/-trice * dis / diss (v) (tr.) (tronc. de (to) disrespect : manquer de respect à) (arg.) : 1/ manquer de respect à (qn), mal parler à (qn), faire un affront à (qn) - You should not have dissed me : Tu aurais dû m’épargner cet affront ; 2/ rejeter les avances de - She dissed him : Elle a rejeté ses avances, Il s’est pris un râteau avec elle (fam.) ; 3/ critiquer (qn), débiner (qn) (fam.), démolir (qn), casser (qn) - Laptops are often dissed as being overweight, unattractive, and pricey : On débine souvent les ordinateurs portables en disant qu’ils sont lourds, laids et chers * dissatisfied (a) : insatisfait(e), mécontent(e) * dissect (v) (tr.) : 1/ disséquer ; 2/ (fig.) décortiquer, éplucher * dissector (n) : dissecteur/-trice (m/f) * dissed and dismissed (ppa coord.) (arg.) : dénigré(e) et rejeté(e) - to get dissed ans dismissed : se faire larguer (pas son petit ami / sa petite amie) * dissed and pissed (ppa coord.) (arg.) : humilié(e) et furieux/-euse * dissent (n) : désaccord, différence d’opinion * dissent (v) (intr.) : 1/ être en dissidence ; 2/ diverger (from, de) * dissenter (n) : dissident(e) (m/f) (syn. dissident) * dissenting (a) : dissident(e) * dissertation (n) (fa) : mémoire (masc.) - I've got a 50-page dissertation to write : J'ai un mémoire de 50 pages à rédiger * disserve (v) (tr.) : desservir, nuire à * disservice (n) : mauvais service - to do a disservice to… : desservir, nuire à…, faire du tort à… * dissident (a) : dissident(e) (syn. dissenter) * dissident (n) : contestataire, dissident * dissonant (a) : 1/ dissonant(e) ; 2/ (fig.) discordant(e) * dissonantly (adv.) : 1/ de façon dissonante ; 2/ de façon discordante * dissymmetric (a) : dissymétrique * dissymmetrical (a) : dissymétrique * distance (n) : 1/ distance (f) - flight distance (Aéro.) : distance de vol - stopping distance : distance d’arrêt - (a) distance shot (Cadrage ciné.) : (un) lointain ; 2/ (expressions) - to go the distance : aller jusqu’au bout (syn. amér. to go the route) * distance (v) (tr.) : distancer, laisser loin derrière - to distance oneself from sth/sb : a/ (au propre) se tenir à distance de qch/qn, se tenir à l’écart de qch/qn ; b/ (au fig.) prendre ses distances vis à vis de qch/qn, s’éloigner de qch/qn * distancing (n) : tenue à distance - physical distancing : (respect de) la distance physique - social distancing : (respect de) la distance sanitaire * distant (a) (fa p) : 1/ [individu] distant(e) ; 2/ éloigné(e) (dans l'espace et dans le temps) - to take place in a distant future : avoir lieu dans un futur éloigné * distaste (n) : dégoût, répugnance (f) (for, de) * distasteful (a) : 1/ de mauvais goût ; 2/ déplaisant(e), désagréable * distemper (n) : détrempe (f) - to paint in distemper : peindre à la détrempe * distemper (v) (tr. et intr.) : peindre à la détempre * distend (v) : (tr.) distendre ; (intr.) se distendre * distended (a) : distendu(e), gonflé(e) - distended belly : ventre distendu, ventre gonflé * distil (brit.) / distill (amér.) (v) (tr.) : distiller * distiller (n) : distillateur (l’appareil) - water distiller : distillateur d’eau * distillery (n) : distillerie (f) * distinct (a) : 1/ distinct(e), différent(e) (from, de) - as distinct from : par opposition à, contrairement à ; 2/ distinct(e), visible ; 3/ net(te), marqué(e) * distinctive (a) : caractéristique * distinctively (adv.) : de facon caractéristique, typiquement * distinctly (adv.) : 1/ de façon distincte ; 2/ nettement * distort (v) (tr.) : déformer, dénaturer - to distort facts : déformer les faits - to distort information : déformer l’information - to distort the truth : travestir la vérité * distorted (a) : déformé(e) * distracted (a) : 1/ distrait(e) ; 2/ préoccupé(e) * distraction (n) (fa) : 1/ détournement d'attention, manque d'attention, inattention (f) - distraction story : (Presse) nouvelle destinée à détourner l’attention ; 2/ ce qui détourne l'attention, sujet de distraction ; 3/ confusion (f), égarement, démence (f), folie (f) (syn. madness) - to distraction : à la folie - His attitude is driving me to distraction : Son attitude me rend fou * distress (n) : 1/ désarroi ; 2/ détresse (f) * distress (v) (tr.) : 1/ bouleverser, désoler, affliger ; 2/ donner un aspect vieilli à (un meuble) * distressing (a) : 1/ désolant(e), éprouvant(e), bouleversant(e) ; 2/ inquiétant(e) * distribute (v) (tr.) : 1/ distribuer (to, à) - to distribute press releases via newswire : diffuser des communiqués sur le fil de presse ; 2/ répartir * distribution (n) (fa) : 1/ distribution (f) - distribution manifold : collecteur de distribution ; 2/ diffusion (f) (de journaux, de revues) - distribution agency : agence de diffusion * distributor (n) (fa p) : 1/ distributeur - authorised distributor : distributeur agréé - wholesale distributor : distributeur en gros ; 2/ diffuseur (de presse) * distributorship (n) : 1/ place de distributeur ; 2/ place de diffuseur * district (n) : quartier (d’une ville) - business district : quartier d’affaires, quartier commercial * distrust (n) : méfiance (f) * distrust (v) (tr.) : se méfier de * distrusted (ppa) : dont on se méfie, qui suscite la méfiance * distrustful (a) : méfiant(e) * disturb (v) (tr.) : troubler - to disturb the peace : troubler l’ordre public * disturbance (n) : 1/ dérangement ; 2/ (pl. disturbances) troubles (pl.), émeutes (f pl.) ; 3/ bruit, vacarme, tapage * disturbing (a) : troublant(e), inquiétant(e), perturbant(e) * disturbingly (adv.) : de façon inquiétante * disuse (n) : désuétude (f), abandon - to fall into disuse : tomber en désuétude * disused (a) : désaffecté(e) * ditch (n) (pl. ditches) : fossé * ditch (v) (tr.) : se débarrasser de (syn. to dump) - to ditch the dollar for oil payments : laisser tomber le dollar pour les achats de pétrole * dither (n) : tremblement, frémissement, frisson * dither (v) (intr.) : 1/ trembler, frémir ; 2/ hésiter, tergiverser * dithery (a) : pris(e) de frisson, tout chose * ditty (n) : chansonnette (f), petite chanson (f) - to hum a ditty : fredonner une chansonnette * dive (n) : 1/ plongeon - to take a dive : plonger ; 2/ plongée (f) ; 3/ piqué (d’un avion) ; 4/ tripot * dive (v) (intr.) : 1/ plonger ; 2/ faire de la plongée * diver (n) : plongeur - skin diver : plongeur sous-marin, adepte de plongée sous-marine * diverse (a) : divers(e) * diversion (n) (fa p) : 1/ diversion (f) - to create a diversion : faire diversion ; 2/ déviation (routière) (f) ; 3/ détournement (de route) ; 4/ distraction (f), divertissement * diversity (n) : diversité (f) - linguistic diversity : diversité linguistique * divert (v) (tr.) (fa) : dévier, détourner * divest (v) (tr.) : 1/ - to divest sb of sth : débarrasser qn de qch, prendre qch à qn ; 2/ priver qn de qch * divide (v) (tr.) : diviser - to be divided into… : se diviser en…, se répartir en… * divided (ppa) : divisé(e) - A house divided against itself cannot stand : Maison divisée en son sein ne saurait se défendre * dividend (n) : dividende - It could pay dividends : Ça pourrait rapporter gros - fluctuating dividend : dividende variable * divider (n) (amér.) : (Voirie) terre-plein central * dividing (a) : - dividing line : ligne de partage, ligne de démarcation * divination (n) : divination (f), prédiction de l’avenir, pratiques divinatoires (f pl.) * divine (v) (tr.) (fa p) : 1/ rechercher (with a rod, avec une baguette de sourcier) ; 2/ prédire (l’avenir) - to devine that… : prédire que… ; 3/ deviner - to devine that… : deviner que… * diving (n) : plongée (f) - diving board : plongeoir - dumpster diving (amér.) : fouiller dans les bennes, faire les poubelles - skin diving : (la) plongée sous-marine * division (n) : 1/ division (f), partition (f) ; 2/ direction (f) - the aircraft division : la direction avions - the equipment division : la direction du matériel ; 3/ (Milit.) division * divorce (n) : divorce * divorce (v) : (tr.) divorcer de ; (intr.) divorcer * dizziness (n) : sensation de vertige * dizzy (a) : qui a le vertige * DJ (n) (init. de disc jockey) (pron. « deejay ») : (Mus.) disquaire (années 1960), programmateur audio, animateur musical, maestro des platines/manettes, monsieur platines, platineur (hum.), platinicien * DMM (n) (init. de digital multimeter : multimètre numérique) * DNC (n) (init. de direct numerical control : commande numérique directe (f)) * do (v) (did, done) : 1/ (tr.) faire - to do a favour : faire une faveur, rendre service - to do one’s duty : faire son devoir ; 2/ (intr.) réussir - to do well in school : réussir à l’école - He is doing well : Il se débrouille bien ; 3/ (intr.) faire l’affaire, suffire, aller bien - That place will do nicely : Cet endroit fera très bien l’affaire, Cet endroit ira très bien ; 4/ (tr.) (arg .) refaire, rouler - He did me out of ten shillings : Il m’a refait de dix shillings - They shan’t do me twice : Ils ne me rouleront pas une deuxième fois - Wasn’t he done! : Il a été bien attrapé !, Il s’est bien fait avoir ; 5/ (expressions) to do bodywork : travailler comme carrossier, travailler comme tôlier - to do business : faire des affaires - to do evil : faire le mal - to do good : faire du bien - to do it (amér.) : faire l’amour, baiser (vulg.) - to do wrong : faire du mal - to do the dishes faire la vaisselle * do (n) (fam.) : fête - There is a do on at the town hall tonight : Il y a une fête ce soir à la mairie * do away (v) (intr.) : - to do away with… : se débarrasser de… * doc (n) (tronc. de doctor) : - the doc (fam.) : le toubib * doc (n) (pl. docs) (tronc. de document) : document, doc (fam.) * docile (a) : docile * docilely (adv.) : docilement * dock (n) : 1/ bassin (portuaire) - dry dock : cale sèche (f), bassin de radoub ; 2/ banc des accusés * doctor (n) : 1/ détenteur d’un doctorat, docteur ; 2/ docteur (en médecine), médecin - to visit a doctor : aller chez le docteur - medical doctor : docteur en médecine, médecin ; 3/ - spin doctor (péj.) : docteur en manipulation, responsable de la propagande ; 4/ Doctor Jones : a/ (adresse directe) docteur Jones, b/ tierce personne) le docteur * doctor (v) (tr.) : arranger, trafiquer, tripatouiller (un texte, une image), caviarder (un article) - to doctor an article : caviarder un article - to doctor images : trafiquer des images * docudrama (n) (contr. de documentary drama) : fiction reposant sur des faits réels (syn. dramadoc) * document (n) : document - document shredder : broyeur de documents * document (v) (tr.) (fa) : 1/ décrire de façon détaillée, fournir de la documentation sur ; 2/ fournir des preuves à l'appui de, appuyer avec des documents, étayer avec des documents * documentarian (n) : documentariste * documentary (a) : documentaire - documentary drama : fiction reposant sur des faits réels (abr. docudrama) - documentary photographer : photographe documentaire * documentary (n) (pl. documentaries) : documentaire * documentation (n) : documentation (f) - aircraft-related documentation : documentation relative aux avions * documented (ppa) : sur lequel des données existent * docuseries (n) : série documentaire (g), docu-série (f) * dodge (v) (tr.) : 1/ esquiver, éviter (un adversaire, une obligation) - to dodge the draft : ne pas répondre à l’appel sous les drapeaux, se soustraire à la conscription ; 2/ éluder, éviter (une question) ; 3/ frauder * dodgems (n pl.) : autos tamponneuses (f pl.) * dodger (n) : 1/ tire-au-flanc (masc.) ; 2/ réfractaire (n), insoumis (n) - draft dodger : insoumis, objecteur de conscience - lockdown dodger : réfractaire au confinement ; 3/ fraudeur, resquilleur * dodgey (a) : dangereux/-euse, risqué(e) - The roads are dodgey : Les routes ne sont pas sures * doff (v) (tr.) : enlever, retirer - to doff one’s hat : se découvrir * dog (n) : chien - cadaver dog : chien renifleur (de cadavres) - herding dog : chien de berger - rescue dog : chien abandonné, chien de la SPA (Fr.) - sled dog : chien de traîneau - stray dog : chien errant - the dogs (brit.) : les courses de lévriers - to go to the dogs : aller aux courses de lévriers - dog cart : charrette anglaise (f) - dog racing : courses de lévriers - dog shelter : refuge pour chiens - dog shit : (de la) merde de chien - dog walker : promeneur de chiens * dog (v) (tr.) : s’attacher aux pas de, suivre à la piste, poursuivre ; 2/ harceler * dog-centric (ac) : centré(e) sur les chiens / sur le chien - dog-centric magazine : revue canine (f) * dogged (a) : obstiné(e) * doggie (a) : de chien, de toutou (aussi doggy) * doggie (n) (fam.) : petit chien, toutou (fam.) (aussi doggy) * doggiestyle (mod.) : (Sex.) en levrette - the doggiestyle position : la levrette * do-gooder (nc) : bonne âme (f) * dogma (n) : dogme * dogmatic (a) : dogmatique * dogpile (n) : empilement de personnes, joyeuse mêlée (f) - A dogpile formed : Une joyeuse mêlée se forma - to join in a dogpile : se joindre à une joyeuse mêlée (syn. pigpile) * dogpile (v) (intr.) : s'entasser les uns sur les autres dans une joyeuse mêlée - to dogpile on sb : s'affaler en masse sur qn * dog-sit (v) : (intr) : garder des chiens - Can you dog-sit for me? : Peux-tu me garder le chien ? * dog-sitter (nc) : garde-chien (masc.), garde-toutou (masc.) (fam.) * dog-sitting (nc) : (la) garde de chiens, (la) garde de toutous - dog-sitting service : service de garde de chiens * do-it-yourself (ac) : à faire soi-même, de bricolage, d’amateur- a do-it-yourself job : un bricolage, un travail d’amateur - do-it-yourself store : magasin de bricolage * do-it-yourself (nc) : (le) bricolage, (le) système D * do-it-yourselfer (nc) : adepte du bricolage, adepte du système D * doldrums (n pl.) : abattement, dépression (f) - to be in the doldrums : broyer du noir, avoir le cafard * dole (n) : (brit.) allocation de chômage (syn. unemployment benefit) - to be on the dole : être au chômage * doleful (a) : morne, triste * dole out (v) (tr.) : distribuer au compte-gouttes * dollar (n) : dollar - It earned him 1000 dollars : Cela lui rapporta 1000 dollars - tens of millions of dollars : des dizaines de millions de dollars * dollar-based (ac) : 1/ fondé(e) sur le dollar ; 2/ exprimé(e) en dollars, libellé(e) en dollars - dollar-based trade : commerce en dollars * dollop (n) : gros morceau (of food, de nourriture) * dolmen (n) : dolmen * dolt (n) (arg.) : idiot (n), abruti (n) * doltish (a) (arg.) : idiot(e), stupide, abruti(e) * domain (n) : domaine - (the) public domain : (le) domaine public - to be in the public domain due to copyright expiration : être dans le domaine public du fait de l’expiration de la protection du droit d’auteur * dome (n) : (Arch.) dôme - earth masonry dome : dôme en maçonnerie de terre * domestic (a) (fa p) : 1/ [animal] domestique ; 2/ familial(e) - domestic violence : violence familiale ; 3/ interne, national(e), du pays - domestic law : droit interne, droit national - domestic media : médias nationaux (pl.) - domestic users : utilisateurs nationaux ; 4/ [vol] intérieur (Aéro.) * domestically (adv.) : 1/ au niveau national ; 2/ dans le pays (anton. internationally) * domestically developed (ac) : conçu(e) dans le pays - domestically developed technology : technique conçue au niveau national * domestically manufactured (ac) : fabriqué(e) dans le pays, de fabrication nationale * domestically produced (ac) : produit(e) au pays, produit(e) localement - domestically-produced parts : pièces d’origine locale * domestically-made (ac) : fait(e) au pays, fait(e) localement - domestically-made plane : avion fait localement * domicile (n) : domicile, lieu de résidence - change of domicile : changement de domicile * domicile (v) (tr.) : domicilier * domiciliation (n) : domiciliation (f) - bank domiciliation : domiciliation bancaire * dominance (n) : prédominance (f) * dominant (a) : dominant(e) - dominant language : langue dominante - (the) dominant narrative (le) discours dominant * dominate (v) (tr.) : dominer * domineering (a) : autoritaire, qui aime dominer les autres * domino (n) (pl. dominoes) : domino - to play dominoes : jouer aux dominos - the domino effect : l’effet domino - to create a domino effect : créer un effet domino * don (n) (fa) : professeur d'université (à Oxford) - He's now an Oxford don : Il est professeur de l’Université d’Oxford maintenant * don (v) (tr.) (lit.) : revêtir * donate (v) (tr.) : donner (sth to sb, qch à qn), faire don de (sth to sb, qch à qn) * donation (n) : don - to make a donation : faire un don - organ donation : (le) don d’organes * done (p. passé de to do) : fait(e) - Done that? : C’est fait ? * done (a) : 1/ (qui est) fini(e) ; 2/ (qui a) fini - Are you done yet? : Tu as fini ? - Are you done with the translation? : Tu as fini de traduire ? ; 3/ qui se fait - That’s not done! : Ça ne se fait pas ! * donnybrook (n) (arg.) : bagarre * donor (n) : 1/ donneur/-euse (de sang, d’organes) - organ donor : donneur d’organes - parts donor : donneur de pièces - [aircraft] to be used as a parts donor : [avion] servir de donneur de pièces - spare parts donor : source de pièces de rechange - donor aicraft : avion à cannibaliser ; 2/ donateur, donatrice * do-nothing (n) : personne qui agit peu, personne portée à l’inaction * donut (n) (amér.) : voir doughnut (n) * doodle (v) (intr.) : gribouiller * doodlebug (n) (amér.) : 1/ fourmilion ; 2/ baguette de sourcier * doodling (n) : (l’action) gribouillage, (le résultat) gribouillis (pl.) - doodling during classes : dessiner des gribouillis pendant les cours * doofus (n) (amér.) : andouille, idiot * doom (n) : destin - to preach doom and gloom : jouer les Cassandre - doom monger : prophète de malheur, Cassandre (fém.) - doom mongering : catastrophisme - a portent of doom : un présage de malheur * doom (v) (tr.) : condamner - to be doomed to + inf. : être condamné(e) à + inf., être voué(e) à + inf. * doomish (a) : funeste, fatal(e) * doom-laden (ac) : - doom-laden estimate : estimation alarmiste - doom-laden strategy : stratégie condamnée à l’échec * doomsayer (n) : prophète de malheur, Cassandre (fém.) (syn. doom monger, doomster) - to defy the doomsayers : défier les pronostics des Cassandre * doomster (n) : prophète de malheur (syn. doomsayer, doom monger) * doona (n) (austr.) : 1/ couette (f) ; 2/ édredon * door (n) : porte (f) - to slam the door : faire claquer la porte, claquer la porte - glass door : porte vitrée, porte-fenêtre - screen door : porte moustiquaire - trap door : trappe (f) - door furniture (sing.) : ferrures de porte (f pl.) - door handle : poignée de porte - door jamb : jambage de porte ; 2/ portière (f) (de voiture) - door compartment : vide-poche (masc.) (dans une portière) * door keeper / doorkeeper (n) : 1/ portier (d’hôtel) ; 2/ concierge * doormat (n) : 1/ paillasson ; (fig.) carpette (f), chiffe molle (f) * doorphone (n) : parlophone, portier de rue - audio doorphone : portier audio - video doorphone : portier vidéo * dope (n) : 1/ marijuana (f), drogue (f), dope (f) (fam.) - dope fiend : drogué (n) ; 2/ (Sport) (n ind. sing.) produits dopants (pl.) ; 3/ gros bêta, andouille (f), nouille (f) - That’s not how you do it, you dope! : C’est pas comme ça qu’on procède, gros bêta ! * doppelganger (n) : double, sosie (f) * dork (n) (arg. amér.) : 1/ bite (f), queue (f) (vulg.) ; 2/ pauvre type, blaireau (péj.) * dorky (a) (arg. amér.) : 1/ ridicule, grotesque ; 2/ ringard(e) - dorky round sunglasses : lunettes de soleil rondes ringardes * dorm (n) (tronc. de dormitory : dortoir) : dorto (fam.) * dormant (a) : endormi(e), au repos, en veilleuse - to remain dormant : rester en sommeil * dormer (n) : lucarne (f) - dormer window : lucarne * dormitory (n) (pl. dormitories) : 1/ (brit.) dortoir ; 2/ (amér.) résidence secondaire (f) * dose oneself (up) (v) : se bourrer de médicaments * doss (n) : dans l’expression It’s a doss! : Fastoche ! * doss down (v) (intr.) : se pieuter (fam.) * dossier (n) : dossier - to publish a dossier : publier un dossier * dot (n) : point - on the dot of 5.30 : à 5 h 30 précises * dotage (n) : sénilité (f), gâtisme * dotard (n) : gâteux/-euse (n) * dote (v) (intr.) : être gaga (on, de), raffoler (on, de) * doth (v. aux.) (arch.) = does * doting (a) : affectueux/-euse, excessivement tendre, qui a une affection excessive et ridicule * dotterel (n) : pluvier-guignard (aussi dottrel) * double (a) : 1/ double - double agent (Intel.) : agent double - double consonant : consonne double ; 2/ deux fois - double the number of / the value of / the amount of / the length of : le double du nombre de / de la valeur de / du montant de / de la longueur de * double (n) : (Cin.) doublure (f) - body double : doublure physique (dans les scènes chaudes) - butt double : doublure des fesses - stunt double : doublure (pour les) cascades * double (v) : (tr.) doubler ; (intr.) doubler * double-acting (ac) : à double effet * double back (v) (intr.) : faire demi-tour, rebrousser chemin * double-blind (ac) : en double aveugle, à double insu (Q) - double-blind study : étude en double aveugle * double check / double-check (v) (tr.) : vérifier deux fois * double-click (vc) : (Inf.) (tr.) cliquer deux fois sur - to double-click a file : cliquer deux fois sur un fichier ; (intr.) cliquer deux fois (on, sur) * double-cross (v) (tr.) : tromper (qn), trahir (qn) * double-crosser (n) : traître, traîtresse * double-decker (nc) : autobus à étage * double down (v) (tr.) (amér.) : 1/ doubler la mise ; 2/ (fig.) surenchérir, persister et signer * double Dutch (n) : 1/ charabia, paroles incompréhensibles (f pl.) ; 2/ (fig.) (du) chinois, (de l’)hébreu - That’s all double Dutch to me! : Tout ça, c’est du chinois pour moi ! * double-edged (ac) : à double tranchant - double-edged sword : épée à double tranchant * double-faced (ac) : [mur] à deux parements * double-flush (v) : (tr.) - to double-flush the toilet : tirer deux fois la chasse d’eau ; (intr.) - to double-flush : tirer la chasse d’eau deux fois de suite * double-jabbed (ac) (brit.) (fam.) : doublement vacciné(e), vacciné(e) deux fois (syn. double-vaxxed) * double-quick (a) : - in double-quick time : en quatrième vitesse (fam.), dare-dare (fam.) * double-quick (adv.) (fam.) : 1/ au pas de gymnastique ; 2/ en quatrième vitesse (fam.), dare-dare (fam.) * double-slope (ac) : à deux pentes, à deux versants - double-slope roof : toit à deux pentes, toit à deux versants * doublespeak (n) : double langage, double discours * doublet (n) : pourpoint * doubloon (n) : doublon (monnaie espagnole) * doubt (n) : doute - to have doubts : avoir des doutes (about, sur) * doubt (v) (tr.) : douter de * doubter (n) : sceptique (n) - climate change doubter : personne ayant des doutes quant aux changements climatiques, sceptique en matière de changement climatique * doubtful (a) : douteux/-euse - It is doubtful whether… : Il est peu probable que… * douchebag (amér.) : 1/ poire vaginale (f) ; 2/ (vulg.) gros con, connard, trou-du-cul, trouduc * dough (n) : 1/ pâte à beignet ; 2/ (fig.) (arg.) galette (f), fric * doughnut (n) : 1/ beignet ; 2/ anneau (var. ortho. amér. donut) * do up (v) (tr.) : redécorer, refaire, retaper (fam.) - to do up a rom : retaper une pièce * dour (a) : austère * douse (v) (tr.) (fam.) : 1/ éteindre (la lumière, la bougie, la camoufle) - to douse the glim : souffler la camoufle (fig), rendre le dernier soupir ; 2/ fermer - Douse that! : Ferme ça ! ; 3/ tremper, arroser ; 4/ ôter, enlever (ses souliers) * dovecot (n) : colombier - dovecot associated with beehives : colombier-rucher * dovetail (n) : (Menuiserie, Charpenterie) queue d’aronde - dovetail joint : assemblage en queue d’aronde * dovetail (v) : (intr.) s’assembler, s’imbriquer (with, avec), s’unir solidement (with, à) ; (tr.) assembler, imbriquer, unir solidement * Dow-Jones industrial average (the) (abr. : the DJ) : (l')indice industriel Dow-Jones (moyenne des prix d'une sélection d'actions américaines) * down (prép.) : 1/ en aval de - down river : en aval du fleuve ; 2/ au fil de - down the ages : au fil des siècles * down (postp. adj.) : [machine, ordinateur, etc.] en panne, arrêté(e), [ligne électrique] abattu(e) - The up escalator is down! (hum.) : L’escalier mécanique montant ne monte plus ! - [electric lines] to be down : [lignes électriques] être abattues - [machine] to be down : [machine] être en panne, être arrêtée - down state : (état d’)indisponibilité - to be in the down state : être indisponible * down (n) (pl. downs) : bas - my ups and downs : mes hauts et mes bas * down (v) (tr.) : 1/ avaler (une bière) ; 2/ descendre (un avion) ; 3/ mettre à terre * downblouse (a) : - downblouse photography : (la) photographie de décolletés * downcast (a) : découragé(e) * downed (ppa) : tombé(e) au sol, abattu(e) * downfall (n) : chute (f) * downgrade (v) (tr.) : dévaluer, déprécier, dévaloriser * downhearted (a) : abattu(e), découragé(e) * downing (n) : (le) fait d’abattre (un avion) * download (v) (tr.) : (Inf.) transférer (d’un système central à un périphérique, depuis un serveur), télédécharger, télécharger en aval, rapatrier (sur sa machine) * downloading (n) : (Inf.) transfert (d’un système central à un périphérique), télédéchargement * downpayment (n) : versement initial * downright (a) : véritable, fieffé(e) - a downright rogue : un fieffé coquin * downright (adv.) : carrément, franchement, complètement, purement et simplement * downsize (v) (tr.) : réduire la taille de * downsized (ppa) : de taille réduite * downstairs (adv.) : au rez-de-chaussée, en bas (anton. upstairs : à l’étage, en haut) - to go downstairs : descendre au rez-de-chaussée * downstream (a) : situé(e) en aval (anton. upstream) * downstream (adv.) : en aval (anton. upstream) * downstream from / of (loc. prép.) : en aval de - downstream from station 40 : en aval du poste de montage 40 (anton. upstream of) * down to (loc. prép.) : jusqu'à (+ limite inférieure) (anton up to jusqu'à + limite supérieure) * downtown (a) (amér.) : de centre-ville (syn. brit. central) - His office is in downtown Boston : Son bureau est dans le centre de Boston - downtown department store : grand magasin du centre-ville * downtown (adv.) : en plein centre-ville - They set up their business downtown : Ils ont monté leur affaire dans le centre-ville * downturn (n) : (Écon.) ralentissement * downvote (v) : (tr.) retrancher un point à, enlever un point à ; (intr.) retrancher un point, enlever un point, donner un avis négatif (anton. to upvote) - downvote button : bouton contre * dowry (n) : dot (f) * dowse (v) (tr.) : [sourcier] chercher de l’eau * dowsing (n) : radiesthésie (f) - dowsing rod : baguette de sourcier * doxing / doxxing (n) (de docs, abr. pl. de doc, tronc. de document) : recherche et mise en ligne d’infos sur la vie privée d’une personne * doze (n) : petit somme, petite sieste (f) * doze (v) (intr.) : sommeiller, faire la sieste * doze off (v) (intr.) : s’assoupir * Dr (brit.) / Dr. (amér.) (abr. de Doctor) : Dr. * drab (a) : terne, monotone * drabness (n) : caractère terne, caractère monotone, caractère monotone * draft (brit.) / draught (amér.) (n) : 1/ courant d’air - to go in out of the draught : rentrer se mettre à l’abri des courants d’air - draught excluder : bourrelet (de porte, de fenêtre) ; 2/ tirant (d’eau) - [ship] to have a draft of 5 metres : [navire] avoir un tirant d’eau de cinq mètres ; 3/ brouillon (de lettre), ébauche, esquisse, avant-projet - to type a first draft : taper un premier jet - initial draft : première ébauche, première version, première esquisse, texte initial, premier projet, avant-projet ; 4/ (amér.) conscription (militaire) (f), appel sous les drapeaux - to dodge the draft : ne pas répondre à l’appel sous les drapeaux, se soustraire à la conscription - draft dodger : insoumis (n), objecteur de conscience * draft (brit.) / draught (amér.) (v) (tr.) : faire au brouillon - dans l’expression to draft and redraft work : rédiger et remanier son travail, mettre et remettre son ouvrage sur le métier * drafty (brit.) / draughty (amér.) (a) : plein(e) de courants d’air, venté(e) * drag (n) : 1/ habits féminins (pl.) - to be disguised in drag : être déguisé en femme ; 2/ (fam.) chose pénible, corvée - What a drag it is getting old! : Quelle barbe de vieillir ! * drag (v) (tr.) : traîner - to drag one’s feet : traîner des pieds, faire traîner les choses (over/on sth, à propos de qch) * drag and drop (v coord.) : (Inf.) faire glisser et déposer, faire glisser et lâcher, déplacer et déposer, tirer-lâcher (into, dans…, from, depuis) * drag-and-drop (ac) : (Inf.) - drag-and-drop clipart items : éléments iconographiques déposables - drag-and-drop icons : icônes à déplacer et déposer * dig and delve (v coord.) : (au fig.) (tr.) creuser et fouiller (sth, qch) ; (intr.) creuser et fouiller (into sth, dans qch) * draggable (a) : déplaçable - draggable menu : menu déplaçable * dragnet (n) : filet à la traîne * drag on (v) (intr.) : se prolonger, s’éterniser * dragon (n) : dragon - dragon slayer : tueur de dragons * dragonfly (n) : libellule (f) * dragoon (n) : (Milit.) dragon * dragoon (v) (tr.) : 1/ embrigader ; 2/ forcer (qn), contraindre (qn) - to dragoon sb into doing sth : forcer / contraindre qn à faire qch * dragooning (n) : embrigadement * drain (n) : 1/ canalisation (f), tuyau d’évacuation, (Agri.) drain - rubble trench drain : drain rempli de pierraille - to throw money down the drain : jeter l’argent par les fenêtres - drain unclogging : débouchage de drains ; 2/ fuite (f), perte (f) - a brain drain of experts : une fuite de cerveaux * drain (v) : 1/ (tr.) drainer, assécher ; (intr.) s’évacuer, se vidanger ; 2/ purger * drainage (n) : 1/ drainage (l’activité) - drainage basin : (Hydro.) bassin versant ; 2/ tout-à-l’égout * draining (n) : 1/ égouttement - draining board : égouttoir ; 2/ évacuation (f) * drain off (v) (tr.) : laisser s’égoutter * drama (n) : 1/ drame, (Télé) dramatique (n) (f) - documentary drama : fiction reposant sur des faits réels ; 2/ (Éduc.) (le) théâtre - drama lessons : cours d’art dramatique, cours de théâtre * dramatic (a) (fa) : spectaculaire (syn. spectacular) - dramatic increase : augmentation spectaculaire (f) * dramatically (adv.) (fa) : de façon spectaculaire * dramatist (n) : auteur dramatique * drank (prét. de to drink) * drape (n) : 1/ (amér.) rideau - to close one’s drapes : fermer ses rideaux ; 2/ drap - surgical drape : drap chirurgical * drape (v) (tr.) : draper - to drape oneself in the toga of pacifism : se draper de la toge du pacifisme * draperies (n pl.) : tentures (f pl.) * drastic (a) : draconien/-ienne, radical(e) * drastically (adv.) : de façon draconienne, de façon radicale, radicalement * draught (n) : voir draft (n) * draught-proof (vc) (tr.) : isoler contre les courants d'air * draughts (n pl.) (brit.) : (le) jeu de dames - to play draughts : jouer aux dames - game of draughts : (une) partie de dames - draughts piece : pion * draughty (a) : voir drafty (a) * draw (n) : 1/ prise (de sang) - blood draw : prise de sang ; 2/ tirage (au sort) ; 3/ match nul ; 4/ (Cin.) film qui déplace les foules - to be a big draw : avoir beaucoup de succès - a box office draw : un succès dans les salles obscures (syn. a box office hit) * draw (v) (drew, drawn) : 1/ (tr.) tirer - to draw the curtains : tirer les rideaux - to draw conclusions : tirer des conclusions ; (intr.) avancer - to draw closer : s’approcher ; 2/ (tr.) étirer - to draw wire : étirer du fil ; 3/ (tr.) attirer ; 4/ (tr. et intr.) dessiner * drawback (n) : inconvénient, désavantage (syn. disadvantage) - to suffer some drawbacks : présenter certains inconvénients * drawee (n) : (Banq.) tiré (n) * drawer (n) : tiroir - chest of drawers : commode (n) - drawer runner : glissière de tiroir (syn. drawer slide) * drawing (n) : dessin - dimensional drawing : dessin côté (syn. - measured drawing) - exploded drawing : dessin éclaté - drawing pin (brit.) : punaise (f) * drawn (pp de to draw) * drawn (ppa) : [visage] tiré(e), crispé(e) * draw out (v) (drew, drawn) (tr.) : étirer * drawstring (n) : cordon, cordonnet - drawstring bag : sac à cordon coulissant, sac à cordonnet * draw up (v) (tr.) : rédiger - to draw up a deed : rédiger un acte * dread (n) : crainte (f), peur (f), effroi (syn. fear) * dread (v) (tr.) : redouter * dreadful (a) : horrible, terrible, affreux/-euse * dreadfully (adv.) : affreusement * dreadnought (n) : (Marine) cuirassé * dream (n) : rêve - Have golden dreams! : Fais de beaux rêves !, Faites de beaux rêves ! - wet dream : a/ éjaculation nocturne (f) - I’ve had a wet dream : j’ai eu une pollution nocturne ; b/ fantasme - my dream girl : la fille de mes rêves * dream (v) (dreamt, dreamt, aussi rég.) : rêver * dreaming (n) : (le) fait de rêver, (le) rêve - lucid dreaming : (le) rêve éveillé * dreamt (prét. de to dream) * dreamt (pp de to dream) * dreamworld (n) : monde onirique, monde imaginaire, monde fictif * dreariness (n) : tristesse (f) * dreary (a) : monotone, triste, morne, lugubre * dredge (n) : drague (f) * dredge (v) (tr.) : draguer * dredger (n) : 1/ (le bateau) dragueur ; 2/ ouvrier dragueur * dregs (n pl.) : lie (f) (de vin) - wine dregs : lie de vin * dress (n) : 1/ robe (f) ; 2/ tenue (f) - fancy dress : déguisement - fancy dress party (brit.) : bal costumé, soirée costumée (f), soirée déguisée * dress (v) (fa) : (tr.) habiller ; (intr.) s'habiller * dresser (n) : 1/ vaisselier ; 2/ habilleuse (fém.) ; 3/ personne qui s’habille (de telle ou telle manière) - cross dresser : travesti (m) * dressing (n) : 1/ assaisonnement ; 2/ pansement, bandage ; 3/ habillage (l’action) - dressing gown (brit.) : a/ robe de chambre, b/ peignoir (de bain) - dressing room : a/ vestiaire ; b/ loge (f) (de théâtre) - dressing table (brit.) : coiffeuse (f) ; 4/ décoration (f) - window dressing : a/ décoration de vitrines ; b/ (de la) poudre aux yeux, (une) façade - This is nothing but window dressing : Ce n’est là que de la poudre aux yeux, Ce n’est là qu’une façade * dressmaker (n) : couturière (f) * dress up (v) : 1/ (tr.) bien habiller - all dressed up : sur son trente-et-un - to dress oneself up : se saper ; (intr.) bien s’habiller, se mettre sur son trente-et-un ; 2/ (tr.) déguiser ; (intr.) se déguiser * dressed up (pp) : - to be all dressed up : être sur son 31 (syn. brit. fam. to be all poshed up) * drew (prét. de to draw) * dribble (v) (intr.) : tomber goutte à goutte * dried (ppa) : séché(e) - dried prune : pruneau séché (syn. dried plum) * drier (n) (brit.) / dryer (amér .) : - hair drier : sèche-cheveu (masc.) * drift (v) (intr.) : 1/ dériver ; 2/ (fig.) to drift into sth : se laisser entraîner dans qch, plonger dans qch ; 3/ [snow, neige] s’amonceler * drifter (n) : vagabond(e) (n) * driftnet (n) : filet dérivant, traîne (f) (var. drif net) * drill (n) : 1/ perceuse (f) - bench drill : perceuse d'établi - pillar drill : perceuse à colonne, perceuse sur colonne - drill chuck : porte-foret (masc.) - hammer drill : perceuse à percussion ; 2/ foret, roulette de dentiste ; 3/ exercice(s) (syn. exercise) - fire drill : exercice d’alerte à l’incendie - drill sergeant : sergent instructeur * drill (v) (tr.) : 1/ percer ; 2/ forer * driller (n) : 1/ (la machine) perceuse (f) ; 2/ (la personne) foreur - offshore driller : foreur en mer, foreur sur plate-forme * drilling (n) : 1/ perçage ; 2/ travaux (pl.) de forage - drilling rig : plateforme de forage * drink (n) : boisson (f) - to refresh oneself with drinks : se rafraîchir - fancy drink : boisson chic, boisson branchée - fizzy drink : boisson gazeuse - soft drink : boisson non alcoolisée - spirits drink : boisson spiritueuse - drinks tray : plateau à boissons (d’un garçon de café) * drink (v) (drank, drunk) (tr.) : boire * drinking (n) : - binge drinking : beuverie (f), beuveries (pl.) * drinking up (n) : (le fait de) vider son verre, (le fait) de finir sa boisson - drinking-up time (brit.) : (dans un pub) (l’) heure de finir son verre - to exceed drinking-up time : dépasser l’heure du dernier verre * drink up (v) (intr.) : vider son verre, finir sa boisson * drip (n) : 1/ goutte à goutte - drip pan : lèche-frite (masc.) (syn. drip tray) ; 2/ perfusion (f) - to be on a drip : être sous perfusion * drip (v) : (intr.) a/ goutter, tomber goutte à goutte ; b/ s’égoutter * drip-dry (v) : (tr.) égoutter, laisser s’égoutter ; (intr.) s’égoutter * drip-dry (a) : ne nécessitant aucun repassage * drip-drying (n) : séchage par égouttage * dripping (n) : 1/ égouttement, goutte à goutte - dripping pan : lèche-frite ; 2/ drippings (pl.) : gouttes (f pl.), gouttelettes (f pl.) * drive (n) : 1/ tour (en voiture) ; 2/ allée (f) ; 3/ campagne vigoureuse (f), collecte (f) - to run a fundraising drive : organiser une campagne de collecte de fonds - blood drive : collecte de sang - unionising drive : campagne de syndicalisation ; 4/ force, dynamisme ; 5/ entraînement - sprocket drive : entraînement par roues dentées - four-wheel drive : (les) quatre roues motrices ; 6/ (Inf.) lecteur (de disque) - hard drive (abr. de hard-disk drive, drive signifiant moteur) : lecteur de disque dur * drive (v) (drove, driven) : 1/ (tr. et intr.) conduire, piloter - Drive safe! : Conduis / Conduisez prudemment, Sois / Soyez prudent (au volant) - Drive with caution! : Sois / Soyez prudent en conduisant ; 2/ (tr.) pousser, contraindre - to drive sb frantic : mettre qn hors de lui - His attitude is driving me to distraction : Son attitude me rend fou ; 3/ (tr.) enfoncer (into, dans) - to drive a wedge : enfoncer un coin ; 4/ (tr.) actionner, entraîner * drive back (v) (tr.) : repousser - to drive back an assault : repousser un assaut * drive by (v) (intr.) : passer (en voiture) * drive-by (a) : [coup de feu] tiré d’une voiture en marche - drive-by shooting : coups de feu tirés d’une voiture en marche * drive-in (ac) (amér.) : [restaurant, cinéma] où l’on pénètre en voiture - drive-in theater (amér.) : cinéma en plein air, ciné-parc (Can.) - drive-in restaurant (amér.) : resto avec service au volant * drivel (n) : bêtises (f pl.), idioties (f pl.), balivernes (f pl.) * drivel (v) (intr.) : radoter * driven (pp de to drive) : 1/ - Half of teens’ activities are driven by technology : La moitié des activités des ados sont impulsées par la technique ; 2/ (en compo., à droite) ayant pour moteur * driver (n) : 1/ conducteur/-trice, pilote (m/f) - a driver’s license (amér.) : un permis de conduire - engine driver : conducteur de train - hit-and-run driver : chauffard coupable de délit de fuite - train driver : conducteur de train - young driver : jeune conducteur (moins de 25 ans) ; 2/ (Inf.) pilote * driverless (a) : sans conducteur, sans pilote, automatique - driverless train : train automatique * driving (a) : 1/ moteur/-trice - driving force : force motrice ; 2/ qui tombe avec force, battant(e) - driving rain : pluie battante * driving (n) : conduite (d’un véhicule) - driving licence (brit.) : permis de conduire * droll (a) (fa) : drôle (dit de façon ironique, quand on n'apprécie pas) - Oh, very droll! : Ah, que c'est drôle! * drone (n) : 1/ ronronnement (syn. purr) - the drone of an engine : le ronronnement d'un moteur ; 2/ bourdon (l'insecte) ; 3/ drone - stealth drone : drone furtif - drone pilot : pilote de drone (syn. drone operator) * drone (on) (v) (intr.) : parler d’une voix monotone * drool (n) : bave (f) * drool (v) (intr.) : baver - to drool over sb/sth : s’extasier devant qn/qch * droop (v) (intr.) : s’affaisser * drop (n) : 1/ chute (f) - drop curtain : (Théât.) rideau d’entracte ; 2/ diminution (f), baisse (f) ; 3/ goutte (f) - a drop in a bucket (amér.) : une goutte d’eau dans l’océan - nose drops : gouttes pour le nez - tear drop : larme (f) ; 4/ cachette (f), magasin secret, lieu sûr (pour marchandises volées, alcools clandestins ou prohibés) ; 5/ client d’un taxi ; 6/ bébé trouvé ; 7/ coup violent qui met ko ; 8/ livraison (f) - the drop is supposed to take place before three o’clock ; 9/ largage - drop zone : zone de largage ; 10/ saut en parachute - to have a drop : faire un saut * drop (v) (intr.) : 1/ (tr.) faire chuter, faire tomber, laisser choir ; (intr.) tomber, chuter - to drop to the floor : tomber par terre ; 2/ (intr.) descendre, tomber - The curtain drops : Le rideau tombe ; 3/ (fig.) laisser tomber - to drop the subject : parler d’autre chose ; 4/ (tr.) déposer (qn) (au travail, chez lui) - to drop a passenger : déposer un voyageur (var. to drop a passenger off) ; 5/ (tr.) larguer, parachuter (depuis un avion) ; 6/ (tr.) vendre, liquider * drop in (v) (intr.) : faire une visite rapide, entrer en passant * droplet (n) : gouttelette (f), fine goutte (f) * drop off (v) : 1/ (intr.) baisser - to drop off to sleep : s’endormir d’un coup ; 2/ (tr.) déposer (qn) (chez lui, au travail, etc.) * drop-out (n) (pl. drop-outs) : élève qui abandonne ses études, décrocheur scolaire * drop out (v) (intr.) : abandonner, laisser tomber (ses études) * dropper (n) : 1/ compe-goutte (masc.) ; 2/ personne qui fait étalage de ses connaissances, de ses fréquentations, de ses amis - name dropper : adepte du lâcher de noms * dropping (n) : étalage - brand-name dropping : étalage de noms de marques - name dropping : étalage de noms, lâcher de noms, bourrage de noms - title dropping : étalage de titres * droppings (n pl.) : fiente (f) * drop round (v) (intr.) : passer (chez qn), faire un saut (chez qn) - Drop round to my place : Faites un saut chez moi (amér. drop around) * drop ship (v double) (tr.) : - [product] to be drop shipped : [produit] être envoyé directement par le grossiste * drop shipment (n) : livraison directe au client (par le grossiste), expédition directe au client (sans passer par le vendeur) * drop shipper (n) : grossiste (expédiant directement le produit commandé par un client à la place du vendeur) * dross (n) : 1/ crasse (f), laitier ; 2/ rebut * drought (n) : sécheresse (f) - drought preparedness : préparation au risque de sécheresse * drought-parched (ac) : ravagé par la sécheresse * drove (n) : 1/ horde (f), troupeau ; 2/ foule (f), multitude (f) - in droves : par milliers ; 3/ boucharde (f) * drove (prét. de to drive) * drove (v) (tr.) : 1/ conduire (du bétail), conduire (des troupeaux) ; 2/ boucharder * droving (n) : conduite de troupeaux - sheep droving : conduite de moutons * drown (v) (intr.) : se noyer * drowsy (a) : somnolent(e) * drudge (n) : 1/ bête de somme ; 2/ (la) bonne, (l')esclave * drudge (v) (intr.) : besogner, trimer * drudgery (n) : corvées (f pl.) * drug (n) : 1/ - medical drug : produit pharmaceutique - drug maker : laboratoire pharmaceutique, labo pharmaceutique (syn. drug manufacturer) - drug repurposing : repositionnemnet de médicaments (syn. drug repositioning) ; 2/ drogue, stupéfiant - narcotic drug : drogue - drug addiction : toxicomanie (f) - the drug scene : l’univers de la drogue, le monde des drogués - drug sting : opération anti-drogue - drug supplier : fournisseur de drogue - drug trafficking : trafic de drogues ; 3/ sérum - truth drug : sérum de vérité * drug (v) (tr.) : droguer * druggist (n) : pharmacien(ne) * drum (n) : 1/ cylindre, tambour, rouleau, bobine (f) ; 2/ fût, baril - oil drum : fût à pétrole ; 3/ (Mus.) tambour - drums (pl.) : a/ tambours (pl.) ; b/ batterie (f) - on drums : à la batterie - drum roll : roulement de tambour (var. drumroll) * drummer (n) : batteur * drumming (n) : prestation à la batterie, jeu à la batterie - bucket drumming : percussion de seaux * drumroll (n) : voir drum roll - en incise : (drumroll please) : (roulement de tambour, s’il vous plaît) * drunk (pp de to drink) * drunk (a) : saoul(e) / soûl(e), ivre * drunk (n) : 1/ ivrogne, ivrognesse (fém.) ; 2/ (arg. amér.) période d’ivresse * drunkard (n) : ivrogne * drunken (a) : 1/ saoul(e) / soûl(e), ivre ; 2/ d’ivrogne * drunkenness (n) : 1/ ivresse (f), ébriété (f) ; 2/ ivrognerie (f), alcoolisme * dry (a) : sec/-èche * dry (v) : (tr.) sécher - to dry the dishes : sécher la vaisselle * dryer (n) (amér.) : appareil à sécher - clothes dryer : sèche-linge, sécheuse (f) (Q) (le cintre) - hair dryer : sèche-cheveu - hand dryer : sèche-main - spin dryer : essoreuse (f) * dry-laid (ac) : posé(e) à sec - dry-laid bricks : briques posées à sec (pl.) * dry up (v) : (tr.) tarir - to dry up the market : tarir le marché ; (intr.) se tarir * DT (n) (G.-B.) (init. de design and technology : conception et fabrication (de produits industriels) (var. D&T) * DTP (n) (init. de desktop publishing : micro-édition, édition assistée par ordinateur) * dual (a) : double - dual citizenship : double nationalité (f) * dual-engine (ac) : 1/ à deux moteurs, bimoteur ; 2/ à deux réacteurs - dual-engine airliner : avion de ligne à deux réacteurs * dub (v) (tr.) : 1/ adouber ; 2/ surnommer, appeler, baptiser (au fig.) ; 3/ doubler (un film) * dubbed (a) : 1/ adoubé(e) ; 2/ [film] doublé(e) * dubbing (n) : 1/ adoubement ; 2/ doublage (de films) * dubious (a) : 1/ douteux/-euse ; 2/ dubitatif/-ive - to be dubious about sth : avoir des doutes sur qch * duchess (n) : duchesse (f) * duck (n) : canard - duck breast : magret de canard - to be as tight as a duck’s arse : être on ne peut plus radin - duck fat : gras de canard * duck (v) (tr.) : 1/ (intr.) baisser la tête - to duck under… : plonger sous… ; 2/ (tr.) se dérober à, esquiver, éluder, éviter - to duck a question : éluder une question (syn. to dodge a question) * duck dive (v) (intr.) : plonger pour esquiver * duckling (n) : caneton * duct (n) : 1/ (Corps humain) canal, conduit ; 2/ (Constr.) conduit - duct tape : ruban adhésif en toile, chatterton - a piece of duct tape : un bout de ruban adhésif * dud (a) (amér.) : 1/ [dispositif] qui ne fonctionne pas, détraqué(e) ; 2/ (Cin.) qui est un navet - a dud movie : un navet * dud (n) (amér.) : 1/ [ personne] zéro, nullard ; 2/ qch qui ne fonctionne pas, qch qui est détraqué ; 3/ raté ; 4/ (Cin.) navet - [film] to turn out to be a dud : [film] s’avérer un navet ; 5/ duds, pl. : voir infra * dude (n) (amér.) : mec * dude (up) (amér.) (tr.) : fringuer * dudgeon (n) : irritation (f), ressentiment, rancune (f), indignation (f) - in high dudgeon : vexé(e) et furieux/-euse, fort en colère * duds (n pl.) (arg.) : fringues (f pl.), frusques (f pl.), nippes (f pl.), hardes (f pl.) (syn. brit. togs) * due (a) : 1/ requis(e), voulu(e) - with due account for… : en tenant compte de… ; 2/ - to be due to + inf. : devoir (sens de prévision) * due (n) : - dues (pl.) : droits, taxes (f pl.), redevances (f pl.) - harbour dues : droits de port * due to (loc. prép.) (amér.) : en raison de, du fait de, à la suite de, de par * duffel (n) : tissu de laine - duffel bag : sac de marin * duffer (n) : 1/ cancre (syn. dunce) ; 2/ tocard, nul / nulle (n) - He is a duffer with his hands : Il ne sait rien faire de ses dix doigts * duke (n) : duc * dull (a) : terne * duly (adv.) : 1/ dûment, comme il se doit, comme convenu - Duly noted! : C’est noté !, J’ai pris bonne note ! ; 2/ à l’heure, comme prévu * dumb (a) : 1/ muet / muette - dumb waiter : monte-plat (aussi dumbwaiter) ; 2/ bête, idiot(e), stupide - dumb blonde : jolie idiote (f) - our dumb friends : nos frères inférieurs, nos amies les bêtes (f pl.) * dumbbell (n) : haltère (aussi dumb bell) * dumbbell-like (ac) : en forme d'haltère * dumb down (v) (tr.) : (tr.) abaisser le niveau (intellectuel) de, niveler par le bas ; (intr.) [élève doué] éviter de briller * dumbfound (v) (tr.) : sidérer, ahurir * dumbification (n) : nivellement par le bas * dumbing down (n) : nivellement par le bas * dumbstruck (a) : muet de stupeur * dumbwaiter (n) : monte-plat (masc.) (aussi dumb waiter) * dummy (n) (pl. dummies) : mannequin, bonhomme en mousse * dump (n) : 1/ dépotoir, décharge (f) - the city dump : la décharge municipale - rubbish dump : décharge à ordures ; 2/ dépôt, entrepôt - ammo dump : dépôt de munitions - weapons dump : dépôt d’armes ; 3/ (en parlant d’une petite ville, d’un village) trou perdu, trou ; 4/ (expressions) - to be down in the dumps : avoir le moral au plus bas, avoir ses humeurs noires, être déprimé, avoir le cafard, broyer du noir * dump (v) (tr.) : 1/ décharger, déverser, rejeter - to dump untreated waste into the sea rejeter des déchets non retraités à la mer ; 2/ vider - to dump the garbage can (amér.) : vider la poubelle ; 2/ se débarrasser de * dumper (n) : tombereau * dumping (n) : 1/ (l’activité) dépôt (d’ordures, etc.) - the dumping of untreated hazardous chemicals : le dépôt de produits chimiques non traités - No dumping : Dépôt d’ordures interdit, Décharge interdite - dumping ground : (le lieu) dépôt d’ordures ; 2/ déversement (de liquides) - oil dumping : dégazage ; 3/ vidange (f) ; 4/ (Inf.) vidage (de la mémoire), vidage mémoire ; 5/ (Commerce) vente à bas prix (sur le marché extérieur), vente à perte, vente à prix bradés, braderie (f) ; 6/ social dumping : transfert d’industries dans des pays aux salaires inférieurs * dumpling (n) : ravioli - meat dumpling : ravioli à la viande * dumpster (n) (amér.) : benne (f) (à ordures) - dumpster diving : fouiller dans les bennes, faire les poubelles * dun (a) : foncé(e) * dunce (n) : cancre (syn. duffer) - the Dunce and the Beauty : la belle et la bête * dune (n) : dune (f) * dung (n) : 1/ excrément, crotte (f) - cow dung : bouse de vache ; 2/ fumier - a pile of dung : un tas de fumier * dungaree (n) : 1/ cotonnade grossière (f) (de l’Inde) ; 2/ - dungarees (pl.) : treillis, combinaison (f) (de mécanicien) * dunno (fam.) (contr. de don’t / doesn’t know) * dungeon (n) (fa) : basse-fosse (f), cachot, oubliettes (f pl.) * duopoly (n) : duopole * duplicate (n) : 1/ copie (f), photocopie (f) ; 2/ double, duplicata * durability (n) : 1/ longévité (f), durée (f) ; 2/ résistance (f), solidité (f) * durable (a) : 1/ à longue durée de vie, durable ; 2/ inaltérable, inusable, résistant(e) * durables (n pl.) : biens durables - consumer durables : biens de consommation durables * duration (n) : durée (f) - All lessons are of one hour’s duration : Toutes les leçons ont une durée d’une heure * duress (n) : contrainte (f) - under duress : sous la contrainte * during (prép.) : durant, lors de, au cours de, à l'occasion de - during cranking : lors du démarrage à la manivelle (d’un moteur) - during program execution : au cours de l'exécution des programmes - during school hours : durant les heures de cours * duroplastic (a) : thermodurcissable * duroplastics ( n pl.) : matières thermodurcissables (f pl.) * dusk (n) : crépuscule * dusky (a) : foncé(e) * dust (n) : poussière (f) - to bite the dust (fig.) : mordre la poussière (fig.) - speck of dust : grain de poussière - dust devil : tourbillon de poussière - dust mask : masque anti-poussière, masque à poussière * dust (v) (tr.) 1/ épousseter, passer un chiffon sur ; 2/ saupoudrer (with, avec) * dustbin (n) : poubelle (f) (syn. amér. garbage can) * dustpan (n) : ramasse-poussière (masc.) - duspan and brush : ramasse-poussière et balayette * duster (n) : chiffon à poussière * dustup (n) (brit.) : accrochage - local dustup : querelle de clocher * dusty (a) : poussiéreux/-euse * Dutch (a) : néerlandais(e), hollandais(e) - Let’s go Dutch : Chacun paye sa part - the Dutch (a. subst. pl.) : les Néerlandais, les Hollandais * Dutch (n) : néerlandais (la langue) - double Dutch : a/ (du) charabia ; b/ (du) chinois, (de l’)hébreu * duty (n) (pl. duties) : 1/ devoir (moral) - to do one’s duty : faire son devoir ; 2/ taxe (f) - death duties : droits de succession * duty-free (ac) : hors taxes, détaxé(e) - duty-free items : articles détaxés - duty-free shop : boutique hors taxes * dwarf (n) : nain, naine * dwarf (v) (tr.) : faire paraître tout petit * dweller (n) : habitant(e) (n) - city dweller : citadin(e) - slum dweller : habitant d’un taudis * dwelling (n) : demeure (f) - slum dwelling : taudis * dwindle (v) (intr.) : se réduire, diminuer, décroître * dwindling (a) : en baisse, décroissant(e) * dye (n) : teinture (f) * dye (v) (prét. et pp dyed) (tr.) : teindre * dyed-in-the-wool (ac) : bon teint, invétéré(e), pur et dur / pure et dure - dyed-in-the wool communist : communiste pur et dur - dyed-in-the-wool ideologue : idéologue bon teint * dyeing (p prés. et gér. de to dye) * dyke (n) (brit.) (aussi dike) : 1/ fossé ; 2/ digue (f) ; 3/ (Écosse) mur (champêtre) - single dyke : mur à une seule épaisseur ; 4/ gouine (f) (péj.), lesbienne (f) * dyke (brit.) / dike (amér.) (v) (tr.) : endiguer (a river, un fleuve) * dynamic (a) : dynamique * dynamically (adv.) : dynamiquement, de façon dynamique, avec dynamisme * dynast (n) : membre d’une dynastie, héritier d’une dynastie, souverain * dynastic (a) : dynastique (f) * dynastically (adv.) : 1/ de façon dynastique ; 2/ sur le plan dynastique * dynasty (n) : dynastie * dysfunction (n) : dysfonctionnement, troubles (pl.) - erectile dysfunction : dysfonctionnement érectile, troubles de l’érection * dysfunctional (a) : 1/ dysfonctionnel(le) ; 2/ [famille] à problèmes ; 3/ [comportement] anormal(e) * dystopia (n) : dystopie (f) - an Orwellian dystopia : une dystopie orwellienne * dystopian (a) : dystopien(ne) f6htjbvmaqb32q773rxoitttrc00m0g Vocabulaire anglais-français à l'intention des apprenants avancés/E 0 78010 767920 759147 2026-06-17T07:18:31Z Elnon 41284 Compléments 767920 wikitext text/x-wiki {{../Index}} === E === * each (a) : chaque * each (n) : chacun(e) * each and every (paire adj.): chaque... sans exception - each and every transaction is recorded : on enregistre chaque transaction sans exception - each and every created being : chacune des créatures sans exception - each and every one : chacun sans exception, absolument tout le monde - within each and every one of us : chez chacun d’entre nous sans exception * each time (that) (loc. conj. de temps) : chaque fois que, toutes les fois que * eager (a) : 1/ impatient(e), empressé(e), ardemment désireux/-euse - to be eager to + inf. : être impatient de + inf. ; 2/ avide - to be eager after pleasure : avoir soif de plaisirs * eagerly (adv.) : ardemment, avec empressement * ear (n) : oreille (f) - ear muffs (pl.) : cache-oreille (masc.),- ear ringing : tinnitus - ear wax : cire d’oreille, cérumen * earache (n) : maux (pl.) d’oreille * earl (n) : comte * early (a) : 1/ du début - in early August : au début du mois d’août, début août - in the early 1970s au début des années 1970 ; 2/ matinal(e) ; 3/ précoce - early wear : usure précoce (f) ; 4/ premier - early childhood : petite enfance (f) ; 5/ en avance * early (adv.) : tôt (anton. late) * early-onset (ac) : à l’apparition précoce, d’apparition précoce - early-onset dementia : démence précoce (f), début précoce de démence * earn (v) (tr.) : 1/ gagner (de l’argent, un salaire) ; 2/ rapporter de l’argent - It earned him 1000 dollars : Cela lui rapporta 1000 dollars ; 3/ obtenir (un diplôme) - to earn a degree : décrocher (fam.) une licence * earner (n) : 1/ salarié(e) (n) - wage earner : salarié(e) (n) ; b/ soutien de famille ; 2/ source de revenu * earnest (a) : sérieux/-euse, sincère * earnest (n) : sérieux (n) - in earnest : sérieusement, pour de bon * earnestness (n) : gravité (f), sérieux (n) * earpiece (n) : écouteur * earshot (n) : - in / within earshot (loc. adv.) : assez près pour entendre / être entendu, à portée de voix - out of earshot (loc. adv.) : trop loin pour entendre / être entendu, hors de portée de voix * Earth (n pr.) : 1/ (the) Earth : (la) Terre (la planète) - [satellite] to orbit the Earth : tourner autour de la Terre - the Earth's crust : la croûte terrestre - the Earth’s curvature : le rayon de courbure de la Terre - the Earth's ecosystem : l'écosystème de la Terre - the Earth's gravity : l'attraction terrestre - Earth inhabitants : (les) habitants de la Terre ; 2/ (expressions) - That brought me down to earth : Cela me ramena sur terre / à la réalité - Where on earth did you…? : Mais où diable as-tu / avez-vous… ? * earth (n) : 1/ terre (f) (la matière) - rare earths : terres rares - earth masonry : maçonnerie de terre (f) - earth mover : engin de terrassement (aussi earthmover) ; 2/ (Élect.) (brit.) (la) terre * earth (v) (brit.) (tr.) : (Élect.) mettre à la terre, relier à la terre * earthenware (n ind. sing.) : faïence (f) - low-fired earthenware : faïence à petit feu (f) * earthflow (n) : coulée de terre (f) * earth-friendly (ac) : écologique, respectueux/-euse de l'environnement, écorespectueux/-euse (syn. environmentally friendly) - earth-friendly living : mode de vie écologique - earth-friendly products : produits respectueux de l'environnement * earthing (n) (brit.) : (Élect.) mise à la terre (f) * earthling (n) : Terrien(ne) * Earthman (n pr.) : Terrien(ne) (l’habitant(e)) * earthquake (n) : tremblement de terre, séisme - earthquake resistance : tenue aux séismes (f) * earthquake-prone (ac) : sujet(te) aux tremblements de terre, régulièrement touché(e) par des séismes - earthquake-prone island volcano : île volcanique à forte sismicité * earthquake-resistant (ac) : résistant aux séismes * Earthwoman (n pr.) : Terrienne (l’habitante) * earthworm (n) : ver de terre, lombric (nom scientifique) * ease (n) : aise (f), facilité (f) - ease of use : commodité, facilité d’utilisation - ease of operation : confort d’utilisation * ease (v) (tr.) : 1/ calmer, soulager ; 2/ relâcher ; 3/ alléger * easier (a) (compar. de supériorité de easy) : plus facile * easier (adv.) : plus facilement, plus aisément * easiest (a) (superl. de supériorité) : le plus facile * easily (adv.) : facilement, aisément * easily accessible (ac) : facilement accessible, facile d'accès - easily accessible information : informations d'accès facile * easily handled (ac) : facile à traiter - easily handled sub-problems : sous-problèmes faciles à régler * easily remembered (ac) : facile à retenir - easily remembered mnemonics : astuces mnémotechniques faciles à retenir * easily replaceable (ac) : facile à remplacer * easing (n) : 1/ soulagement ; 2/ relâchement - quantitative easing : (Fin.) assouplissement quantitatif, diarrhée monétaire (péj.), (la) planche à billets * east (a) : est, d’est * east (adv.) : à l’est, vers l’est * East (n pr.) : 1/ (l’)Orient - the far East : l’extrême Orient - the Middle East : le Moyen Orient - the near East : le proche Orient ; 2/ (l’)Est * eastbound (a) : vers l’est * eastbound (adv.) : vers l’est * eastern (a) : oriental, de l’Est - Eastern Europe : (l’)Europe de l’Est * easy (a) : facile, aisé(e) - easy credit : (le) crédit facile, (les) facilités de crédit - easy terms : facilités de paiement * easy-going / easygoing (a) : sans soucis, facile à vivre (syn. carefree) - an easy-going life : une vie facile - an easy-going week : une semaine sans soucis * easy-to-service (ac) : facile à entretenir, facile à réparer - an easy-to-service unit : un appareil facile à réparer * eat (v) (ate, eaten) (tr.) : manger * eat away (v) (ate, eaten) (tr.) : ronger * eaten (pp de to eat) * eater (n) : 1/ mangeur - to be a messy eater : manger salement - useless eater : bouche à nourrir inutile (f), bouche à nourrir de trop (syn. worthless eater) ; 2/ - fire eater : a/ cracheur de feu ; b/ bagarreur * eat out (v) (ate, eaten) (tr.) : - to eat one’s heart out : se ronger les sangs, se morfondre * eats (n pl.) : bouffe (f) (vulg.), boustifaille (f) (vulg.) - Are there eats? : Il y a quelque chose à bouffer ? * eat up (v) (ate, eaten) (tr.) : dévorer, avaler * eaves (n pl.) : avant-toit * eavesdrop (v) (intr.) : écouter (de façon indiscrète) (on sb, qn) - to eavesdrop into communications : écouter les communications * ebb (n) : reflux - at low ebb (fig.) : en plein déclin, au plus bas * ebb (v) (intr.) : 1/ refluer ; 2/ (fig.) diminuer, décliner * ebullient (a) : exubérant(e) * E.C. (n pr.) (init. de (the) European Community) : (la) Communauté européenne * eccentric (a) : extravagant(e), original(e) * eccentricity (n) : excentricité (f) * ecclesiastical (a) : clérical(e) * eclipse (v) (tr.) : 1/ (Astr.) éclipser ; 2/ (fig.) faire de l’ombre à, éclipser * eco- (préf.) (tronc. de ecology) : éco- * eco-activist (n) : militant écolo, militante écolo, écolo (n) (m/f) * eco-friendly (ac) : (selon le cas) écologique, vert(e), biodégradable - eco-friendly bag : sac biodégradable - eco-friendly supermarket : supermarché vert - eco-friendly vehicle : véhicule écologique * ecological (a) : écologique - ecological niche : niche écologique (f) * ecologically (adv.) : sur le plan écologique * ecologically friendly (ac) : écologique - ecologically friendly solution : solution écologique (f) - ecologically friendly agriculture : agriculture biologique (f) * ecologist (n) : 1/ écologiste (le militant, la militante) (m/f) ; 2/ écologue (le chercheur, la chercheuse) (m/f) * ecology (n) : écologie (f) * e-commerce-enabled (ac) : [site web] configuré(e) pour le commerce électronique * eco-museum (n) : écomusée (masc.) * economic (a) : économique - economic collapse : effondrement économique - economic development : (le) développement économique - economic debacle : débâcle économique (f) - economic forecaster : prévisionniste économique (m/f), conjoncturiste (m/f) - economic forecasting : (la) prévision économique - economic growth : croissance économique (f) - economic performance : résultats économiques (pl.) - economic planner : spécialiste de la planification économique - economic theorist : économiste (m/f) - economic war : guerre économique (f) * economically (adv.) : du point de vue économique * economics (n sing.) : (la) science économique, (l’)économie (la matière enseignée) - a master’s degree in economics : un diplôme de maîtrise en économie ; un master en économie * economist (n) : économiste (m/f) * economy (n) (pl. economies) : économie (f) - (the) gig economy : (l’)économie du travail à la demande, (les) emplois précaires (pl.) - market economy : économie de marché - planned economy : économie planifiée * ecosystem (n) : écosystème - the Earth's ecosystem : l'écosystème de la Terre, l'écosystème terrestre (syn. the terrestrial ecosystem) * ecosystemic (a) : écosystémique - ecosystemic approach : démarche écosystémique * eco-unfriendly (ac) : nocif/-ive pour l’environnement - eco-unfriendly behaviour : comportement nocif pour l’environnement * ecstasy (n) : extase (f) * Ecuador (n pr.) : (l’)Équateur * Ecuadorean / Ecuadorian (a) : équatorien(ne) (sans maj.) * Ecuadorean / Ecuadorian (n pr.) : Équatorien (le ressortissant) * ecumenical (a) : œcuménique * Ed. / Eds. (tronc. de Edited by + nom / noms : sous la direction de) : Dir. * ed (n) (tronc. fam. de education) (amér.) : - higher ed : (l’)enseignement supérieur, (les) études supérieures (f pl.) * ed. (tronc. de edition : édition) : éd. - 2nd ed. : 2e éd. * Ed. D. (n) (abr. de Doctor of Education : diplômé en sciences de l'éducation) * eddy (n) (pl. eddies) : remous * edge (n) : 1/ bord, rebord, bordure (f) - the top edge : le bord supérieur ; 2/ lisière (f) ; 3/ arête (f), fil - blunt edge : arête émoussée - cutting edge : arête de coupe - sharp edge : arête vive, fil tranchant ; 4/ avantage - to have a slight edge : être légèrement supérieur (over, à) - to have the edge over one’s opponents : avoir l’avantage sur ses adversaires, l’emporter de justesse sur ses adversaires - to lose the technological edge : perdre sa supériorité technologique - to maintain an edge : maintenir son avance - competitive edge : avantage concurrentiel * edge out (v) (tr.) : évincer, détrôner * edgeways (adv.) : latéralement, de côté - I can’t get a word in edgeways : Je n’arrive pas à placer un mot * edgewise (adv.) cf. edgeways * edible (a) : comestible * edibles (n pl.) : denrées comestibles (f pl.) * edict (n) : édit - papal edict : édit du pape, édit papal * edifice (n) : édifice * edificeering (n) : (la) grimpe urbaine * edit (n) (tronc. de editorial, éditorial, article de tête) édito (abr.) - (the) edit page (la) page de l'édito (var. editpage) * edit (v) (fa) : 1/ (tr.) concevoir (la forme, le contenu d’une rubrique, etc.), préparer (un texte), mettre en forme (un texte) ; (intr.) faire de la mise en forme ; 2/ (tr.) monter (une page, une rubrique, etc.), réaliser la mise en page de (une page, une rubrique, etc.) ; 3/ (tr.) revoir, retoucher, modifier, corriger, réviser (un papier) ; 4/ (tr.) diriger, être rédacteur en chef de (un périodique) - edited by… : publié sous la direction de… * editable (a) : modifiable * editing (n) (fa) : 1/ mise en forme (f) ; 2/ montage, mise en page (f) - video editing : montage vidéo ; 3/ correction(s) (f), modification(s) (f), retouche(s) (f) - crowdsourced editing : modifications collectives (f pl.) - image editing : retouche d’images - paid editing : rédaction rémunérée (f) ; 4/ (anglicisme) - the editing window (Inf.) : la fenêtre d’édition * edition (n) : édition (f) (au sens d'ensemble des exemplaires imprimés en un fois) - the early/late edition of The Times : la première/dernière édition de The Times - evening edition : édition du soir - morning edition : édition du matin * editor (n) (fa) : 1/ (Presse) rédacteur, rédacteur en chef, chef de rubrique - Editor's Note:... Note de la rédaction :... - art editor : directeur artistique - fashion editor : chef de la rubrique mode - home affairs editor : rédacteur chargé de la politique intérieure - senior editor rédacteur en chef - society editor : rédacteur du carnet mondain (aussi social editor) - sport(s) editor : chef de la rubrique sport(s) ; 2/ correcteur ; 3/ (Inf.) programme modificateur, programme correcteur * editorial (a) (fa) : de rédaction, rédactionnel(le) - editorial director : directeur de la rédaction - editorial honor roll (amér.) : (Presse) liste des anciens rédacteurs en chef - editorial policy : politique rédactionnelle - (the) editorial staff : (l')équipe rédactionnelle, (la) rédaction - editorial standards : normes rédactionnelles - editorial writer : éditorialiste (m/f) (syn. editorialist - leader writer) - very opinionated editorial : éditorial des plus virulents * editorialist (n) : éditorialiste (m/f) (syn. editorial writer - leader writer) * editorially (adv.) : 1/ au niveau de la Rédaction - subheadings inserted editorially : sous-titres de la Rédaction ; 2/ au niveau éditorial, sur le plan éditorial * editorially independent (ac) : [presse] indépendant(e) au niveau éditorial * editorship (n) : 1/ poste de rédacteur en chef ; 2/ direction (f) (d’ouvrage collectif) * EDM (n) (init. de electrical discharge machining : usinage par étincelage) : étincelage * educable (a) : éducable (anton. uneducable) * educate (v) (tr.) : éduquer * education (n) : 1/ éducation (f) - national education : (Fr) (l')éducation nationale (anciennement public instruction : (l')instruction publique, f.) - the Secretary (of State) for Education and Science (G.-B.) : le ministre de l'Éducation - the Ministry of Education : le ministère de l’Éducation ; 2/ enseignement - the different levels of education : les différents stades de l'enseignement - higher education : (l')enseignement supérieur, (les) études supérieures - primary education : (l')enseignement primaire - secondary education : (l')enseignement secondaire - sixth-form education : (l')enseignement en première et terminale ; 3/ sciences (f pl.) de l'éducation, pédagogie - Doctor of Education (abr. Ed. D.) : diplômé ès sciences de l'éducation - the local education authority or LEA (G.-B.) : la direction régionale de l'enseignement = (Fr) le rectorat * educational (a) : éducatif/-ive - educational background : antécédents scolaires (pl.) - the educational process : le processus éducatif (jarg.) - educational program(me) : émission éducative (f) - educational psychologist : psychologue scolaire - the educational system : le système éducatif (var. the education system) - educational technologist : technicien pédagogique, technopédagogue * educationalist (n) : pédagogue (m/f) (syn. educationist) * educationist (n) : pédagogue (m/f) (syn. educationalist) * educator (n) : éducateur, éducatrice * educe (v) (tr.) : dégager, susciter (syn. to elicit) * EEC (n) (init. de European Economic Community) : CEE (communauté économique européenne) (f) * eek (onomatopée) : quelle horreur ! * eel (n) : anguille (f) - electric eel : anguille électrique * eerie (a) : sinistre, étrange * eerily (adv.) : de façon sinistre * eeriness (n) : étrangeté (f) * efface (v) (tr.) : effacer (des souvenirs) - to efface the memories of a war : effacer les souvenirs d’une guerre * effect (n) : 1/ effet, répercussion (f) - adverse effect : effet indésirable, effet négatif - the bandwagon effect : l’effet de mode, l’effet d’entraînement, l’effet boule de neige ; 2/ au pl. effects, effets - audio effects : effets sonores - special effects : (Cin.) effets spéciaux * effect (v) (tr.) : 1/ effectuer (des transformations, des réparations) - to effect changes : effectuer des changements - to effect transactions : effectuer des transactions ; 2/ parvenir à - to effect a settlement : parvenir à un règlement * effective (a) (fa p) : 1/ effectif/-ive - effective date : date d’effet ; 2/ agissant(e), opérant(e), actif/-ive, qui a / produit de l’effet, efficace - not to be effective : être sans effet * effectively (adv.) (fa p) : 1/ efficacement ; 2/ dans la réalité, dans les faits * effectively organised (brit.) / organized (amér.) (ac) : bien organisé(e) - effectively organised data : données bien organisées * effectiveness (n) : efficacité (f) * effector (n) : (Robot.) - end effector : effecteur (composant qui saisit ou manipule des objets) * effectsman (n) : (Cin.) responsable des effets spéciaus, technicien d’effets spéciaux, truqueur * effectual (a) : (niveau de langue soutenu) efficace * effectually (adv.) : (niveau de langue soutenu) efficacement * effeminate (a) : efféminé(e) * efficacious (a) (littéraire ou soutenu) : [remède, traitement médical] efficace, agissant(e), probant(e) - efficacious drug : médicament efficace, médicament agissant - efficacious trials : essais probants - highly efficacious nasal spray : pulvérisateur nasal très agissant * efficacy (n) (littéraire ou soutenu) : efficacité (d’un remède, d’un traitement médical) * efficiency (n) : 1/ efficacité (f); 2/ rendement - energy efficiency : rendement énergétique - a building’s energy efficiency : le bilan énergétique d’un bâtiment - fuel efficiency : rendement du combustible * efficient (a) : efficace * efficiently (adv.) : efficacement, avec efficacité * efficiently run (ac) : dirigé(e) avec efficacité - efficiently run company : société dirigée de façon efficace * effing (a) (prononciation de f…ing mis pour fucking) : Effing hell, you’re a real pain! : Putain, t’es un vrai casse-couilles (vulg.) * effort (n) : effort - in an effort to + inf. : pour essayer de + inf. - last-ditch effort : ultime effort - the war effort : l’effort de guerre * effrontery (n) : effronterie (f) * EFL (n) (abr. de English as a foreign language : (l’)anglais langue étrangère) - an EFL student : un étudiant en anglais langue étrangère * EFT (n) (abr. de English for techies : (l’)anglais pour les techniciens) : anglais technique, anglais technologique * e.g. / eg (init. du latin exempli gratia) : par ex. (par exemple) (lu « for example » en G.-B. mais souvent « e g » aux É.-U.) * egg (n) : œuf - fried egg : œuf frit - hard-boiled egg : œuf dur - egg shell : coquille d’œuf * egg (v) (tr.) : 1/ tremper dans un œuf battu ; 2/ jeter des œufs sur (qn / qch) - to be egged : recevoir des œufs (sur soi) * egg-shaped (ac) : en forme d’œuf * eggy (a) : d’œuf - eggy smell : odeur d’œuf * egomaniac (n) : égotiste (n) (m/f), égocentrique (n) (m/f) * egregious (a) : 1/ scandaleux/-euse, choquant(e) ; 2/ flagrant(e) - an egregious mistake : une erreur flagrante * egress (n) (pl. egresses) : issue (f) * Egypt (n pr.) : (l’)Égypte * Egyptian (a) : égyptien(ne) (sans maj.) * Egyptian (n pr.) : Égyptien (le ressortissant) * eiderdown (n) : 1/ édredon ; 2/ couette (f) * eight (adj. num.) : huit * eightfold (a) : octuplé(e), multiplié(e) par huit - to rise eightfold : augmenter de huit fois, être multiplié par huit * eighties (n pl.) : 1/ nombres 80 à 89 ; 2/ températures 80 à 89 (f pl.) ; 3/ latitudes 80 à 89 (f pl.) ; 4/ années 80 à 89 (f pl.) * either (a) : l’un ou l’autre, l’une ou l’autre (a) - You can choose either way : Vous pouvez choisir l’une ou l’autre option * either (pron.) : l’un ou l’autre, l’une ou l’autre (pron.) - Either of the two channels can be used : On peut utliser l’une ou l’autre voie * either (adv.) : (en fin de phrase négative) non plus - I don’t like cats either : Je n’aime pas les chats non plus * either (conj.) : - either… or… : soit… soit…, ou bien… ou bien… * ejector (n) : éjecteur - ejector seat : siège éjectable * e-journal (n) (abr. de electronic journal) : revue électronique * eke out (v) (tr.) : gagner difficilement / tant bien que mal (a living, sa vie) * elaborate (a) : 1/ élaboré(e), recherché(e) - elaborate politeness : politesse exagérée (f) ; 2/ complexe, compliqué(e) ; 3/ perfectionné(e) * elaborate (v) (fa) : (tr.) décrire en détail ; (intr.) donner des détails, entre dans les détails - to elaborate on sth : développer, commenter, préciser (un point, une question) - Could you elaborate on this? : Pourriez-vous préciser ?, Pourriez-vous en dire plus ? – Please elaborate : Veuillez préciser * elastic (a) : élastique * elated (a) : transporté(e) de joie, euphorique * elation (n) : joie (f), exaltation (f), euphorie (f) * elbow (n) : coude - elbow grease : huile de coude - People give you a lot of elbow room : On vous laisse les coudées franches * elderly (a) : âgé(e), du 3e âge - elderly lady : dame d’âge respectable - elderly parent : père ou mère âgés * elderly (a. subst. pl.) : vieillards, personnes âgées, personnes du 3e âge - the elderly (a. subst. pl.) : les vieux - elderly home : foyer pour personnes âgées, maison de retraite * eldership (n) : qualité d’ancien * e-learning (n) (tronc. de electronic learning) : apprentissage électronique, formation en ligne * electable (a) : éligible - to be electable : avoir de grandes chances d’être élu(e) * election (n) : élection (f) - election by acclaim : élection par ovation - landslide election : ras de marée électoral, élection triomphale * electioneer (v) (intr.) : faire campagne * electioneering (n) : électoralisme * electorate (n) : électorat * electric(al) (a) : électrique - electrical apparatus : appareillage électrique - electric blanket : couverture électrique, couverture chauffante (f) - electric blender : mélangeur électrique - electric cable : câble électrique - electric cooker : cuisinière électrique (f) - electrical engineering : génie électrique - electrical water heater : chauffe-eau électrique (masc.) - electric fan : ventilateur électrique - electric razor : rasoir électrique * electrically (adv.) : électriquement * electrically driven (ac) : à entraînement électrique, entraîné(e) électriquement, à commande électrique - electrically driven screwdriver : tourne-vis électrique * electrically noisy (ac) : pollué(e) électriquement - electrically noisy environment : milieu pollué électriquement * electrically operated (ac) : marchant à l’électricité - electrically operated device : appareil électrique * electricity (n) : électricité (f) - electricity generation : production d’électricité - electricity importer : importateur d’électricité - electricity wholesaler : opérateur de réseau d’électricité * electricity-gobbling (ac) : gourmand(e) en énergie - electricity-gobbling appliance : appareil qui consomme beaucoup de courant * electrics (n pl.) : (Auto.) circuits électriques (pl.) * electro-chemical (a) : électrochimique * electrocute (v) (tr.) : électrocuter * electrocuted (ppa) : électrocuté(e) - to get electrocuted : se faire électrocuter * electrocution (n) : électrocution (f) * electrolysis (n) : électrolyse (f) - electrolysis cell : cellule d’électrolyse * electromagnetic (a) : électromagnétique - electromagnetic hypersensitivity : hypersensibilité électromagnétique (f), électrohypersensibilité * electron (n) : électron * electronic (a) : électronique - electronic mail : courrier électronique - electronic medium : support électronique - electronic tech : électronicien - electronic telephone directory : annuaire téléphonique électronique * electronically (adv.) : (Électron.) électroniquement * electronically controlled (ac) : (Électron.) commandé(e) électroniquement, à commande électronique * electronically erasable (ac) : (Électron.) effaçable électroniquement * electronically operated (ac) : (Électron.) à commande électronique - electronically operated grips : attaches à commande électronique * electronics (n) : 1/ (sing.) (l’)électronique (f) (le domaine) - consumer electronics : (l’)électronique grand public - home electronics : (l’)électronique familiale, (l’)électronique domestique - household electronics : (l’)électronique ménagère - electronics expert : expert en électronique ; 2/ (pl.) systèmes électroniques - consumer electronics : (outre le sens 1, aussi) appareils électroniques grand public - custom electronics : systèmes électroniques adaptés aux besoins du client, systèmes électroniques sur mesure - home electronics : appareils électroniques domestiques - household electronics : appareils électroniques ménagers - electronics manufacturing : fabrication de composants électroniques * electron-tube-based (ac) : muni(e) de tubes à vide * electrostatic (a) : électrostatique - electrostatic loudspeaker : haut-parleur électrostatique * electrotechnical (a) : électrotechnique - electrotechnical engineer : technicien en électrotechnique, électrotechnicien * elegant (a) : élégant(e) - an elegant swordplay : une escrime élégante * elephant (n) : éléphant - white elephant : (en parlant d’un bâtiment ou d’un ouvrage d’art) gouffre financier, projet coûteux, objet encombrant - elephant seal : éléphant de mer * elevated (ppa) : soutenu(e) - elevated language : langage soutenu * elevator (n) : 1/ ascenseur - goods elevator (amér.) : monte-charge (syn. freight elevator) - elevator operator (amér.) : conducteur d’ascenseur, [homme] garçon d’ascenseur - elevator pitch : présentation éclair, topo éclair, boniment (péj.) - elevator shaft : cage d’ascenseur ; 2/ (Agric.) élévateur * Eleven plus (exam) (brit.) : examen de passage / d'entrée en 6ème * elicit (v) (tr.) : 1/ faire naître (un sentiment) ; 2/ obtenir (from, de) * elide (v) (tr.) : élider * eligible (a) : 1/ qualifié(e), admissible, éligible - eligible voter : personne en âge de voter, électeur, électrice ; 2/ célibataire, libre - an eligible young man : un bon parti * eliminate (v) (tr.) : éliminer - to eliminate wastage : éliminer le gaspillage * elimination (n) : élimination (f) * elision (n) : élision (f) * elite (a) : d’élite * elite (n) : (le) gotha - the continent’s elite : le gotha continental * elitism (n) : élitisme * elitist (a) : élitiste * ell (n) : aune (f) (1 m 20) * ellipse (n) : ellipse (f) (la forme) * ellipsis (n) (pl. ellipses) : 1/ ellipse (f) (l’omission) ; 2/ (an ellipsis) points de suspension (pl.), trois petits points (pl.) (syn. three dots) * elliptic / elliptical (a) : 1/ (forme) elliptique - elliptical galaxy : galaxie elliptique ; 2/ (Gram.) elliptique * elm (n) : orme * elope (v) (intr.) : s’enfuir * elopement (n) : fugue amoureuse (f) (en vue d’un mariage) * else (a) : d’autre - Have you got anything else? : Vous n’avez rien d’autre ? - What else? : Quoi d’autre ? * else (adv.) : autrement, sinon * elsewhere (adv.) : ailleurs (syn. somewhere else) - to source from elsewhere : s’approvisionner ailleurs * ELT (n) (abrév. de English language teaching : (l’)enseignement de l’anglais) * elude (v) (tr.) : esquiver - to elude a blow : esquiver un coup * elusive (a) : 1/ insaississable ; 2/ difficile à trouver, hors d'atteinte * elusiveness (n) : 1/ nature insaisissable ; 2/ absence (f) * email (n) (abr. de electronic mail : courrier électronique) : courriel - by email : par courriel - email software : (du) logiciel de messagerie, logiciels (pl.) de courrier électronique * email (v) (tr.) : envoyer par courriel * email back (v) : (tr.) to email sth back to sb : retourner qch à qn par courriel ; (intr.) to email back to sb : répondre à qn par courriel * email-friendly (ac) : convenant au courriel * emasculate (v) (tr.) : émasculer, castrer * emasculator (n) : castrateur/-trice (n) * embalmer (n) : embaumeur/-euse, thanatopracteur/-trice * embankment (n) : 1/ berge (f) ; 2/ talus * embargo (n) : embargo - arms embargo : embargo sur les armes * embarrass (v) (tr.) : mettre dans l’embarras, faire honte à - to embarrass onseself : se mettre dans l’embarras * embarrassment (n) : embarras, gêne (f), trouble - to be an embarrassment to sb : mettre qn dans l’embarras, faire honte à qn * embassador (n) (arch.) : ambassadeur (voir ambassador) * embassy (n) (pl. embassies) : embassade (f) * embattle (v) (tr.) : 1/ ranger en bataille ; 2/ garnir de créneaux * embed (v) (tr.) : 1/ enchâsser, encastrer ; 2/ embarquer * embedded (ppa) : 1/ enchâssé(e) ; 2/ intégré(e), embarqué(e) - [journalist] to spend a year embedded with the Hell’s Angels : [journaliste] passer une année au sein des Hell’s Angels, partager l’ordinaire des Hells Angels une année durant * embellish (v) (tr.) : embellir * embellishment (n) : 1/ embellissement (l’action) ; 2/ enjolivements (pl.), fioritures (f pl.) * ember (n) : braise (f) * embezzle (v) (tr.) : détourner (money, de l'argent) * embezzlement (n) : concussion (f) * embitter (v) (tr.) : 1/ rendre amer, donner de l’amertume à, aigrir ; 2/ altérer, envenimer (des rapports) * embodiment (n) : incarnation (f) * embody (v) (tr.) : incarner * embolden (v) (tr.) : enhardir, encourager * embolism (n) : ambolie (f)- to have an embolism : avoir une embolie - to develop an embolism : être victime d’une embolie - pulmonary embolism : embolie pulmonaire * emboss (v) (tr.) : bosseler * embrace (n) : 1/ étreinte (f), accolade (f) ; 2/ adoption (f) (of, de), acceptation (f) (of, de), adhésion (f) (of, à) - the embrace of conspiracy theories : l’adoption de théories conspirationnistes * embrace (v) (tr.) (fa) : 1/ prendre dans ses bras, étreindre ; 2/ englober, réunir ; 3/ accepter, adhérér à, adopter - to embrace a technique : adopter une technique * embroidery (n) : 1/ (la technique) broderie (f) ; 2/ (l’objet) (pl. embroideries) broderie * emergency (n) (pl. emergencies) (fa) : événement critique, circonstance critique (f), situation critique (f), état d’urgence, cas d'urgence - a state of emergency : l’état d’urgence - in an emergency : en cas d’urgence - emergency hammer : brise-glace (masc.) - emergency operations : interventions d’urgence (f pl.) - emergency preparedness : état de préparation aux situations d’urgence - the emergency room : la salle des urgences, les urgences - emergency situation : état d’urgence - emergency spare part : pièce de rechange de secours * emeritus (a) : émérite, honoraire - professor emeritus : professeur émérite - president emeritus : président honoraire * emission (n) : émission (f) - emission of greenhouse gases : émission de gaz à effet de serre - carbon dioxide emission : émission d'oxyde de carbone - car emissions : gaz d’échappement émis par les voitures - radioactive emissions : dégagements radioactifs - vehicles with reduced emissions : véhicules à émissions réduites * emit (v) (tr.) : émettre - to emit a beam of light : émettre un rayon lumineux - to emit greenhouse gases : émettre des gaz à effet de serre - to emit low radiation : émettre peu de radiations * Emmy-worthy (ac) : digne de recevoir un Emmy - an Emmy-worthy performance : une interprétation méritant un Emmy * emoji (n) (terme japonais) : émoji (masc.), émoticône (f) * emote (v) (intr.) : exprimer des émotions * emotion (n) : émotion (f) * emotional (a) : émotionnel(le) * emotionally (adv.) : 1/ du point de vue émotionnel, sur le plan émotionnel ; 2/ avec émotion * emotion-laden (ac) : plein(e) d’émotion, chargé(e) d’émotion - emotion-laden speech : discours rempli d’émotion * emperor (n) : empereur (pour le féminin, voir empress) * emphasis (n) (fa) : accent * emphasise (brit.) / emphasize (amér.) (v) (tr.) : mettre l’accent sur, souligner * empire (n) : empire * empirical (a) : empirique - empirical data : données empiriques (f pl.) - empirical evidence : constatations empiriques (f pl.) * employ (v) (tr.) : employer, utiliser - [planes] to be employed as stand-bys : [avions] servir d'appareils de réserve * employee (n) : employé (m), employée (f) - employee benefits : avantages sociaux * employer (n) : employeur - at an employer’s premises : chez un employeur * employment (n) : (le) travail, (l’)emploi - full employment : (le) plein emploi - manufacturing employment : (l’)emploi industriel - employment bureau : agence pour l’emploi * empress (n) : impératrice (f) * empty (a) : 1/ vide ; 2/ vain(e) - empty threat : vaine menace (f), menace en l’air * empty (v) : (tr.) vider ; (intr.) se vider * emulate (v) (tr.) : copier, imiter * emulation (n) (fa p) : 1/ imitation (f) ; 2/ émulation (f) * enable (v) (tr.) : 1/ - to enable sb to + inf. : permettre à qn de + inf., mettre qn à même de + inf.donner à qn la possibilité de + inf. ; 2/ - to enable sth : rendre possible qch, autoriser qch ; 3/ activer * enabler (n) : 1/ (angl. gén.) a/ [individu] incitateur ; b/ [société] catalyseur, dynamiseur (à éviter : facilitateur) ; 2/ (le logiciel) activateur - application enabler : habilitateur d’applications - enabler software : logiciels (pl.) d’activation * enabling (a) : propice, favorable - enabling framework : cadre favorable, cadre propice * enabling (n) : habilitation (f) * enact (v) (tr.) (jur.) : promulguer (une loi) * enactment (n) : promulgation (f) (d’une loi) * enamel (n) : émail * enamelled (brit.) / enameled (amér.) (ppa) : émaillé(e) * Enc. (abr. de Enclosures : pièces jointes, f pl.) : PJ * encase (v) (tr.) : 1/ mettre dans un étui ; 2/ munir d’une enveloppe * encephalitis (n) : (Méd.) encéphalite (f) * encircle (v) (tr.) : encercler * encirclement (n) : encerclement * enclose (v) (tr.) : joindre * enclosure (n) : 1/ enclos - bee enclosure : enclos à ruches - sheep enclosure : enclos à moutons ; 2/ pièce jointe (f) * encompass (v) (tr.) : entourer * encore! (interj.) : bis ! * encore (n) : (un) bis (n), (une) réédition - to search for an encore : chercher à frapper un nouveau coup * encounter (n) : rencontre (f) - encounter of the first kind : rencontre du premier type (= UFO sighting) - encounter of the second kind : rencontre du deuxième type (= UFO landing) - Close Encounters of the Third Kind (film de 1977) : Rencontres rapprochées du troisième type - close encounter : rencontre rapprochée * encounter (v) (tr.) : rencontrer * encroach (v) (intr.) : empiéter (on, sur), déborder (on, sur), gagner du terrain (on, sur), envahir * encroachment (n) : empiètement * encrust (v) (tr.) : incruster (with, de) * encrustation (n) : incrustation (f) * encrypt (v) (tr.) : crypter, coder, chiffrer * encrypted (ppa) : crypté(e), codé(e), chiffré(e) (anton. unencrypted) * encumber (v) (tr.) : encombrer (with, de) * encyclopaedia (brit.) / encyclopedia (amér.) : encyclopédie (f) * encyclopaedic (brit.) / encyclopedic (amér.) (a) : encyclopédique * end (n) : 1/ fin (f) - end game : partie finale (f) - the end times : les temps derniers, les temps ultimes, la fin du monde ; 2/ bout, extrémité (f) - at one end : à un bout, à une extrémité * endanger (v) (tr.) : mettre en danger, mettre en péril * endangered (a) : en péril - endangered species : espèce en voie d'extinction * endangerment (n) : mise en danger, mise en péril - reckless endangerment : conduite dangereuse (f) * endeavor (amér.) / endeavour (brit.) (v) (intr.) : s’efforcer (to do, de faire) * endemic (a) : endémique * endemically (adv.) : sur le plan endémique * ender (n) : - game ender (fig.) : élément qui met un terme à une situation * endgame (n) : 1/ (aux échecs) finale (f) ; 2/ dénouement - to enter one’s endgame : arriver à son dénouement (aussi end game) * ending (n) : 1/ dénouement ; 2/ (Gram.) désinence (f) (d’une déclinaison), terminaison (f) - case endings : désinences casuelles * endism (n) : (le) finisme * endless (a) : 1/ interminable, sans fin - the endless screw : la vis sans fin ; 2/ inépuisable * endline (a) : final(e) - endline data : données finales (f pl.) * end-of-the-world (ac) : de fin du monde - end-of-the-world prédictions : prédictions de fin du monde * endogamy (n) : endogamie (f) * endorse (v) (tr.) : donner son aval à, avaliser, être pour, approuver, appuyer, soutenir (an action, une action, a plan, un plan) * endorsement (n) : approbation (f), soutien * endow (v) (tr.) : doter (with, de) * endowed (ppa) : - to be endowed : [individu] être doté(e) (with, de) * end product (n) : 1/ résultat, aboutissement - the end product of his labours : l’aboutissement de ses efforts ; 2/ (Ind.) produit fini * end up (v) (intr.) : finir (with + gér., par + inf.), se retrouver + attribut - to end up an old maid : se retrouver vieille fille, finir vieille fille * endurance (n) (fa p) : 1/ endurance (f) ; 2/ (Av.) autonomie (f), temps de vol restant * endure (v) : (tr.) supporter, subir, résister à ; (intr.) durer * enduring (a) : durable * enema (n) : lavement * enemy (n) (pl. enemies) : ennemi, ennemie - to bear down on the enemy : foncer sur l'ennemi - implacable enemy : ennemi implacable * energetic (a) : 1/ énergique ; 2/ [style] nerveux/-euse * energise (brit.) / energize (amér.) (v) (tr.) : donner de l’énergie à, dynamiser, stimuler * energise (brit.) / energizer (amér.) (n) : énergisant (n), stimulant (n) * energy (n) (pl. energies) : énergie (f) - alternative sources of energy : énergies de substitution - renewable energy : énergie renouvelable - solar energy : énergie solaire - tidal energy : force marémotrice - wind energy : énergie éolienne - energy efficiency : rendement énergétique - energy gobbler : gouffre à énergie * energy-intensive (ac) : 1/ gros consommateur d’énergie, énergivore - energy-intensive industries : industries grosses consommatrices d'énergie, industries énergivores ; 2/ à forte intensité énergétique (jarg.) - energy-intensive products : produits à forte intensité énergétique * enervate (v) (tr.) (fa) : débiliter, affaiblir, amollir * enervating (a) (fa) : 1/ débilitant(e) - I find this climate very enervating : Je trouve ce climat très débilitant ; 2/ lénifiant(e) - enervating effect : effet lénifiant * enfeeble (v) (tr.) : affaiblir * enfilade (n) : tir en enfilade * enforce (v) (tr.) : 1/ faire appliquer, faire respecter - to enforce the law : faire appliquer la loi ; 2/ imposer * enforceable (a) : (Droit) exécutoire, applicable - an immediately enforceable decision : une décision exécutoire sur le champ (anton. non-enforceable) * enforcement (n) : application (f), exécution (f) - law enforcement : application de la loi * engaged (ppa) (fa) : 1/ fiancé(e) - He's engaged to a rich heiress : Il est fiancé à une riche héritière ; 2/ (brit.) [ligne téléphonique] occupé(e) - The line is engaged : La ligne est occupée * engagement (n) (fa) : 1/ rendez-vous ; 2/ fiançailles (f pl.) * engender (v) (tr.) : engendrer * Engg. (abr. de engineering) * engine (n) (fa) : 1/ machine (f) (dans un navire) - engine room : salle des machines ; 2/ (Av.) moteur, réacteur - the drone of an engine : le ronronnement d'un moteur - the engine's jet stream : le souffle du réacteur - cold engine : moteur froid - jet engine : moteur à réaction - piston engine : moteur à pistons - plane engine : moteur d’avion - wing-mounted engine : moteur monté sur l’aile / sous l’aile ; 3/ locomotive (f) - helper engine : locomotive de renfort - an old steam engine : une vieille locomotive à vapeur - engine driver : conducteur de train ; 4/ (Inf.) moteur - search engine : moteur de recherche * engine-driven (ac) : à moteur - engine-driven vehicle : véhicule à moteur * engineer (n) (fa p) : 1/ ingénieur - agricultural engineer : ingénieur agronome - assistant engineer : sous-ingénieur - automation engineer : automaticien - civil engineer : ingénieur du bâtiment - computer engineer : ingénieur informaticien - design engineer : ingénieur d’études - project engineer : ingénieur de projet - space engineer : ingénieur spatial - trained engineer : ingénieur de formation - weapons engineer : ingénieur de l’armement ; 2/ technicien, technicienne, mécanicien, mécanicienne - electric light engineer : éclairagiste - electrotechnical engineer : technicien en électrotechnique, électrotechnicien - flight engineer : (Av.) mécanicien de bord, mécanicien navigant - locomotive engineer : mécanicien de locomotive - television engineer : installateur de télévision - weapons engineer : expert en armement * engineer (v) (tr.) : 1/ construire (un pont, un gratte-ciel, etc.) ; 2/ créer, fabriquer, réaliser (un produit, etc.) * engineering (n) : 1/ (la) construction - aeronautical engineering : (la) construction aéronautique - automated production engineering : (la) productique - mechanical engineering : (la) construction mécanique - space station engineering : (la) construction de station spatiales - surface engineering : (le) traitement de surface par impact - engineering materials : matériaux de construction - engineering model : maquette de faisabilité - engineering pen : stylo de dessinateur industriel - engineering report : rapport technique ; 2/ (le) génie, (l’)ingénierie (f) - civil engineering : (le) génie civil - concurrent engineering : (l’)ingénierie simultanée, (l’)intégration de la conception et de la production) - human engineering : (l’)ergonomie (f) - nuclear engineering : (le) génie nucléaire - project engineering : (l’)ingénierie de projet - simultaneous engineering : (l’)ingénierie en partenariat (travail d’équipe entre concepteur et client) - social engineering : (le) génie social, (l’)ingénierie sociale, (la) sociologie appliquée, (la) manipulation de la société - space engineering : (l’)ingénierie spatiale - engineering company : société d'ingénierie, bureau d'ingénieurs - engineering graduate : diplômé d’une école d’ingénieurs * engineering-ese (n) : jargon des ingénieurs * engineless (a) : sans moteur * England (n pr.) : (l’)Angleterre (f) * English (a) : anglais(e) (sans maj.) * English (n) : (l’)anglais (n m) (la langue) - to brush up one’s English : se remettre à son anglais - I speak English : je parle anglais - Shakespeare’s English : (l’)anglais de Shakespeare (var. the English of Shakespeare ) - English as a foreign language : (l’)anglais langue étrangère - English as a second language : (l’)anglais seconde langue - English for specific purposes : (l’)anglais de spécialité - English for techies : (l’)anglais pour les techniciens, (l’)anglais technique, (l’)anglais technologique - American English : (l’)anglais américain - aviation English : anglais pour la communication entre pilote et tour de contrôle, anglais de l’aviation, anglais aéronautique - basic English : (l’)anglais de base - British English : (l’)anglais britannique - Chinese English : (l’)anglais chinois (syn. Chinglish, sinicised/-ized English) - Japanese English : (l’)anglais japonais (syn. Engrish) - pidgin English : (le) petit nègre - Simplified English : (l')anglais simplifié - spoken English : (l’)anglais parlé - standard English : (l’)anglais courant, (l’)anglais ordinaire - technical English : (l’)anglais technique - technology English : (l’)anglais de la technologie * Englishman (n pr.) : Anglais (le ressortissant) * Englishwoman (n pr.) : Anglaise (la ressortissante) * Engr. (abr. de engineer) * engrave (v) (tr.) : graver * engraving (n) : 1/ (la) gravure (l’activité) ; 2/ gravure (l’objet) * Engrish (n) : (l’)anglais japonais (où L est prononcé comme R) * engrossed (pp) (fa) : captivé(e), accaparé(e) - to be engrossed in one’s work : être absorbé(e) par son travail * engrossing (a) : captivant(e) * enjoy (v) (tr.) : trouver plaisir à - Enjoy your meal! : Bon appêtit ! - to enjoy oneself : s’amuser * enhance (v) (tr.) : 1/ améliorer, renforcer - to enhance a network’s performance : améliorer le fonctionnement d’un réseau; 2/ rehausser, enrichir, mettre en valeur, développer * enhanced (ppa) : 1/ amélioré(e), renforcé(e) ; 2/ rehaussé(e), enrichi(e), mis(e) en valeur, développé(e) * enhancement (n) : amélioration (f) - technical enhancements : améliorations techniques * enlarge (v) (tr.) : agrandir * enlarged (ppa) : agrandi(e) - enlarged photograph : photo agrandie (f), agrandissement photographique (syn. blown-up photograph) * enlargement (n) : agrandissement - enlargement of a photo : agrandissement d’une photo * enlighten (v) (tr.) : éclairer (sb about sth, qn au sujet de qch) * enlightened (a) : éclairé(e) (au fig.) * enlightenment (n) : 1/ éclaircissement (au fig.) ; 2/ (Hist.) (les) Lumières (f pl.) - the Age of Enlightenment : le siècle des Lumières ; 3/ (Bouddhisme) (l’)éveil * enlist (v) (tr.) : (tr.) enrôler, recruter ; (intr.) s’enrôler * enlisted (ppa) : enrôlé(e), recruté(e) - enlisted crew : membres d’équipage * enlistee (n) : recrue (f) * enliven (v) (tr.) : animer * enmesh (v) (tr.) : 1/ prendre dans un filet ; 2/ empêtrer * enquiry (n) : voir inquiry (n) * enrapture (v) (tr.) : ravir * enrichment (n) : enrichissement - illicit enrichment : enrichissement frauduleux - personal enrichment : enrichissement personnel * enrollment (amér.) / enrolment (brit.) (n) : inscription (f) (à une université, etc.) (anton. disenrollment / disenrolment : désinscription (f)) * ensconced (pp) : bien installé(e) (in, dans) * ensemble (n) : (Mus.) ensemble, groupe - marimba ensemble : ensemble de marimba, groupe de marimba * ensure (v) (tr.) : assurer - to ensure sb's happiness : assurer le bonheur de qn - to ensure that… : veiller à ce que…, faire en sorte que… - It must be ensured that… : Il convient de s’assurer que… * entail (v) (tr.) : supposer (syn. to imply, to involve) * entangle (v) (tr.) : emmêler, enchevêtrer * entanglement (n) : 1/ emmêlement, enchevêtrement ; 2/ imbroglio, embrouillamini (fam.), intrigue compliquée (f) * enter (v) : 1/ (tr.) entrer dans, pénétrer dans - to enter one’s endgame : arriver à son dénouement ; (intr.) entrer ; 2/ (tr.) inscrire dans (un registre) ; 3/ (tr.) (Inf.) introduire, saisir (des données) - to enter data into… : saisir des données dans… * enterprise (n) : 1/ an enterprise : une entreprise - a commercial enterprise : une exploitation commerciale - a medium-sized enterprise : une entreprise de taille moyenne ; 2/ (l’)entreprise - free enterprise : (la) libre entreprise, (le) libéralisme économique * entertain (v) (tr.) : divertir * entertaining (a) : divertissant(e) * entertainment (n) : divertissement - entertainment budget : budget spectacles, budget sorties - entertainment news : (l’)actualité du spectacle, (l’)actualité culturelle (f) * enthral(l) (v) (tr.) : captiver * enthrone (v) (tr.) : introniser * enthuse (v) (intr.) : exprimer son enthousiasme (about, pour), parler avec enthousiasme (about, de) * enthusiasm (n) : enthousiasme * enthusiast (n) : passionné (n), amoureux (n), grand amateur, adepte, fana (n) (fam.), mordu (n) (fam.) - architectural enthusiast : mordu d’architecture - aviation enthusiast : passionné d’aviation, mordu d’aviation - ballooning enthusiast : fana du vol en montgolfière - beer enthusiast : grand amateur de bière - boating enthusiast : adepte de la navigation de plaisance - book enthusiast : bibliophile - cycling enthusiast : adepte de la petite reine, mordu du vélo (aussi bicycle enthusiast) - film enthusiast : cinéphile (syn. film fan - cinema goer) - hifi enthusiast : amateur de hifi - motorcycle enthusiast : grand amateur de motos - mountain hiking enthusiast : amateur de randonnées en montagne - nature enthusiast : amoureux de la nature, passionné de la nature - outdoor enthusiast : adepte du plein air - photography enthusiast : photographe amateur - railway enthusiast : passionné de trains, ferrovipathe (syn. brit. trainspotter, syn. amér. railfan) - technology enthusiast : passionné de technologie - wine enthusiast : grand amateur de vin * enthusiastic (a) : enthousiaste * enthusiastically (adv.) : avec enthousiasme * entice (v) (tr.) : attirer (par la ruse) * enticing (a) : attirant(e), alléchant(e) * entitle (v) (tr.) : 1/ donner droit (to, à) - The card entitles to many benefits : La carte donne droit à de nombreux avantages ; 2/ autoriser - That entitles me to believe that… : Cela m’autorise à croire que... * entitled (ppa) : qui pense avoir tous les droits, qui se croit tout permis, à qui tout est dû, qui ne se prend pas pour rien - an entitled couple : un couple qui se croit tout permis * entitlement (n) : 1/ droit ; 2/ (amér.) aide (f), prestation (f) - state entitlements : prestations de l’État ; 3/ (amér.) – sense of entitlement : sentiment d’être au-dessus des lois * entity (n) (pl. entities) : entité (f) - biological entities : entités biologiques - extraterrestrial entities : entités extraterrestres - interdimensional entities : entités interdimensionnelles * entrance (n) : entrée (le lieu) (f) - entrance hall : vestibule (syn. entrance way) * entrance (v) (tr.) : fasciner * entrap (v) (tr.) : 1/ prendre au piège, piéger ; 2/ (fig.) attraper par la ruse * entrapment (n) : 1/ prise au piège, piégeage, capture (f) ; 2/ (le) fait de s’enfermer accidentellement * entrapped (ppa) : pris(e) au piège, piégé(e) ; 2/ (fig.) attrapé(e) par la ruse * entreat (v) (tr.) : supplier, implorer (to do sth, de faire qch) * entreaty (n) (pl. entreaties) : prière (f), supplication (f) * entree (n) (fa) : plat de résistance, plat principal * entrench (v) (tr.) : entourer d’une tranchée - [soldier] to entrench oneself : [soldat] se retrancher * entrepreneur (n) : entrepreneur, entrepreneuse * entrepreneurial (a) : entrepreneurial(e), entreprenarial(e) * entrepreneurship (n) : entrepreneuriat, entreprenariat * entrust (v) (tr.) : confier (sb with sth, qch à qn) - to be entrusted to… : être confié(e) à… * entry (n) (pl. entries) : 1/ entrée (f) - felonious entry : entrée avec effraction - No entry : a/ « Entrée interdite » ; b/ « Sens interdit » - entry point : point d’accès (into, à) ; 2/ inscription (f) ; 3/ (Inf.) saisie (de données) (f) - data entry : saisie de données * entwine (v) (tr.) : 1/ entrelacer ; 2/ lier * enunciate (v) : 1/ (tr.) prononcer clairement, bien prononcer ; (intr.) articuler clairement, bien articuler ; 2/ (intr.) s’exprimer clairement * enunciation (n) : 1/ articulation (f) ; 2/ énonciation (f) * enviro (n) (pl. enviros) (abr) : écolo (n) * environment (n) 1/ milieu, cadre, ambiance (f) - operating environment : cadre de fonctionnement ; 2/ (the) environment : (la) nature, (l')environnement - to be concerned about the environment : se soucier de l'environnement - to protect the environment : protéger la nature - environment consultant : conseiller pour l'environnement - environment scientist : spécialiste de l'environnement * environmental (a) : 1/ du milieu - environmental changes : modifications du milieu (f pl.) - environmental destruction : destruction du milieu ; 2/ écologique, écologiste, environnemental, de l’environnement - environmental activist : militant écologiste - environmental advocate : défenseur de l’environnement - environmental awareness : prise de conscience écologique - environmental disaster (syn. catastrophe) : catastrophe écologique (f) - environmental issues problèmes environnementaux, questions (f pl.) relatives à l'environnement - environmental science (sing.) : (les) sciences de l'environnement, (les) sciences environnementales - environmental treaty : traité sur l'environnement * environmentalist (n) : défenseur de la nature, écologiste (n) * environmentally friendly (ac) : écologique, respectueux/-euse de l'environnement * environmentally harmful (ac) : nocif/-ve pour le milieu, qui nuit à l'environnement * environmentally protected (ac) : protégé(e) des atteintes extérieures - environmentally-protected keyboard : (Inf.) clavier protégé des atteintes extérieures * environmentally sound (ac) : rationnel sur le plan écologique - environmentally sound technologies (EST) : technologies rationnelles sur le plan écologique * environmentally unfriendly (ac) : peu compatible avec l’environnement * envisage (v) (tr.) : envisager - the refusal to envisage the inevitable consequences of one’s words and acts : le refus d’envisager les conséquences inévitables de ses paroles et de ses actes * envoy (n) : envoyé (n) * envy (n) : envie (f) - to look on with envy : regarder avec envie * envy (v) (tr.) : envier * eon (n) (amér.) : voir aeon (n) * EP (n) (init. de extended player) : (Mus.) single multi-titres * epic (a) : 1/ épique ; 2/ (arg.) énorme, fantastique - That was epic! : C’était énorme ! * epic (n) : récit épique, poème épique * epicentre (brit.) / epicenter (amér.) (n) : épicentre * epidemic (n) : épidémie (f) - the AIDS epidemic : l’épidémie du SIDA * epidemiologist (n) : épidémiologiste (m/f) * epidemiology (n) : épidémiologie (f) * epiphany (n) : soudaine révélation (f), illumination (f) - I have just had an epiphany : Je viens d’avoir une illumination * episode (n) : épisode - pilot episode : épisode pilote (d’un film à épisode, d’une série) * epitaph (n) : épitaphe (f) * epitome (n) : incarnation (f), paragon - the epitome of… : l’exemple même de…, l’incarnation de… * eponym (n) : éponyme * eponymous (a) : 1/ qui donne son nom ; 2/ qui reçoit son nom * epopee (n) : épopée (f) (au propre comme au figuré) * EPS (n) (init. de earning per share) : bénéfice par action * equal (a) : égal(e) * equal (v) (tr.) : égaler, être égal à * equality (n) : égalité (f) - gender equality : égalité femmes-hommes * equally (adv.) : 1/ de la même manière, de la même façon - Equally, ... (a m p) (t d p) : De même, ... ; 2/ équitablement, à parts égales * equanimity (n) : égalité d’humeur * equation (n) : (Math.) équation (f) - linear equation : équation linéaire * equestrian (a) : équestre, hippique - equestrian show : concours hippique * equipment (n ind. sing.) : (du) matériel, (de l’)équipement, (des) équipements (pl.), (des) engins (pl.) - Heavy equipment was used in the reconstruction project : de gros engins furent employés dans les travaux de reconstruction - an item of equipment : un équipement, un engin – a piece of equipment : un équipement, un engin - farm equipment : matériel agricole - the equipment division : la direction du matériel - equipment manufacturer : équipementier * equities (n pl) : actions ordinaires * era (n) : ère (géologique, etc.) * erase (v) (tr.) : 1/ gommer ; 2/ effacer * eraser (n) (amér.) : gomme (f) (à effacer) (syn. brit. rubber) * erasure (n) : 1/ gommage ; 2/ effacement * erectile (a) : érectile - erectile dysfunction : dysfonctionnement érectile, troubles de l’érection (pl.) * ergo (adv.) : par conséquent, donc * ergonomic (a) : ergonomique * ergonomically (adv.) : de façon ergonomique * ergonomically designed (ac) : de conception ergonomique - ergonomically designed drill handle : poignée de perceuse ergonomique * ergonomically placed (ac) : disposé(e) de façon ergonomique - ergonomically placed trackball : (Inf.) boule de commande disposée de façon ergonomique * ergonomics (n sing.) : (l’)ergonomie (f) * erode (v) : 1/ (tr.) éroder ; (intr.) s’éroder : 2/ (tr.) saper, miner ; (intr.) être sapé(e)(e), être miné(e) * erosion (n) : érosion (f) - soil erosion : érosion des sols * erosion-prone (ac) : sensible à l’érosion - erosion-prone soils : sols susceptibles d’être affectés par l’érosion * erotica (n) : (selon le cas) litérature érotique (f), art érotique * err (v) (intr.) (fa) : 1/ se tromper (syn. to be wrong) - To err is human, to forgive divine : L’erreur est humaine et le pardon, divin ; 2/ pécher * errand (n) : course (f), commission (f) - to go on an errand : faire une commission - errand boy : garçon de courses * error (n) : erreur (f) - the chance of error : les risques d'erreur - human error : erreur humaine - pilot error : erreur de pilotage - slight error : légère erreur - spelling error : faute d’orthographe - error types : types d’erreurs * error-laden (ac) : plein(e) d’erreurs, bourré(e) d’erreurs, farci(e) d’erreurs - error-laden piece : (Presse) article farci d’erreurs * error-prone (ac) : sujet(te) à l’erreur, peu fiable - error-prone process : processus peu fiable - less error-prone : plus fiable * erstwhile (a) : d’autrefois, de jadis * eruption (n) : éruption (f) - volcanic eruption : éruption volcanique * escalate (v) : (tr.) intensifier, agraver ; (intr.) s’intensifier, s’aggraver * escalation (n) : escalade (f), montée (f), intensification (f) * escalope (n) : escalope (f) - chicken escalope : escalope de poulet * escape (n) : 1/ évasion (f), fuite (f) - to seek an escape from sth : chercher à échapper à qch - to have had a lucky escape : l’avoir échappé belle ; 2/ échappatoire (f) * escape (v) : (tr.) échapper à ; (intr.) s’échapper (from, de) - a place to escape : un refuge * escaper (n) : évadé (n), fugitif (n) * escapologist (n) : maniaque de l’évasion, récidiviste de l’évasion, virtuose de l’évasion * escort (n) : 1/ (Milit.) escorte (f) ; 2/ compagnon, cavalier - to hire an escort : payer les services d’un compagnon / cavalier - escort girl : accompagnatrice en soirée * escort (v) (tr.) : escorter * escrow (n) : fiducie (f) * ESL (n) (abr. de English as a second language : (l’)anglais seconde langue) - an ESL student : un étudiant en anglais 2e langue * esophagus (amér.) / oesophagus (brit.) (n) (pl. brit. oesophagi ou oesophaguses) : œsophage * ESP (n) (init. de English for specific purposes : (l’)anglais de spécialité) * especially... (a m p) : spécialement …, surtout … * espionage (n) : espionnage (noter la diff. d’ortho.) (syn. spying) - espionage film : film d’espionnage (amér. espionage movie) * espouse (v) (tr.) : 1/ (arch.) épouser, se marier avec ; 2/ (fig.) épouser, embrasser (une cause) * essay (n) (fa p) : 1/ essai, tentative (f) ; 2/ essai, petit livre (littéraire ou philosophique) ; 3/ rédaction (f) (au collège), dissertation (f) (au lycée) * essay (v) (tr.) : essayer, tenter * essential (a) : essentiel(le) (anton. non-essential) * essentially (adv.) : essentiellement - Essentially, … (a m p) (t d p) : Pour l'essentiel …, En gros ... * estab (n) (abr. de establishment au sens 2) * establishment (n) : 1/ établissement ; 2/ ordre établi, caste (f), oligarchie (f) - the Establishment : la caste dirigeante - the Anglo-American establishment : l’oligarchie anglo-américaine - establishment mouthpiece : organe de l’ordre établi * estate (n) (fa) : 1/ (an estate) domaine (au sens de grande propriété), propriété (f) - council estate : cité HLM - industrial estate : zone industrielle (f) - estate agent : a/ administrateur de terres ; b/ agent immobilier ; 2/ (n ind. sing.) biens (pl.) - real estate : biens immobiliers (pl.) ; 3/ (brit.) - housing estate : (selon le cas) a/ lotissement (pavillons), b/ cité (immeubles) (f) * estimate (n) : estimation (f), évaluation (f), appréciation (f) - an estimate of the situation : évaluation de la situation, le point sur la situation - a rough estimate : une approximation * estimate (v) (tr.) : estimer, évaluer, apprécier * Estonia (n pr.) : (l’)Estonie (fém.) * Estonian (a) : estonien(ne) (sans maj.) * Estonian (n pr.) : Estonien (le ressortissant) * estranged (ppa) : dont on est séparé - [married couple] to become estranged : [couple marié] se séparer * estuary (n) (pl. estuaries) : estuaire - the Thames estuary : l’estuaire de la Tamise * ET (n) (abr. de extraterrestrial : extraterrestre) * et al (abr. du latin et alii, et autres) : 1/ et al. ; 2/ (hum.) et compagnie, et cie * etch (v) (tr.) : 1/ décaper, attaquer ; 2/ graver à l’eau-forte * etching (n) : attaque (f), décapage * eternal (a) : éternel(le) - an eternal optimist : un indécrottable optimiste * eternally (adv.) : éternellement * ETH (n) (abr. de (the) extraterrestrial hypothesis : (l')hypothèse des extraterrestres) (l')HET) - an ETH supporter : un partisan de l'HET * ethic (n) : morale (f), éthique (f) - the work ethic : l'éthique du travail * ethical (a) : éthique, moral(e) - ethical journalism : journalisme éthique, journalisme moral * ethics (n pl.) : éthique (f) - journalism ethics : (l’)éthique journalistique, (la) déontologie journalistique * ethnic (a) : ethnique - ethnic cleansing : nettoyage ethnique - ethnic warfare : (la) guerre ethnique * ethnically (adv.) : ethniquement * ethnically-cleansed (ac) : ayant subi un nettoyage ethnique * ethnically sensitive (ac) : sensible aux facteurs ethniques * ethnocentric (a) : ethnocentrique * etiquette (n) (fa) : décorum * EU (n pr.) (abr. de European Union) : UE - EU countries : (les) pays de l’UE * EU-driven (ac) : impulsé par l’Union Européenne * eugenicist (n) : eugéniste * eugenics (n sg) : eugénisme * eulogise (brit.) / eulogize (amér.) (v) : (tr.) faire l’éloge de (qch), faire le panégyrique de (qch) ; (intr.) - to eulogise about sth : faire l’éloge de qch, faire le panégyrique de qch * eulogy (n) (pl. eulogies) : panégyrique * euphemism (n) : euphémisme * euphemistically (adv.) : - euphemistically speaking (a m p) : par euphémisme * Eurasian (a) : eurasien(ne) * Eurasian (n) : Eurasien(ne) * Europe (n pr.) : (l’)Europe (f) - Eastern Europe : (l’)Europe de l’Est * European (a) : européen(ne) (sans maj.) - European industry : (l’)industrie européenne (f) - the European Union : l’Union européenne (f) * European (n pr.) : Européen (l’habitant) - modern Europeans : (les) Européens actuels * euthanise (brit.) / euthanize (amér.) (v) (tr.) : euthanasier * EV (n) (pl. EVs) (abr. de electric vehicle, véhicule électrique) * evac (v) (tronc. de to evacuate) : (tr.) évacuer ; (intr.) évacuer les lieux * evacuate (v) : (tr.) évacuer ; (intr.) évacuer les lieux * evacuation (n) : évacuation (f) * evacuee (n) : évacué(e) * evade (v) (tr.) : 1/ échapper à - to evade police : échapper à la police ; 2/ ne pas payer - to evade taxes : ne pas payer ses impôts ; 3/ éluder (une question) * evangelical (a) : évangélique * e-vape (n) : vapoteuse (f), cigarette électronique (f) (aussi vape) * e-vape (v) (tr. et intr.) : vapoter (aussi to vape) * e-vaping (n) : vapotage (aussi vaping) * evasion (n) : 1/ évasion (f), fuite (f) ; 2/ dérobade (f), esquive (f), échappatoire ; 3/ fraude (f) - tax evasion : fraude fiscale * evasive (a) : évasif/-ive, qui cherche à éviter - to take evasive action : (chercher à) se dérober * eve (n) : veille (f) - on the eve of… : la veille de… * even (a) : 1/ régulier/-ière ; 2/ uniforme ; 3/ égal(e), équivalent(e) ; 4/ pair(e) ; 4/ quitte (inv.) - to get even : régler ses comptes * even (adv.) : 1/ même - Even a child can do it : Même un enfant sait le faire ; 2/ (+ comparatif ) encore - even worse : encore pire * even better (m d l) : bien mieux, mieux encore * even if (loc. conj. de concession) : même si * evening (n) : soir - evening edition : (Presse) édition du soir * even-numbered (ac) : pair(e) - even-numbered year : année paire (anton. : odd-numbered) * even so (loc. adv.) : mais cependant, quand même, toutefois, néanmoins, malgré cela, quoi qu’il en soit * evensong (n) : vêpres (f pl.) * event (n) (fa) : 1/ événement (aussi événement) - a turn of events : - in the event of : en cas de - in the event that… : au cas où…, si éventuellement… - impact event : collision (f) (avec un corps céleste) - watershed event : événement décisif - the event horizon : l’horizon des événements - event photographer : photographe événementiel ; 2/ manifestation (f) - popular event : événement très couru ; 3/ (Maint.) modification de l’état (d’un système), défaillance (f), panne (f) - event marker : signal de panne ; 4/ (Sport) épreuve (f) * event-driven (ac) : 1/ anticipant les modifications ; 2/ réagissant aux modifications * even though (loc. conj. de concession) : même si, malgré le fait que * eventual (a) (fa) : final(e), définitif/-ive * eventually (adv.) (fa) : 1/ finalement, un jour ou l'autre - He'll do it eventually : Il finira bien par le faire ; 2/ pour finir * Eventually, … (a m p) (t d p) : En fin de compte, ..., Au bout du compte, … * ever-expanding (ac) : en constante expansion, sans cesse croissant - an ever-expanding portfolio : un portefeuille (d’actions) qui ne fait que grandir * evergreen (a) : qui revient toujours, qui ne vieillit pas * evergreen (n) : 1/ plante à feuillage persistant ; 2/ (amér.) (Journ.) sujet revenant de façon cyclique, marronnier (au fig.) (syn. brit. chestnut) * ever-increasing (ac) : toujours plus grand(e) - ever-increasing thirst : soif toujours plus grande * ever-worsoning (ac) : [situation] qui ne fait qu’empirer / qui ne fait que se dégrader, qui se dégrade de plus en plus, de plus en plus grave * every (a) : 1/ chaque - to roll out 7 aircraft every month : sortir sept avions chaque mois ; 2/ tout, toute - at every turn : à tout bout de champ, à tout propos - every second person : une personne sur deux ; 3/ tous les / toutes les - every conceivable topic : tous les sujets qu'on peut imaginer - every trick in the trade : tous les tours du métier, toutes les ficelles du métier * everyday (a) : de tous les jours - everyday speech : (la) langue de tous les jours * every-nighters (n pl.) : couple baisant tous les soirs, acharnés de la copulation - We are every-nighters : Nous faisons l’amour tous les soirs * every time (that) (loc. conj. de temps) : toutes les fois que * everywhere (adv.) : partout * eviction (n) : expulsion (f) (d’un locataire) * evidence (n ind. sing.) (fa) : 1/ manifestations (f pl.), signes (pl.), indices (pl.), indications (f pl.), informations (f pl.), constatations (f pl.) - claim accompanied by no evidence : affirmation sans la moindre preuve / sans même un début de preuve - evidence adduced as hearsay : indices présentés sous forme de ouï-dire - circumstantial evidence : faisceau d’indices, preuves indiciaires, preuves indirectes - damning evidence : éléments de preuve accablants, indices accablants - empirical evidence : constatations empiriques - key evidence : indications importantes, informations capitales - physical evidence : indices physiques - uncontroverted evidence : preuves indiciaires incontestables ; 2/ témoignages (pl.) - key evidence : témoignages clé - a piece of evidence : un témoignage * evidence (v) (tr.) : 1/ prouver - as evidenced by… : comme le prouve… ; 2/ témoigner de, manifester, attester - as evidenced by… : comme en témoigne…, comme cela est attesté par…, comme l’atteste… * evidential (a) : fondé sur des indices - evidential material : éléments de preuve, éléments probants, indices - evidential support : étaiement par des éléments probants - evidential requirements : prescriptions en matière de preuves - These certificates have no evidential value : Ces certificats n’ont aucune valeur probante * evil (a) : mauvais(e) - evil angel : ange du mal - the Evil One : le Malin, le Diable * evil (n) : (le) mal - to do evil : faire le mal * evildoer (n) : malfaiteur, scélérat * evince (v) (tr.) (fa) : manifester, faire preuve de, montrer clairement (syn. to display, to show, to reveal) * evocative (a) : évocateur/-trice - evocative of sth : qui évoque qch, qui fait penser à qch, qui rappelle qch * evolve (v) (intr.) : évoluer, se développer - to evolve from sth : naître de qch, tirer son origine de qch * EW (n) (init. de electronic warfare) : (la) guerre électronique - EW assets : équipements de guerre électronique - EW operations : opérations de guerre électronique * ex (prép. d'origine latine) : (= out of, free of) au départ de, enlevé à, à enlever à * ex (n) (pl. exes) : ex (inv.) - an ex : (selon le cas) un ancien conjoint, une ancienne conjointe - his ex : son ex (son ancienne épouse) - her ex : son ex (son ancien époux) - No exes at our wedding : Pas d’ex à notre mariage * ex (n) (abr. de ex-boyfriend : ex-petit ami) ex (masc.) * ex (n) (abr. de ex-girlfriend : ex-petite amie) ex (fém.) * ex (n) (abr. de ex-husband : ex-mari) ex (masc.) ex (masc.) * ex (n) (abr. de ex-wife : ex-femme) : ex (fém.) * exact (v) (tr.) : 1/ exiger (sth from sb, qch de qn) ; 2/ extorquer (sth from, qch à) ; 3/ - to exact revenge on sb : se venger de qn * exaggerate (v) : (tr.) exagérer ; (intr.) exagérer - Let's not exaggerate! : N'exagérons pas ! * exam (n) (tronc. de examination) : examen - to pass an exam : réussir à un examen, être reçu à un examen - to take an exam, : passer un examen (syn. to sit for an exam) - gyno exam : examen gynécologique - exam paper : sujet d'examen * examination (n) : examen - medical examination : examen médical - oral examination : examen oral - written examination : examen écrit - examination board (brit.) : comité chargé de l'organisation des examens scolaires, secrétariat des examens - examination answer key : corrigé d’examen - examination paper : feuille d’examen * examine (v) (tr.) : examiner - Let us examine the facts : Examinons les faits * examinee (n) : candidat(e) (à un examen) * Example: … (m d l) (t d p) (fam.) : Ainsi, Par exemple * example (n) : exemple (syn. instance) - for example : par exemple - in the following example : dans l'exemple suivant - shining example : exemple éclatant, exemple parfait - striking example : exemple frappant * exanguinate (v) : (tr.) vider de son sang, saigner complètement ; (intr.) se vider de son sang, perdre tout son sang * exasperate (v) (tr.) : énerver * exasperating (a) : énervant(e) * exceed (v) (tr.) : dépasser - to exceed drinking-up time : dépasser l’heure du dernier verre * exceedingly (adv.) : extrêmement * excel (v) (intr.) : exceller * excellence (n) : excellence (f) * except (prép.) : à l'exception de, sauf - on all gears except reverse : sur toutes les vitesses sauf la marche arrière * except for (loc. prép.) : hormis, à part, exception faite de * excepting (prép.) : excepté * exception (n) : exception (f) - to take exception to sth : se formaliser de qch, s’offusquer de qch * exceptional (a) : 1/ exceptionnel(le) ; 2/ dérogatoire * exceptionalism (n) : exceptionnalisme - American exceptionalism : (l’)exceptionnalisme étatsunien * exceptionally (adv.) : exceptionnellement, extraordinairement ; 2/ extrêmement * except that (loc. conj. de restriction) : sauf que, si ce n'est que * excerpt (n) : extrait (from, de) * excess (n) : 1/ excès, abus ; 2/ excédent * excessive (a) : excessif/-ive - excessive menstrual bleeding : saignements menstruels excessifs (pl.) * excessively (adv.) : excessivement, par trop * excessively large (ac) : trop gros(se) - excessively large file : (Inf.) fichier trop gros * exchange (n) : 1/ échange (f) - interindustry exchanges : échanges inter-industriels ; 2/ change - exchange rate : taux de change ; 3/ central (n) - public telephone exchange : central téléphonique public ; 4/ bourse (f) - stock exchange : marché des valeurs, place boursière (f) - the London / New York / Paris Stock Exchange : la Bourse (des valeurs) de Londres / New York / Paris * exchange (v) (tr.) : échanger * excisable (a) : soumis(e) au droit d’excise, imposable * excise (n) : taxe (f) (on, sur) * excite (v) (tr.) : passionner, enthousiasmer * excitement (n) : passion (f), enthousiasme * exciting (a) (fa) : passionnant(e), enthousiasmant(e) * excitingly (adv.) : passionnément * exclave (n) : enclave (f) * excl. (abr.) cf. excluding * exclude (v) (tr.) : exclure * excluder (n) : bourrelet d’isolation - draught excluder : bourrelet (de porte, de fenêtre) * excluded (ppa) : exclu(e) - to feel excluded : se sentir exclu(e) * excluding (prép.) : à l'exclusion de, à l'exception de, sauf, subst. + non compris, subst. + non inclus - all accessories excluding batteries : tous les accessoires de l'appareil, à l'exclusion des piles * exclusion (n) : exclusion (f) * exclusive (a) : exclusif/-ive, en exclusivité - exclusive interview : entretien exclusif, entretien en exclusivité - exclusive story reportage exclusif (syn. scoop) * exclusively (adv.) : en exclusivité - as this newspaper exclusively revealed last week, ... : comme notre journal fut le premier à le divulguer la semaine dernière, ... * ex-con (n) (tronc. de ex-convict : ancien détenu, ancien taulard) * ex-convict (n) : ancien détenu, ancienne détenue, ancien taulard, ancienne taularde * excrement (n) : excréments (pl.), déjections (f pl.), matière fécale (f) - bovine excrement : excréments de bovins, bouse de vache * excruciating (a) : atroce, insupportable * excruciatingly (adv.) : atrocement * exculpate (v) (tr.) : disculper * excuse (n) (fa) : prétexte * excuse (v) (tr.) : 1/ excuser, pardonner - Excuse me! : S'il vous plaît ! (pour demander le passage) - Excuse me, officer : Excusez-moi, monsieur l'agent (pour demander un renseignement) ; 2/ justifier * ex-directory (a) : sur la liste rouge, ne figurant pas dans l’annuaire téléphonique - to be ex-directory : être sur la liste rouge - to have an ex-directory phone number : ne pas figurer dans l’annuaire * exec (n) (pl. execs) (tronc. de executive) : cadre * executive (a) : 1/ de cadre ; 2/ exécutif/-ive - executive director : directeur-en-chef - chief executive officer : président directeur général - executive vice president : vice-président directeur général * executive (n) : 1/ cadre, cadre dirigeant ; 2/ dirigeant(e), directeur/-trice - chief executive : président directeur général, PDG - manufacturing executive : chef d’entreprise - senior executive : membre de la direction, cadre dirigeant, cadre supérieur * exemplar (n) : exemple, modèle * exempt (v) (tr.) : exonérer (from, de) * exercise (v) (intr.) : se donner de l’exercice physique, faire des exercices physiques * exert (v) (tr.) : exercer - to exert oneself : se dépenser * exertion (n) : effort physique * exhaust (n) : échappement - exhaust fumes : gaz d’échappement * exhaust (v) (tr.) : épuiser, exténuer (qn) ; 2/ épuiser (des ressources) ; 3/ épuiser (un sujet) * exhausted (a) : épuisé(e), exténué(e) * exhaustion (n) : épuisement * exhibit (n) : 1/ (Art) pièce exposée (f) ; 2/ (Droit) pièce à conviction * exhibit (v) (tr.) (fa) : 1/ exposer ; 2/ présenter, manifester ; 3/ exploiter (un film) * exhibition (n) (fa) : 1/ exposition (f), expo (f) (fam.) - exhibition curatorship : commissariat d’exposition ; 2/ présentation (f) ; 3/ exploitation (f) (d’un film) * exhibitor (n) (amér.) : 1/ exposant (d’une exposition) ; 3/ propriétaire de salle (de cinéma) * exhilarate (v) (tr.) : griser, emballer (fam.) * exhilarating (a) : grisant(e), excitant(e) * exhilaration (n) : exaltation (f) * exhumation (n) : exhumation (f) * exhume (v) (tr.) : exhumer * exist (v) (intr.) : exister - to cease to exist : cesser d’exister * existence (n) : existence (f) - to be in existence : exister - to come into existence : voir le jour, naître, apparaître (syn. to come into being) * existential (a) : 1/ de l’existence, sur l’existence - an existential threat : une menace quant à l’existence, une menace mortelle ; 2/ existentiel(le) * exit (n) : issue (f), sortie (f) - Exit through the gift shop (sur un panneau) : Sortie par la boutique de souvenirs * exodus (n) : exode - to join the exodus : prendre à son tour le chemin de l’exode * exonerate (v) (tr.) (fa p) : 1/ disculper ; 2/ exonérer, exempter * exoplanet (n) : exoplanète (f) * exoskeleton (n) : exosquelette * exotic (a) : exotique * exociticism (n) : exotisme * expand (v) (tr.) : (tr.) étendre, accroître, élargir, développer ; (intr.) s’étendre, s’accroître, s’élargir - [conflict] to expand into all-out war : [conflit] tourner à la guerre totale * expandable (a) : extensible * expanse (n) : étendue (f) * expansion (n) : 1/ expansion (f), élargissement, développement ; 2/ extension (f) - expansion board : (Inf.) carte d’extension - expansion slot : (Inf.) connecteur d’extension interne, logement * expat (n) (tronc. de expatriate (n) : expatrié(e)) * expatiate (v) (intr.) : discourir (on sth, sur qch) * expatriate (n) : expatrié (n) * expect (v) (tr.) : 1/ attendre - to expect a baby : attendre un bébé ; 2/ s’attendre à - to be expected to + inf. : devoir (au sens de prévision) * expectancy (n) : attente (f), expectative (f) - life expectancy : espérance de vie * expectant (a) : 1/ plein(e) d’espoir, chargé(e) d’espoir ; 2/ futur(e) - expectant mother : future maman (f) * expectation (n) : espérance (f) * expected (ppa) : prévu(e) - as expected : comme prévu * expedite (v) (tr.) (fa) : accélérer (une opération, un processus) * expel (v) (prét. et pp -lled) (tr.) : 1/ chasser (un envahisseur), expulser (un étranger), renvoyer (un élève), bouter (les Anglais hors de France) - He was expelled from school for stealing : Il fut renvoyé de l'école pour vol ; 2/ rejeter, évacuer, expulser (de l'eau, de l'air, du gaz) - to expel a gas : rejeter un gas * expendable (a) : que l’on peut sacrifier, non récupérable - expendable filter : filtre d’usage - expendable rocket (Aéro.) : fusée ne servant qu’une fois * expenditure (n) : dépense (f) * expense (n) : 1/ dépense(s) (f), frais (pl.) - operating expense : frais d’exploitation (pl.) - travelling expenses : frais de voyage ; 2/ dépens (pl.) - at the expense of… : aux dépens de… * expensive (a) : cher/-ère, coûteux/-euse, onéreux/-euse * experience (n) : 1/ pratique (f) - He has considerable driving experience : C’est un conducteur très expérimenté - work experience : expérience professionnelle ; 2/ (l’)expérience (f) - I know from experience that … : Je sais par expérience que… ; 3/ (une) expérience - a painful experience : une expérience pénible * experience (v) (tr.) : éprouver, ressentir * experienced (a) : qui a de l’expérience, expérimenté(e) (anton. inexperienced) * experiencer (n) : témoin, sujet - the experiencer : le sujet, la victime, la personne affectée - the UFO experiencer : le témoin d’un ovni * experiment (n) : expérience (scientifique) (f) * experiment (v) (intr.) : (with + gér.) essayer de + inf., tâtonner en + part. présent * expert (n) : expert(e), spécialiste (m/f) - disinformation expert : expert en désinformation - electronics expert : expert en électronique - genealogy expert : expert en généalogie - space expert : spécialiste de l’espace, spécialiste spatial * expertise (n) (fa) : savoir-faire technique, compétence technique (f), qualité d’expert (dans un domaine donné), expérience professionnelle (f) * explain (v) (tr.) : expliquer * explanation (n) : explication (f) - to defy explanation : défier l'entendement - mundane explanation : explication prosaïque - natural explanation : explication naturelle - non-natural explanation : explication autre que naturelle * explanatory (a) : explicatif/-ive, d’explication - explanatory journalism : (le) journalisme d’explication * expletive (a) : explétif/-ive * expletive (n) : 1/ juron - expletive-laden letter : lettre constellée de jurons ; 2/ explétif (n) * explicit (a) (fa) : explicite (comme en français mais généralement employé dans un sens réprobateur) - explicit content : [film qui] comporte des scènes choquantes * explode (v) : (tr.) faire exploser ; (intr.) exploser * exploded (ppa) : éclaté(e) - exploded drawing : dessin éclaté * exploit (n) : 1/ (angl. gén.) exploit, prouesse, fait d’armes - to recount one’s exploits : raconter ses exploits ; 2/ (Inf.) du code prêt à l’emploi * exploit (v) (tr.) : exploiter * exploitative (a) : d’exploitation, spoliateur/-trice * exploiter (n) : exploiteur * exploration (n) : exploration (f) - exploration of the solar system : exploration du système solaire * explore (v) (tr.) : explorer * explorer (n) : explorateur/-trice - urban explorer : explorateur urbain (sur la Toile) * explosion (n) : explosion (f) - the Chernobyl nuclear reactor explosion : l'explosion du réacteur nucléaire de Tchernobyl * explosion-prone (ac) : sujet(te) aux explosions, présentant un risque d’explosion * explosion-proof (ac) : antidéflagrant(e) * explosive (a) : explosif/-ive * explosive (n) : explosif (n) * exponent (n) : interprète, celui qui expose (une théorie, un principe, etc.), représentant, défenseur, partisan * export (n) : 1/ exportation (f) (l’activité) - export of manufactures : exportation de produits manufacturés ; 2/ (svt au pl. exports) exportation (le produit), produit exporté ; 3/ évacuation (f) - export pipeline : oléoduc d’évacuation * export (v) (tr.) : exporter - to export goods : exporter des marchandises - to export arms to conflict-affected countries : exporter des armes dans des pays touchés par un conflit * exported (ppa) : exporté(e) * exporter (n) : exportateur/-trice (n) * exporting (a) : exportateur/-trice * export-oriented (ac) : tourné(e) vers l’exportation - export-oriented industry : industrie travaillant pour l’exportation * expose (v) (tr.) (fa) : démasquer (qn), dévoiler (qch), mettre à nu * exposé (n) (fa) : révélations (f pl.) (on, sur) * exposition (n) : exposition (f), foire (f) * exposure (n) (fa p) : 1/ exposition (f) (au froid, à des radiations, etc.) ; 2/ (Photog.) mise au point, exposition - automatic exposure : mise au point automatique - exposure control : réglage de l’exposition ; 3/ mise à nu, mise à découvert, révélation (f) * express (v) (tr.) : exprimer * expression (n) : 1/ expression (f) (du visage), mine (f) - mournful expression : mine d’enterrement ; 2/ expression (de la langue) (syn. phrase) - idiomatic expression : a/ expression idiomatique, b/ (Ling.) idiotisme - fixed expression : expression figée, expression consacrée - set expression : expression toute faite - slang expression : expression argotique * expressionless (a) : [voix] neutre * expulsion (n) : expulsion (f), rejet * expunge (v) (tr.) : supprimer (un passage) * ex-serviceman (pl. ex-servicemen) (brit.) : ancien combattant (syn. amér. veteran) * extend (v) (tr.) : 1/ étirer ; 2/ offrir (to, à) * extensible (a) : 1/ extensible ; 2/ [visa] renouvelable * extension (n) : - extension of time : sursis * extensive (a) : vaste, étendu(e) * extensively (adv.) : considérablement, beaucoup * Externally, … (a m p) (t d p) : Extérieurement,…, À l'extérieur, … * extinct (a) : disparu(e), éteint(e) - extinct language : langue disparue (f) - extinct species : espèce disparue ‘f) * extinction (n) : extinction (f) - to face extinction : être menacé(e) d'extinction - species extinction : disparition d'espèces * extension-level (ac) : - extension-level event : cas d’extinction d’espèce, anéantissement d’une espèce * extol (v) (tr.) : exalter, louer * extortion (n) : 1/ extorsion (f) (de fonds), chantage ; 2/ (fig.) (de l’)escroquerie, (du) vol * extortionist (n) : 1/ extorqueur ; 2/ (fig.) écorcheur * extra (a) (fa) : supplémentaire, en plus - I've got some extra work to do : J'ai un travail supplémentaire à faire * extra (n) : figurant, figurante - to work as an extra : faire de la figuration * extract (n) : extrait (from, de) * extract (v) (tr.) : extraire (from, de) * extracurricular (a) : extra-scolaire - extracurricular activities : activités extra-scolaires * extradite (v) (tr.) : extrader * extradition (n) : extradition (f) * extra-sensory (a) : extra-sensoriel(le) - extra-sensory perception : perception extra-sensorielle * extraterrestrial (a) : extraterrestre (syn. non-terrestrial) * extraterrestrial (n) : extraterrestre (n m/f) * extravagance (n) : 1/ extravagance (f) ; 2/ dépense inconsidérée (f), folle dépense (f) * extravagant (a) (fa) : 1/ [individu] prodigue, dépensier/-ière ; 2/ [prix] inabordable * extravaganza (n) (fa) : spectacle somptueux - a production extravaganza : un film qui a coûté une fortune * extreme (a) : 1/ extrême, exceptionnel(le) - extreme weather : temps déréglé, dérèglements du temps ; 2/ (Sport) extrême - extreme sports : sports extrêmes * extremely (adv.) : 1/ extrêmement ; 2/ (+ adj.) vachement + adj. (fam.) * extremely large (ac) : très grand(e) - extremely large hard disk : (Inf.) disque dur de très grande capacité * exude (v) (tr.) : exsuder, dégager, émettre * exurb (n) : grande banlieue (f) - in the remotest exurbs : dans les plus lointaines banlieues * ex-voto (n) (Latin) : ex-voto (inv.) - ex-voto offerings : ex-voto (pl. inv.) * ex-wife (n) : ancienne épouse (f) * eye (n) : 1/ œil (pl. yeux) - the camera's eye (Cin.) : l'œil de la caméra - eye bags : poches sous les yeux - eye care : soins oculaires (pl.) - to turn a blind eye : fermer les yeux (to, sur) ; 2/ (amér.) - private eye : détective privé, privé (n) * eyeball (n) : globe oculaire * eyebrow (n) : sourcil - to pluck one’s eyebrows : s’épiler les sourcils - bushy eyebrows : sourcils touffus * eye-catching (ac) : 1/ qui attire l’œil, qui ne passe pas inaperçu(e), accrocheur (syn. attention-grabbing) ; 2/ (péj.) voyant(e), tape-à-l’œil (inv.), tapageur/-euse * eye-friendly (ac) : non nocif/-ive pour la vue - eye-friendly picture : image ne fatiguant pas la vue * eyelet (n) : œillet (de chaussure) * eye-opener / eyeopener (n) : 1/ révélation (f) - It was an eye-opener : Cela nous a ouvert les yeux, Cela a a été une révélation ; 2/ (amér.) verre d’alcool pris au saut du lit * eyesore (n) : (en parlant d'un bâtiment, etc.) horreur (f) (pour la vue), verrue (f) (fig.) * eyeware (n ind. sing.) : lunettes (f pl.) * eyewitness (n) (pl. eyewitnesses) : témoin oculaire - a witness to a UFO event : le témoin d'une apparition d'ovni - multiple eyewitnesses : plusieurs témoins oculaires - eyewitness account : récit d'un témoin - eyewitness testimony : témoignage oculaire - eyewitness statement : déclaration d'un témoin oculaire c3ve30js7bay5vdp8i0kyaryzd63tov Vocabulaire anglais-français à l'intention des apprenants avancés/F 0 78011 767921 767570 2026-06-17T07:33:37Z Elnon 41284 Compléments 767921 wikitext text/x-wiki {{../Index}} === F === * fab (a) (tronc. de fabulous) (fam.) : extra (fam.), génial(e) (fam.) * fabric (n) (fa) : 1/ tissu (au prop.) - covering fabric : tissu de revêtement - fabric mask : masque en tissu ; 2/ tissu (au fig.), structure (f) - the fabric of European industry : le tissu industriel européen - the fabric of society : le tissu social ; 3/ (Bât.) structure * fabricate (v) (tr.) : 1/ fabriquer - to fabricate consent : engendrer l’adhésion ; 2/ (Presse) bidonner - to fabricate a fake piece of news : bidonner une fausse nouvelle * fabricated (ppa) : 1/ fabriqué(e), manufacturé(e) - fabricated item : pièce manufacturée (f) ; 2/ (Presse) bidonné(e), bidon (inv.) - fabricated interview : entretien bidon - fabricated piece of news : nouvelle bidonnée (f) * fabrication (n) : 1/ fabrication (f) - method of fabrication : méthode de fabrication ; 2/ faux (n) * fabulous (a) : 1/ fabuleux/-euse, fantastique ; 2/ fabuleux/-euse, sensationnel(le) ; 3/ génial(e) * face (n) (fa p) : 1/ face (f), côté ; 2/ (Usin.) face (de travail) - face grinding : rectification plane (f) ; 3/ visage, figure (f) - His face was all puckered up : Son visage était tout ratatiné - loss of face : (fait de) perdre la face, humiliation - bloated face : visage enflé - fresh face : nouveau visage, nouveau venu - face cloth (amér.) : gant (de toilette) pour le visage ; 4/ front (de taille) - the coal face : le front de taille (à la mine de charbon) ; 5/ cadran - clock face : cadran d’horloge * face (v) : 1/ (tr.) être face à, être du côté de ; 2/ (tr.) faire face à, affronter - to face headwinds : affronter des vents contraires ; 3/ (tr.) se trouver confronté(e) à, être en butte à - to face a dilemma : être confronté(e) à un dilemme - to face extinction : être menacé(e) d'extinction - to face jolts : subir des chocs ; 4/ (intr.) (to face towards) être tourné(e) vers, regarder ; 5/ (Usin.) planer, dresser * face lift / face-lift / facelift (n) : ravalement du visage - to have a facelit : se faire ravaler la devanture (fam.), se faire tirer la peau * face-plant / faceplant (n) : atterrissage sur le visage, chute sur la tronche, chute frontale - to do a faceplant : chuter sur la tronche - faceplant video : vidéo de chute sur le visage * face-plant / faceplant (v) (intr.) : s’écraser au sol la tête la première, atterrir sur le visage, faire une chute frontale, piquer du nez - She suddenly stopped and fell, face-planting on the floor : Elle s’arrêta brusquement et s’affala au sol la tête la première * face-to-face (ac) : en face à face - a face-to-face debate : un face à face * facial (a) : facial(e), du visage - facial hair : poils du visage (pl.), pilosité faciale (f) * facile (a) (fa p) : 1/ [victoire] facile ; 2/ [idée] superficiel(le), simpliste, sans raisonnement approfondi ; 3/ [supposition] spécieux/-euse * facility (n) (pl. facilities) : 1/ usine (f), installation (f), station (f), unité (f), site, atelier, centre - manufacturing facility : site de fabrication, unité de production, installation industrielle - research facility : centre de recherches - service facility : atelier de réparation ; 2/ au pl. facilities : a/ conditions favorables (f pl.), possibilités (f pl.), facilités (f pl.) ; b/ équipements, installations (f pl.), moyens, infrastructures (f pl.) - communications facilities : moyens de communication - fitness facilities : centres de remise en forme - production facilities : installations de production - sports facilities : installations sportives * facing (n) : (Usin.) planage, dressage * facings (n pl.) : (Archi.) parements * fact (n) : 1/ (a fact) fait établi - It is a fact that… : C’est un fait que… ; 2/ (fact, sans art.) (la) réalité - to distinguish fact from fiction : distinguer la réalité du mythe ; 3/ (a fact, svt au plur. facts) fait (l’occurrence) - to alter the facts : falsifier les faits, trafiquer la réalité - fact checking (Journ.) : vérification des faits rapportés - fact finding (Journ.) : recherche d’informations, enquêtes journalistiques (f pl.) * fact check (vc) (tr.) : vérifier (Journ.) - to fact check a report : vérifier la véracité des faits rapportés dans une dépêche * fact-free (ac) : 1/ [avis] qui ne repose pas sur des faits - fact-free punditry : commentaires d’experts ne reposant pas sur des faits ; 2/ [commentateur] qui ne tient pas compte des faits * factor (n) : facteur * factoring (n) : (Inf.) décomposition (f) (d’un tout en ses parties) * factory (n) (pl. factories) : usine (f) - factory complex : complexe d’usines, complexe industriel - factory farm : ferme industrielle (f) * factory-installed (ac) : monté(e) en usine, installé(e) d’origine * facts-based (ac) : reposant sur des faits, concret/-ète * factual (a) : reposant sur des faits, factuel(le) * factuality (n) : caractère factuel, réalité des faits * factually (adv.) : dans les faits * factually based (ac) : fondé(e) sur des faits réels * faculty (n) (fa p) : 1/ (pl. faculties) faculté (physique, intellectuelle) (f) ; 2/ (ind. pl.) a/ (le) corps professoral, (le) corps d'enseignants-chercheurs, (le) corps enseignant, (les) enseignants - new faculty : de nouveaux enseignants - tenured faculty : (les) professeurs titulaires - to hire faculty : embaucher des enseignants - a faculty member : un membre du corps enseignant universitaire ; b/ (la) faculté - to join the faculty : devenir membre de la faculté * fad (n) : 1/ marotte (f), dada, lubie (f) ; 2/ mode (f), vogue (f), engouement (f) - a passing fad : un engouement passager, un effet de mode * faddish (a) : 1/ à la mode, en vogue, tendance (adj. inv.) ; 2/ éphémère * fade (v) (intr.) : 1/ s’estomper, s’effacer ; 2/ disparaître (au loin) (syn. to disappear ; 3/ [son] s’affaiblir * faded (a) : fané(e), flétri(e) - faded grandeur : (la) grandeur passée * fade away (v) (intr.) : s’étioler * fader (n) : (Électron.) tirette (f) * fag (n) (brit.) (arg.) : clope (f), sèche (f) * faggot (n) : 1/ (brit.) fagot (pour le feu) ; 2/ (amér.) (vulg.) pédé, tantouse (f), tarlouze (f), tafiole (f), tapette (f) * faggotism (n) : pédérastie (f) * fail (n) : (notation universitaire) unité de valeur refusée * fail (v) : 1/ (tr.) (to fail sth) échouer à, ne pas aboutir à, ne pas réussir à ; (tr.) + inf. avec to : ne pas parvenir à + inf., ne pas arriver à + inf., renoncer à + inf., ne pas + inf. ; (intr.) ne pas réussir, échouer, ne pas aboutir - to fail miserably : échouer lamentablement ; 2/ (intr.) être défaillant(e), connaître une défaillance, être victime d’une panne - Should the main system fail : Au cas où le système principal serait défaillant ; 3/ (tr.) to fail sb : faillir à ses devoirs envers qn ; 4/ - I shall not fail to do so : Je n'y manquerai pas * failing (ppra) : en dysfonctionnement * failings (n pl.) : faiblesses (f pl.) * failing which (loc.) : à défaut de quoi * failover (n) : (Inf.) basculement (d’un système informatique défaillant à son double) - to perform a failover : opérer un basculement - automatic failover : basculement automatique - manual failover : basculement manuel * fail-safe (ac) : à sécurité intégrée * failure (n) : 1/ échec - a recipe for failure : l’échec quasi assuré - academic failure : (l’)échec scolaire - dismal failure : échec épouvantable ; 2/ incident, avarie (f), dysfonctionnement, défaillance (f) - to produce a failure : engendrer une défaillance - kidney failure : dysfonctionnement rénal - liver failure : insuffisance hépathique ; 3/ impossibilité (f) (to + inf., de + inf.) * failure-prone (ac) : sujet(te) aux pannes - failure-prone item : élément sujet aux pannes * failure-proneness (nc) : tendance à avoir des défaillances, tendance à tomber en panne - to reduce the failure-proneness of a system : réduire la tendance d’un système à tomber en panne * fain (adv.) (arch.) : volontiers - I would fain know what you have to say : Je voudrais bien savoir ce que vous avez à me dire * faint (a) : faible, imperceptible - faint warning : timide avertissement * faint (n) : évanouissement - to be in a faint : être évanoui(e) * faint (v) (intr.) : se trouver mal, s’évanouir * fair (n) : 1/ [cheveux] blond(s), [peau] clair(e) ; 2/ juste, équitable, honnête - It’s only fair : Ce n’est que justice - to be fair though : pour être honnête cependant - by fair means : par des moyens licites, par des moyens honnêtes - by fair means or foul : de gré ou de force - fair game : cible légitime - fair play : acceptation loyale des règles (anton. : foul pay) - fair price : prix raisonnable - fair trade : (le) commerce équitable (anton. unfair) ; 3/ [cheveux, teint) blond(e), clair(e) * fair (adv.) (= fairly) : franc jeu - to play fair : jouer franc jeu, être beau joueur - They don’t play fair : Ils ne jouent pas franc jeu * fair (n) : foire (f) - boot fair : vente depuis l’arrière de sa voiture (syn. boot sale) - fun fair : fête foraine (f) (syn. amusement fair) - trade fair : foire commerciale, salon professionnel - World’s fair : Exposition universelle (f) * fairly (adv.) : 1/ équitablement, avec impartialité (anton. unfairly) ; 2/ (+ adj.) assez, passablement, plutôt * fairness (n) : 1/ blondeur (f) (des cheveux), blancheur (f) (de la peau) ; 2/ équité (f), impartialité (f) * fairy (n) (pl. fairies) : fée (f) - the tooth fairy : la petite souris (litt. la fée des dents) - fairy tale : conte de fée * faith (n) : foi (f) - to lose faith in sb : perdre confiance en qn (syn. to lose confidence in sb) - faith school : école religieuse, école confessionnelle * faithful (a) : fidèle * faithfully (adv) : fidèlement - to faithfully recreate the past : recréer fidèlement le passé * faithfulness (n) : fidélité (f) * fake (a) : artificiel(le), bidon (inv.) (anton. true, real) - fake anglicism : faux anglicisme - fake interview : entretien bidon - fake news : nouvelles bidonnées (f pl.), fausses nouvelles (f pl.), fausses infos (f pl.) (anton. real news, true news) - fake nude : faux nu (de célébrité) - fake student : faux étudiant * fake (n) : 1/ contrefaçon (f), faux, imitation (f), copie (f) ; 2/ information bidon : 3/ imposture (f) ; 4/ imposteur * fake (v) (tr.) : fabriquer de toutes pièces, bidonner - to fake articles : (Journ.) bidonner de articles * faker (n) : imposteur, charlatan - news faker : bidonneur de fausses nouvelles, manipulateur de l’information * fall (n) : 1/ chute (f) - free fall : chute libre (au prop. comme au fig.) - to take the fall for sb : porter le chapeau à la place de qn ; 2/ baisse (f) ; 3/ défaite (f) ; 4/ cascade (f) ; 5/ (amér.) automne (brit. autumn) - the fall armyworm : la légionnaire d’automne - the fall color season (amér.) : la saison des couleurs * fall (v) (fell, fallen) (intr.) : 1/ tomber, choir ; 2/ baisser, cheoir, diminuer - to have fallen by a third : avoir diminué d'un tiers - Shares fell by 20 % : Les cours ont baissé de 20% ; 3/ - to fall for sb : s’éprendre de qn, tomber épris de qn - to fall for sth : s’enthousiasmer pour qch * fall apart (v) (fell, fallen) (intr.) : tomber en morceaux, partir en quenouille * fall behind (v) (fell, fallen) (intr.) : prendre du retard - to fall behind technologically : prendre du retard sur le plan technologique - to fall behind with one's deliveries : prendre du retard dans ses livraisons * fallboard (n) : couvercle (de clavier de piano) - to slam the fallboard : faire claquer le couvercle - lockable fallboard : couvercle verrouillable * fallen (pp de to fall) * fallen (a) : 1/ tombé(e) (à terre) – fallen tree : arbre tombé, arbre abattu ; 2/ tombé(e), mort(e) au combat ; 2/ déchu(e) - fallen angel : ange déchu * fall off (v) (fell, fallen) (intr.) : 1/ se détacher, tomber ; 2/ chuter ; 3/ - to fall off to sleep : s’endormir d’un coup * fallow (a) : en jachère - to lie fallow : être en jachère * false (a) : faux / fausse (anton. true, vrai) - false cognate : faux-ami - false information : informations fausses (f pl.) - false labour : fausses contractions (f pl.), fausse alerte (f) - false lead : fausse piste (f) - false news items : fausses nouvelles * falsehood (n) : fausseté (f) * falsely (adv.) : faussement, à tort (anton. truly) * falsifiability (n) (fa) : réfutabilité (f) - falsifiability rule : règle de la réfutabilité * falsifiable (a) (fa) : réfutable * falter (v) (intr.) : 1/ chanceler, vaciller ; 2/ hésiter * fame (n) : renommée (f), célébrité (f), notoriété (f) - his/her 15 minutes of fame : son quart d’heure de célébrité * famed (a) 1/ [personne] de renom, renommé(e) - famed journalist George Seldes : le célèbre journaliste George Seldes ; 2/ [chose] de légende, légendaire * familiar (a) : familier/-ière - familiar fixture : élément familier, élément faisant partie du décor * family (n) (pl. families) : famille (f) - the latest offspring in the family : le dernier né de la famille - my immediate family : ma famille proche, mes proches - to marry into a family : s’allier (par le mariage) à une famille - decent family : famille respectable - old family : famille de vieille souche - family apiary : rucher familial - family memorabilia : anciens objets de famille - family planning : planification familiale (f) - family trip : séjour en famille * family-owned (ac) : familial(e) - family-owned business : entreprise familiale (f) * famine (n) : famine (f) * famished (a) : affamé(e) * famous (a) : célèbre, notoire * famously (adv.) : notoirement * fan (n) : 1/ ventilateur - electric fan : ventilateur électrique ; 2/ éventail * fan (n) (tronc. de fanatic (n) : fanatique, passionné) fana - cycling fan : fana de vélo * fanatic (n) : maniaque (n) - religious fanatics : fanatiques religieux * fanatical (a) : maniaque (a) - He's fanatical about hygiene : C'est un maniaque de l'hygiène * fancier (n) (brit.) : amateur, connaisseur - bird fancier : a/ ornithologue amateur ; b/ marchand d’oiseaux, aviculteur * fanciful (a) : [pers.] capricieux/-euse, fantasque ; [histoire] fantaisiste, irréaliste * fancy (n) (pl. fancies) : fantaisie, lubie, caprice (syn. whim) - to take a fancy : se prendre d’affection (for, pour) - fancy dress : déguisement - fancy drink : boisson chic, boisson branchée * fancy (v) (tr.) : 1/ imaginer ; 2/ trouver à son goût - Do you fancy her? : Est-ce qu’elle te plaît ? * fancy man (n) : 1/ béguin ; 2/ gigolo, souteneur * fancy woman (n) : 1/ amante (f), maîtresse (f) ; 2/ femme aux mœurs légères ; 3/ prostituée (f) * fandom (n) : (le) monde des fanas * fan out (v) (intr.) : se déployer (en éventail) * fantastic (a) : 1/ fantastique - fantastic places : lieux fantastiques ; 2/ formidable * fantasticalness (n) : extravagance (f) - the fantasticalness of these writings : le caractère extravagant de ces écrits * fantasy (n) (pl. fantasies) (fa) : 1/ (a fantasy) fantasme, idée fantaisiste (f) ; 2/ (le) fantastique (n), (la) science-fiction de second ordre - science fantasy : (le) fantastique scientifique * fantasy-prone (ac) : enclin(e) à l’affabulation - fantasy-prone personality : personnalité encline à l’affabulation * FAQ (n) (init. de frequently asked questions : foire aux questions, questions-réponses, litt. « questions souvent posées ») * far (adv.) : 1/ loin - (not to) be far behind : n'être pas loin derrière - as far as… : jusqu’à… ; 2/ (+ compar. de supériorité) beaucoup, bien - far lower : bien plus bas - far more + adj. : bien plus + adj. * farcical (a) : 1/ qui tient de la farce, qui tourne à la farce ; 2/ grotesque, ridicule * farcically (adv.) : de façon grotesque, de façon ridicule * fare (n) : prix de la course (d'un taxi) - train fare : billet de train * fare (v) (intr.) : 1/ aller (bien ou mal), avoir un sort (bon ou mauvais), se trouver dans telle ou telle situation - He fared ill : Les choses allèrent mal pour lui - You might go farther and fare worse : Vous pourriez aller plus loin et trouver pire ; 2/ (intr.) advenir, se passer ; 3/ (intr.) se débrouiller ; 4/ (intr.) voyager * farewell ! (interj.) : adieu ! * farewell (n) : 1/ adieux (pl.) - He made his farewell and left : Il fit ses adieux et partit ; 2/ départ - farewell party : fête d’adieu (f) * farewell (v) (tr.) : faire ses adieux (sb, à qn) - to be farewelled by a crowd of wellwishers : être salué à son départ par une foule de sympathisants * far-fetched (a) : tiré(e) par les cheveux, capillotracté(e) (hum.), farfelu(e), irréaliste, difficile à croire, invraisemblable - far-fetched story : histoire à dormir debout * far-flung (ac) : (qui se trouve) en des endroits reculés, au bout du monde - far-flung empire : vaste empire - far-flung parts of the world : endroits reculés du monde * far-gone (ac) (svt attribut) : 1/ [état] avancé(e) ; 2/ [présence] éreinté(e) ; 3/ [malade] très atteint(e) * farm (n) : 1/ ferme (f) - small farm : fermette (f) - factory farm : ferme industrielle - stud farm : haras - farm equipment : matériel agricole - farm holdings : exploitations agricoles (f) - farm machinery : machines agricoles (f pl.) - farm yard : cour de ferme ; 2/ élevage - salmon farm : élévage de saumons, ferme salmonicole ; 3/ - sewage farm : champs d’épandage (pl.) ; 4/ - health farm (brit.) : centre de cure, centre de remise en forme (syn. health spa) * farm (v) (tr.) : 1/ cultiver (des produits agricoles) ; 2/ élever (des animaux) - to farm salmon : élever des saumons * farmed (ppa) : d’élevage - farmed salmon : saumon d’élevage * farmer (n) : fermier - cattle farmer : éleveur de bétail (syn. cattle rancher) - chicken farmer : éleveur de poulets, aviculteur - produce-sharing farmer : métayer * farming (n) : 1/ agriculture (f) - chemical farming : agriculture chimique - no-till farming : agriculture sans labourage - organic farming : agriculture bio(logique) ; 2/ élevage (l’activité) - fish farming : élevage de poissons, pisciculture (f) - maggot farming : élevage d’asticots - sheep farming : élevage de moutons, élevage ovin * farmstead (n) : ferme (f) (l’exploitation agricole) * farrago (n) (pl. farragos (brit.) / farragoes (amér.) : ramassis, méli-mélo, mélange, pot-pourri * far-reaching (ac) : aux vastes implications * far-seeing (ac) : qui voit loin, prévoyant(e) * far-sighted (ac) (amér.) : 1/ hypermétrope ; 2/ presbyte (syn. brit. long-sighted) * fart (n) : 1/ pet, vent (malodorant) ; 2/ - old fart : vieux schnoque * fart (v) (intr.) : péter * farther (a) (comp. de supériorité de far) : 1/ plus éloigné(e), autre ; 2/ plus éloigné(e), plus lointain(e) * farther (adv.) : plus loin * farthest (a) (superl. de far) : - the farthest : le plus loin * farting (n) : pets (pl.) - farting contest : concours de pets * fascism (n) : (le) fascisme * fascistic (a) : fasciste * fashion (n) : mode (f) - fashion design : création textile - fashion designer : styliste de mode, créateur/-trice de mode - fashion house : maison de haute couture, maison de couture, entreprise de mode - fashion industry : industrie de la mode - fashion photographer : photographe de mode (m/f) - fashion shoot : séance de photos de mode - fashion stylist : styliste de mode - fashion word : mot à la mode * fashionable (a) : à la mode (anton. unfashionable) * fashion-conscious (ac) : [individu] qui suit la mode * fashionista (n) : modeuse (f), suiveuse (f) de la mode, victime (f) de la mode * fast (a) : 1/ rapide - fast mover : produit à rotation rapide - fast food : restauration rapide (f), bouffe rapide (f) ; 2/ bien attaché(e), bien assujetti(e), solidement fixé(e) - to make a boat fast : amarrer un bateau * fast (adv.) : 1/ rapidement, vite ; 2/ fermement, solidement * fast (n) : jeûne * fast (v) (intr.) : jeûner * fast-changing (ac) : changeant rapidement - fast-changing technology : technologie évoluant rapidement * fasten (v) : 1/ (tr.) attacher ; (intr.) s’attacher ; 2/ imposer (upon/on, à), affubler (upon/on, de) - to fasten a nickname upon sb : affubler qn d’un surnom - Do not fasten the blame on him! : Ne rejette pas / Ne rejetez pas la faute sur lui ! * fastener (n) : dispositif de fixation * fastening (n) : fixation (f) * faster (a) (compar. de supériorité de fast, rapide) plus rapide * faster-growing (ac) : à croissance plus rapide * faster than light (ac) (abr. FTL) : plus rapide que la lumière (abr. PLR), supraluminique * fastest-growing (ac) : à la croissance la plus rapide - the fastest-growing segments of the computing industry : les secteurs à la croissance la plus rapide de l’industrie informatique * fast-growing (ac) : en croissance rapide, en rapide expansion, en plein essor, dynamique (anton. slow-growing) - fast-growing population : population en croissance rapide / à forte croissance - fast-growing demand : demande croissante (f) * fastidious (a) (fa) : maniaque, méticuleux/-euse, tatillon(ne) * fastidiously (adv.) (fa) : soigneusement, méticuleusement, de façon tatillonne * fasting (n) : (la) pratique du jeûne, (le) jeûne * fast-moving (ac) : [article] à rotation rapide * fast-paced (ac) : au rythme rapide, rapide - fast-paced evolution : évolution rapide (f) (anton. slow-paced) * fast-spreading (ac) : [incendie] se répandant rapidement, se propageant rapidement * fast-track (v) (tr.) : accélérer - to be fast-tracked : être l’objet d’un traitement accéléré * fast-tracked (a) : accéléré(e) - fast-tracked delivery : livraison accélérée (f) * fat (a) (fa) : 1/ gras(se) ; 2/ gros(se) - a fat fee : un gros cachet * fat (n) : 1/ graisse (f) - to be trimmed of fat : être dégraissé(e) - duck fat : graisse de canard - fat farm (amér.) : institut d’amaigrissement ; 2/ gras (n) - saturated fats : acides gras - The fat is in the fire : Les choses vont se gâter, Ça va barder * fatal (a) : fatal(e), mortel(le) - fatal accident : accident mortel - fatal blow : coup fatal (to sth, porté à qch) - the fatal sisters : les Parques (f pl.) * fatalism (n) : fatalisme * fatalistic (a) : fataliste * fatality (n) (pl. fatalities) (fa) : mort (masc.) (dans un accident) - There were no fatalities : Il n'y eut pas de morts - traffic fatalities : tués sur les routes * fatally (adv.) (fa) : mortellement * fate (n) : destin, destinée (f), sort - to suffer the same fate as... : subir le même sort que... - a stroke of fate : un coup du sort (syn. a blow of fate) - the cruel blow of fate that struck me : ce coup cruel du sort qui m’a frappé * fat-free (ac) : 1/ sans graisse, dégraissé(e) ; 2/ sans gras * father (n) : père - father and son : père et fils * father (v) (tr.) : engendrer * fatherhood (n) : paternité (f) * fathom (n) : (mesure nautique) brasse (f) * fathom (v) (tr.) : 1/ sonder ; 2/ (brit.) comprendre * fathom out (v) (tr.) : comprendre, figer (fam.) * fatigue (n) : 1/ fatigue (f) (d’un matériau) - part susceptible for fatigue : pièce de fatigue - fatigue resistance : résistance à la fatigue, tenue en fatigue - fatigue strength : résistance à la fatigue, tenue en fatigue ; 2/ (au pl., fatigues) tenue de combat - dressed in fatigues : ayant revêtu une tenue de combat * fatigue-resistant (ac) : résistant à la fatigue * fat-laden (ac) : riche en graisses - fat-laden meal : repas riche en graisses * fatten (v) (tr.) : engraisser * fattening (a) : qui fait grossir * fattie (n) : (fam.) gros lard * fatty (a) : gras(se) - fatty meat : viande grasse (f) * fatuity (n) (fa) : stupidité (f), sottise (f), imbécillité (f) * fatuous (a) : fat(e) - a fatuous person : un fat * fault (n) (fa p) : 1/ faute (f) - It’s your fault : C’est de ta faute ; 2/ défaut, vice, défectuosité (f), imperfection (f) - fault of construction : défaut de construction - fault in material : vice de matière, défaut dans la matière - design fault : défaut de conception - to check sth for possible faults : rechercher d’éventuels défauts dans qch - to detect a fault : déceler une défectuosité - to find fault with sth : critiquer qch ; 3/ dérangement, défaillance (f), ennui technique, ennui mécanique, panne (f), incident de fonctionnement, avarie (f), anomalie (f), erreur - to identify a fault : trouver la cause d'une défaillance ; 4/ faille (géologique) (f) - seismic fault : faille sismique - fault diagnostics : moyens de diagnostic d’erreurs * fault-free (ac) : sans ennuis, sans incidents, au point * faultless (a) : sans défauts * faultlessly (adv.) : impeccablement * fault-prone (ac) : tendant à tomber en panne, instable - fault-prone software program : programme logiciel instable * fault-proneness (nc) : propension à la panne, instabilité (f) * faulty (a) : défectueux/-euse, défaillant(e) - faulty design : défaut de conception, défaut dans le plan - faulty material : défaut dans les matériaux * fauna (n) : faune (f) * faux-bois (n) : faux-bois - faux-bois artist : créateur de faux-bois - faux-bois pieces : ouvrages en faux-bois * favor (amér.) / favour (brit.) (n) : 1/ service (rendu) - Do me a favour : Rends-moi service / Rendez-moi service ; 2/ faveur (f) * favor (amér.) / favour (v) (tr.) : 1/ favoriser (qn) ; 2/ être pour, être partisan de, opter pour, pencher pour, préférer * favourite (brit.) / favorite (amér.) (a) : 1/ préféré(e) ; 2/ en vogue * fawn (n) : faon * fawn (up) (v) (intr.) : - to fawn up on sb : flatter qn bassement, flagorner qn * fax (n) (pl. faxes) (tronc. de facsimile) : télécopie (f) - fax paper : papier pour photocopieur * fear (n) : crainte (f), peur (f) - to sow fear : semer la peur - fear monger : colporteur de peur, marchand d’épouvante * fear (v) (tr.) : craindre, redouter * feared (ppa) : redouté(e) - a feared event : un événement redouté * fearful (a) : 1/ craintif/-ive ; 2/ affreux/-euse, effrayant(e) - a fearful accident : un terrible accident * fearless (a) : 1/ sans peur ; 2/ intrépide * feasibility (n) : faisabilité (f) * feasible (a) : faisable (anton. unfeasible) * feast (n) : 1/ festin, banquet ; 2/ régal * feast (v) (intr.) : se régaler (on sth, de qch) * feat (n) : exploit - to achieve a technological feat : réaliser un exploit technologique * feature (n) : 1/ trait, caractéristique (f), particularité (f), propriété (f) ; 2/ fonction (f), fonctionnalité (f) - editing feature : fonction de modification ; 3/ dispositif ; 4/ personnage (connu) * feature (n) (abr. de feature film) (Cin.) long métrage (plus de 40 min.) * feature (n) (abr. de feature article) : (Presse) grand article, grande enquête (f), grand reportage, reportage spécial, article spécialisé, article de fond, dossier (on sth / sb, sur qch / qn) (syn. in-depth story) - [journalist] to do a feature in a newspaper : [journaliste] être chroniqueur dans un journal - [magazine] to have a feature : [revue] publier un article de fond (on sth / sb, sur qch / qn) - women’s features : pages féminines (f pl.) - feature writer : chroniqueur, articlier * feature (v) : 1/ (tr.) comporter, présenter, arborer, avoir (telle ou telle caractéristique) ; 2/ (tr.) (Cin.) [film] faire figurer en tant que vedette, mettre en vedette avoir pour vedette ; (intr.) (Cin.) [acteur/actrice] figurer en tant que vedette (in, dans), jouer (in, dans) ; 3/ (intr.) (Rap) être présent, apparaître, figurer (sur l'album d'un congénère) * featured (ppa) : mis(e) en vedette, sélectionné(e) - featured photo : (Presse) photo (mise en) vedette (sur la une d'un journal, d’une revue), photo de couverture, photo sélectionnée (pour la une, la couverture) * feature-intensive (ac) : ayant une myriade de fonctions * featureless (a) : sans traits distinctifs, sans traits marquants * featurette (n) (abr. de featurette film) : court métrage / court-métrage (moins de 40 min.) (syn. short film) * fed (prét. de to feed) * fed (pp de to feed) * federal (a) : fédéral(e) - Federal Reporter (amér.) : journaliste judiciaire * federally (adv.) : sur le plan fédéral * fed up (ppa) : qui en a assez, qui en a plein le dos, qui en a soupé (with sth/sb, de qch/qn) * fees (n pl.) : honoraires (pl.), commissions (f pl.) - impound fees : frais de récupération d’un véhicule saisi * fee-paying (ac) : payant(e) - fee-paying public school : école privée payante * feeble (a) : faible * feebly (adv.) : faiblement * feed (n) : 1/ alimentation (f), aliments (pl.) - tainted feed : aliments avariés (pour animaux) ; 2/ diffussion (f) - Twitter feed : fil d’actualité Twitter * feed (v) (fed, fed) : 1/ (tr.) nourrir ; (intr.) se nourrir ; 2/ (tr.) fournir, envoyer, introduire * feedback (n) : 1/ réaction (f), rétroaction (f) ; 2/ retour (de force) ; 3/ renvoi d'informations, retour d'informations ; 4/ (n ind. sing.) informations (f pl.) en retour, avis (pl.), commentaires (pl.) (des utilisateurs) - spoken feedback : réponses orales (f pl.) * feedback-driven (ac) : inspiré(e) par les retours d’expérience - feedback-driven data management : (Inf.) gestion de données inspirée par les retours d’expérience * feeder (n) : dispositif d’approvisionnement, chargeur * feeding (n) : alimentation (f) * feedstock (n) : (Usin.) matière première (f) * fee-free (ac) : gratuit(e), non payant(e) - fee-free college : université gratuite (f) * feel (v) (felt, felt) : (tr.) sentir - to feel one’s way along : se frayer un chemin à tâtons ; (intr.) se sentir (+ adj. ou pp) - to feel excluded : se sentir exclu(e) - to feel good : se sentir bien - to feel uncomfortable : se sentir mal à l’aise - to feel well : se sentir en bonne santé * feeler (n) : palpeur * feel-good (ac) : qui rend optimiste - feel-good film : film qui rend optimiste * feeling (n) : 1/ sentiment - to have mixed feelings : avoir des sentiments mitigés ; 2/ (Jazz, Blues, Rock) sensibilité musicale (f) * feign (v) (tr.) : feindre, simuler * feint (n) : feinte (f) * feint (v) : (tr.) feindre - to feint a punch : faire semblant de donner un coup de poing ; (intr.) faire une feinte, feindre * fell (v) (tr.) : abattre (a tree, un arbre) * fell (prét. de to fall) * fella (n) (amér.) : 1/ mec, gars ; 2/ copain, petit copain * fellow (n) : 1/ gars, type - He’s a jolly good fellow : C’est un gars rudement bien ; 2/ confrère, consœur (f) - fellow student : condisciple étudiant(e) ; 3/ membre (d’une académie, d’une société savante) ; 3/ boursier/-ière * fellowhip (n) : bourse (f) - research fellowship : bourse de recherche * felon (n) (fa) : délinquant(e) (n), criminel(le) (n) - convicted felon : repris de justice * felonious (a) : criminel(le) - felonious entry : entrée avec effraction * felony (n) (pl. felonies) (amér.) (fa) : crime, forfait - to perpetrate a felony : commettre un crime * felt (prét. de to feel) * felt (pp de to feel) * felt (n) : feutre (la matière) - felt pen : feutre (le stylo) * female (a) : femelle (pour les animaux), de sexe féminin (pour les personnes) - female actor : actrice (f) - female writer : autrice (f) - female gender : sexe féminin * female (n) : 1/ femelle (n) (f) ; 2/ femme (f) * fen (n) (brit.) : marais, marécage * fence (n) : 1/ clôture (f), enceinte (f) ; 2/ barrière (f) ; 3/ (arg.) recéleur * fence (v) : 1/ (tr.) clôturer ; 2/ (arg.) (tr.) fourguer (des marchandises volées) ; (intr.) faire du recel ; 3/ (intr.) faire de l’escrime * fencing (n) : 1/ escrime (f) - fencing master : maître d’armes ; 2/ hostilités (f pl.) * fender (n) : 1/ garde-feu ; 2/ (amér.) pare-chocs (d’auto) - fender bender : petit accrochage, petit accident (de voiture), (de la) tôle froissée ; 3/ (amér.) garde-boue (de vélo) (masc.) * fend off (v) (tr.) : repousser - to fend off a counter-attack : repousser une contre-attaque * fennel (n) : fenouil * ferking (a) (= fucking) : - You, ferking whore! : Espèce de sale pute ! * ferret (n) : furet * ferrite (n) : ferrite (f) * ferroalloy (n) : ferro-alliage * ferry (n) (pl. ferries) : bac (pour traverser) * ferry (v) (tr.) : transporter, transborder * fertile (a) : fertile - fertile soil : sol fertile * fertility (n) : fertilité (f) * fertilise (brit.) / fertilize (amér.) (v) (tr.) : fertiliser * fertiliser (brit.) / fertilizer (amér.) (n) : engrais * fest (n) (tronc. de festival : festival) : fête (de qch) - beer fest : fête de la bière - film fest : festival cinématographique - poetry fest : fête de la poésie - sausage fest : fête où il y a trop d’hommes (syn. sausage party) * fester (v) (intr.) : suppurer * festival (n) : 1/ fête (f) - festival of lights : fête des lumières - harvest festival : fête de la moisson ; 2/ (Mus., Cin., etc.) festival - to headline a festival : être tête d’affiche d’un festival; (intr.) être en tête d’affiche, être tête d’affiche - hot-air balloon festival : festival de montgolfières - jazz festival : festival de jazz - rock festival : festival de rock 3/ - festival curatordhip : programmation de festival - festival goer : festivalier, festivalière * fetch (v) (tr.) : 1/ aller chercher (from, dans), quérir (from, dans); 2/ amener (qn), apporter (qch) - to fetch parts to the technician's position : (Usin.) apporter les pièces à domicile au compagnon * fetishism (n) : fétichisme - diaper fetishism : fétichisme des couches * fetishist (n) : fétichiste (n m/f) * fetishist (a) : fétichiste (a) * fetishistic (a) : fétichiste (a) * fetter (v) (tr.) : entraver * feud (n) : querelle (f), dissension (f) * feudalistic (a) : féodal(e) * feverish (a) : fiévreux/-euse - You’re not feverish : Tu n’as pas la fièvre * few (quantif. + n pl.) : 1/ peu de ; 2/ (a few) quelques - in just a few minutes en quelques minutes à peine * fiancé / fiance (n) : fiancé * fib (n) : petit mensonge, bobard - to tell fibs : raconter des bobards * fib (v) (intr.) : dire un mensonge, raconter un bobard * fibre (brit) / fiber (amér.) (n) : fibre (f) - optical fibre : (la) fibre optique - fiber optics (sing.) : (le domaine de) la fibre optique * fickle (a) : versatile * fickleness (n) : versatilité (f) * fiction (n) : littérature d’imagination - the craft of fiction : l'art du romancier - science fiction : (l')anticipation scientifique (obs.), (la) science-fiction - fiction writer : romancier * fictional (a) : romancé(e) * fiddle (n) : violon, crincrin (en folk music et country music) * fiddle (v) (intr.) : tripoter (about, with) * fiddle about (v) (intr.) : perdre son temps * fiddler (n) : violoneux (n) * fidget (v) (intr.) : remuer, gigoter * fidget about (v) (intr.) : gigoter dans tous les sens, ne pas tenir en place * field (n) : 1/ champ - fields under cultivation : champs cultivés, cultures (f pl.) - poppy field : champ de pavots - wheat field : champ de blé - field builder : faiseur de champs - field mouse : mulot ; 2/ (le) terrain - in the field : sur le terrain, en campagne, en clientèle - field man : représentant (qui se déplace) ; 3/ terrain (de sport) - football field : terrain de football ; 4/ domaine (d’intérêt), secteur (d’activité) - field of activity : secteur d’activité * field-installable (ac) : installable en clientèle * fiend (n) : 1/ démon, esprit malin ; 2/ fléau, peste (f) - dope fiend : drogué (n) - sex fiend : obsédé sexuel * fiendish (a) : diabolique, démoniaque * fiendishly (adv.) : diaboliquement * fierce (a) : 1/ farouche ; 2/ féroce * fiercely (adv.) : 1/ d’un air farouche ; 2/ d’un air féroce * fiery (a) : 1/ brûlant(e) ; 2/ [tempérament] sanguin(e) * fife (n) : fifre * fifth (a) : cinquième (aussi 5th) * fifth column (n) : cinquième colonne (f), parti de l’étranger * fifth columnist (n) : membre de la cinquième colonne, partisan de l’étranger, traître / traitresse * fifties (n pl.) : 1/ nombres 50 à 59 ; 2/ températures 50 à 59 (f pl.) ; 3/ latitudes 50 à 59 (f pl.) - the howling fifties : les cinquantièmes hurlants (parallèles 50 à 59 des océans de l'hémisphère sud) ; 4/ années 50 à 59 (f pl.) * fifty (n) : cinquante * fig (n) : figue (f) - fig leaf : (au prop.) feuille de figuier ; (au fig.) feuille de vigne, couverture (f) - to harvest figs : récolter des figues * figgy (a) : aux figues - figgy pudding : gâteau aux figues * fight (n) : combat, lutte, affrontement - peer-to-peer fight : combat d’égal à égal * fight (v) (fought, fought) : (tr.) combattre, lutter contre - to fight disinformation : lutter contre la désinformation ; (intr.) se battre * fight back (v) (intr.) : contre-attaquer, réagir * fighter (n) : combattant (n) - fire fighter : sapeur-pompier, pompier * fighting-age (ac) : en âge de combattre - fighting-age men : hommes en âge de combattre * fight off (v) (fought, fought) (tr.) : repousser, résister à - to fight off deflation : lutter contre la déflation * figment (n) : création (f), invention (f) - a figment of sb's imagination : le fruit de l'imagination de qn * figurative (a) : 1/ figuré(e) ; 2/ figuratif/-ive * figure (n) (fa p) : 1/ silhouette (f), apparence (f), taille (f) - I have the same figure now as when I was 18 : J’ai la même silhouette aujourd'hui que lorsque j'avais 18 ans ; 2/ chiffre, valeur (f), somme (calculée) (f), statistique (f) - round figure : chiffre rond ; 3/ (plus rarement) figure géométrique (f) ; 4/ figure acrobatique (f) - figure skater : patineur artistique, patineuse artistique - figure skating : patinage artistique ; 5/ figure (de style, de rhétorique) - figure of speech : figure de style ; 6/ figure (illustration numérotée d’un article, d’un livre) * figure (v) (tr.) : 1/ estimer, évaluer ; 2/ penser, estimer - to figure that… : se dire que… * figurehead (n) : 1/ (prop. et fig.) figure de proue ; 2/ homme de paille, prête-nom (masc.) * figure out (v) (tr.) : 1/ imaginer, échafauder ; 2/ résoudre (un problème) ; 3/ comprendre * filament-wind (vc) (tr.) : bobiner des filaments de * filch (v) (tr.) : voler (from sb, à qn) * file (n) (fa) : 1/ (Inf.) fichier - computer file : fichier informatique - data file : fichier de données - program file : fichier (d'exécution) de programme - file name : nom de fichier - file server : serveur de fichiers ; 2/ lime (f) (l'outil) - nail file : lime à ongles * file (v) (tr.) : classer (sous forme de fichier) - to file a message : archiver un message * file (v) (intr.) : défiler * file (down) (v) (tr.) : limer - to file lengthwise : limer dans le sens de la longueur * filibuster (n) : obstruction parlementaire (f) * filicide (n) : acte de tuer son fils ou sa fille * filigree (n) : filigrane * filigreed (a) : filigrané(e), en filigrane * filing (n) : classification (f) - filing cabinet : classeur à tiroirs - filing system : système de classification de fichiers * filing (n) : limage * filings (n pl.) : limaille (f) * Filipina (n pr) : Philippine (fém.) * Filipino (a) : philippin(e) (sans maj.) (aussi Philippine) * Filipino (n pr.) : Philippin (le ressortissant) * Filipino (n) : philippin (le langage) * fill (n) : content (n) - to eat one’s fill : manger son content, manger à sa faim, être rassasié(e) * fill (v) : (tr.) remplir - to fill the needs of : satisfaire les besoins de ; (intr.) se remplir * filler (n) : 1/ rembourrage ; 2/ (Bât.) enduit, mastic ; 3/ (Presse) bouche-trou, passe-partout - filler item : article bouche-trou, petit article pour combler ; 4/ (Ling.) mot de remplissage, mot bouche-trou * fill in (v) (tr.) : remplir, compléter - to fill in a form : compléter un formulaire * filling (n) : 1/ (l’activité) (le) remplissage - filling spout : goulotte de remplissage ; 3/ (l’objet) plombage (dentaire) * fillings (n pl.) : (Archi.) fourrure (f) (entre deux parements) * fillip (n) : 1/ chiquenaude (f), pichenette (f) ; 2/ petit coup de fouet, encouragement, stimulant ; 3/ rien, bagatelle (f) * fillip (v) (tr.) : donner une chiquenaude à (qch) * filly (n) (pl. fillies) 1/ pouliche (f) ; 2/ (arg., vieil.) fille (f), jeune femme (f) * film (n) : 1/ fine couche (f), pellicule (f) - thin film : pellicule fine, film mince, couche mince - ultra-thin film : pellicule ultra-fine ; 2/ pellicule (cinématographique) - film canister : boîte de film / à film, boîtier de film / à film ; 3/ film (syn. amér. movie) - to be in a film : jouer dans un film - to make a film : faire un film - (the) making of the film : (les) coulisses (pl.) du tournage, (les) secrets (pl.) du tournage - cult film : film mythique, film culte (anglic.) - detective film : film policier (syn. crime film) - feature film : long métrage (plus de 40 min.) - featurette film : court-métrage / court métrage (moins de 40 min) - full-length film : long métrage - (the) film that's so bad it's good : (le) nanar - genre film : film de genre (var. amér. genre movie) - historical film : film historique (syn. period film) - the main film : le film principal, le grand film - seminal film : film fondateur, film phare - a very short film : un très court (moins de 3 min.) - special effects film : film à effets spéciaux - talking film : film parlant (abr. fam. talkie (n)) (anton. silent film film muet) - film/movie) actor : acteur de cinéma, comédien - film/movie actress : actrice de cinéma, comédienne - film animator : auteur de films d’animation - the film business : l'industrie cinématographique (syn. the film industry) - film crew : équipe de tournage - film club : ciné-club (syn. film soc) - film criticism : (la) critique de films (l'activité) - film director : réalisateur, metteur en scène - film fan : cinéphile (syn. film enthusiast - cinema goer) - film maker : cinéaste (syn. cinematographer) - film making (brit.) : réalisation de films (amér. filmmaking) - film review : (une) critique de film (l'article) - film reviewer : (un) critique de films/cinéma (la personne) - film rights : droits d’adaptation - film soc : ciné-club (syn. film club) - film festival : festival cinématographique (abr. film fest) * film (v) : (tr.) filmer, tourner ; (intr.) être filmé(e) - to film well : être photogénique * filmgoer (n) : amateur de films, amateur de cinéma * filmless (a) : sans pellicule, sans film - filmless camera : caméra sans film * filmmaking (n) (amér.) : réalisation de films (brit . film making) * filth (n) : saleté (f) * filthy (a) : sale, dégoûtant(e), immonde * fin (n) (fa) : nageoire (f) * final (a) 1/ final(e), de fin, ultime - final check : vérification ultime (f) - final checkout : contrôle final - final development work : dernières mises au point ; 2/ définitif/-ive - That’s final! : C’est définitif !, C’est fini maintenant !, Ça suffit ! * finalise (brit.) / finalize (amér.) (v) (tr.) : mener à terme, mener à bonne fin, mettre la dernière main à, mettre au point, achever (une tâche), parachever (un rapport, une étude), conclure un (projet) * finally (adv.) : 1/ finalement, enfin ; 2/ définitivement - ; 3/ Finally, ... (a m p) (t d p) : a/ Enfin, … ; b/ En définitive, … * finance (n) : 1/ (la) finance ; 2/ au pl. finances : finances, fonds - My finances are getting low : Mes fonds baissent * financial (a) : financier/-ière - chief financial officer : directeur financier - financial advice : conseils financiers (pl.) - financial institution : institution financière (f) - financial technology) : (la) technologie financière, (les) technologies financières (pl.) - financial viability : viabilité financière (f) * financially (adv.) : financièrement * financially viable (ac) : viable sur le plan financier * financier (n) : financier, bailleur de fonds - international financier : bailleur de fonds international * financing (n) : financement * finch (n) : fringillidé * find (v) (found, found) (tr.) : 1/ trouver, découvrir - to find a niche : trouver un créneau - to find onself sth : se trouver qch - to find one’s way : se frayer un chemin (into, dans) ; 2/ trouver, considérer - I find this climate very enervating : Je trouve ce climat très débilitant - I find it stupid : Je trouve ça stupide ; 3/ retrouver - to find oneself behind bars : se retrouver derrière les barreaux 4/ (expressions) - to find fault with sth : critiquer qch - to find one’s footing : trouver ses bases * finder (n) : 1/ trouveur/-euse - Finders keepers, losers weepers (proverbe) : a/ Qui trouve, garde ; b/ Qui va à la chasse perd sa place ; 2/ découvreur/-euse * finding (n) : 1/ découverte (f) ; 2/ constat ; 3/ (Droit) verdict, conclusion (f) * findings (n pl.) : trouvailles (f pl.), découvertes (f pl.), constatations (f pl.), résultats (d’une enquête, d’un sondage), conclusions (f pl.), données recueillies (f pl.) - audit findings : conclusions d’audit, résultats d’audit * find out (v) (found, found) (tr.) : 1/ mettre au jour, découvrir ; 2/ s’apercevoir de * fine (a) 1/ fin(e), précis(e) - fine adjustment : réglage précis - fine grinding : rectification (f) de haute précision ; 2/ beau/belle - fine arts : (les) beaux-arts - fine ideas : (de) belles idées (f pl.) * fine (adv.) (fam.) : bien - to be working fine : fonctionner à merveille - to do fine : se débrouiller * fine (n) : amende (f) (à payer) - to be given a fine : recevoir une amende * fine (v) (tr.) : condamner à une amende (for, pour) * fine-grained (ac) : à grains fins - fine-grained sand : sable à grains fin, sable fin (anton. coarse-grained) * fine tune (vc) (tr.) : peaufiner, affiner * finely tune (vc) (tr.) : bien régler (un moteur) * fine-spun / finespun (ac) : 1/ [fil] très fin(e) - fine-spun linen yarn : fil de lin fin ; 2/ (fig.) très fin(e), très délicat(e) - finespun dialogues : dialogues subtils * finely tuned (ac) : [instrument musical] bien accordé(e), [moteur] bien réglé(e) * fine tune (v) (tr.) : fignoler, mettre au point, optimiser, peaufiner (fine = finely) * fine-tuned (ac) : ajusté(e) minutieusement, mis(e) au point, optimisé(e), peaufiné(e), affiné(e) - fine-tuned analysis : analyse fine - - fine-tuned computer : ordinateur optimisé - fine-tuned knowledge : connaissances fines (f pl.) - fine-tuned method : méthode bien affinée (f) * finger (n) : doigt - to keep one’s fingers crossed : croiser les doigts - not to lift a finger (to help sb) : ne pas lever le petit doigt (pour aider qn) * finger (v) (tr.) : 1/ palper ; 2/ (Sex.) doigter, tripoter - to have one’s arsehole / asshole fingered : se faire doigter l’anus ; 3/ désigner du doigt, dénoncer (as, comme) * fingering (n) : (Sex.) doigtage, tripotage - anal fingering : doigtage anal (syn. arse / ass fingering) * fingerless (a) : sans doigts - fingerless glove : mitaine (f) * fingernail (n) : ongle (de doigt) * fingerprint (n) : empreinte digitale (f) * fingertip (n) : bout du doigt - at your fingertips : au bout de vos doigts * finish (n) 1/ fin (f), achèvement - from start to finish : du début à la fin ; 2/ finition (f) - unsurpassed degree of finish : degré de finition unique - surface finish : état de surface (Usin.) * finish (v) (tr.) : finir, compléter, achever, terminer * finished (ppa) : fini(e) - finished goods : produits finis - finished product : produit fini, produit ouvré * finisher (n) : 1/ finisseur - asphalt finisher : finisseur d’asphalte ; 2/ (Sport) marqueur décisif * finishing (n) : (Usin.) finition (f) * finish off (v) (tr.) : achever, terminer, mener à terme * finish up (v) (tr.) : achever, terminer, mener à terme - I'll finish up this work next week : Je terminerai ce travail la semaine prochaine * finite (a) : fini(e) - the finite (a. subst. sing.) : le fini * Finland (n pr.) : (la) Finlande * Finn (n pr.) : Finlandais (le ressortissant) * Finnish (a) : finnois(e) (sans maj.) * fintech (n) (abr. de financial technology) ; (la) technologie financière, (les) technologies financières (pl.) - a fintech startup : une jeune pousse financière * fir (n) : sapin - fir tree : sapin * fire (n) : 1/ feu (l’élément) - to make a fire : faire du feu - to get a fire going : allumer un feu - fire screen : pare-étincelle (pl. pare-étincelles) ; 2/ feu, incendie (f) - to catch fire : prendre feu - to set on fire : incendier - He’ll never set the world on fire : Il n’a pas inventé la foudre - forest fire : incendie de forêt, feu de forêt - fire drill : exercice d’alerte à l’incendie - fire eater : a/ cracheur de feu ; b/ (fig.) bagarreur - fire fighter : sapeur-pompier, pompier - fire hazard : risque d’incendie ; 3/ feu (tir) - live fire : tir à balles réelles, balles réelles (f pl.) * fire (v) (tr.) : 1/ cuire ; 2/ tirer (un coup de feu) - to fire a round at… : tirer une balle sur… - to fire a salvo : tirer une salve ; 3/ renvoyer (qn), mettre (qn) à la porte, licencier, virer (fam.) - to fire workers : licencier des ouvriers * firearm (n) : arme à feu - firearms shop : armurerie (f) * fireball (n) : boule de feu * firebomb (n) : bombe incendiaire (f) * firebomb (v) (tr.) : lancer des bombes incendiaires sur (une ville) * firebrand (n) : 1/ brandon ; 2/ (fig.) agitateur, fauteur de troubles, trublion * firebreak (n) : zone coupe-feu (f) * fired (a) : cuit(e) - fired clay bricks : briques en argile cuite (f pl.) * fireguard (n) : pare-feu (pl. pare-feux) (masc.), pare-étincelle (pl. pare-étincelles) (masc.) * firelighter (n) : allume-feu * fireman (n) (pl. firemen) : sapeur-pompier * fire off (v) (tr.) : 1/ tirer (a shot, un coup de feu) - to fire off a missile at… : envoyer un missile sur… ; 2/ envoyer (an e-mail, un courriel) ; 3/ enchaîner (questions, des questions) * fireplace (n) : cheminée (f), âtre - fireplace screen : pare-feu * fire-prone (ac) : qui connaît souvent des incendies - fire-prone forest : forêt connaissant souvent des incendies * fireproof (a) : à l’épreuve du feu, ignifuge * fireproof (v) (tr.) : rendre ininflammable, ignifuger * fire-resistant (ac) : résistant au feu, qui ne prend pas feu, anti-feu, incombustible, ininflammable, réfractaire - fire-resistant clothing : vêtements (pl.) qui résistent au feu - fire-resistant door : porte coupe-feu * fire-resisting (ac) : résistant au feu, ignifuge, réfractaire * fire sale (n) : a/ soldes après incendie ; b/ vente au rabais * fire-ship (nc) : brûlot * fireside (n) : coin du feu, foyer - fireside chat : causerie au coin du feu * firewall (n) : (Inf.) pare-feu (pl. pare-feux) (masc.) * firewood (n) : bois de chauffage * fireworks (n pl.) : 1/ feux d’artifice (pl.) ; 2/ grabuge (sing.) - There will be fireworks : Il va y avoir du grabuge (syn. brit. There will be ructions) * firing (n) : licenciement (l’action et le résultat) - firings of professionals : licenciements de professionnels * firm (n) : firme (f), société (f), entreprise (f) - charter firm : société d’affrètement - computer security firm : entreprise de sécurité informatique - fleet firm : société de location de véhicules - home-automation firm : firme de domotique - manufacturing firm : entreprise industrielle - privately owned firm : société privée * firm (v) : (tr.) rendre ferme, affermir ; (intr.) devenir ferme, se raffermir - The ground has firmed : Le sol s’est affermi * firmware (n ind. sing.) : logiciels (pl.) microprogrammés * first (a) : 1/ premier/-ière - first language : première langue - first cameraman (Cin.) : chef opérateur ; 2/ germain(e) - first cousin : cousin germain * first (adv.) : tout d’abord, premièrement, pour commencer - First (a m p) (t d p) : Primo - first and foremost : tout d’abord, en premier lieu, d’abord et avant tout - first, … second, … third, … (m d l) : primo, … secundo, … tertio, … * first-aider (n) : secouriste (m/f) * first-ever (ac) : tout premier / toute première - the first-ever lesbian marriage : le tout premier mariage lesbien * first-hand (adv.) : 1/ directement - to witness events first-hand : être le témoin direct d’événements ; 2/ en personne ; 3/ par soi-même * Firstly (a m p) (t d p) : Premièrement, En premier lieu, Primo * first-rate (ac) : extra (syn. top-quality) * first time (loc. adv.) : la première fois - to fail the driving test first time : échouer au permis de conduire la première fois * fish (n) : poisson - fish die-off : hécatombe de poissons - fish farming : élevage de poissons, pisciculture (f) - fish monger : poissonnier - fish and chips shop : marchand de poisson-frites - fish shop : marchand de poisson-frites - fish sourcing : approvisionnement en poissons - fish tank : aquarium * fisherman (n) : pêcheur/-euse * fishery (n) (pl. fisheries) : pêcherie (f) * fishing (n) : pêche (f) - fly fishing : pêche à la mouche - catch and release fishing : pêche avec remise à l’eau - fishing net : filet de pêche - fishing pole : canne à pêche - fishing reel : moulinet de canne à pêche * fish net / fishnet (n) : filet de pêche, filet à poisson * fishnet (n) (abr. de fishnet stocking, bas résille) * fishtail (v) : (Auto.) (tr.) faire déraper ; (intr.) déraper (en perdant le contrôle du train arrière) * fishtailing (n) : (Auto.) dérapage (en perdant le contrôle du train arrière), glissade de l’arrière * fishy (a) : douteux/-euse * fissiparous (a) : 1/ (Bio.) fissipare, scissipare ; 2/ (fig.) séparatiste, scissionniste * fissure (n) : fissure (f) - anal fissure : fissure anale * fist (n) : poing - fist fight : pugilat (aussi fistfight) * fistfight (n) : pugilat * fisting (n) : (Sex.) - anal fisting : enfoncement du poing dans l’anus * fit (a) : - to be fit for : a/ être apte à, être fait(e) pour ; b/ être approprié(e) à, être adapté(e) à - to be fit to + inf. : être en état de + inf., être à même de + inf. * fit (n) : ajustement - to check the fit : vérifier l’ajustement - from the first fit : dès le premier ajustement - fit model : mannequin de cabine * fit (n) : accès, crise (f) - to be prone to fits of rage : être sujet(te) à des accès de rage - to give sb fits : faire avoir une crise de nerfs à qn * fit (v) : 1/ (tr.) être à la taille de, aller sur, aller dans, aller à, correspondre à, convenir à, s’accorder avec ; (intr.) [vêtements] être à la taille, aller - The dress fits but doesn’t suit her : La robe va bien mais elle ne lui sied pas ; 2/ (tr.) équiper (with, de), munir (with, de), doter (with, de) - to be fitted with sth as standard : être équipé(e) en série de qch ; 3/ (tr.) ajuster, adapter (qch) (to…, à…) ; (intr.) s’adapter (into/to, à), tenir (into, dans), aller (into/to, dans/à) - to fit together : s’assembler ; 4/ (tr.) installer, monter (into, sur), intégrer (into, à) * fit and healthy (paire adj.) : en pleine forme et en bonne santé, en forme et en bonne santé, apte et bien portant(e), dispos(e) et bien portant(e) - to stay / to keep fit and healthy : rester / se maintenir en forme et en bonne santé, conserver la forme et la santé - to get / to become fit and healthy : améliorer sa forme et sa santé - a fit and healthy body : un corps apte et sain * fitful (a) : [sommeil] agité(e), capricieux/-euse, changeant(e), incertain(e) * fit in (v) (intr.) : s’adapter, cadrer * fitness (n) : 1/ aptitude (f) (for, à) ; 2/ forme (physique) (f) - physical fitness : forme physique ; 3/ mise en forme (f), remise en forme (f) - fitness facilities : centres de remise en forme - fitness room : salle de remise en forme - fitness trainer : professeur de remise en forme * fitness-centric (ac) : spécialisé dans la mise en forme physique - fitness-centric company : société centrée sur la mise en forme physique * fit out (v) (tr.) : équiper (with, de) * fitter (n) : ajusteur * fitterdom (n) : métier d’ajusteur, qualité d’ajusteur * fitting (a) : approprié(e), séant(e) * fitting (n) : armature (f), garniture (f), montage - light fitting : luminaire * fittings (n pl.) (amér.) : 1/ équipements (d’une maison) - metal fittings : ferrures ; 2/ (Plomb.) raccords, raccorderie (f) * fit together (v) (tr.) : assembler - to fit the pieces together : assembler les morceaux * fit to print (expr.) : (Presse) qui est publiable, qui mérite d’aller sous presse, qu’on est censé connaître, qu’on ne nous cache pas (anton. not fit to print) * five (adj. num.) : cinq (5) * five (n) : cinq (5) * five S’s (n) : - the five S’s : les 5 S * five-axis (ac) : à cinq axes - 5-axis numerically controlled milling machine : fraiseuse à commande numérique cinq axes * fivefold (a) : quintuple, multiplié(e) par 5 * fiver (n) : 1/ (brit.) (arg.) billet de cinq livres (syn. five-pound note) : 2/ (amér.) (arg.) billet de cinq dollars (syn. : five-dollar bill) * fix (n) (fa) : 1/ réparation (f), correction (f) ; 2/ (amér.) pétrin (fig.) - to be in a fix : être dans le pétrin ; 3/ piqûre du drogué * fix (v) (tr.) (fa p) : 1/ fixer, figer, immobiliser ; 2/ fixer (une date, une somme) - How about fixing a time for tomorrow? : Que dirais-tu / diriez-vous de décider d’une heure pour demain ? ; 3/ corriger (une erreur) - to fix a mistake : corriger une erreur - to fix a dangling modifier (Gram.) : corriger une anacoluthe ; 4/ (amér.) régler (un problème, un ennui, un pépin) - to fix a problem : régler un problème ; 5/ (amér.) réparer, arranger, remettre en état, retaper, bricoler (fam.) * fixate (v) : (tr.) (Milit.) fixer, immobiliser - to fixate troops : immobiliser des troupes ; (intr.) - to fixate on sth : faire une fixation sur qch, être obnubilé par qch - Why does every one keep fixating on that? : Pourquoi tout le monde fait-il une fixation là-dessus ? * fixed (ppa) : 1/ fixe - (the) fixed parts of a machine : (les) parties fixes d’une machine ; 2/ figé(e) - fixed expression : expression figée, expression consacrée * fixing (n) : 1/ fixation (f), ancrage, mise en place, assujettissement, calage ; 2/ (amér.) (fa) réparation (f), remise en état (f), retape (f), correction (f), modification (f) * fixture (n) : 1/ élément (d’une installation, d’un décor) - familiar fixture : élément familier, élément faisant partie du décor - light fixture : luminaire ; fixtures (pl.) : équipements, installations (in a house, dans une maison) ; 2/ (Usin.) support, montage, dispositif de serrage ; 3/ date fixée (pour une course, etc.), course dont la date est fixée - list of fixtures : programme * fizzle (v) : (intr.) ne pas faire long feu, échouer * fizzy (a) : gazeux/-euse - fizzy drink : boisson gazeuse (f) * fjord (n) : fjord - Norwegian fjord : fjord norvégien * Fla. : abr. de Florida, (la) Floride * flabbergast (v) (tr.) : ébahir, interloquer, époustoufler, sidérer * flabbergasted (a) : (attribut du sujet) ahuri(e), ébahi(e), époustoufle(e), interloqué(e), sidéré(e) * flaccid (a) : flasque, mou, mollasson * flag (n) : drapeau - [merchant vessel] to be registered under the flag of Panama : [navire marchand] battre pavillon panaméen flag day : journée de quête (pour une œuvre de bienfaisance) * flag (v) (tr.) 1/ signaler - to flag a post : signaler une publication, un billet ; (intr.) [conversation] languir * flag down (v) (tr.) : - to flag sb down : faire signe à qn de s’arrêter - to flag down a taxi : héler un taxi * flagging (a) : mollissant(e), fléchissant(e), languissant(e), anémié(e) * flagstone (n) : dalle * flake (n) : 1/ flocon ; 2/ écaille, éclat (de silex) * flail (n) : (Agric.) fléau (à battre) * flamboyant (a) (fa) : [individu] haut(e) en couleurs, extravagant(e) * flame (n) : 1/ flamme (f) - flame arrester : coupe-flamme - flame resistance : tenue à la flamme - flame spitter : cracheur de feu ; 3/ (fig.) petit ami, petite amie, béguin - a former flame : un ancien petit ami / une ancienne petite amie - an old flame : un amour de jeunesse, une ancienne conquête, un ex / une ex * flame-resistant (ac) : résistant au feu, incombustible, ignifuge - flame-resistant overalls : salopette ignifuge (f) * flan (n) : 1/ (brit.) tarte (à la crème) - flan flinger : entartreur ; 2/ (amér.) flan * Flander (n pr.) : (la) Flandre * flank (n) : flanc - flank steak : bavette de bœuf * flank (v) (tr.) : flanquer (by, de) * flannel (n) (brit.) : gant (de toilette) pour le visage * flap (n) : 1/ rabat (d’enveloppe) ; 2/ battant ; 3/ volet (sur un aile d’avion) * flap (v) (tr.) : battre (des ailes) * flapjack (n) : 1/ (brit.) galette à l’avoine ; 2/ (amér.) crêpe épaisse (f) - to flip a flapjack : (brit.) faire sauter une galette à l’avoine, (amér.) faire sauter une crêpe épaisse * flap-out (ac) : sous forme de dépliant * flapper (n) : 1/ clapet ; 2/ garçonne (f) (dans les années 1920) * flare (n) : 1/ lueur vive (f) ; 2/ fusée éclairante (f) * flare (v) (intr.) : 1/ flamber ; 2/ (fig.) [violence] éclater ; 3/ s’évaser * flared (a) : évasé(e) * flare out (v) (intr.) : s’évaser * flaring (a) : qui s’évase, évasé(e) - outwardly flaring : s’évasant vers l’extérieur * flash (n) : 1/ éclair - a flash in the pan : un feu de paille (au fig.) - in a flash : en un éclair, en un clin d’œil - flash flood : crue soudaine (f), crue subite (f) - flash flooding : inondations soudaines (f pl.) - flash point ; a/ point d’éclair, point d’inflammabilité ; b/ (Polit.) point d’inflammation, point chaud (aussi flashpoint) ; 2/ point (d’informations) - news flash : point d'informations * flash (v) : 1/ (tr.) brandir (qch de lumineux) ; 2/ (tr.) faire étinceler, faire briller, faire clignoter ; (intr.) clignoter * flashback (n) : retour dans le passé, bond dans le passé, rappel éclair (Q), analepse (f) * flashforward (n) : prolepse (f) * flashings (n pl.) : (Archi.) noquets * flashlight (n) (amér.) : torche (brit. torch) * flash on and off (vc) : (tr.) allumer et s'éteindre alternativement, faitre clignoter ; (intr.) s'allumer et s'éteindre alternativement, clignoter * flashpoint (n) : 1/ point d’éclair, point d’inflammabilité ; 2/ (Polit.) point d’inflammation, point chaud (aussi flash point) * flask (n) : gourde (pour l’eau), flasque (pour l’alcool) - vacuum flask : bouteille thermos * flat (a) : 1/ plat(e) - flat stone : pierre plate - flat chest : poitrine plate ; 2/ dégonflé(e), à plat - flat battery : accus (pl.) à plat - [tire] to run flat : [pneu] rouler à plat * flat (n) : 1/ fer plat ; 2/ (brit.) appartement, appart (fam.) * flat-assed (ac) (amér.) : aux fesses plates * flat-chested (ac) : qui n’a pas de poitrine, qui est plate de poitrine, à la poitrine plate, qui n’a pas de seins * flat earther / flat-earther (n/nc) : partisan de la terre plate * flat earthism (n) : théorie de la terre plate * flatlet (n) : petit appartement, studio * flatline (n) : électrocardiographie plate (f) * flatline (v) : 1/ (tr.) arrêter le cœur de ; (intr.) avoir un arrêt cardiaque ; 2/ (tr.) stabiliser * flatplan (n) (Presse) : chemin de fer - to draw up the flatplan : dérouler le chemin de fer - electronic flatplan : chemin de fer électronique * flat-screen (ac) : à écran plat - flat-screen TV set : écran de télé plat * flatten (v) : 1/ (tr.) aplatir ; (intr.) s’aplatir ; 2/ (tr.) aplanir ; (intr.) s’aplanir ; 3/ (Usin.) planer * flatware (n ind. sing.) : 1/ vaisselle plate ; 2/ (amér.) couverts (pl.) * flatworm (n) : ver plat * flaunt (v) (tr.) : exhiber, étaler, montrer, faire montre de - to flaunt a new tattoo : exhiber un nouveau tatouage * flautist (n) (brit.) : flûtiste (aussi flutist) * flavour (brit.) / flavor (amér.) (n) : 1/ saveur, goût ; 2/ parfum, arôme (d’une glace, etc.) ; 3/ (fig.) avant-goût * flavour (brit.) / flavor (amér.) (a) : savoureux/-euse * flaw (n) : défaut, déficience (f), imperfection (f), faille (f) - internal flaw : défaut interne, défaut à cœur - near-fatal flaw : défaut presque fatal * flawed (ppa) : défectueux/-euse * flawless (a) : sans défaut, infaillible - a flawless swordplay : une escrime impeccable * flawlessly (adv.) : sans aucune erreur * flax (n) : lin * flaxen (a) : 1/ de lin - flaxen cloth : toile de lin ; 2/ (fig.) blond(e) - flaxen hair : cheveux blonds (pl.) * flea (n) : puce (f) - When you lie down with dogs, you get up with fleas : Qui dort avec les chiens, se lève avec des puces - flea market : marché aux puces - flea rake : peigne sale, crasseux (n) * flea-bitten (ac) : 1/ plein de puces, recouvert de puces ; 2/ (fig.) miteux/-euse - flea-bitten apartment : appartement miteux * fled (prét. de to flee) * fled (pp de to flee) * fledg(e)ling (n) : 1/ oisillon, oiselet ; 2/ novice, bleu (fam.) * flee (v) (fled, fled) (tr. et intr.) : fuir * fleet (n) : flotte (f) (de navires, de taxis, de véhicules) - fleet of buses : flotte de bus - The English fleet repelled the Spanish Armada in 1588 : La flotte anglaise repoussa l'Armada - fleet firm : société de location de véhicules * fleet (v) (intr.) : passer rapidement, s’enfuir * fleeting (a) : passager/-ère, éphémère, fugitif/-ive * Flemish (a) : flamand(e) * flesh (n) : chair (f) - to be made flesh : prendre corps - flesh monger : marchand de chair humaine * flew (prét. de to fly) * flex (n) (brit.) : fil souple, câble souple, fil électrique * flex (v) (tr.) : (tr.) plier, fléchir - to flex one’s biceps : rouler les mécaniques, jouer les gros bras, montrer sa force, faire une démonstration de force ; (intr.) plier, se plier, fléchir * flexibility (n) : flexibilité (f), souplesse (f) * flexible (a) : flexible, souple - flexible automation : (Prod.) automatisation souple (f), automatisation flexible * flexibly (adv.) : avec flexibilité * flexitime (n) : (les) horaires à la carte, (les) horaires souples (var. ortho. flextime) * flextime (voir flexitime) * flick (n) : 1/ chiquenaude (f), petit coup, mouvement rapide ; 2/ (fam.) film, pelloche (f) - chick flick : film pour midinettes, film pour gonzesses (péj.) - gangster flick : film de truands - skin flick : film porno - teen flick : film pour ados ; 3/ (pl. flicks) (vieilli) le ciné, le cinoche - going to the flicks : aller au cinoche * flick (v) (tr.) : donner une chiquenaude à, donner un petit coup à ; (intr.) to flick through sth : feuilleter qch, parcourir qch, survoler qch * flicker (n) : lueur intermittente, scintillement * flicker (v) (intr.) : [flamme, lumière] vaciller, tremblr, [flamme] danser * flicker-free (ac) : exempt(e) de scintillement - ficker-free screen : écran exempt de scintillement * flick knife (n) (brit.) : couteau à cran d’arrêt * flier (amér.) / flyer (brit.) (n) : 1/ aviateur, pilote ; 2/ prospectus (commercial), tract (politique) ; 3/ grand voyageur * flies (n pl.) (brit.) : braguette (f) - Your flies are open : Ta braguette est ouverte, Tu as la braguette ouverte (aussi fly (sing.) : Your fly is down) * flight (n) : 1/ (Aéro.) vol - a flight from Paris to New York : un vol Paris - New York - commercial flight : vol commercial - maiden flight : premier vol, vol inaugural - revenue flight : vol commercial - space flight : a/ (a space flight) vol spatial, b/ (sans art.) (les) vols spatiaux (pl.) - test flight : vol d’essai - flight case : mallette de vol (pour guitare, pour disques) - the flight crew : l’équipage (d’un avion) - flight deck : cabine de pilotage - flight distance : distance de vol - flight engineer : mécanicien de bord, mécanicien navigant - flight hour : heure de vol - flight plan : plan de vol - flight school : école de pilotage - flight simulator : simulateur de vol ; 2/ fuite (f), exode, départs (pl.) - to provoke a wave of flight : entraîner une vague de départs ; 3/ volée (f) - flight of steps : escalier * flighty (a) : inconstant(e), volage, frivole * flinders (n pl.) : éclats (pl.), fragments (pl.), pièces (f pl.) - to chop to flinders : faire voler en éclats, mettre en pièces * fling (v) (flung, flung) (tr.) : jeter, balancer (fam.), bazarder (fam.) * flinger (n) : personne qui jette qch, objet qui projette qch - confetti flinger : lance-confetti (masc.) - flan flinger : entartreur - mud flinger : dénigreur, salisseur de réputation * flip (n) : retournement - flip cap : bouchon rabattable * flip (v) (tr.) : 1/ retourner (a card, une carte) ; renverser (a vehicle, un véhicule) ; 2/ faire sauter (a pancake, une crêpe) - to flip a flapjack : (brit.) faire sauter une galette à l’avoine, (amér.) faire sauter une crêpe épaisse * flippant (a) : cavalier/-ière, irrespectueux/-euse * flippancy (n) : ton cavaler, ton irrespectueux * flippantly (adv.) : cavalièrement, d’un ton dégagé * flip out (v) (intr.) : 1/ avoir un mauvais délire (fam.), paniquer ; 2/ péter les plombs (fam.), perdre son sang-froid * flirtatious (a) : coquet(te), aguicheur/-euse * flirter (n) : dragueur, dragueude * flit (n) (brit.) : déménagement * flit (v) (intr.) : 1/ faire un mouvement de va-et-vient rapide ; 2/ (papillon] voleter ; 3/ (brit.) déménager à la cloche de bois * flivver (n) (fam.) : bagnole * float (n) : 1/ flottement - free float : flottement libre ; 2/ (Natation) planche (f) ; 3/ (Pêche) bouchon, flotteur - glass float : boule de pêche ; 4/ (Natation) matelas gonflable ; 5/ (brit.) char bas (d’un défilé historique, d’un cortège carnavalesque) ; 6/ (Fin.) (brit.) fonds de caisse * float (v) : 1/ (intr.) flotter - to float weightlessly : flotter en apesanteur ; 2/ (tr.) lancer (une idée) 3/ (tr.) (Bourse) lancer, émettre (des actions) * floatation (n) : 1/ flotage (du bois) ; 2/ (Bourse) lancement, émission (f) (d'actions) ; 3/ (Naut.) flottaison (f) * floater (n) : 1/ (Vue) corps flottant - to have floaters in the eyes ; 2/ étron flottant ; 3/ noyé(e) (n) ; 3/ employé(e) sans poste fixe, journaliste polyvalent ; 4/ électeur indécis, électrice indécise * floating (a) : flottant(e) - floating barrier : barrière flottante (f) * float off (v) (intr.) : se détacher et flotter * flock (n) : 1/ troupeau (de moutons), nuée (f) (d’oiseaux) ; 2/ ouailles (f pl.), fidèles (pl.) * flock (v) (intr.) : affluer - to flock to the polls : aller voter en masse * floe (n) : plaque (f) (de glace), plaquette (f) (de glace) - ice floe : glace flottante (f) * flog (v) (tr.) : 1/ fouetter, flageller ; 2/ (arg.) fourguer, refourguer, refiler (sth to sb / sb sth, qch à qn) - Flog him your old suit! : Refile-lui ton vieux costume ! (aussi to flog off) * flood (n) : 1/ déluge - the Flood : le Déluge ; 2/ (prop. et fig.) inondation (f), marée, (f) crue (f) - to unleash a flood of… : déverser une marée de… - flash flood : crue soudaine, crue subite * flood (v) (tr.) : inonder (syn. to inundate) - to flood the market : inonder le marché * floodgate (n) (svt au pl.) : vanne (f) - to open the floodgates : ouvrir les vannes * flood in (v) (intr.) : affluer - reports are now flooding in : les rapports affluent de tous côtés * flooding (n) : inondations (f pl.) * flood-prone (ac) : exposé(e) aux inondations, inondable - flood-prone area : zone inondable (f) * flooding-prone (ac) : sujet(te) aux crues - flooding-prone river : fleuve sujet aux crues * floor (n) : 1/ sol - to drop to the floor : tomber par terre - ground floor : rez-de-chaussée - floor areas : surfaces au sol - floor tile : carreau de sol ; 2/ a/ plancher - floor joist : solive de plancher ; b/ parquet - floor sander : ponceuse de parquet ; 3/ (au pl. floors) ateliers - (the) factory floor : a/ (les) ateliers (de production), (la) production ; b/ (la) base ouvrière ; 4/ étage - first floor : (brit.) premier étage ; (amér.) rez-de-chaussée - second floor : (brit.) deuxième étage, (amér.) premier étage - sixth-floor walk-up (amér.) : appartement au 5e sans ascenseur ; 5/ (Bourse) parquet - the trading floor (amér.) : le parquet, l’enceinte des transactions (syn. brit. the dealing floor) ; 6/ piste (f) (de dance) - dance floor : piste de dance * floorboard (n) : lame de parquet * flop (n) : échec, four (au fig.), bide (au fig.) (syn. amér. au Cin. flopperoo) * flopperoo (n) (amér.) : four complet (syn. brit. flop) * floppy-eared (ac) : aux oreilles tombantes - floppy-eared dog : chien aux oreilles tombantes * flora (n) : flore (f) * Florida (n pr.) : (la) Floride * Floridian (n) : de la Floride, floridien(ne) * Floridian (n) : habitant(e) de la Floride, Floridien, Floridienne * florist (n) : fleuriste (m/f) * floss (n) : 1/ bourre (f) (de soie) - candy floss : barbe à papa (f) ; 2/ fil dentaire * floss (v) (tr.) : passer au fil dentaire * flotilla (n) : flotille (f) * flotsam (n ind. sing.) : débris flottants (pl.), épaves flottantes (f pl.) * flotsam and jetsam (n. indén. sing. coord.) : épaves et rejets marins (m pl.), épaves flottantes (f pl.) * FLOTUS (titre) (acronyme formé des initiales de First Lady of the United States of America : Première dame des États-Unis) * flour (n) : farine (f) (de blé) - flour mill : minoterie (f) * flourish (v) (tr.) : brandir, faire des moulinets avec * flout (n) : moquerie (f), raillerie (f), sarcasme * flout (v) : (tr.) bafouer, faire fi de - to flout distancing rules : se moquer des règles de distanciation ; (intr.) to flout at sb : railler qn * flow (n) : 1/ écoulement, passage (d'un courant), cours - to go against the flow : aller à contre-courant - fluid flow : écoulement des liquides ; 2/ circulation (f), flux - cash flow : marge brute d'autofinancement (MBA), liquidités (f pl.) (d'une entreprise), flux de trésorerie * flow (v) (intr.) : couler, s’écouler * flower (n) : fleur (f) - Say it with flowers! : Dites-le avec des fleurs ! - wild flower : fleur sauvage - flower mart : fleuriste * flowing (a) : fluide * flown (pp de to fly) * flu (n) (abr. de influenza) : grippe - the flu : la grippe (saisonnière) * fluctuate (v) (intr.) : fluctuer * fluctuating (a) : fluctuant(e), variable - fluctuating demand : demande fluctuante - fluctuating dividend : dividende variable * fluctuation (n) : fluctuation (f), mouvement (syn. movement) * flue (n) : 1/ conduit de cheminée ; 2/ tuyau de poêle - to go up the flue (fig.) : partir en fumée * fluency (n) : maîtrise d’une langue, aisance dans une langue * fluent (a) : 1/ [individu] qui parle couramment (une langue) - I am fluent in English : je parle anglais couramment ; 2/ [langue] qui est parlée couramment - fluent English : anglais parlé couramment * fluff (n ind. sing.) : 1/ peluche (f) (sur un vêtement), moutons (pl.) (sous un lit) ; 3/ bétises (f pl.), âneries (pl.), ragots (pl.) - celebrity fluff : ragots mondains (syn. celebrity gossip) * fluff out (v) voir fluff up (v) * fluff up (v) (tr.) : (faire) gonfler, (faire) bouffer (ses plumes, ses cheveux) (syn. to fluff out) * fluid (n) : fluide (n), liquide (n) - fluid flow : écoulement des liquides - fluid mechanics (sing.) : (la) mécanique des fluides * fluid-based (ac) : hydraulique- fluid-base actuator : actionneur hydraulique * fluke (n) : coup de veine, coup de chance - by a happy fluke : par un heureux coup du sort * fluke (v) : (tr.) obtenir par un coup de chance ; (intr.) : avoir un coup de chance * flummery (n ind ; sing.) : 1/ flatteries (f pl.), courbettes (f pl.) ; 2/ simagrées (f pl.) ; 3/ baratin - Don’t talk such flummery : Épargne-moi ce baratin ; 4/ a flummery : un dessert anglais à la gelée * flummox (v) (tr.) : déconcerter, démonter, rendre perplexe, sidérer (syn. to bewilder) * flummoxed (ppa) : déconcerté(e), démonté(e), perplexe, sidéré(e) (syn. bewildered) * flung (prét. de to fling) * flung (pp de to fling) * flunk (n) (amér.) : échec, ratage * flunk (v) (amér.) : (intr.) échouer, rater - to flunk on maths : échouer en maths, rater les maths * flunkey (n) (péj.) : larbin * flurry (n) (pl. flurries) : rafale (f) (of snow, de neige) * flush (n) : 1/ chasse d’eau ; 2/ rougeur (f) * flush (v) : 1/ (tr.) laver à grandes eaux, rincer abondamment - to flush the toilet : tirer la chasse d’eau ; 2/ (intr.) rougir * flush (a) : 1/ abondamment pourvu(e), bien garni(e) - to be flush of money : être en fonds, être plein aux as, avoir plein de fric ; 2/ abondant(e) - Money is flush : Il y a de l’argent en abondance - These are flush times : Nous sommes à une époque d’abondance * flush out (v) : (Chasse) (tr.) lever, faire lever (des oiseaux) ; (intr.) [oiseaux] se lever * fluster (v) (tr.) : énerver - to get flustered : s’énerver * flute (n) : flûte (f) * flutist (n) : flûtiste (m/f) (aussi flautist) * flutter (n) : 1/ battement (d’ailes) ; 2/ (fig.) agitation (f) - to be in a flutter : être dans tous ses états * flutter (v) : 1/ (tr.) battre (one’s wings, des ailes) ; 2/ (intr.) voleter, voltiger ; 3/ (intr.) (fig.) papillonner * fly (n) (pl. flies) : 1/ mouche (f) - fly paper : papier tue-mouche - fly fishing : pêche à la mouche - fly trap : piège à mouches, attrape-mouche (orth. rect., masc.) (aussi flytrap) ; 2/ - Your flies are open : Ton capot est ouvert * fly (v) (flew, flown) : (tr.) piloter ; (intr.) prendre l'avion * fly-away (a) : [vêtement] flottant(e), négligé(e) ; 2/ [individu] étourdi(e), léger/-ère * fly-by-wire (ac) (Av.) : - fly-by-wire commands : commandes de vol électroniques * flyer (cf flier) * fly fish / flyfish (v) (intr.) : pêcher à la muche * fly-in (a) : [communauté] accessible par avion * fly-in (n) : rendez-vous aérien * flying (a) : volant(e) - flying disc : disque volant - flying saucer : soucoupe volante (f) * flying (n) : (Av.) (le) vol - flying school : école de vol - flying hours : heures de vol (f pl.) - flying time : durée de vol, temps de vol * flyover / fly-over (n) (brit.) : auto-pont * flypast (n) : défilé aérien * fly trap / flytrap (n) : piège à mouches * FO (n) (brit.) (init. de Foreign Office : ministère des affaires étrangères) * foal (n) : poulain * fob off (v) (tr.) : - fob sb off with sth : se débarrasser de qn en lui donnant ou en lui racontant qch * focus (n) (pl. focuses ou foci) : 1/ foyer ; 2/ mise au point - focus button : (Photog.) touche de mise au point - focus system : (Photog.) système de mise au point ; 3/ centre * focus (v) (amér. focused, brit. focussed 2) : (tr.) focaliser, concentrer, axer (on sth, sur qch) ; (intr.) se focaliser (on sth, sur qch), se concentrer (on sth, sur qch), être axé(e) (on sth, sur qch) * focusing (amér.) / focussing (brit.) (n) : (Photog.) mise au point - automatic focusing : mise au point photographique * fodder (n) : 1/ fourrage ; 2/ bouffe (f) (péj.), boustifaille (f) (péj.) ; 3/ matière (f) (pour un roman, etc.) ; 4/ pions (pl.), chair à canon - cannon fodder : chair à canon * fog (n) brouillard * fogey (n) : voir fogy (n) * foghorn (n) : corne de brume, sirène de brume * fog-shrouded (ac) : enveloppé(e) de brouillard - fog-shrouded island : île envelopppée de brouillard * fogy (n) : - old fogy : vieille ganache (f) (péj.), vieux copain (amic.) (aussi fogey) * foil (n) : objet qui fait ressortir qch, objet qui met en valeur qch, repoussoir * foil (n) : 1/ feuille de métal (pour cuire) - aluminium foil : clinquant d’aluminium ; 2/ transparent pour rétroprojecteur * foil (v) (tr.) : mettre en échec, contrecarrer * fold (n) : pli * fold (v) (tr.) : plier * foldable (a) : pliable - foldable garment bag : housse à vêtements pliable * fold away (v) (intr.) : se replier * fold back (v) (tr.) : rabattre, replier * folding (n) : pliage - folding machine : machine à plier (les feuilles, etc.), plieuse (f) * foldout (n) : dépliant * fold over (v) (tr.) : plier en deux, replier * fold up (v) (tr.) : replier, fermer * foliage (n) : feuillage * folk (n pl.) : gens (pl.), personnes (f pl.) * folk (a) : populaire - folk music : musique populaire, musique de terroir, musique folk (anglic.) * folks (n pl.) (amér.) : 1/ gens (pl.) ; 2/ (fam.) (en s’adressant à des gens) les gars, les filles (f pl.), les amis, tout le monde - Hey, folks ; 3/ (fam.) parents (pl.), vieux (pl.) ; 4/ famille (f) * follow (v) : 1/ (tr.) suivre - to follow the money trail : remonter la piste financière, suivre les circuits empruntés par l’argent ; (intr.) suivre, venir après ; 2/ (tr.) obéir, suivre - to follow the instructions : suivre les consignes ; 3/ (tr.) donner suite à ; (intr.) s’ensuivre, résulter de - to follow on from (sth) : faire suite à (qch), s’inscrire dans le prolongement de (qch) ; 4/ (tr. et intr.) suivre, comprendre - I don’t really follow : Je ne comprends pas vraiment * follower (n) : 1/ personne qui suit - to be a follower rather than a leader : être à la traîne plutôt qu’en tête ; 2/ disciple, adepte, partisan(e) * following (prép.) : 1/ (sens temporel) à la suite de, après, en réponse à - following which : à la suite de quoi ; 2/ (sens causal) à la suite de, suite à (incorrect) - following a failure : à la suite d'une défaillance * following (a) : suivant - the following procedures : les étapes suivantes, la marche à suivre - in the following example : dans l'exemple suivant * following (n) : (Mus.) public fidèle (d'une formation) * following on from (loc. prép.) : à la suite de, suite à (incorrect) - following on from the information that we received : à la suite des renseignements qui nous sont parvenus * follow up (v) (tr.) : suivre, effectuer un suivi de - to follow up an aircraft's performance : suivre le comportement d'un avion * follow-up (n) : suivi (n) * follow-up (a) : de suivi, suiveur - follow-up sheet : fiche suiveuse (f) * foment (v) (tr.) : fomenter - to foment a coup : fomenter un coup d’État * fond (a) : 1/ affectueux/-euse ; 2/ (tjrs attribut) - to be fond of : aimer, être amateur/-trice de * fondness (n) : 1/ tendresse (f) ; 2/ affection (f) (for, pour), tendresse (for, pour) - to feel a fondness for sb : éprouver un penchant pour qn, avoir un faible pour qn * foo (mod.) : dans l’expression foo fighter : sphère suiveuse (f) (accompagnant les bombardiers alliés pendant la Seconde Guerre mondiale) * food (n) : nourriture (f), bouffe (f) (vulg.), aliments (pl.) - to refresh oneself with food : se restaurer - contaminated food : nourriture polluée - fast food : restauration rapide (f), bouffe rapide (f) - gourmet food : mets gastronomiques (pl.) - junk food : nourriture rapide, nourriture de mauvaise qualité - locally grown food : produits alimentaires locaux - low-fat foods : aliments à faible teneur en gras / en graisse - no-fat foods : aliments sans gras / graisse - organic foods : aliments biologiques - tainted food : nourriture avariée - takeaway food : plats (pl.) à emporter - food bolus : bol alimentaire - food chain : chaîne alimentaire (f) - food column : (Presse) rubrique gastronomique - food magazine : magazine de cuisine - food mart : magasin d’alimentation, supérette (f) - food poisoning : intoxication alimentaire (f) - food processor : firme agro-alimentaire (f) - food riot : émeute de la faim - food stamp : bon alimentaire - food stylist : styliste alimentaire (m/f) - food web : réseau trophique, réseau alimentaire * fool (n) : idiot(e) (n) - to make a fool of oneself : se rendre ridicule * fool (v) (tr.) : berner, duper - to fool oneself : se faire des illusions * fool around (v) (intr.) (amér.) (fam.) : 1/ s'amuser, perdre son temps, ne rien ficher ; 2/ batifoler à droite et à gauche * foolish (a) : idiot(e) * fool-proof (ac) : 1/ à l’épreuve des imbéciles - foolproof formula : formule infaillible (f) ; 2/ [mécanisme] indéréglable, à l’épreuve des fausses manœuvres, de sûreté * foot (n) (pl. feet) : 1/ pied (la partie du corps) - to shoot oneself in the foot : se tirer une balle dans le pied (au propre et au figuré) - to put one's foot in it : mettre les pieds dans le plat - You never set foot round there : Tu n’as jamais mis les pieds dans le coin - to get back on one’s feet again : se remettre sur pied, reprendre pied, se relever ; 2/ pied (la mesure = 30,5 cm) - square feet : pieds carrés - [facilities] to take up 1.8 million square feet : [installations] occuper 1,8 millions de pieds carrés * foot (v) (tr.) : 1/ fouler, monter sur - to foot the stage : monter sur scène, fouler les planches ; 2/ - to foot the bill (fam.) : payer l’addition * footage (n) (litt. longueur en pieds) : 1/ (Cin.) (du) métrage, (de la) pellicule - outtake footage : chutes de montage ; 2/ (Vidéo) séquences (f pl.), enregistrements (pl.) - video footage : séquences vidéo (pl.), enregistrements vidéo (pl.) ; 3/ (Médias) images (f pl.) - file footage : images d’archives * football (n) (lit. (la) « balle au pied ») : (le) football, (le) ballon rond (fam.) - football field : terrain de football - football games : parties de ballon rond * footbike (n) : pédicycle, cyclotrottinette (f), vélo trotinette * footbridge (n) : passerelle (f) (syn. walkway) * footfall (n) : 1/ bruit de pas ; 2/ fréquentation (f), nombre de clients * foothold (n) : 1/ (en escalade) prise (f) - to get a foothold : trouver un point d’appui ; 2/ (fig.) pied, tremplin - to get a foothold : mettre un pied, s’implanter (dans un domaine, un milieu) * footing (n) : pied, assise (f), base (f) - to find one’s footing : trouver ses bases - to lose one’s footing : perdre pied - to regain one’s footing : reprendre pied - equal footing : pied d’égalité - to be on an equal footing : être sur un pied d’égalité - to place on an equal footing : mettre sur le même pied - a secure footing : une assise solide (syn. a firm footing) * footloose (a) : sans attaches, libre de ses mouvements, vagabond(e) * footman (n) : laquais * footnote (n) : 1/ note de bas de page ; 2/ détail sans importance * footnote (v) (tr.) : mettre en note / dans les notes de bas de page, faire figurer en note / dans les notes de bas de page - [comments, explanations] to be footnoted : [commentaire, explication] être mentionné en note / dans les notes de bas de page, faire l’objet d’une note / de notes de bas de page * footnoting (n) : usage de notes de bas de page - [article] to require footnoting : [article] avoir besoin de notes de bas de page * foot-print / footprint (n) : encombrement (d'une machine) - large foot-print : encombrement important - narrow machine footprint : faible encombrement * foppish (a) : fat * for (prép.) : 1/ pour - for one : pour (ma/sa) part ; 2/ pour, réservé(e) à ; 3/ (après subst.) (destination, usage) + gér. : destiné(e) à, servant à, prévu(e) pour ; 4/ (après to use, to employ, to utilize, to design, to intend) + gér. : pour + inf. ; 5/ (but) pour obtenir, afin d'assurer - for more efficient manufacturing : pour obtenir plus d’efficacité dans la production ; 6/ à la recherche de, pour voir s'il y a / s'il n'y a pas ; 7/ pour ce qui est de, quant à, sous l'angle de ; 8/ pour ce qui concerne ; 9/ (motif, cause) + gér. : pour + inf. passé ; 10/ en raison de, à cause de ; 11/ + durée : pendant - for the first six months : pendant les six premiers mois * for (conj.) (après virgule) (m d l) : car, en effet, « : » (deux points) * forage (n) (fa) : recherche de nourriture * forage (v) (tr.) : 1/ fourrager, ravager ; 2/ se procurer en fourrageant, se procurer en maraudant * forage (about) (v) (intr.) : fourrager (pour trouver) * for all (loc. prép.) (+ possessif + substantif) : malgré, en dépit de - For all their sophistication, laptops do suffer some drawbacks : Malgré leurs perfectionnements techniques, les portables présentent certains inconvénients * for all that (m d l) : malgré cela * foray (n) : incursion (f) (into, dans) * forbade (prét. de to forbid) * forbear (n) : ancêtre (var. ortho. forebear) * forbear (v) (forbore, forborne) : (tr.) renoncer à, se priver de ; (intr.) s’abstenir (from + gér., de faire qch) * forbid (v) (forbade, forbidden) (tr.) : interdire * forbidden (pp de to forbid) : interdit(e) * forbidding (a) : sévère, rébarbatif/-ive * forbore (prét. de to forbear) * forborne (pp de to forbear) * force (n) : 1/ force (f) - centripetal force : force centripète - driving force : force motrice ; 2/ contrainte (f), effort - force sensor : capteur d’effort ; 3/ forces, pl. : (Milit., Police) forces - poorly led forces : forces mal commandées - riot forces : forces anti-émeutes - undertrained forces : forces mal préparées * force (v) (tr.) : forcer, obliger de force * forced (ppa) : forcé(e) - forced holidays : congés forcés - forced masking : obligation de porter un masque, port du masque obligatoire * force down (v) (tr.) : faire baisser - to force down costs : faire baisser les coûts * force-fit (vc) (tr.) : emmancher à force * forceful (a) : vigoureux/-euse, énergique * forcefully (adv.) : avec vigueur, avec énergie * force-land (vc) : (tr.) obliger à atterrir - to force-land a plane : obliger un avion à atterrir ; (intr.) [avion] faire un atterrissage forcé * force majeure (n) : force majeure (f) - in a case of force majeure : en cas de force majeure * force-march (v) : (tr.) faire avancer (ses troupes) à marche forcées ; (intr.) [armée] avancer à marches forcées * force-vaccinate (v) (tr.) : vacciner de force * forcible (a) : obtenu(e) par la force - forcible resignation : démission imposée (f) * forcibly (adv.) : de force, avec force * fore (a) : - fore and aft (naut.) : d’avant en arrière * forebear cf forbear (n) * forebode (v) (tr.) : présager * forecast (n) : 1/ prévision (f), pronostic - to make forecasts : faire des prévisions (syn. to establish forecasts) - to meet forecasts : répondre aux prévisions - business forecasts : prévisions industrielles - sales forecasts : ventes prévisionnelles (f pl.) - weather forecasts : prévisions météorologiques (f pl.) - forecast plan : plan prévisionnel ; 2/ prédiction (f) ; 3/ estimation (f) - forecasts are for a shift to the left : les prévisions donnent une poussée de la gauche * forecast (-cast/casted, -cast/casted) (tr.) : 1/ prévoir, pronostiquer; 2/ prédire * forecasting (n) : (la) prévision - economic forecasting : (la) prévision économique (syn. business forecasting) - forecasting package : progiciel de prévision - forecasting techniques : techniques de prévision - a forecasting unit : un service de la prévision * forecaster (n) : prévisionniste - business forecaster : spécialiste de la prévision économique (syn. economic forecaster : prévisionniste économique, conjoncturiste) - trend forecaster (var. trends forecaster) : analyste de tendances, prévisionniste de tendances (syn. trend seer) - weather forecaster : a/ météorologue; 2/ présentateur / présentatrice de la météo (à la télé) * foreclose (v) (tr.) : saisir (a house, une maison) * foreclosed (ppa) : [maison] saisi(e) * foreclosure (n) : saisie * forecourt (n) : avant-cour, cour (de ferme), devant (de station service) * forefinger (n) : index (le doigt) * forefather (n) : ancêtre * forefoot (n) (pl. forefeet) : patte de devant * forefront (n) : premier plan - in the forefront of… : à la pointe de… * forego (v) (-went, -gone) (tr.) : renoncer à * foregoing (a) : précédent(e), susdit(e) * foregone (pp de to forego) * forehead (n) : front (= partie du visage) - balding forehead : front dégarni * foreign (a) : étranger/-ère - foreign language : langue étrangère * foreigner (n) : étranger * foreign-run (ac) : géré(e) par des étrangers - foreign-run outlets : médias gérés par des instances étrangères * foreign-trained (ac) : formé(e) à l'étranger - foreign-trained engineer : ingénieur ayant fait ses études à l'étranger * forelimb (n) : patte avant * foreman (n) : contremaître, agent de maîtrise * foremanship (n) : contremaîtres (pl.), agents (pl.) de maîtrise * foremost (a) : premier/-ière, en tête * foremost (adv.) : surtout, avant tout - first and foremost : a/ avant toute chose ; b/ surtout * foreplay (n) : préliminaires (amoureux) (pl.) - Cut the foreplay! : (fig.) Arrête de tourner autour du pot !, Va droit au but ! * forensic (a) : médico-légal(e) - forensic medicine : médecine légale * foresaw (prét. de to foresee) * foresee (v) (-saw, -seen) (tr.) : prévoir - to foresee the future : prévoir l'avenir * foreseeable (a) : prévisible - in the foreseeable future : dans un avenir prévisible - the foreseeable (a. subst. sing.) : le prévisible * foreseeabilty (n) : prévisibilité (f) * foreseen (pp de to foresee) * foreshadow (v) (tr.) : 1/ présager, annoncer ; 2/ préfigurer * foreshadowing (n) : 1/ présages, annonces (f pl.) ; 2/ préfiguration * foreshorten (v) (tr.) : dessiner en perspective * forest (n) : forêt (f) - the rain forest : la forêt tropicale humide - forest fire : incendie de forêt, feu de forêt * forestall (v) (tr.) : devancer * foreswear (v) (-swore, -sworn) (tr.) : abjurer, renoncer à * foreswore (prét. de to foreswear) * foresworn (pp de to foreswear) * foretaste (n) : avant-goût * foretell (-told, -told) (v) (tr.) : prédire - She foretold her own death to her children : Elle prédit sa propre mort à ses enfants * foretold (prét. de to foretell) * foretold (pp de to foretell) * forever (adv.) : à jamais, pour toujours - to put off forever : retarder indéfiniment * forewarn (v) (tr.) : avertir * forewarning (n) : avertissement * forewent (prét. de to forego) * for example (m d l) : par exemple (syn. for instance) * for fear that (loc. conj. de crainte) : de peur que * forfeit (n) (fa) : 1/ confiscation ; 2/ gage * forfeit (v) (tr.) : 1/ perdre (une liberté, un droit, sous la contrainte) ; 2/ renoncer (à un droit, volontairement) ; 3/ verser (une somme) * forgave (prét. de to forgive) * forge (v) (tr.) (fa p) : 1/ forger ; 2/ contrefaire * forged (ppa) : forgé(e) - forged part : pièce forgée (f) (syn. forging) * forgery (n) (pl. forgeries) (fa) : contrefaçon, falsification * forget (v) (forgot, forgotten) (tr.) : oublier - It should not be forgotten that… : On n’oubliera pas que… - Forget it! : Laisse tomber ! * forgettable (a) : peu mémorable, vite oublié(e), parfaitement oubliable (anton. unforgettable : inoubliable) * forging (n) : 1/ forge (f) (l’activité), forgeage - warm forging : forge à mi-chaud - forging press : presse à forger ; 2/ (pl. forgings) pièce forgée (f) (syn. forged part) * forgive (v) (forgave, forgiven) (tr.) : pardonner * forgiven (pp de to forgive) * forgiveness (n) : pardon - to ask for sb’s forgiveness : demander pardon à qn - no forgiveness from me! : Pas de pardon de ma part ! * forgot (prét. de to forget) * forgotten (pp de to forget) * forgotten (a) : oublié(e) - a forgotten corner of the universe : un coin oublié de l'univers * for instance (m d l) : par exemple (syn. for example) * fork (n) : 1/ fourche (f) - fork stacker : élévateur à fourche ; 2/ ramification (f) ; 3/ embranchement * fork (v) : (intr.) bifurquer * forking (n) : fait de bifurquer, bifurcation * forklift (n) : chariot élévateur (syn. forklift truck) * fork out (v) (tr.) (arg.) : allonger, abouler, casquer - Fork out the money! : Aboule / Aboulez le fric ! * for lack of (loc. prép.) : par manque de * forlorn (a) : abandonné(e) * form (n) (fa p) : 1/ forme (f) - geometrical form : forme géométrique - in its purest form : sous sa forme la plus pure ; 2/ formulaire - to fill out a form : remplir un formulaire (syn. to fill in a form) - blank form : formulaire vierge - contact form : formulaire de contact (d’un site web) ; 3/ (brit.) classe (f) (dans un établissement scolaire) - We were in the same form at school : Nous étions dans la même classe à l'école - the fifth form : la seconde - the first form : la classe de sixième - the fourth form : la troisième - the lower sixth (form) : la première - the school sixth form : la première et la terminale (au lycée) - the second form : la cinquième - the upper sixth (form) : la terminale ; 4/ forme, type - a form of slavery : une forme d’esclavage * form (v) (tr.) : 1/ former, façonner ; 2/ (Indust.) former (une pièce en plastique), façonner (une pièce en métal), emboutir (une plaque de métal) ; 3/ former, constituer - to form a barrier : constituer une barrière - to form a coalition : former une coalition * formal (a) (fa) : 1/ officiel(le) ; 2/ compassé(e), guindé(e), cérémonieux/-euse; 3/ [tenue] habillé(e) ; 4/ [langage] soutenu(e) - formal language : langage soutenu - 'assistance' is a formal word for 'help' : « assistance » est plus soutenu que « aide » (anton. informal) * formaldehyde (n) : formaldéhyde * formally (adv.) (fa) : 1/ officiellement ; 2/ dans les règles (anton. informally) * formation (n) : 1/ formation (f) - chip formation (Usin.) : formation de copeaux ; 2/ formation (ensemble d’objets dans le ciel) - objects flying in formation : objets volant en formation - a formation of lights : lumières se déplaçant en formation - cloud formations : formations nuageuses * formative (a) : formateur/-trice, de formation - my formative yars : mes années de formation * former (n) : - opinion former : faiseur d’opinion (syn. opinion shaper) * former (a) : ancien (au sens d’antérieur, de précédent) - my former boss : mon ancien patron ; the former (a. subst. sing. ou pl.) : le(s) premier(s) (par rapport à the latter : le(s) dernier(s) (de deux) * formerly (adv.) : autrefois, jadis, précédemment, anciennement, dans le temps (syn. in the old days) * formidable (a) (fa) : redoutable, impressionnant(e) - a formidable adversary : un redoutable adversaire * forming (n) : (Indust.) formage (d’une pièce en plastique), façonnage (d’une pièce en metal), emboutissage (d’une plaque de métal) - tube forming : façonnage de tubes * formula (n) (pl. formulae ou formulas) : formule (f) - foolproof formula : formule infaillible * for one thing (m d l) : une raison, c'est que …, entre autres raisons … * for one thing …, for another … (m d l) : d'un côté …, de l'autre … * for-profit (ac) : à but lucratif * forte (n) : point fort * forth (adv.) : en avant - and so forth : ainsi de suite (syn. and so on) - from this day forth : à partir d’aujourd’hui * for that matter (m d l) : pour ce qui est de cela, d'ailleurs * forthcoming (a) : 1/ prochain(e), à venir ; 2/ [film] qui va sortir, [livre] à paraître ; 3/ disponible ; 4/ [individu] communicatif/-ive * for the purpose of (loc. prép.) (+ gér. ou subst.) : dans le but de, dans le dessein de, en vue de * for this purpose (m d l) : à cet effet, dans ce but * for this reason (m d l) : pour cette raison * forthright (a) : franc/-che * forthwith (adv.) : sur-le-champ, toutes affaires cessantes * forties (n pl.) : 1/ nombres 40 à 49 ; 2/ températures 40 à 49 ; 3/ latitudes 40 à 49 - the roaring forties : les quarantièmes rugissants (parallèles 40 à 49 des océans de l'hémisphère sud) ; 4/ années 40 à 49 * fortitude (n) : force d’âme, courage * fortnight (n) : quinze jours * fortress (n) (pl. fortresses) : forteresse (f) * fortuitous (a) : fortuit(e) * fortuitously (adv.) : fortuitement * fortune (n) : fortune (f) - to make a fortune : faire fortune - fortune teller : diseuse de bonne aventure * fortunate (a) (fa) : chanceux/-euse, heureux/-euse * fortunately (adv.) : par chance, heureusement * forum (n) (pl. fora ou forums) : forum - online forum : forum en ligne * forward (a) : 1/ qui est en avant, avant (inv.) - forward planning : planification à long terme ; 2/ qui va vers l’avant ; 3/ présomptueux/-euse, impertinent(e), effronté(e), trop hardi(e) : 4/ (Bourse) - the forward market : le marché à règlement mensuel * forward (adv) : en avant - a step forward : un pas en avant - to think forward : se projeter dans l’avenir, se tourner vers l’avenir, envisager l’avenir, réfléchir à l’avenir, anticiper * forward (v) (tr.) : faire suivre (du courrier) * forward-looking (ac) : qui regarde vers l’avant, prévisionnel(le) - forward-looking maintenance : maintenance prévisionnelle (f) * forward-thinking (ac) : tourné(e) vers l’avenir * fossil (a) : fossile - fossil fuels : combustibles fossiles * fossil (n) : fossile (n) * fossil-laden (ac) : plein(e) de fossiles, rempli(e) de fossiles - fossil-laden rock : roche pleine de fossiles * foster (a) : 1/ adoptif/-ive ; 2/ placé(e) dans une famille d’accueil - foster home : famille d’accueil - foster parents : parents adoptifs * foster (v) (tr.) : 1/ élever, allaiter ; 2/ [famille d’accueil] accueillir (un enfant) ; 3/ promouvoir, encourager (syn. to encourage) * fought (prét. de to fight) * fought (pp de to fight) * foul (a) : 1/ [air] vicié(e) ; 2/ [acte, jeu] déloyal(e) - foul play : a/ jeu déloyal, jeu irrégulier, tricherie - foul blow : coup en traître - by means fair or foul : par des moyens licites ou illicites, par des moyens honnêtes ou malhonnêtes, de gré ou de force ; b/ acte criminel, homicide, meurtre - foul deed : acte crapuleux ; 3/ ignoble, infâme * foul (v) (tr.) : obstruer * fouling (n) : gêne (f), obstruction (f) * foul up (v) (tr.) : faire foirer (vulg.), faire capoter (fam.) - to foul things up : foutre la pagaille * found (v) (tr.) : fonder * found (prét. de to find) * found (pp de to find) * foundation (n) : 1/ fondation (f) (d’une institution, etc.) ; 2/ fondement, base ; 3/ fondation (l’organisme) ; 4/ fond de teint * founder (v) (intr.) : sombrer * foundry (n) (pl. foundries) : fonderie (f) * fountain (n) : fontaine (f) - fountain pen : stylo à plume * four (a) (fa) : quatre * four-author (ac) : [team, équipe] de quatre auteurs, [study, étude] à quatre auteurs * four-axis (ac) : (à) quatre axes - four-axis robot : robot quatre axes * four-colour (ac) : à quatre couleurs, de quatre couleurs, quadrichrome - four-colour printing : quadrichromie * four-engine (ac) : quadrimoteur, quadriréacteur * fourfold (a) : quadruple, multiplié(e) par 4 - fourfold increase : quadruplement * four-lane (ac) : [autoroute] à quatre voies * four-post (ac) : à quatre poteaux - four-post bed : lit à baldaquin * foursome (n) : 1/ groupe de quatre personnes, quatuor - to arrange a foursome : organiser une réunion à quatre - Will you make up a foursome? : Voulez-vous vous joindre à nous trois ? ; 2/ (Sex.) plan à quatre * four-station (ac) : à quatre postes - four-station assembly line : chaîne d'assemblage à quatre postes * fourteener (n) : sonnet anglais * Fourth (a m p) (t d p) : Quarto * Fourthly (a m p) (t d p) : Quatrièmement, En quatrième lieu, Quarto * fox (n) (pl. foxes) : renard * foxhole (n) : 1/ terrier de renard, renardière (f) ; 2/ (Guerre) tranchée * foyer (n) : vestibule * fraction (n) : fraction - within fractions of a second : en quelques fractions de seconde * fracture (v) (intr.) : se fracturer - [country] to fracture internally : se fracturer de l’intérieur * frame (n) : 1/ encadrement, cadre - supporting frame : cadre-support - photo frame : porte-photo (grand cadre) ; 2/ châssis - basic frame : châssis de base (d’une auto) ; 3/ monture (f) (de lunettes) ; 4/ image * frame (v) (tr.) : 1/ encadrer ; 2/ (Cin.) cadrer ; 3/ présenter de façon mensongère ; 4/ monter un coup contre (sb, qn), piéger (sb, qn) * framework (n) : 1/ métier à broder, métier à dentelles, métier à tapisserie ; tambour à broder ; carreau de dentelière ; métier à filer ; 2/ cadre, bâti (n), carcasse (f) (d’une machine) - conveyor framework : bâti de convoyeur ; 3/ charpente (f), ossature (f) - steel framework : charpente en acier ; 4/ coffrage (pour le béton), boisage (pour un puits) ; 5/ canevas, plan (d’un roman) ; 6/ cadre - to create a framework for sth : créer un cadre pour / à qch - enabling framework : cadre favorable, cadre propice ; 7/ (Inf.) infrastructure logicielle (f), structure logicielle (f) (Q), infrastructure de développement, cadre d'applications (Q), cadriciel, socle d'applications (Q) * framing (n) : 1/encadrement ; 2/ (Cin.) cadrage ; 3/ présentation factice (f) ; 4/ coup monté (contre qn) * France (n pr.) : (la) France * franchise (n) (fa) : 1/ droit de vote ; 2/ franchise commerciale (f) * Francoism (n) : (le) Franquisme * Francoist (a) : franquiste - Francoist Spain : l’Espagne franquiste * Francoist (n) : franquiste (n) * francophone (a) : francophone (syn. French-speaking) * Francophone (n) : francophone (n) (syn. French speaker) * frank (a) : franc/-che * frankly (adv.) : franchement, avec franchise * frankness (n) : franchise (f) * frantic (a) : 1/ dans tous ses états, hors de soi - to drive sb frantic : mettre qn hors de lui ; 2/ frénétique, effréné(e) * frantically (adv.) : frénétiquement, désespérément * fraternal (a) : 1/ fraternel(le) ; 2/ faux/fausse - fraternal twins : faux jumeaux, fausses jumelles * fraud (n) (fa) : 1/ (la chose) supercherie, imposture, tromperie, abus de confiance ; 2/ (la personne) imposteur * fraudster (n) : escroc, arnaqueur, filou (fam.) * fraught (a) : 1/ [situation, ambiance] tendu(e) - The subject is politically fraught : Le sujet est politiquement risqué ; 2/ plein(e) (with de), chargé(e) (with, de) * fray (n) : rixe (f) - to join the fray : se lancer dans la mêlée * fray (v) (intr.) : s’effilocher * freak (a) : anormal(e), insolite, exceptionnel(le) - freak wave : vague scélérate (f) - freak weather : temps anormal pour la saison * freak (n) : [individu] monstre, [objet] curiosité (f) - freak of nature : aberration de la nature, accident de la nature * freckle (n) : tache de rousseur * free (a) : 1/ libre - free fall : chute libre (f) (au prop. comme au fig.) - free time : temps libre ; 2/ - you are free to + inf. : il vous est loisible de + inf. ; 3/ free from… : débarrassé(e) de…, exempt(e) de… - instructions free from errors : instructions exemptes d’erreurs - free of… : libre de…, franco de… ; 2/ gratuit(e) * free (v) (tr.) : libérer * free and clean (paire adj.) : gratuit(e) et propre - access to free and clean water : accès à de l’eau gratuite et propre * free and clear (paire adj.) : 1/ franc(he) et quitte (inv.) - (to be) free and clear : (être) franc / franche et quitte ; 2/ libéré(e) et dégagé(e) - The plot must be free and clean before 12 o’clock : L’emplacement doit être libéré et dégagé d’ici midi * freedom (n) : liberté (f) (syn. liberty) * free-fall / freefall (n) : chute libre (f) - to be in freefall : être en chute libre * free-floating (ac) : 1/ flottant librement, flottant(e), libre, sans attaches, sans station d’attache - free-floating exchange rate : taux de change flottant librement - free-floating motor : moteur librement suspendu - free-floating piston : piston libre - free-floating planet : planète non liée à une étoile - free-floating plant life : organismes végétaux vivant en suspension dans l’eau ; 2/ (fig.) flottant(e) - free-floating anxiety : angoisse diffuse (f), angoisse flottante * free-for-all (n) : mêlée générale (f) * freeloader (n) : pique-assiette (masc.) * freely (adv.) : 1/ librement ; 2/ gratuitement * freely available (ac) : en libre accès, disponible gratuitement (to, pour) * freer (compar. de sup. de free) * free-to-play (ac) : [game, jeu video] gratuit(e) * freeware (n ind. sing.) : logiciels du domaine public (pl.) * freeway (n) (amér.) : autoroute (f) (sans péage) * free-wheel / freewheel (v) (intr.) : 1/ (Cyclisme) rouler en roue libre ; 2/ (fig.) vivre en roue libre * freeze (v) (froze, frozen) : 1/ (tr.) congeler, frigorifier - to be frozen dead : mourir gelé ; (intr.) geler ; 2/ (intr.) (fig.) s’immobiliser, se figer * freeze out (v) (tr.) : ignorer qn délibérément, exclure qn volontairement * freezer (n) : congélateur * freight (n) : fret - freight elevator (amér.) : monte-charge (syn. goods elevator) * freighter (n) : cargo * French (a) : français(e) (sans maj.) - French letter : capote anglaise (f) (syn. French cap) * French (n) : français (la langue) - pidgin French : (le) petit nègre - Quebec French : français québécois * Frenchman (n) (pl. Frenchmen) : (le ressortissant) Français * Frenchwoman (n) (pl. Frenchwomen) : (la ressortissante) Française * frequency (n) (pl. frequencies) : fréquence (f) - line frequency : (Électron.) fréquence de balayage de ligne - radio frequency : fréquence radio - sampling frequency : fréquence d’échantillonnage * frequent (a) : fréquent(e) - to become all too frequent : ne devenir que trop fréquent - frequent urination : mictions fréquentes (f pl.) (anton. infrequent) * frequently (adv.) : fréquemment (anton. infrequently) * frequently asked (ac) : [question] souvent posé(e), qui revient sans cesse, qui revient souvent * frequently used (ac) : couramment utilisé - (to) store frequently used information in memory : emmagasiner en antémémoire les données les plus utilisées * fresh (a) (fa p) : 1/ frais/fraîche - fresh bread : pain frais ; 2/ doux/-ouce - fresh water : eau douce (f) (aussi freshwater) ; 3/ nouveau/-elle - fresh face : nouveau visage, nouveau venu - fresh start : nouveau départ * freshen (v) : (tr.) rafraîchir ; (intr.) se rafraîchir * fresh-faced (ac) : au visage poupin, à l’air juvénile * freshman (n) (pl. freshmen) (amér.) : étudiant de première année * freshwater (n) : eau douce (f) (aussi fresh water) * fret (v) (intr.) : s’agiter, se tourmenter * fretsaw (n) : scie à découper, scie à chantourner * fretwood (n) : bois à découper, bois à chantourner * Freudian (a) : freudien(ne) - Freudian slip : lapsus révélateur * friction (n) (fa) : 1/ friction (f) ; 2/ frottement * frictional (a) : dû/due au frottement - frictional resistance : résistance due au frottement * Friday (n) : vendredi (sans maj.) * fridge (n) : frigo - fridge magnet : aimantin * friend (n) : ami (m), amie (f) * friendlier (compar.) : plus amical(e) - technologies that are friendlier to the environment : techniques plus respectueuses du milieu (syn. more friendly) * friendliness (n) : caractère amical * friendly (a) : amical(e), bien disposé(e), gentil(le) - friendly society : société mutualiste (f), mutuelle (n f) (syn. mutual society) * -friendly (en compo., à droite) : 1/ adapté(e) à, convenant à, qui ménage, qui facilite, compatible avec, conçu(e) pour, aménagé(e) pour - coach-friendly : pro-car, accueillant(e) pour les cars - customer-friendly : respectueux/-euse de la clientèle, répondant aux attentes des clients - email-friendly : convenant au courriel - girl-friendly : a/ bon(ne) pour les jeunes filles ; b/ soucieux/-euse de l’intérêt des jeunes filles - loser-friendly : pour les nuls - printer-friendly : facile à imprimer, imprimable - media-friendly : médiatique - service-friendly : facilitant les opérations de maintenance - Sigint-friendly : qui se prête à l'écoute des signaux - spam-friendly : tolérant(e) envers le pollupostage, fermant les yeux sur le pollupostage - upgrade-friendly : facile à mettre à niveau, facilement modernisable - user-friendly : convivial(e), facile d'emploi, simple d’emploi, à la portée de l'utilisateur ; 2/ qui respecte, qui ne nuit pas à, sans danger pour - bee-friendly : bon(ne) pour les abeilles - body-friendly : a/ non agressif/-ive pour l’organisme, supportable par le corps, bon(ne) pour la santé ; b/ agréable à porter - earth-friendly : écologique, respectueux/-euse de l'environnement - eco-friendly : (selon le cas) écologique, vert(e), biodégradable - environment-friendly : qui respecte l’environnement, respectueux/-euse de l'environnement - eye-friendly : non nocif/-ive pour la vue - ozone-friendly : qui n’attaque pas la couche d’ozone * friendship (n) : amitié (f) * frig about (v) (intr.) : faire l’imbécile * frigate (n) : frégate (f) - helicopter-carrying frigate : porte-hélicoptère (masc.) * fright (n) : effroi, peur (f) * frighten (v) (tr.) : effrayer * frightening (a) : effrayant(e) * frighteningly (adv.) : 1/ de façon effrayante ; 2/ effroyablement, terriblement * frightful (a) : effrayant(e) * frill (n) : 1/ volant (sur une robe), jabot (sur une chemise), frou-frou / froufrou ; 2/ pl. frills : a/ fanfreluches (f pl.), frioritures (f pl.) ; b/ options (f pl.), extras (pl.) (sur un vol, un périple, une auto achetée) * frilly (a) : 1/ à volants, à fanfreluches, à froufous (fam.) - frilly shirt : chemise garnie de dentelle (aussi frilled shirt) ; 2/ [style] prétentieux/-euse ; 3/ [détail] frivole * frillies (n pl.) : jupons vaporeux (pl.), frous-frous (pl.), dessous de dentelle (pl.) * fringe (n) : 1/ (brit.) frange (f) (of hair, de cheveux) ; 2/ marge (f) - to live on the fringes of society : vivre en marge de la société - fringe archaeology : archéologie des marges, archéologie marginale (f) * fro (adv.) : - to go to and fro : aller et venir, faire les cent pas * frock (n) (fa) : robe (f) - She was in a summer frock : Elle portait une robe d’été * frog (n) : grenouille (f) * frogman (n) : homme-grenouille * frog-march / frogmarch (n) : transport (d’une personne récalcitrante) par quatre hommes la tenant chacun par un membre, face au sol * frog-march / frogmarch (v) (tr.) : faire transporter (une personne récalcitrante) par quatre hommes la tenant chacun par un membre, face au sol, amener (qn) de force * frogmarch out (v) (tr.) : faire sortir (qn) de force - to be fogmarched out : se faire éjecter * from (prép.) : 1/ + lieu ou moment : provenant de, de, à partir de, depuis, dans - people from different departments : des gens provenant de divers services - the AC current from a wall outlet : le courant alternatif provenant d'une prise murale ; 2/ - from … to : de … à - from … to … to : depuis … jusqu’à … en passant par - (to) produce everything from seats to dashboards to bumpers : produire de tout depuis les sièges jusqu’aux tableaux de bord en passant par les pare-chocs ; 3/ + matière : à partir de, dans ; 4/ + cause : provenant de, dû à ; 5/ d'après * front (a) : 1/ avant (inv.) - front office : a/ réception, bureau d’accueil, service clientèle ; b/ (Toile) serveur de la clientèle, partie visible (d’un site) - front yard : jardin de devant ; 2/ en tête - (the) front page : (la) première page, (la) « une » - The story made the front page of all the papers : Cette histoire a eu les honneurs de la 1re page de tous les journaux * front (n) (fa p) : 1/ devant (n), avant (n) - Let's sit at the front! : Asseyons-nous à l'avant ! - at the front of : à l’avant de ; 2/ front (de mer) ; 3/ front (entre deux armées) - to fight a war on two fronts : livrer bataille sur deux fronts * front (v) (tr.) : être à la tête de, être le chanteur de (un groupe de musique) - Back then, I was fronting a band : À l’époque, j’étais le chanteur d’un groupe * frontal (a) : frontal(e), qui est de face * frontier (n) : 1/ frontière (f) (la limite entre deux ou plusieurs États) ; 2/ (amér.) (fa) domaine vierge, domaine à conquérir, nouveau domaine, région pionnière (f), front pionnier (la limite et la zone délimitée) - a new frontier : un domaine vierge * front-loader (nc) : machine à chargement frontal * front-loading (ac) : à chargement par le devant, à chargement frontal - front-loading washing machine : machine à laver à chargement frontal * frontman (n) : chanteur (d'un groupe) * front office (n) : 1/ (Fin.) salle des marchés ; 2/ (Écon.) service clientèle * frosted (a) : [verre] dépoli(e) * froth (n) : mousse (f) * frown (n) : froncement des sourcils * frown (v) (intr.) : froncer les sourcils - to frown at sb : regarder qn en fronçant les sourcils, faire les gros yeux à qn * froze (prét. de to freeze) * frozen (pp de to freeze) * frozen (ppa) : 1/ gelé(e) - frozen river : rivière gelée - frozen soil : sol gelé ; 2/ congelé(e) ; 3/ (fig.) immobilisé(e), figé(e) - frozen time (Photog.) : effet de ralenti à la Matrix * frugal (a) (fa p) : 1/ [individu] économe ; 2/ [repas] frugal(e) * frugally (adv.) : 1/ économiquement ; 2/ frugalement * fruit (n) : (ind. sing. ) fruits (pl.) - tree laden with fruit : arbre chargé de fruits - to bear fruit : porter des fruits * fruiting (n) : fructification (f) - period of fruiting : période de fructification * fruiting (a) : fructifère - fruiting tree : arbre fructifère * fruition (n) : concrétisation (f) - to come to fruition : porter ses fruits, fructifier ; (fig.) se réaliser * fruity (a) : chaleureux/-euse - fruity voice : voix chaleureuse * frump (n) : femme mal fagotée (f) * frumpish (a) : mal fagoté(e) * frumpy (a) : mal fagoté(e) * frustum (n) : (selon le cas) tronc de cône, tronc de pyramide, cône tronqué, pyramide tronquée (f) - a frustum of a cone : un tronc de cône * fry pan / frypan (n) (amér.) : poêle (à frire) (f) * FT (the) (n pr.) (init. de the Financial Times) : - to get the FT : recevoir le Financial Times * FTL (a) (init. de faster than light : plus rapide que la lumière, supraluminique) PRL * FTSE (the) (pron. footsie) : (l')indice du FT (sélection faite par le Financial Times d'actions de sociétés cotées à la Bourse de Londres) * fuck (v) : (tr.) enculer - Fuck this, I’m bored (vulg.) : Putain, je me fais chier - Fuck it ! : Merde !, Putain ! ; (intr.) baiser, niquer (vulg.) * fuck all / fuck-all (n) (brit.) (vulg.) : que dalle (syn. bugger all / bugger-all, sod all / sod-all) - It costs me fuck-all : Ça ne me coûte que dalle * fucker (n) (vulg.) : enculé (n) - you, dirty fucker : espèce de sale enculé * fucking (a) (vulg.) : saloperie de + nom, putain de + nom - You’re being a fucking pain : T’es un putain d’emmerdeur * fucking (n) : (la) baise - ass fucking : enculage - to get an ass fucking : se faire enculer * fuck up (v) (tr.) : bousiller - to fuck a car up : bousiller une voiture * fuddled (a) : 1/ embrouillé(e) (syn. confused) ; 2/ ivre * fudge (n) : 1/ caramels mous (pl.) - Have a piece of fudge : Prends un caramel / Prenez un caramel ; 2/ sauce au chocolat ; 3/ (n ind. sing.) (Presse) nouvelles (f pl.) de dernière minute, (toutes) dernières nouvelles (f pl.) - fudge box : espace réservé aux nouvelles de dernière minute, emplacement de la dernière heure - fudge column : espace réservé aux nouvelles de dernière minute * fudge (v) : 1/ (tr.) esquiver; (intr.) se dérober ; 2/ (tr.) truquer, trafiquer, manipuler, bidonner (fam.), tripatouiller fam.) (des données, des chiffres) - to fudge figures : trafiquer des chiffres * fudge! (interj.) (euphémisme pour fuck!) : mince ! * fudge and smudge (v coord.) (tr.) : brouiller * fudgy (a) : au caramel - fudgy chocolate cake : gateau au chocolat et au caramel * fudgy-wudgy (a) : - fudgy-wudgy man : vendeur ambulant d’esquimos * fuel (n) (fa) : carburant, combustible - to pour fuel on the flames : (fig.) verser de l’huile sur le feu - alternative fuel : carburant de substitution - organic fuel : combustible organique - substitute fuel : carburant de substitution - fuel consumption : consommation de carburant - fuel gases : gaz combustibles - fuel tank : réservoir à carburant * fuel (v) (tr.) : alimenter (en carburant) * fuel-air (n double adj.) : carburant-air - fuel-air explosives : explosifs carburant-air * fulfill (v) (tr.) : 1/ accomplir, réaliser, mener à bien, exécuter - to fulfill tasks : exécuter des tâches ; 2/ satisfaire * fulfilment (brit.) / fulfillment (amér.) (n) : 1/ accomplissement (d’un devoir, d’une promesse), exécution (f) (d’un souhait, d'une commande, etc.), réalisation (f), concrétisation (f) - order fulfilment : exécution de commandes - fulfilment centre : centre logistique ; 2/ épanouissement (personnel) * full (a) : plein(e), entier/-ière, total(e) - full employment : (le) plein emploi - to be in full production : être en pleine production - full rotational speed : pleine vitesse de rotation - full stop : point final - full support : soutien total, appui entier - the full width of the tape : toute la largeur de la bande ; 2/ complet/-plète - full report : rapport complet * full (adv.) : pleinement (= fully, voir full-bodied, full-fledged, full-grown) * full and complete (paire adj.) : complet, complète, plein et entier, pleine et entière - a full and complete answer : une réponse complète - the full and complete acceptance of these provisions : l’acceptation pleine et entière de ces dispositions - the full and complete participation of all interested parties : la participation pleine et entière de tous les intéressés * full-bodied (ac) : [vin] corsé(e) * full-electric (ac) : entièrement électrique, 100% électrique - full-electric vehicle : véhicule entièrement électrique * full-featured (ac) : disposant de toutes les fonctions - full-featured fax modem : télécopieur ayant toutes les fonctions requises (var. full-feature) * full-fledged (ac) : 1/ [oiseau] qui a toute ses plumes ; 2/ [artiste] accompli(e) ; 3/ [activité] à part entière * full-frontal (ac) : entièrement nu(e) - full-frontal nudity : nudité intégrale (f) * full-grown (ac) : ayant atteint son plein développement, adulte - full-grown size : taille adulte (f) - full-grown tree : arbre ayant atteint son plein développement (syn. fully grown) * full-length (ac) : long(ue), (de) grande taille - full-length card : (Inf.) carte longue (f) - full-length film : long métrage (syn. feature film) * full-on (ac) : 1/ complet/-ète, total(e) - a full-on heart attack : une crise cardiaque massive - This is a full-on war now : Il s’agit d’une guerre totale maintenant ; 2/ bien chargé(e) - a full-on day : une journée bien chargée * full-scale (ac) : 1/ grandeur nature ; 2/ complet/-ète, total(e), généralisé(e) - full-scale war : guerre totale * full-size(d) (ac) : (de) grandeur nature, de taille normale, de taille longue * full-text (ac) : - full-text search (Inf.) : recherche plein texte, recherche en texte intégral * full-tilt (ac) : à plein régime - to run (a place) full tilt : faire tourner (une installation) à plein régime * full-throated (ac) : retentissant(e), tonitruant(e) - full-throated battle cry : cri de guerre retentissant * fully (adv.) : 1/ pleinement, totalement, entièrement ; 2/ à fond - to apply the brakes fully : actionner les freins à fond ; 3/ à bloc - fully laden cart : charrette chargée à bloc (f) * fully automated (ac) : entièrement automatisé(e) - fully automated production : production entièrement automatisée (f) * fully automatic (ac) : complètement automatique, sans opérateur - fully automatic operation : marche complètement automatique (f) * fully accredited (ac) : ayant toutes les accréditations, pleinement accrédité(e) - fully accredited journalist : journaliste muni(e) de toutes les accréditations * fully compatible (ac) : (Inf.) entièrement compatible, compatible à 100% * fully connected (ac) : (Inf.) [réseau, topologie] où tous les nœuds sont à connexion directe - fully connected topology : architecture à interconnexion intégrale * fully equipped (ac) : entièrement équipé(e) - fully equipped laptop computer (Inf.) : ordinateur de terrain tout équipé * fully functional (ac) : doté(e) de toutes les fonctions - fully functional version (Inf.) : version dotée de toutes les fonctions * fully functioning (ac) : en parfait état de fonctionnement - fully functioning computer (Inf.) : ordinateur en parfait état de marche * fully grown (ac) : ayant atteint son plein développement, adulte (syn. full-grown) * fully outfitted (ac) : entièrement équipé(e) - fully outfitted computer (Inf.) : ordinateur entièrement équipé * fully qualified (ac) : 1/ remplissant toutes les conditions requises, certifié(e) - fully qualified teacher : professeur certifié ; 2/ (Toile) complet/-ète - fully qualified domain name : nom de domaine complet * fully serviceable (ac) : en état de marche - fully serviceable unit : poste en état de marche * fully stabilised (ac) : totalement stabilisé(e) - fully stabilised situation : situation totalement stabilisée (f) * fully threaded (ac) : entièrement fileté(e) (anton. partly threaded : partiellement fileté(e)) - fully threaded hexagon-cap screw : vis à tête hexagonale entièrement filetée (f) * fully tighten (vc) (tr.) : visser à fond * fully upgradable (ac) : (Inf.) entièrement évolutif/-ve - fully upgradable PC : PC entièrement évolutif * fulminate (v) (intr.) : fulminer (against sb/sth, contre qch/qn), pester (against sb/sth, contre qch/qn) * fulsome (a) : obséquieux/-euse * fumble (n) : (Sport) réception ratée (f) (d’un ballon), ratage * fumble (v) (intr.) : tâtonner, être maladroit(e) * fumble-fingered (ac) : qui a la main maladroite * fume (v) (intr.) : [individu] rager * fumes (n pl.) (fa) : vapeurs (f pl.), fumées (f pl.), émanations (f pl.), gaz (pl.) - exhaust fumes : gaz d’échappement * fun (n) : plaisir, amusement - to be fun : être marrant à faire - to have fun : s’amuser - Let's have fun! : Amusons-nous un peu ! - to make fun of… : se moquer de… * function (n) (fa p) : 1/ fonction (f) ; 2/ cérémonie (f), réception (f) * function (v) (intr.) : fonctionner - to function autonomously : fonctionner de façon autonome * functional (a) : fonctionnel(le) - functional illiteracy : illetrisme * functionally (adv.) : fonctionnellement * functionally obsolete (ac) : ne répondant plus aux besoins actuels - functionally obsolete bridge : pont qui ne remplit plus ses fonctions * functionally significant (ac) : important sur le plan fonctionnel - functionally significant item : élément important sur le plan fonctionnel * functioning (a) : qui fonctionne, en état de fonctionnement, en état de marche, opérationnel(le) * functioning (n) : fonctionnement, marche (f) * fund (n) : 1/ fonds (faux pl.), caisse (f) - the International Monetary Fund : le Fonds monétaire international - pension fund : fonds de pensions (calque), caisse de retraite ; 2/ fonds (pl.), capital - fund raising : collecte de fonds (aussi fund-raising) * fund (v) (tr.) : financer * fundamental (a) : fondamental(e) - to be fundamental : être d’une importance fondamentale (to, pour) * fundamentally (adv.) : fondamentalement * funder (n) : bailleur de fonds, organisme de financement, source de financement * funding (n) : financement(s), investissement(s) * fundraise (v) (intr.) : collecter des fonds * fund-raising (brit.) / fundraising (amér.) (a) : de collecte de fonds - fundraising drive : campagne de collecte de fonds * fund-raising (brit.) / fundraising (amér.) (n) : collecte de fonds * funeral (n) : funérailles (f pl.) - de-luxe funeral : funérailles de luxe * fun-filled (ac) : où l'on s'amuse bien, très divertissant(e) - fun-filled day : (selon le cas) journée où l'on s'amuse bien / où l'on s'est bien amusé * fungible (a) : fongible (noter diff. ortho.) (anton. non-fungible : non fongible) * fungicide (n) : fongicide (noter diff. ortho.) * fungus (n) (pl. fungi) : moisissure (f) * funk (n) : peur (f), frousse (f) * funky (a) : 1/ qui sent mauvais, qui pue, puant(e), fétide, nauséabond(e) - to smell funky : cocotter, fouetter, schlinguer (vulg.) ; 2/ (amér.) bizarre, bizarroïde, drôle - The beer smells kind of funky : La bière a une drôle d’odeur ; 3/ (Mus.) stylé(e) * funnel (n) : entonnoir * funnel-shaped (ac) : en forme d’entonnoir * funny (a) : drôle, marrant(e) - The funny thing is that… : Ce qu’il y a de drôle, c’est que… * funster (n) : personne qui aime s’amuser * fur (n) : 1/ pelage ; 2/ fourrure (f) - fur muff : manchon en fourrure - fur seal : otarie à fourrure - fur trader : pelletier * furlough (n) : 1/ permission (f), perm (f) (abr. fam.) ; 2/ congé - compulsory furloughs : congés forcés (pl.) * furlough (v) (tr.) (amér.) : 1/ donner son congé à, mettre à pied ; 2/ mettre au chômage technique * furloughed (ppa) : 1/ congédié(e), mis(e) à pied ; 2/ mis(e) au chômage technique * furnish (v) (tr.) : meubler * furnished (a) (fa) : meublé(e) (anton. unfurnished : non meublé(e)) * furniture (n ind. sing.) (fa) : 1/ mobilier, meubles (pl.) - The furniture they sell is shoddy : Les meubles qu’ils vendent ne payent pas de mine - a piece of furniture : un meuble - storage furniture : meubles de rangement - furniture making : ébénisterie (f) - furniture restorer : restaurateur de meubles ; 2/ ferrures (f pl.) - door furniture : ferrures de porte * furred (a) : [animal] à fourrure * furrow (n) : sillon - to dig a furrow : (Agric.) creuser un sillon * furry (a) : à fourrure - furry mamal : manifère à fourrure * further (a) : supplémentaire, en plus - a further 50 mm : 50 mm de plus * Further, … (a m p) (m d l) (aussi entre virgules) : 1/ De plus, En outre ; 2/ D'ailleurs, Du reste * further (adv.) : davantage, encore plus * further (v) (tr.) : promouvoir, faire avancer * furtherance (n) : poursuite (f) (d’un objectif), promotion (f) (d’une cause), avancement (d’un domaine) - in (the) furtherance of multilingualism : pour faire avancer le multilinguisme, pour faire progresser le multilinguisme * furthermore (adv.) (m d l): de plus, en outre * fuse (n) : 1/ mèche (f) - slow-burning fuse : mèche lente ; 2/ fusible (n) - fuse box : coffret électrique * fuse (v) (tr.) : 1/ connecter avec un fusible ; 2/ couper * fuselage (n) : fuselage * fusilier (n) : (Milit.) fusilier * fustian (n) : futaine (f) * fuss (n) : 1/ agitation (f) (syn. noise, bustle) ; 2/ des histoires (f pl.) - to make a fuss : faire des histoires * fussiness (n) : 1/ caractère tatillon, caractère pointilleux - her fussiness over dress codes : son caractère tatillon en matière de code vestimentaire ; 2/ irritabilité (f) (d’un bébé), tendance à pleurer (d’un bébé) * fusspot (n) : faiseur d’embarras, causeur d’ennuis * fussy (a) : 1/ tatillon(ne), pointilleux/-euse, méticuleux/-euse ; 2/ irritable, difficile * futile (a) (fa) : inutile - Resistance is futile : Inutile de résister * future (a) : futur(e), à venir * future (n) (fa p) : 1/ avenir, évolutions (f pl.) à venir (éviter l'anglic. « futur » dans ce sens) - in the future : à l’avenir - at some time in the future : à une époque ou une autre de l’avenir - to decide a company's future : décider de l'avenir d'une compagnie - to foresee the future : prévoir l'avenir (syn. to anticipate the future) - to peer into the future : scruter l'avenir - the foreseeable future : l'avenir prévisible - future shock (expression issue du livre d’Alvin Toffler Future Shock) : a/ l'inaptitude à affronter le progrès; b/ le traumatisme résultant de cette inaptitude ; 2/ futur (= avenir virtuel) - (a) factory of the future : (une) usine futuriste ; 3/ (Bourse) - futures (pl.) : contrats à terme - the futures market : le marché des contrats à terme ; 4/ (Gram.) futur (le temps) - the historical future : le futur de narration * future-proof (v) (tr.) : prémunir contre les évolutions à venir * futurology (n) : (la) futurologie - a branch of futurology : une branche de la futurologie * futurologist (n) : futurologue (syn. a futurist) * fuzzy (a) : 1/ peu clair(e), flou(e) ; 2/ crépu(e) - fuzzy hair : cheveux crépus (pl.) 895cnk3c9fvz1fdydyl9uq1yzo1ifkw Fonctionnement d'un ordinateur/Les unités arithmétiques et logiques entières (simples) 0 80707 767857 766882 2026-06-16T19:53:54Z Mewtow 31375 /* Les ALU basées sur des ALU 1 bit */ 767857 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. Mais on peut aller encore plus loin... [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===L'unité de calcul à forçage des retenues=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===L'exemple de l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Elle est construite en assemblant plusieurs ALU de 1 bits, chacune basée sur un additionneur implémenté avec le circuit suivant, abordé précédemment dans ce chapitre : [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des ALU 1 bit== Les ALU précédentes sont basées sur des additionneurs auxquels on a rajouté des circuits, mais où les additionneurs complets eux-mêmes n'ont pas été modifiés. Les ALU que l'on va voir dans ce qui suit font l'inverse : elle transforment les additionneurs complets en de véritables ALU de 1 bit, capables de faire des opérations logiques ET/OU/XOR/NXOR. Les ALU 1 bit sont souvent connectées comme dans un additionneur à propagation de retenue, mais ce n'est pas systématique et on peut faire la même chose avec des additionneurs plus complexes. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 1h4dssbrgdl37z4bd4i0upqqh8qouko 767859 767857 2026-06-16T19:59:19Z Mewtow 31375 /* Les ALU basées sur des ALU 1 bit */ 767859 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. Mais on peut aller encore plus loin... [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===L'unité de calcul à forçage des retenues=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===L'exemple de l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Elle est construite en assemblant plusieurs ALU de 1 bits, chacune basée sur un additionneur implémenté avec le circuit suivant, abordé précédemment dans ce chapitre : [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Nous allons aussi voir la même chose, mais pour les portes logiques de 1 bit. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> kx80h5mggl0k45tzi3lz7l2kwto619m 767860 767859 2026-06-16T19:59:53Z Mewtow 31375 /* Les portes logiques universelles à deux entrées */ 767860 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. Mais on peut aller encore plus loin... [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===L'unité de calcul à forçage des retenues=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===L'exemple de l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Elle est construite en assemblant plusieurs ALU de 1 bits, chacune basée sur un additionneur implémenté avec le circuit suivant, abordé précédemment dans ce chapitre : [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> g73taa0w0m9prbfi40sg82gfyczlfi6 767861 767860 2026-06-16T20:04:01Z Mewtow 31375 /* L'exemple de l'ALU du processeur Intel x86 8008 */ 767861 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. Mais on peut aller encore plus loin... [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===L'unité de calcul à forçage des retenues=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues, sauf qu'elles ne manipule pas les retenues en entrée des additionneurs complets. A la place, elle manipule les retenues dans les additionneurs complets eux-même. Voyons exactement ce qu'elle fait. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 99ymhiqh7yzvq88nq3k8nybasgzkbl1 767862 767861 2026-06-16T20:04:31Z Mewtow 31375 /* L'unité de calcul à forçage des retenues */ 767862 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. Mais on peut aller encore plus loin... [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues, sauf qu'elles ne manipule pas les retenues en entrée des additionneurs complets. A la place, elle manipule les retenues dans les additionneurs complets eux-même. Voyons exactement ce qu'elle fait. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 63qqfhtieqhbce78mh8txfs9kian90d 767863 767862 2026-06-16T20:04:53Z Mewtow 31375 /* Les ALU basées sur la manipulation des retenues */ 767863 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues, sauf qu'elles ne manipule pas les retenues en entrée des additionneurs complets. A la place, elle manipule les retenues dans les additionneurs complets eux-même. Voyons exactement ce qu'elle fait. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 5t9dklyr8mpcl9iexrakgavealw7n9n 767864 767863 2026-06-16T20:09:19Z Mewtow 31375 /* La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008 */ 767864 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues en entrée des additionneurs complets, ce qui permet d'implémenter les opérations ET et OU. De plus, la retenue sortante des additionneurs est elle aussi manipulée de manière à implémenter l'opération XOR. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> jjnar69sots2zpqj7nmallbm3w7vl90 767865 767864 2026-06-16T20:16:05Z Mewtow 31375 /* La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008 */ 767865 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues en entrée des additionneurs complets, mais elle n'a pas de multiplexeur en sortie des additionneurs complets. A la place, elle procède en forçant las retenue sortante à 0. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour gérer le XOR, il suffit de mettre la retenue d'entrée à 0, ce qui est réalisé avec une vulgaire porte ET pour chaque additionneur complet, placée en aval de l'entrée de retenue. Pour gérer les deux autres opérations logiques, le circuit n'utilise pas de multiplexeur. Le résultat du ET/OU est bien disponible sur la sortie de résultat, non sur la sortie de retenue. A la place, le circuit utilise la porte ET et la porte OU de l'additionneur complet, et désactive la porte inutile. Pour un ET/OU, le circuit met à zéro la retenue entrante. De plus, elle met aussi à zéro la retenue sortante, sans quoi le circuit donne des résultats invalides. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] Pour info, le processeur Z80 avait une ALU similaire. * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> j6ut3nocs5fw1ccz26pedx0l37vquqc 767866 767865 2026-06-16T20:25:14Z Mewtow 31375 /* La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008 */ 767866 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008=== L'ALU du processeur Intel x86 8008 est une ALU 8 bits (les opérandes sont de 8 bits), qui implémente 4 opérations : l'addition, ET, OU, XOR. L'addition est réalisée par un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. L'ALU en question manipule bien les retenues en entrée des additionneurs complets, mais elle n'a pas de multiplexeur en sortie des additionneurs complets. A la place, elle procède en forçant las retenue sortante à 0. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour cela, l'ALU utilise deux méthodes : * la retenue entrante est forcée à 0 ou à 1 ; * le circuit altère la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] Pour info, le processeur Z80 avait une ALU similaire. * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> laoxr8eo95t5bryyv5bn451cd5jj5jp 767867 767866 2026-06-16T20:29:38Z Mewtow 31375 /* La manipulation de la retenue sortante : l'ALU du processeur Intel x86 8008 */ 767867 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante en modifiant un additionneur complet=== Dans cette section, nous allons étudier deux ALU assez similaires. La première est celle du processeur Intel x86 8008, la seconde est celle du processeur Z80. Les seules différences entre les deux sont que la première est une ALU 8 bits, l'autre une ALU de 4 bits. La première utilise l'anticipation de retenue pour l'addition, pas la seconde. Mais au-delà de ces différences, elles implémentent toutes deux 4 opérations : l'addition, ET, OU, XOR. Les ALU en question manipulent les retenues en entrée des additionneurs complets, mais elle n'a pas de multiplexeur en sortie des additionneurs complets. A la place, elle procède en modifiant l'intérieur d'un additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] L'additionneur précédent est modifié pour gérer les trois opérations XOR, ET, OU. Pour cela, l'ALU utilise deux méthodes : * la retenue entrante est forcée à 0 ou à 1 ; * le circuit altère la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] Pour info, le processeur Z80 avait une ALU similaire. * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> n697iqmbd4sr6qknst61qkbdfe9akdf 767868 767867 2026-06-16T20:30:48Z Mewtow 31375 /* La manipulation de la retenue sortante en modifiant un additionneur complet */ 767868 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante en modifiant un additionneur complet=== Dans cette section, nous allons étudier deux ALU assez similaires. La première est celle du processeur Intel x86 8008, la seconde est celle du processeur Z80. Les seules différences entre les deux sont que la première est une ALU 8 bits, l'autre une ALU de 4 bits. La première utilise l'anticipation de retenue pour l'addition, pas la seconde. Mais au-delà de ces différences, elles implémentent toutes deux 4 opérations : l'addition, ET, OU, XOR. Les ALU en question manipulent les retenues en entrée des additionneurs complets, mais elle n'a pas de multiplexeur en sortie des additionneurs complets. A la place, elle procède en modifiant l'intérieur d'un additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] Pour info, le processeur Z80 avait une ALU similaire. * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 98gy04vsennurjofo6x9qxrpzmjpx1i 767869 767868 2026-06-16T20:39:13Z Mewtow 31375 /* La manipulation de la retenue sortante en modifiant un additionneur complet */ 767869 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante en modifiant un additionneur complet=== Dans cette section, nous allons étudier deux ALU assez similaires. La première est celle du processeur Intel x86 8008, la seconde est celle du processeur Z80. Les seules différences entre les deux sont que la première est une ALU 8 bits, l'autre une ALU de 4 bits. La première utilise l'anticipation de retenue pour l'addition, pas la seconde. Mais au-delà de ces différences, elles implémentent toutes deux 4 opérations : l'addition, ET, OU, XOR. Les ALU en question manipulent les retenues en entrée des additionneurs complets, mais elle n'a pas de multiplexeur en sortie des additionneurs complets. A la place, elle procède en modifiant l'intérieur d'un additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forcant la renteue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forcant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8008, voici un lien qui pourrait vous intéresser : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] Pour info, le processeur Z80 avait une ALU similaire. * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> hovwm372allns8ryjwqrxcrniwos761 767870 767869 2026-06-16T20:42:02Z Mewtow 31375 /* La manipulation de la retenue sortante en modifiant un additionneur complet */ 767870 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante en modifiant un additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. our rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forcant la renteue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forcant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> dc91mgtoyxdi4c31yx170vlthp0zlzn 767871 767870 2026-06-16T20:42:33Z Mewtow 31375 /* La manipulation de la retenue sortante en modifiant un additionneur complet */ 767871 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue sortante en modifiant un additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. our rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 7f3i3xd6vq7wajmxoc9hsv9pvlcr2x7 767875 767871 2026-06-16T20:55:28Z Mewtow 31375 /* La manipulation de la retenue sortante en modifiant un additionneur complet */ 767875 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. our rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 051fwox2wm1tnvc99o8g90k5hssmylq 767876 767875 2026-06-16T20:55:52Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767876 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, l'additionneur complet est modifié. L'idée est d'altérer la retenue sortante à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 2vepozu11br9spg0tl5xfkn92eure9n 767877 767876 2026-06-16T20:56:27Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767877 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> a9lpf97a3nvcekeamlrmr6w95kun5v3 767878 767877 2026-06-16T20:56:37Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767878 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque. Leur budget en transistors était en faveur des additionneurs à propagation de retenue. Dans les faits, l'implémentation exacte était légèrement plus complexe, vu que ce circuit était conçu à partir de portes TTL AND-OR-NAND, qui regroupe une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus sur ces deux ALUs, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 2szv8vu5cmz06zyl12ykeqxqhquvz4v 767879 767878 2026-06-16T20:57:48Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767879 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. [[File:ALU à propagation de retenue.jpg|centre|vignette|upright=2|ALU parallèle fabriquée à partir d'ALU 1 bit.]] ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 6c4zewohs16jj0idrscyqj83d7gwnv4 767880 767879 2026-06-16T20:59:18Z Mewtow 31375 /* Les ALU basées sur des portes logiques universelles */ 767880 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU basées sur la manipulation des retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 2fpd71awt1rudbffidaricbrhs3aakn 767881 767880 2026-06-16T21:00:04Z Mewtow 31375 /* Les ALU basées sur la manipulation des retenues */ 767881 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Les unités de calcul logiques fabriquées avec des additionneurs complets=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> ctxcv722d9l5f494krsukzl0lnz2b45 767882 767881 2026-06-16T21:00:24Z Mewtow 31375 /* Les unités de calcul logiques fabriquées avec des additionneurs complets */ 767882 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> e3kwxuqs1jdntcwz12bnnytzn5u75pw 767883 767882 2026-06-16T21:01:27Z Mewtow 31375 /* Un additionneur complet est une petite ALU de 1 bit */ 767883 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un ET logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> 61rbd6hquk5dabbiw6mcmmziwvgikvr 767886 767883 2026-06-17T00:39:07Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767886 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. Pour distinguer cette retenue de celle qui sort de l'additionneur complet, on l’appellera la '''retenue interne'''. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. * Un NAND logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. Pour comprendre pourquoi, regardons ce qui se passe quand on met la retenue interne à 0. Le bit de somme est alors un NOR entre le résultat de la porte ET et celui de l'autre porte NOR. Et là, il y a deux situations, suivant qu'on mette la retenue interne à 0, à 1. * Si on met la retenue entrante à 0, la porte ET sortira un 0, la porte NOR fera un NOR entre les deux bits d'opérande. Le résultat de la porte NOR inversera donc ce résultat, ce qui donne un OU entre les deux bits d'opérande. * Si on met la retenue entrante à 1, la porte ET sort le ET entre les deux bits d'opérande, et la porte NOR sortira un zéro. La porte NOR finale inversera le résultat du Et, ce qui donne un NAND. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> g4e90qmpr8d9eaz5wvrssgzlbpfj8ze 767887 767886 2026-06-17T00:39:29Z Mewtow 31375 /* La manipulation de la retenue dans l'additionneur complet */ 767887 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu les circuits pour l'addition, la soustraction et les comparaisons. Nous avons aussi vu qu'il est très facile d'implémenter la soustraction en rajoutant quelques portes logiques à un additionneur. Et de même, une fois qu'on sait faire la soustraction, implémenter les comparaisons demande juste d'ajouter quelques portes logiques. Mais il est possible d'aller plus loin ! Dans ce chapitre, nous allons voir un circuit appelé une '''unité de calcul arithmétique et logique''', abrévié ALU (''Arithmetic and Logical Unit''). Comme son nom l'indique, elle effectue des additions, des soustractions, des comparaisons et des opérations bit à bit. La plupart des ALUs ne gèrent pas les multiplications/divisions et vous comprendrez pourquoi dans ce qui suit. Tous les processeurs contiennent au moins une ALU. En fait, créer un processeur demande une unité de calcul, des registres, un circuit de communication avec la mémoire et d'interconnecter le tout. Il faut aussi ajouter des circuits pour commander le tout, qui sont regroupés dans l'unité de contrôle. L'unité de contrôle lit les instructions en mémoire, puis commande l'unité de calcul, les registres et la mémoire pour que l'instruction soit exécutée correctement. L'unité de contrôle est assez complexe et aura droit à plusieurs chapitres dédiés, nous avons déjà vu les registres, il est temps de voir l'unité de calcul. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] ==L'interface d'une unité de calcul et sa conception== L'interface d'une ALU est assez simple. Il y a évidemment les entrées pour les opérandes et la sortie pour le résultat, mais aussi une entrée de commande qui permet de choisir l'instruction à effectuer. Sur cette entrée, on place une suite de bits qui précise l'instruction à effectuer, qui varie d'une ALU à l'autre. La suite de bit peut être vu est aussi appelée l''''''opcode''''', ce qui est un diminution de ''code opération''. L'ALU a aussi une '''entrée de retenue entrante''', sur le même modèle que les additionneurs. Pour rappel, les additionneurs sont conçus avec des additionneurs complets, qui prennent trois bits en entrée : deux bits d'opérande et un bit de retenue. Pour la colonne des bits de poids faible, il y a aussi un additionneur complet qui prend en opérande les deux bits de poids faible, mais aussi une retenue entrante. Les unité de calcul entières contiennent un additionneur entier, ce qui fait qu'elles aussi disposent de cette entrée de retenue. Elles fournissent aussi la retenue en sortie, avec d'autres informations, ce qui nous amène à parler des sorties de l'ALU. En plus de la sortie pour le résultat, l'ALU a des sorties de 1 bit appelées des '''''flags''''', ou indicateurs. Les plus fréquents sont les fameux bits intermédiaires vu dans le chapitre sur les comparaisons : un bit qui est à 1 si un débordement d'entier a eu lieu (la retenue de sortie), un bit qui est à 1 si un débordement d'entier en complètement à deux a eu lieu, un bit qui indique si le résultat est zéro, le bit de signe du résultat en complément à deux. Si c'est le cas, les bits intermédiaires alimentent souvent un circuit qui calcule le résultat d'une comparaison, qui est considéré comme séparé de l'ALU. Mais une ALU peut fournir d'autres ''flags'' en plus de ces 4 bits intermédiaires, voire ne pas fournir les 4 bits précédents, tout dépend de l'ALU. Par exemple, certains processeurs avaient un ''flag'' qui donnait le bit de parité du résultat. Autre exemple, les processeurs avec un support du BCD avaient des ''flags'' dédiés à la gestion du BCD. Le processeur Z80 fournissait les deux ''flags'' des exemples précédents, à savoir un ''flag'' pour le bit de parité du résultat, un autre pour la gestion du BCD, et un autre pour indiquer que le résultat valait zéro. [[File:Interface d'une ALU.jpg|centre|vignette|upright=2|Interface d'une ALU]] ===Le ''bit-slicing''=== Avant l'invention des premiers microprocesseurs, les processeurs étaient fournis en pièces détachées qu'il fallait relier entre elles. Le processeur était composé de plusieurs circuits intégrés, placés sur la même carte mère et connectés ensemble par des fils métalliques. Et l'ALU était un de ces circuits intégrés. Les ALUs en pièces détachée de l'épique étaient assez simples et géraient des opérandes de 2, 4, 8 bits, rarement 16 bits. Mais il était possible d'assembler plusieurs ALU pour créer des ALU plus grandes. Par exemple, on pouvait combiner plusieurs ALU 4 bits pour créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Par exemple, l'ALU des processeurs AMD Am2900 est une ALU de 16 bits composée de plusieurs sous-ALU de 4 bits. Cette technique qui consiste à créer des unités de calcul plus grosses à partir d’unités de calcul plus élémentaires s'appelle le '''''bit slicing'''''. Le ''bit slicing'' est utilisé pour des ALU capables de gérer les opérations bit à bit, l'addition, la soustraction, mais guère plus. Il n'y a pas, à ma connaissance, d'ALU en bit-slicing capable d'effectuer une multiplication ou une division. L'implémentation des opérations bit à bit avec une ALU bit-slice est triviale, la seule complication mineure est l'addition. Si on combine deux ALU de 4 bits, la première calcule l'addition des 4 bits de poids faible, alors que le second calcule l'addition des 4 bits de poids fort. Mais il faut propager la retenue de l'addition des 4 bits de poids faible à la seconde ALU. Pour cela, l'ALU doit transmettre un '''bit de retenue''' sortant à l'ALU suivante, qui doit elle accepter celui-ci sur une entrée. Il faut que l'ALU ait une interface compatible : il faut qu'elle ait une entrée de retenue, et une sortie pour la retenue sortante. La retenue passée en entrée est automatiquement prise en compte lors d'une addition par l'ALU. Comme nous l'avons vu dans le chapitre dédié aux circuits de calculs, ajouter une entrée de retenue ne coute rien et est très simple à implémenter en à peine quelques portes logiques. ===L'intérieur d'une unité de calcul=== Les unités de calcul les plus simples contiennent un circuit différent pour chaque opération possible. L’entrée de sélection commande des multiplexeurs pour sélectionner le bon circuit. [[File:Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.png|centre|vignette|upright=2.0|Unité de calcul conçue avec des sous-ALU reliées par des multiplexeurs.]] Mais les ALU que nous allons voir fonctionnent autrement. Elles sont construites sur le même modèle que l'additionneur-soustracteur, qui est un circuit configurable. On lui envoie un bit de commande qui décide entre addition ou soustraction, ce bit de commande configure un inverseur commandable et la retenue entrante. Les ALU qui vont suivre disposent de plusieurs circuits semblables à l'inverseur commandable. Ils possèdent une entrée de commande, dont la valeur est déduite par un circuit combinatoire à partir du code opération (généralement un décodeur). [[File:ALU composée de sous-ALU configurables.png|centre|vignette|upright=2.0|ALU composée de sous-ALU configurables.]] ==Les ALU entières basées sur un additionneur-soustracteur== Pour rappel, un additionneur soustracteur est fait en combinant un additionneur avec un inverseur commandable. L'entrée de retenue et l'entrée de commande de l'inverseur sont partagée, c'est le même bit qui est envoyé sur les deux. Mais dans ce qui suit, on va supposer qu'elles sont découplées, qu'on peut envoyer des bits différents sur les deux. Le circuit est donc celui-ci : [[File:Additionneur soustracteur.png|centre|vignette|upright=2|Additionneur soustracteur]] De plus, nous allons ajouter un circuit commandable de mise à zéro pour la seconde entrée d'opérande. [[File:ALU basée sur un additionneur soustracteur modifié.png|centre|vignette|upright=2|ALU basée sur un additionneur soustracteur modifié]] L'ALU obtenue ainsi supporte 8 opérations distinctes, résumées dans le tableau ci-dessous. Les principales sont l'addition, la soustraction, l'opération NOT, l'incrémentation, le calcul du complément à deux, et l'identité (une entrée est recopiée sur la sortie). {|class="wikitable" |- ! Reset !! Invert !! Retenue entrante !! !! Sortie de l'ALU |- | 0 || 0 || 0 || || A + B |- | 0 || 0 || 1 || || A + B + 1 |- | 0 || 1 || 0 || || A + <math>NOT(B)</math> = A - B - 1 |- | 0 || 1 || 1 || || A - B |- | 1 || 0 || 0 || || B |- | 1 || 0 || 1 || || B + 1 |- | 1 || 1 || 0 || || <math>NOT(B)</math> |- | 1 || 1 || 1 || || <math>NOT(B)</math> + 1 (complément à deux) |} Pour les autres opérations bit à bit, l'idéal est d'ajouter des circuits pour les opérations ET/OU/XOR en parallèle de l'additionneur-soustracteur et d'utiliser un multiplexeur pour choisir quel circuit donne le résultat. Une amélioration relie l'inverseur commandable non seulement à l'additionneur, mais aussi aux portes ET/OU/XOR. Il est aussi possible de faire pareil avec le circuit pour mettre à zéro l'opérande non inversée. Le tout permet d'ajouter quelques opérations logiques gratuitement, juste en changeant le câblage du circuit [[File:Simplified-ALU.svg|centre|vignette|upright=2|ALU simplifiée.]] ==Les ALU qui manipulent les retenues== L'ALU précédente implémente pas les opérations bit à bit en ajoutant des circuits autour de l'additionneur. Cependant, il existe une alternative qui modifie l'additionneur pour qu'il devienne capable de faire des opérations ET/OU/XOR. Pour comprendre comment faire, il faut rappeler qu'un additionneur est composé de deux parties : une couche d'additionneurs complets, et le reste qui s'occupe du calcul ou de la propagation des retenues. Et il se trouve qu'en manipulant les retenues, on peut émuler d'autres opérations à partir de l'addition. Par exemple, nous avons déjà vu que l'opération XOR est une addition dans laquelle les retenues seraient ignorées. En conséquence, on peut émuler un XOR à partir d'une addition, en rajoutant un circuit pour mettre les retenues à 0, simplement composé de portes ET. Le choix de l'opération est le fait d'une entrée de commande : mise à 0 pour un XOR et à 1 pour l'addition. [[File:Circuit qui fait ADD et XOR.png|centre|vignette|upright=2|Circuit qui fait ADD et XOR.]] Mais on peut aller encore plus loin... ===Un additionneur complet est une petite ALU de 1 bit=== Mine de rien, un additionneur complet seul est capable d'exécuter de nombreuses opérations bit à bit, ce qui permet d'implémenter une unité de calcul logique avec des additionneurs complets. Pour rappel, une unité de calcul logique ne gère que les opérations bit à bit, pas l'addition ni la soustraction. Les opérations supportées sont les opérations NOT, OU, ET, XOR, parfois d'autres comme NXOR. Et un additionneur complet gère ces opérations nativement. Pour rappel, un additionneur complet additionne trois bits, en faisant deux XOR : : <math>\text{Somme} = (A \oplus B) \oplus \text{Retenue entrante}</math> : <math>\text{Retenue sortante} = (A \oplus B) . \text{Retenue entrante} + (A . B)</math> Il est alors intéressant de voir ce qui se passe si on force la retenue entrante à 0 ou 1. Si on force la retenue entrante à 0, le tout se simplifie grandement. On rappelle à toute fin utile que <math>X \oplus 0 = X</math>. Les équations précédentes deviennent : : <math>\text{Somme} = (A \oplus B)</math> : <math>\text{Retenue sortante} = A . B</math> A l'opposé, si on force les retenues à 1, les équations deviennent totalement différentes. Sachant que <math>X \oplus 1 = \overline{X}</math>, on obtient : : <math>\text{Somme} = \overline{A \oplus B}</math> : <math>\text{Retenue sortante} = (A \oplus B) + (A . B) = A + B</math> Pour résumer : * Si la retenue d'entrée est à 0, la retenue de sortie est un ET entre les deux bits d'opérandes, le bit de somme en est le XOR. * Si on met la retenue entrante à 1, alors la retenue sortante sera un OU entre les deux bits d'opérandes, le bit de somme en est le NXOR. ===Les ALU à manipulation de retenue=== Pour manipuler des retenues, il faut ajouter un circuit de masquage dans l'additionneur-soustracteur, pour mettre les retenues à 0/1. Le circuit de masquage : soit recopie le bit d'entrée (pour l'addition), soit force les entrées de retenue à 0, soit les force à 1. Le circuit de masquage est composé de portes universelles 1 bit, un circuit qu'on a abordé dans le chapitre sur les opérations bit à bit, avec une porte universelle par retenue. [[File:Additionneur modifiée en ALU entière capable de faire des XOR et NXOR.png|centre|vignette|upright=2|Additionneur modifiée en ALU entière capable de faire des XOR et NXOR]] Pour finaliser le circuit, il faut connecter la sortie soit aux bits de résultat, soit aux entrées de retenue, ce qui demande un simple multiplexeur. [[File:Implémentation d'une ALU entière simple.png|centre|vignette|upright=2|Implémentation d'une ALU entière simple]] ===La manipulation de la retenue dans l'additionneur complet=== L'ALU précédent utilise un multiplexeur en sortie des additionneurs complets, pour implémenter le OU et le ET bit à bit. Mais il existe une alternative qui modifie l'additionneur complet. Pour rappel, il est possible de créer un additionneur complet comme illustré ci-dessous. L'idée est que l'additionneur complet calcule d'abord la retenue sortante, puis en déduit le bit de somme. Pour distinguer cette retenue de celle qui sort de l'additionneur complet, on l’appellera la '''retenue interne'''. [[File:Full adder basé sur une modification de la retenue.png|centre|vignette|upright=2|Full adder basé sur une modification de la retenue]] En plus de modifier la retenue entrante, la retenue sortante est elle aussi modifiée, à l'intérieur de l'additionneur complet : elle est soit forcée à 0, soit forcée à 1. * Un XOR s'obtient en forçant la retenue entrante à 0, et en laissant la retenue interne telle quelle. * Un OU logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 0. * Un NAND logique s'obtient en forçant la retenue interne à 0, et la retenue entrante à 1. On peut obtenir un ET en ajoutant une porte NON au circuit précédent. Pour comprendre pourquoi, regardons ce qui se passe quand on met la retenue interne à 0. Le bit de somme est alors un NOR entre le résultat de la porte ET et celui de l'autre porte NOR. Et là, il y a deux situations, suivant qu'on mette la retenue interne à 0, à 1. * Si on met la retenue entrante à 0, la porte ET sortira un 0, la porte NOR fera un NOR entre les deux bits d'opérande. Le résultat de la porte NOR inversera donc ce résultat, ce qui donne un OU entre les deux bits d'opérande. * Si on met la retenue entrante à 1, la porte ET sort le ET entre les deux bits d'opérande, et la porte NOR sortira un zéro. La porte NOR finale inversera le résultat du Et, ce qui donne un NAND. Une ALU de ce type a été utilisée sur les processeurs Intel x86 8008, ainsi que dans les processeurs Z80. L'ALU du processeur Intel x86 8008 est une ALU 8 bits, qui utilise un circuit d'anticipation de retenue, chose assez rare sur les processeurs de l'époque en raison de leur faible budget en transistors. L'implémentation exacte sur le 8008 était légèrement plus complexe, car il utilisait des portes logiques TTL AND-OR-NAND, qui regroupent une porte ET, une porte OU et une porte NAND en une seule. Pour ceux qui veulent en savoir plus, voici quelques liens : * [https://www.righto.com/2017/02/reverse-engineering-surprisingly.html Reverse-engineering the surprisingly advanced ALU of the 8008 microprocessor] * [https://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html The Z-80 has a 4-bit ALU. Here's how it works.] ==Les ALU basées sur des portes logiques universelles== Les ALU que nous allons voir dans cette section sont des additionneurs à propagation de retenue, dans lesquels les additionneurs complets sont remplacés par des unité de calcul de 1 bits, plus complexes que prévues. Les unités de calcul en question peuvent manipuler la retenue sortante, pour la mettre à 1 ou 0, comme indiqué plus haut. Cependant, ce n'est pas de cette manière que sont implémentées les opérations logiques. A la place, elles sont implémentées en utilisant des '''portes logiques universelles'''. ===Les portes logiques universelles à deux entrées=== Dans cette section, nous allons voir comment créer un circuit capable d'effectuer plusieurs opérations logiques, le choix de l'opération étant le fait d'une entrée de commande. Par exemple, imaginons un circuit capable de faire à la fois un ET, un OU, un XOR et un NXOR. Le circuit contiendra une entrée de commande de 2 bits, et la valeur sur cette entrée permet de sélectionner quelle opération faire : 00 pour un ET, 01 pour un OU, 11 pour un XOR, 01 pour le NXOR. Nous allons créer un tel circuit, sauf qu'il est capable de faire toutes les opérations entre deux bits et regroupe donc les 16 portes logiques existantes. Sachez qu'avec un simple multiplexeur, on peut créer un circuit qui effectue toutes les opérations bit à bit possible avec deux bits. Et cela a déjà été utilisé sur de vrais ordinateurs. Pour deux bits, divers théorèmes de l’algèbre de Boole nous disent que ces opérations sont au nombre de 16, ce qui inclus les traditionnels ET, OU, XOR, NAND, NOR et NXOR. Voici la liste complète de ces opérations, avec leur table de vérité ci-dessous (le nom des opérations n'est pas indiqué) : * Les opérateurs nommés 0 et 1, qui renvoient systématiquement 0 ou 1 quel que soit l'entrée ; * L'opérateur OUI qui recopie l'entrée a ou b, et l'opérateur NON qui l'inverse : <math>a</math>, <math>b</math>, <math>\overline{a}</math>, <math>\overline{b}</math> ; * L’opérateur ET, avec éventuellement une négation des opérandes : <math>a . b</math>, <math>\overline{a} . b</math>, <math>a . \overline{b}</math>, <math>\overline{a . b}</math> ; * La même chose avec l’opérateur OU : <math>a + b</math>, <math>\overline{a} + b</math>, <math>a + \overline{b}</math>, <math>\overline{a + b}</math> ; * Et enfin les opérateurs XOR et NXOR : <math>a \oplus b</math>, <math>\overline{a \oplus b}</math>. {|class="wikitable" |- !a !b ! !<math>0</math> !<math>a . b</math> !<math>a . \overline{b}</math> !<math>a</math> !<math>\overline{a} . b</math> !<math>b</math> !<math>a \oplus b</math> !<math>a + b</math> !<math>\overline{a . b}</math> !<math>\overline{a \oplus b}</math> !<math>\overline{b}</math> !<math>a + \overline{b}</math> !<math>\overline{a}</math> !<math>\overline{a} + b</math> !<math>\overline{a + b}</math> !<math>1</math> |- |0 || 0 || - ||0 || 0 ||0 ||0 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||1 ||1 ||1 ||1 |- |0 ||1 || - ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 ||0 ||0 ||0 ||0 ||1 ||1 ||1 ||1 |- |1 ||0 || - ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 ||0 ||0 ||1 ||1 |1 |- |1 ||1 || - ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 ||0 ||1 |} Le circuit à concevoir prend deux bits, que nous noterons a et b, et fournit sur sa sortie : soit a ET b, soit a OU b, soit a XOR b, etc. Pour sélectionner l'opération, une entrée du circuit indique quelle est l'opération à effectuer, chaque opération étant codée par un nombre. On pourrait penser que concevoir ce circuit serait assez complexe, mais il n'en est rien grâce à une astuce particulièrement intelligente. Regardez le tableau ci-dessus : vous voyez que chaque colonne forme une suite de bits, qui peut être interprétée comme un nombre. Il suffit d'attribuer ce nombre à l'opération de la colonne ! En faisant ainsi, le nombre attribué à chaque opération contient tous les résultats de celle-ci. Il suffit de sélectionner le bon bit parmi ce nombre pour obtenir le résultat. Et on peut faire cela avec un simple multiplexeur, comme indiqué dans le schéma ci-dessous ! [[File:Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|Unité de calcul bit à bit de 2 bits, capable d'effectuer toute opération bit à bit.]] Il faut noter que le raisonnement peut se généraliser avec 3, 4, 5 bits, voire plus ! Par exemple, il est possible d'implémenter toutes les opérations bit à bit possibles entre trois bits en utilisant un multiplexeur 8 vers 3. Maintenant que nous sommes armés des portes logiques universelles, nous pouvons implémenter un circuit généraliste, qui peut effectuer la même opération logique sur tous les bits. Ce circuit est appelé une '''unité de calcul logique'''. Elle prend en entrée deux opérandes, ainsi qu'une entrée de commande sur laquelle on précise quelle opération il faut faire. Elle est simplement composée d'autant de portes universelles 2 bits qu'il n'y a de bits dans les deux opérandes. Par exemple, si on veut un circuit qui manipule des opérandes 8 bits, il faut prendre 8 portes universelles deux bits. Toutes les entrées de commande des portes sont reliées à la même entrée de commande. [[File:Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit.png|centre|vignette|upright=2|Unité de calcul bit à bit de 4 bits, capable d'effectuer toute opération bit à bit]] ===L'exemple de l'ALU du processeur 8086 d'Intel=== Voyons maintenant l'ALU du processeur 8086 d'Intel, un des tout premier de la marque. Elle est basée sur un additionneur complet qui calcule la retenue sortante avec un multiplexeur 2 vers 1, illustré ci-dessous. [[File:Additionneur complet basé sur un MUX.png|centre|vignette|upright=2|Additionneur complet basé sur un MUX]] Sur le 8086, la porte XOR et la porte ET sont remplacées par une porte logique universelle commandable 2 bit, à savoir un circuit qui peut remplacer toutes les portes logiques 2 bit existantes. Pour configurer les deux portes, l'ALU contient un petit circuit combinatoire qui traduit l'''opcode'' en signaux envoyés aux portes universelles. [[File:ALU du 8086 (bloc de 1 bit).png|centre|vignette|upright=2|ALU du 8086 (bloc de 1 bit)]] Pour l'addition et la soustraction, les deux portes sont configurées pour reformer sur un additionneur complet. Pour les opérations bit à bit, la porte qui remplace le XOR est alors configurée pour donner la porte voulue : soit un ET, soit un OU, soit un XOR, soit.... En parallèle, l'autre porte logique a un 0 sur sa sortie, afin de mettre les retenues à 0. [[File:ALU du 8086 lors d'une opération logique.png|centre|vignette|upright=2|ALU du 8086 lors d'une opération logique]] L'ALU du 8086 supporte aussi les décalages d'un rang vers la gauche, qui sont équivalents à une multiplication par deux. L'opérande à décaler est envoyé sur les entrées A de chaque additionneur complet. Les deux portes logiques universelles sont alors configurées comme suit : la porte de propagation se comporte comme une porte FALSE, l'autre comme une porte OUI qui recopie l'entrée A. [[File:ALU du 8086 lors d'un décalage à gauche d'un rang.png|centre|vignette|upright=2|ALU du 8086 lors d'un décalage à gauche d'un rang]] Pour ceux qui veulent en savoir plus sur les circuits de calcul de l'Intel 8086, voici un lien : * [https://www.righto.com/2020/08/reverse-engineering-8086s.html Reverse-engineering the 8086's Arithmetic/Logic Unit from die photos] ==L'exemple de l'unité de calcul 74181== L''''unité de calcul 74181''' est très souvent présentée dans les cours d'architecture des ordinateurs, pour son aspect pédagogique indéniable. Elle a été commercialisée dans les années 60, à une époque où processeurs étaient vendus en kit, en pièces détachées. Les pièces détachées en question étaient des boitiers qui contenaient des registres, l'unité de calcul, des compteurs, des PLA, qu'on assemblait sur une carte électronique pour faire le processeur. Le 74181 était une ALU de 4 bits, ce qui veut dire qu'elle prenait en entrée deux opérandes entiers de 4 bits et fournissait un résultat de 4 bits. Il était possible de faire du ''bit-slicing'', à savoir de combiner plusieurs 74181 afin de créer une unité de calcul 8 bits, 12 bits, 16 bits, etc. Le 74181 était spécifiquement conçu pour, car il gérait un bit de retenue en entrée et fournissait une sortie pour la retenue du résultat. Il était possible de placer plusieurs 74181 en série, afin d'obtenir une ALU plus grande. Une autre solution utilisait une unité d'anticipation de retenue séparée, à savoir l'unité 74182, spécialement conçue pour travailler avec des 74181. Elle prenait en entrées 4 signaux P et G pour la propagation et la génération de retenue, et fournissait en sortie 4 retenues. Cela permettait de combiner jusqu'à 4 ALUs 74181. ===Les opérations gérées par l'ALU 74181=== Le 74181 fonctionne concrètement comme un additionneur-soustracteur amélioré sur deux points. Premièrement, l'inverseur commandable est remplacé par une porte universelle 2 bits. Pour l'additionneur, il conserve son entrée de retenue, mais il est désactivable. Concrètement, il y a un MUX en sortie de l'ALU qui choisit la sortie parmi : la sortie des portes universelles 2 bits, la sortie de l'additionneur. L'entrée de sélection de l'instruction fait 5 bits, ce qui colle parfaitement avec les 32 instructions possibles. Les 5 bits en question sont séparés en deux : un groupe de 4 bits qui précise l'opération bit à bit, et un '''bit M''' qui indique s'il faut faire l'addition ou non. Dans le groupe de 4 bits, les bits sont notés s0, s1, s2 et s3. [[File:Schéma fonctionnel du 74181.png|centre|vignette|upright=2|Schéma fonctionnel du 74181.]] En conséquence, le 74181 peut combiner l'addition et les 16 opérations bit à bit (donc toutes les opérations de ce type possibles entre deux bits). L'ALU 74181 peut fonctionner selon deux modes. Dans le premier mode, il effectue une opération bit à bit seule. Dans le second mode, il effectue une opération bit à bit entre les deux nombres d'entrée A et B, additionne le nombre A au résultat, et additionne la retenue d'entrée. Pour résumer, il effectue une opération bit à bit et une addition facultative. Un exemple d'opération de ce genre est la soustraction, obtenue en combinant l'opération bit à bit NOT, une retenue d'entrée à 1, et une addition. En tout, le 74181 était capable de réaliser 32 opérations différentes : les 16 opérations bit à bit seules, et 16 autres opérations obtenues en combinant une opération bit à bit avec une addition. ===L'implémentation de l'ALU 74181=== Le 74181 comprend 75 portes logiques, mais ce nombre est à relativiser car l’implémentation utilisait des optimisations qui fusionnaient plusieurs portes entre elles. Elle utilisait notamment des portes AND-OR-NOT, identique à une porte ET suivie d'une porte NOR. L'implémentation de ce circuit est, sur le papier, très simple. On prend un additionneur à anticipation de retenue, et chaque additionneur complet est précédé par une porte logique universelle 2 bit, réalisée avec un multiplexeur. Le circuit est cependant très optimisé, dans le sens où l'additionneur complet est fusionné avec la porte logique universelle. L'idée part d'un additionneur PG, qui génère deux signaux de propagation et de génération de retenue sont calculés. Le 8086 remplace les deux portes qui calculent ces signaux par des portes universelles 2 bits. Le 74181 n'utilise qu'une seule porte logique universelle, très modifiée. En clair, le 714181 est composé d'ALU 1 bit reliées à un circuit d’anticipation de retenue. La table de vérité de vérité des ALU 1 bit est la suivante. On part du principe que le circuit a deux entrées A et B, et calcule A + f(A,B), avec f(A,B) une opération bit à bit. {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || f(0,0) || 0 |- | 0 || 1 || || 0+f(0,1) || || f(0,0) || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || f(1,0) |- | 1 || 1 || || 1+f(1,1) || || 1 || f(1,1) |} Sur le 74181, il faut imaginer que le circuit qui calcule f(A,B) est une porte universelle commandable 2 bits, réalisée avec un multiplexeur. Les bits du résultat sont envoyés sur les 4 entrées du multiplexeur, et le multiplexeur choisit le bon bit à partir des entrées A et B (qui sont envoyés sur son entrée de commande. Les 4 entrées du multiplexeur sont notées S0, S1, S2 et S3. On a alors : {|class="wikitable" |- ! A || B || || A PLUS f(a,b) || || P || G |- | 0 || 0 || || 0+f(0,0) || || S1 || 0 |- | 0 || 1 || || 0+f(0,1) || || S0 || 0 |- | 1 || 0 || || 1+f(1,0) || || 1 || S2 |- | 1 || 1 || || 1+f(1,1) || || 1 || S3 |} Le circuit pour faire cela est le suivant : [[File:Circuit de base du 74181, avant l'additionneur.jpg|centre|vignette|upright=2|Circuit de base du 74181, avant l'additionneur]] Le schéma du circuit est reproduit ci-dessous. Un œil entrainé peut voir du premier coup d’œil que l'additionneur utilisé est un additionneur à anticipation de retenue modifié. La première couche dans le schéma ci-dessous correspond au circuit qui calcule les signaux P et G. La seconde couche est composée du reste de l'additionneur, à savoir du circuit qui combine les signaux de propagation et de génération des retenues finales. [[File:74181aluschematic.png|centre|vignette|upright=2|Schéma des portes logique de l'ALU 74181.]] Pour ceux qui veulent en savoir plus sur cette unité de calcul et n'ont pas peur de lire une analyse des transistors TTL de la puce, voici deux articles très intéressant sur cette ALU : * [https://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html Inside the vintage 74181 ALU chip: how it works and why it's so strange ] * [https://www.righto.com/2017/01/die-photos-and-reverse-engineering.html Inside the 74181 ALU chip: die photos and reverse engineering] ==Les ALU sérielles== Les '''ALU sérielles''' effectuent leurs calculs 1 bit à la fois, bit par bit. Le circuit est alors très simple : il contient un circuit de calcul très simple, de 1 bit, couplé à trois registres à décalage : un par opérande, un pour le résultat. Le circuit de calcul prend trois bits en entrées et fournit un résultat d'un bit en sortie, avec éventuellement une retenue en sortie. Une bascule est ajoutée au circuit, pour propager les retenues des additions/soustractions, elle ne sert pas pour les opérations bit à bit. L'ALU sérielle est facile à concevoir à partir de sa table de vérité, aussi je ne va pas détailler sa conception, je laisse le tout en exercice au lecteur. Mais un moyen de la concevoir facilement est simplement d'utiliser un additionneur complet avec de quoi mettre la retenue à 0/1, idem pour une des deux entrées d'opérande. [[File:ALU sérielle.jpg|centre|vignette|upright=2|ALU sérielle]] Les ALU sérielles ne payent pas de mine, mais elles étaient très utilisées autrefois, sur les tout premiers processeurs. Les ordinateurs antérieurs aux années 50 utilisaient des ALU de ce genre. L'avantage de ces ALU est qu'elles peuvent gérer des opérandes de grande taille, avec plus d'une trentaine de bits, sans trop de problèmes. Il suffit de prévoir des registres à décalage suffisamment longs, ce qui est tout sauf un problème. Par contre, elles sont assez lentes pour faire leur calcul, vu que les calculs se font bit par bit. Elles sont d'autant plus lentes que les opérandes sont longs. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les circuits de comparaison | prevText=Les circuits de comparaison | next=Les circuits pour l'addition multiopérande | nextText=Les circuits pour l'addition multiopérande }} </noinclude> f1jg1buwqd40dic6uywuqmo5lhw8siy Dictionnaire de philosophie/Abduction 0 82991 767913 766774 2026-06-17T05:35:48Z PandaMystique 119061 767913 wikitext text/x-wiki {{DicoPhilo|Abduction|lecture=oui}} '''L'abduction''' est un mode de raisonnement introduit et développé sous ce nom par le philosophe et logicien américain [[s:Auteur:Charles Sanders Peirce|Charles Sanders Peirce]] (1839-1914). Au sein de l'œuvre de ce fondateur du pragmatisme, ce type d'inférence occupe une place centrale pour définir la logique de la découverte scientifique<ref>Charles Sanders Peirce, « The Fixation of Belief », ''Popular Science Monthly'', vol. 12, novembre 1877, p. 1-15.</ref>. Il convient d'emblée de dissiper une confusion fréquente. Si Peirce conçoit l'abduction comme le processus de ''génération'' d'hypothèses nouvelles face à un fait surprenant, la philosophie contemporaine utilise souvent ce terme, ou celui d'« inférence à la meilleure explication » (IBE), pour désigner le processus de ''sélection'' ou de justification de l'hypothèse la plus robuste. Bien que liés, ces deux usages ne se recouvrent pas parfaitement : le premier insiste sur l'[[Dictionnaire de philosophie/Imagination|imagination]] créatrice, le second sur les critères de choix théorique. == Définition et nature == L'abduction désigne le processus par lequel, confronté à un fait inexpliqué, l'esprit formule une hypothèse susceptible d'en rendre [[Manuel de terminale de philosophie/Raison|raison]]. Peirce la caractérise par la forme suivante<ref>Charles Sanders Peirce, ''Collected Papers'', vol. 5, Cambridge (Massachusetts), Harvard University Press, 1934, § 5.189.</ref> : {{Citation bloc|Le fait surprenant ''B'' est observé ; mais si ''A'' était vrai, alors ''B'' s'en suivrait ; donc il y a une raison de soupçonner que ''A'' est vrai.}} Ce raisonnement remonte de l'effet observé vers une cause possible. Contrairement à la [[Perception|perception]] directe, l'abduction infère quelque chose de différent de ce qui est observé, souvent un élément inobservable directement<ref>Stathis Psillos, « Peirce on Abduction », dans Dov M. Gabbay et John Woods (éd.), ''Handbook of the History of Logic'', vol. 10 : ''Inductive Logic'', Amsterdam, Elsevier, 2011, p. 119-152.</ref>. C'est l'opération mentale qu'effectue un médecin lorsqu'il pose un diagnostic à partir de symptômes, ou un détective lorsqu'il reconstruit le déroulement d'un crime à partir d'indices disparates. == Antécédents historiques : l'héritage d'[[Dictionnaire de philosophie/Aristote|Aristote]] == Si Peirce a donné à l'abduction son nom moderne et sa portée logique, il ne l'a pas créée ''ex nihilo''. Il a explicitement relié sa conception à l'''apagôgè'' (ἀπαγωγή) décrite par Aristote dans les ''Premiers Analytiques'' (II, 25)<ref>Peirce écrit notamment en 1891-92 : « There are in [[Manuel de terminale de philosophie/Science|science]] three fundamentally different kinds of reasoning, Deduction (called by Aristotle συναγωγή or συλλογισμός), Induction (Aristotle's ἐπαγωγή), and Reduction (Aristotle's ἀπαγωγή), but misunderstood because of corrupt text, and as misunderstood usually translated abduction. » (''Collected Papers'', vol. 1, § 1.65). Peirce revient longuement sur ce lien dans son traité « The Logic of Drawing History from Ancient Documents » (1901), vol. 7, § 7.163-7.253, où il argumente que le texte d'Aristote a été corrompu par Apellicon. Voir aussi William Paul Haas, « C.S. Peirce's Abduction from the Prior Analytics », ''Community Scholar Publications'', Providence College, 1996, qui documente précisément l'interprétation peircéenne d'Aristote.</ref>. Pour le Stagirite, ce raisonnement intervient lorsque la relation entre le terme moyen et le terme majeur est certaine, mais que celle entre le dernier terme et le moyen terme n'est que probable. Bien que l'interprétation d'Aristote par Peirce soit parfois contestée par les historiens de la logique, cette filiation permet d'ancrer l'abduction dans une longue tradition de réflexion sur les inférences qui ne relèvent pas de la déduction nécessaire<ref>Sur la distinction entre le sens aristotélicien et le sens peircéen, voir Christian Plantin, « Abduction », dans ''Dictionnaire de l'argumentation'', Lyon, ENS Éditions, 2021.</ref>. == Structure logique et distinction des inférences == Pour bien saisir la spécificité de l'abduction, il faut la confronter aux deux autres modes d'inférence classiques. * La '''déduction''' applique une règle générale à un cas pour obtenir un résultat certain. Elle n'apporte aucune information nouvelle qui ne soit déjà contenue dans les prémisses. * L''''induction''' part de l'accumulation de cas singuliers pour tenter d'établir une règle générale. Elle généralise, mais n'explique pas. L'abduction, elle, part d'un résultat curieux et cherche une règle qui pourrait l'expliquer. L'exemple des haricots, cher à Peirce, éclaire ces distinctions<ref>Charles Sanders Peirce, ''Collected Papers'', vol. 2, Cambridge (Massachusetts), Harvard University Press, 1932, § 2.623.</ref>. Imaginez des sacs de haricots. # '''[[Dictionnaire de philosophie/Déduction|Déduction]]''' : Je sais que ce sac ne contient que des haricots blancs (Règle). Je tire une poignée de ce sac (Cas). ''Donc'', ces haricots sont blancs (Résultat). # '''Induction''' : Je tire une poignée de ce sac, ils sont blancs. Je tire une autre poignée, ils sont blancs (Cas + Résultat). ''Donc'', tous les haricots de ce sac sont blancs (Règle probable). # '''Abduction''' : Je trouve des haricots blancs posés sur la table (Résultat). Or, je sais que ce sac contient des haricots blancs (Règle). ''Donc'', je fais l'hypothèse que ces haricots proviennent de ce sac (Cas hypothétique). == Statut épistémologique == L'abduction présente trois caractéristiques fondamentales qui définissent son statut dans la théorie de la connaissance. Premièrement, elle est '''créative et ampliative'''. Contrairement à la déduction, l'abduction ajoute de l'information. Peirce va jusqu'à affirmer qu'elle est « la seule opération logique qui introduit une idée nouvelle »<ref>Charles Sanders Peirce, ''Collected Papers'', vol. 5, § 5.171.</ref>. Sans elle, la science ne serait qu'un classement de données ou un calcul de conséquences, sans jamais produire de théories explicatives. Deuxièmement, elle est '''faillible'''. Sa conclusion n'est jamais certaine, seulement plausible. Du point de vue de la logique formelle stricte, l'abduction est invalide : elle correspond au sophisme de l'affirmation du conséquent (« Si P alors Q ; or Q ; donc P »). Ce qui est une faute en logique déductive devient ici une heuristique féconde, à condition de garder à l'esprit que l'hypothèse demande à être testée. Troisièmement, elle '''guide l'enquête'''. L'abduction ne se suffit pas à elle-même ; elle est le premier moment d'une boucle récursive. L'abduction suggère une hypothèse ; la déduction explicite les conséquences observables de cette hypothèse ; enfin, l'induction vérifie si ces conséquences se réalisent dans l'expérience<ref>K. T. Fann, ''Peirce's Theory of Abduction'', La Haye, Martinus Nijhoff, 1970, p. 9-10.</ref>. == L'abduction dans le pragmatisme == Pour Peirce, l'abduction est indissociable de sa maxime pragmatiste, qui lie le sens d'une idée à ses conséquences pratiques concevables<ref>Charles Sanders Peirce, « How to Make Our Ideas Clear », ''Popular Science Monthly'', vol. 12, janvier 1878.</ref>. Face à une surprise qui brise nos habitudes d'action ou de pensée, l'abduction propose une explication dont la fonction première est de nous permettre de reprendre le cours de l'expérience. Peirce n'hésite pas à naturaliser cette capacité en la qualifiant d'« instinct rationnel »<ref>Charles Sanders Peirce, ''Collected Papers'', vol. 6, Cambridge (Massachusetts), Harvard University Press, 1935, § 6.530.</ref>. Il s'étonne que l'esprit humain, malgré l'infinité des hypothèses possibles, parvienne si souvent à deviner la bonne explication en un nombre limité d'essais. Il rapproche cette faculté du ''lume naturale'' (lumière naturelle) évoqué par Galilée, suggérant une affinité naturelle entre l'esprit humain et les lois de l'univers<ref>Jaime Nubiola, « Il Lume Naturale: Abduction and God », ''Semiotiche'', vol. 1, n° 2, 2004, p. 91-102.</ref>. == Débats contemporains et postérité == Si la logique peircéenne est restée longtemps confidentielle, la notion d'abduction connaît un vif regain d'intérêt depuis la seconde moitié du {{XXe}} siècle, au prix parfois de glissements sémantiques. === L'inférence à la meilleure explication (IBE) === Dans le débat sur le réalisme scientifique, l'abduction est souvent assimilée à l'Inférence à la meilleure explication. Des auteurs comme Gilbert Harman soutiennent que si une théorie explique les phénomènes mieux que ses rivales (par sa simplicité, sa cohérence, son pouvoir unificateur), nous sommes justifiés à la croire vraie<ref>Gilbert Harman, « The Inference to the Best Explanation », ''The Philosophical Review'', vol. 74, n° 1, 1965, p. 88-95.</ref>. C'est l'argument principal du réalisme scientifique : il serait miraculeux que nos meilleures théories scientifiques fonctionnent si bien tout en étant fausses. Cependant, des critiques comme Bas van Fraassen objectent que la « meilleure » explication disponible n'est peut-être que la meilleure d'un mauvais lot (« ''the best of a bad lot'' »)<ref>Bas van Fraassen, ''Laws and Symmetry'', Oxford, Clarendon Press, 1989, p. 142-143.</ref>. Rien ne garantit que la vérité figure parmi les hypothèses que nous avons imaginées. Ici, on s'éloigne de l'abduction peircéenne (invention) pour toucher aux critères de justification. === Intelligence artificielle et bayésianisme === L'abduction est également devenue un concept clé en intelligence artificielle pour modéliser les raisonnements dits « non monotones » (c'est-à-dire des raisonnements où l'ajout de nouvelles informations peut invalider les conclusions précédentes, contrairement à ce qui se produit en logique classique déductive). Cette capacité est essentielle pour des systèmes de diagnostic ou de détection d'anomalies<ref>Antonis C. Kakas, Robert A. Kowalski et Francesca Toni, « Abductive Logic Programming », ''Journal of Logic and Computation'', vol. 2, n° 6, 1992, p. 719-770.</ref>. Les systèmes experts, notamment en diagnostic médical, fonctionnent sur des moteurs d'inférence abductive où une hypothèse initialement acceptée peut être révisée à la lumière de nouvelles observations. Enfin, des épistémologues contemporains tentent d'articuler l'abduction avec le probabilisme bayésien (théorie mathématique calculant la probabilité d'une cause en fonction de nouveaux événements). La question est de savoir si le pouvoir explicatif d'une hypothèse doit augmenter sa probabilité ''a priori'' ou si l'abduction n'est qu'une approximation heuristique du raisonnement bayésien rigoureux<ref>Sur ces débats, voir Igor Douven, « Abduction », ''The Stanford Encyclopedia of Philosophy'', 2021, sections 3-4.</ref>. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Textes de référence === * Charles Hartshorne et Paul Weiss (éd.), ''Collected Papers of Charles Sanders Peirce'', vol. 1-6, Cambridge (Massachusetts), Harvard University Press, 1931-1935. * Charles S. Peirce, ''Écrits sur le signe'', rassemblés et commentés par Gérard Deledalle, Paris, Seuil, 1978. * Charles S. Peirce, ''Pragmatisme et pragmaticisme'', trad. C. Tiercelin et P. Thibaud, Paris, Cerf, 2002. === Études et commentaires === * Jean-Marie Chevalier, ''Peirce ou l'invention de l'épistémologie'', Paris, Vrin, 2022. * K. T. Fann, ''Peirce's Theory of Abduction'', La Haye, Martinus Nijhoff, 1970. * Stathis Psillos, « Peirce on Abduction », dans ''Handbook of the History of Logic'', vol. 10, Amsterdam, Elsevier, 2011. * Claudine Tiercelin, ''C. S. Peirce et le pragmatisme'', Paris, PUF, 1993. * William Paul Haas, « C.S. Peirce's Abduction from the Prior Analytics », ''Community Scholar Publications'', Providence College, 1996. === Sur les débats contemporains === * Peter Lipton, ''Inference to the Best Explanation'', Londres, Routledge, 2004. * Umberto Eco et Thomas Sebeok (éd.), ''The Sign of Three: Dupin, Holmes, Peirce'', Bloomington, Indiana University Press, 1983. {{AutoCat}} [[Catégorie:Logique]] 2g5i9y6jyisgy4oys2jlz7fukaomhfa Dictionnaire de philosophie/Aboulie 0 82992 767918 766469 2026-06-17T05:47:43Z PandaMystique 119061 767918 wikitext text/x-wiki {{DicoPhilo|Aboulie|lecture=oui}} == Définition et étymologie == L'aboulie (du grec ancien {{lang|grc|ἀβουλία}} / ''aboulía'', composé du préfixe privatif {{lang|grc|α-}} et de {{lang|grc|βουλή}} / ''boulế'' signifiant « volonté, délibération, résolution ») désigne une diminution pathologique ou une perte de la volonté se manifestant par l'incapacité à initier et à mener à terme des actions, même les plus simples<ref>Théodule Ribot, ''[[s:Les Maladies de la volonté|Les Maladies de la volonté]]'', Paris, Germer Baillière, 1883, p. 38-39</ref>. Le terme apparaît dans le vocabulaire médical français au XIX{{e}} siècle, notamment sous la plume de Théodule Ribot en 1883. Si l'aliéniste belge Joseph Guislain (1797-1860) avait préalablement décrit des phénomènes d'affaiblissement de la fonction volitive dans ses travaux sur l'aliénation mentale, c'est Ribot qui systématise l'usage du terme « aboulie » dans son ouvrage de référence sur les maladies de la volonté<ref>Centre National de Ressources Textuelles et Lexicales, article « Aboulie », étymologie</ref>. Contrairement à la simple paresse ou au manque de motivation passager, l'aboulie constitue un symptôme psychopathologique et neurologique caractérisé par une altération profonde des mécanismes de la volition. Le sujet aboulique, tout en conservant généralement ses facultés cognitives et bien qu'il puisse désirer certaines fins, se trouve dans l'impossibilité de convertir ses intentions en actes effectifs<ref>Pierre Janet, « La maladie du scrupule ou l'aboulie délirante : Le contenu des obsessions », ''Revue Philosophique de la France et de l'Étranger'', vol. 51, 1901, p. 337-359</ref>. == Nosographie et manifestations cliniques == === L'aboulie dans la psychiatrie classique === La description systématique de l'aboulie comme entité clinique trouve son accomplissement dans l'œuvre de Théodule Ribot (1839-1916), fondateur de la psychologie scientifique française. Dans son traité de 1883, Ribot établit une classification des maladies de la volonté dont l'aboulie représente la forme paradigmatique<ref>Théodule Ribot, ''Les Maladies de la volonté'', Paris, Germer Baillière, 5{{e}} édition, 1888, p. 35-72</ref>. Il distingue plusieurs degrés dans l'altération volitive, depuis l'affaiblissement partiel jusqu'à l'anéantissement complet de la capacité d'agir. Pierre Janet (1859-1947), poursuivant les travaux de Ribot, analyse l'aboulie comme résultant d'une insuffisance de la tension psychologique et d'un rétrécissement du champ de la conscience<ref>Pierre Janet, ''L'Automatisme psychologique'', Paris, Félix Alcan, 1889, p. 457</ref>. Pour Janet, l'aboulie s'observe particulièrement dans les états de psychasthénie, où le sujet, tout en comprenant la nécessité d'agir et en formulant des intentions, demeure incapable de les réaliser. Les aliénistes français, notamment Jean-Étienne Dominique Esquirol (1772-1840) et ses successeurs, ont documenté l'aboulie dans différentes formes d'aliénation mentale, en particulier dans la mélancolie et les états de démence<ref>Jean-Étienne Esquirol, ''Des maladies mentales considérées sous les rapports médical, hygiénique et médico-légal'', Paris, J.-B. Baillière, 1838, tome I, p. 300-315</ref>. === Manifestations cliniques contemporaines === La psychiatrie et la neurologie contemporaines situent l'aboulie sur un continuum allant de l'apathie (aboulie mineure) au mutisme akinétique (aboulie majeure)<ref>Barris R. W., Schuman H. R., « Bilateral Anterior Cingulate Gyrus Lesions: Syndrome of the Anterior Cingulate Gyri », ''Neurology'', vol. 3, n° 1, 1953, p. 44-52</ref>. Toutefois, il convient de préciser que les usages terminologiques varient selon les disciplines et les écoles. En neurologie, « apathie » et « aboulie » sont parfois employées de manière interchangeable, tandis que certains cliniciens réservent le terme « aboulie » à une altération plus spécifiquement centrée sur l'initiative et la mise en route de l'action, l'apathie désignant une réduction plus générale de la motivation incluant une dimension affective. Le mutisme akinétique représente, quant à lui, une abolition quasi totale de l'activité volontaire malgré la préservation de la vigilance. L'aboulie s'observe principalement dans trois contextes nosographiques : '''Troubles de l'humeur''' : elle constitue un symptôme cardinal de la dépression majeure, particulièrement dans ses formes mélancoliques, où elle s'associe à la douleur morale et à l'inhibition psychomotrice<ref>Henry Ey, ''Études psychiatriques'', tome III, Paris, Desclée de Brouwer, 1954, p. 215-230</ref>. '''Schizophrénie''' : elle appartient au registre des symptômes déficitaires sous le terme d'« avolition » (terme d'origine latine proche de l'aboulie grecque), reflétant une perturbation profonde des systèmes motivationnels et de l'initiation comportementale<ref>Nancy C. Andreasen, « Negative Symptoms in Schizophrenia: Definition and Reliability », ''Archives of General Psychiatry'', vol. 39, n° 7, 1982, p. 784-788</ref>. '''Syndromes neurologiques''' : des lésions focales du cortex préfrontal médian, du cortex cingulaire antérieur, ou des noyaux gris centraux (notamment le globus pallidus) peuvent entraîner un tableau clinique d'aboulie pure<ref>K. P. Bhatia, C. D. Marsden, « The Behavioural and Motor Consequences of Focal Lesions of the Basal Ganglia in Man », ''Brain'', vol. 117, n° 4, 1994, p. 859-876</ref>. == Approches philosophiques de l'aboulie == === Aboulie et structure de la volonté === L'étude philosophique de l'aboulie interroge la nature même de la volonté et de l'action intentionnelle. La tradition philosophique, de Descartes à Kant, a généralement conçu la volonté comme une faculté souveraine de l'esprit, capable de déterminer l'action par sa seule puissance. L'aboulie, en révélant une dissociation entre l'intention et l'exécution, met en question cette conception intellectualiste de la volition. Maine de Biran (1766-1824) développe une philosophie de l'effort qui offre un cadre conceptuel particulièrement pertinent pour penser l'aboulie. Pour le philosophe périgourdin, la conscience de soi naît de l'expérience primitive de l'effort moteur, dans lequel le moi s'éprouve comme force volontaire rencontrant la résistance du corps propre<ref>Maine de Biran, « Mémoire sur la décomposition de la pensée », dans ''Œuvres philosophiques'', éd. Pierre Tisserand, Paris, Félix Alcan, tome III, 1920, p. 15-120</ref>. Dans cette perspective, l'aboulie pourrait être interprétée – et il s'agit là d'une hypothèse interprétative plutôt que d'un résultat établi – comme une défaillance de cette force hyperorganique, une impossibilité pour le moi de s'affirmer comme pouvoir causal effectif. L'analyse biranienne permet de comprendre que l'aboulie ne réside pas dans une absence de désir ou d'intention, mais dans une impuissance spécifique du vouloir à se traduire en effort effectif<ref>Émile Boutroux, « La Psychologie du mysticisme », dans ''Nouvelles études d'histoire de la philosophie'', Paris, Félix Alcan, 1927, p. 82-95</ref>. === Aboulie et faiblesse de la volonté (akrasie) === La distinction entre aboulie et akrasie ({{lang|grc|ἀκρασία}}) constitue un enjeu conceptuel majeur. L'akrasie, analysée depuis Aristote comme le fait d'agir intentionnellement contre son meilleur jugement, se distingue de l'aboulie par la préservation de la capacité d'action<ref>Aristote, ''Éthique à Nicomaque'', livre VII, 1145a-1152a, trad. Jules Tricot, Paris, Vrin, 1959, p. 325-370</ref>. L'agent akratique agit, quoique contrairement à ce qu'il juge préférable ; le sujet aboulique, en revanche, demeure dans l'inaction malgré sa volonté d'agir. La philosophie contemporaine de l'action, notamment dans les travaux de Donald Davidson, a cherché à élucider la structure causale de l'action intentionnelle<ref>Donald Davidson, « Actions, Reasons, and Causes », ''The Journal of Philosophy'', vol. 60, n° 23, 1963, p. 685-700</ref>. Selon le modèle causaliste standard, une action est intentionnelle quand elle est causée de manière appropriée par une « raison primaire » composée d'une pro-attitude et d'une croyance. L'aboulie révèle les limites de ce modèle : le sujet aboulique possède des raisons d'agir (il désire certaines fins et croit que certains moyens permettent de les atteindre), mais ces raisons demeurent causalement inopérantes. Richard Holton propose de distinguer la faiblesse de la volonté (''weakness of will'') proprement dite, qu'il identifie à l'irrésolution ou à l'abandon trop facile de ses résolutions, de l'akrasie stricto sensu, qui consiste à agir contre son meilleur jugement sans avoir formé de résolution contraire<ref>Richard Holton, « Intention and Weakness of Will », ''The Journal of Philosophy'', vol. 96, n° 5, 1999, p. 241-262</ref>. L'aboulie se distinguerait des deux phénomènes en ce qu'elle concerne non pas la révision des intentions ou l'action contraire au jugement, mais l'impossibilité même de passer de l'intention à l'action. === L'aboulie dans la phénoménologie === La tradition phénoménologique, prolongeant les intuitions de Maine de Biran, offre des analyses nuancées de l'expérience vécue de l'aboulie. Edmund Husserl distingue les volitions (''Wollen'') comme actes intentionnels dirigés vers un but et souligne le rôle de la conscience intime du temps dans la constitution de l'action volontaire<ref>Edmund Husserl, ''Ideen zu einer reinen Phänomenologie und phänomenologischen Philosophie'', Zweites Buch, Husserliana Band IV, Den Haag, Martinus Nijhoff, 1952, § 56-60, p. 250-280</ref>. Michel Henry, dans sa lecture de Maine de Biran, approfondit l'analyse de l'effort en en faisant la manifestation originaire de la Vie absolue. Dans cette interprétation phénoménologique, l'aboulie apparaîtrait comme une défaillance de l'auto-affection de la Vie, une impossibilité pour le vivant de s'éprouver soi-même comme puissance<ref>Michel Henry, ''Philosophie et phénoménologie du corps. Essai sur l'ontologie biranienne'', Paris, Presses Universitaires de France, 1965, p. 125-160</ref>. == Philosophie de l'esprit et neurosciences cognitives == === Architecture cognitive de la volition === Les neurosciences contemporaines ont identifié les corrélats neuronaux des processus volitionnels, offrant un éclairage nouveau sur les mécanismes de l'aboulie. Les expériences pionnières de Benjamin Libet ont mis en évidence l'existence d'un « potentiel de préparation » (''Bereitschaftspotential'') précédant de plusieurs centaines de millisecondes la conscience de l'intention d'agir<ref>Benjamin Libet, Curtis A. Gleason, Elwood W. Wright, Dennis K. Pearl, « Time of Conscious Intention to Act in Relation to Onset of Cerebral Activity (Readiness-Potential): The Unconscious Initiation of a Freely Voluntary Act », ''Brain'', vol. 106, n° 3, 1983, p. 623-642</ref>. Ces données soulèvent des questions philosophiques sur la nature de la volonté consciente et sur le rôle causal de l'intention dans la genèse de l'action. L'aboulie semble impliquer un dysfonctionnement des circuits fronto-striataux responsables de la conversion des intentions en actions<ref>Campbell Le Heron, Matthew A. J. Apps, Masud Husain, « The Anatomy of Apathy: A Neurocognitive Framework for Amotivated Behaviour », ''Neuropsychologia'', vol. 118, 2018, p. 54-67</ref>. Les modèles computationnels actuels conçoivent la motivation comme résultant d'un calcul coûts-bénéfices intégrant la valeur subjective des résultats attendus et les efforts requis pour les atteindre. L'aboulie pourrait résulter d'une altération de ce système d'évaluation, conduisant à une sous-estimation systématique des bénéfices ou à une surestimation des coûts associés à l'action<ref>Masud Husain, Jonathan P. Roiser, « Neuroscience of Apathy and Anhedonia: A Transdiagnostic Approach », ''Nature Reviews Neuroscience'', vol. 19, n° 8, 2018, p. 470-484</ref>. === Le problème de la causalité mentale === L'aboulie pose de manière aiguë le problème de la causalité mentale : comment des états mentaux (intentions, volitions) peuvent-ils causer des événements physiques (mouvements corporels) ? Si l'on accepte le principe de clôture causale du domaine physique, selon lequel tout événement physique possède une cause physique suffisante, le rôle causal de la volonté consciente devient problématique<ref>Jaegwon Kim, « The Myth of Nonreductive Materialism », ''Proceedings and Addresses of the American Philosophical Association'', vol. 63, n° 3, 1989, p. 31-47</ref>. John Searle propose une approche naturaliste de l'intentionnalité qui cherche à préserver l'efficacité causale des états mentaux tout en reconnaissant leur réalisation dans des processus cérébraux<ref>John R. Searle, ''Intentionality: An Essay in the Philosophy of Mind'', Cambridge, Cambridge University Press, 1983, p. 79-111</ref>. Dans cette perspective, l'aboulie révèlerait une dissociation pathologique entre les niveaux de description neurophysiologique et phénoménologique de l'action : les mécanismes cérébraux de préparation motrice restent intacts, mais la composante expérientielle de la volition (l'« intention-en-action ») fait défaut. == Enjeux éthiques et juridiques == === Aboulie, responsabilité morale et libre arbitre === La question de la responsabilité morale du sujet aboulique soulève des difficultés conceptuelles considérables. La tradition philosophique, d'Aristote à Kant, fonde généralement la responsabilité morale sur la capacité d'agir librement, c'est-à-dire de déterminer soi-même ses actions en fonction de ses raisons<ref>Emmanuel Kant, ''Fondements de la métaphysique des mœurs'', trad. Victor Delbos, Paris, Delagrave, 1907, deuxième section, p. 125-170</ref>. Le débat contemporain entre compatibilistes et incompatibilistes sur le libre arbitre éclaire différemment la condition aboulique. Pour les compatibilistes comme Harry Frankfurt, la liberté ne requiert pas l'existence de possibilités alternatives, mais seulement une certaine forme d'identification de l'agent à ses volitions de second ordre<ref>Harry G. Frankfurt, « Freedom of the Will and the Concept of a Person », ''The Journal of Philosophy'', vol. 68, n° 1, 1971, p. 5-20</ref>. L'aboulie poserait alors problème en tant qu'elle empêche la réalisation des volitions avec lesquelles le sujet s'identifie. Pour les incompatibilistes libertariens comme Robert Kane, la liberté requiert que l'agent soit la « source ultime » de ses actions, ce qui implique une forme de contrôle agent-causal irréductible<ref>Robert Kane, ''The Significance of Free Will'', New York, Oxford University Press, 1996, p. 105-142</ref>. Dans cette perspective, l'aboulie représenterait une privation de ce pouvoir d'auto-détermination. === Implications pour la théorie de la responsabilité === L'existence de l'aboulie interroge les critères traditionnels de l'imputabilité juridique et morale. Le droit pénal français, héritier de la tradition kantienne, considère que la responsabilité suppose la capacité de comprendre et de vouloir<ref>Code pénal français, article 122-1</ref>. Un sujet atteint d'aboulie sévère, tout en conservant potentiellement sa lucidité intellectuelle et sa capacité de jugement moral, pourrait se trouver privé de la capacité volitive requise pour l'imputation. Cette situation révèle une tension dans nos concepts de responsabilité : faut-il distinguer une responsabilité intellectuelle (fondée sur la compréhension) et une responsabilité volitive (fondée sur la capacité d'agir) ? L'aboulie suggère que ces deux dimensions peuvent se dissocier, remettant en question les modèles trop simples de l'agentivité rationnelle<ref>John Martin Fischer, Mark Ravizza, ''Responsibility and Control: A Theory of Moral Responsibility'', Cambridge, Cambridge University Press, 1998, p. 12-50</ref>. == Perspectives thérapeutiques et anthropologiques == === Approches thérapeutiques === Le traitement de l'aboulie dépend étroitement de son étiologie. Dans les formes psychiatriques, les approches médicamenteuses (antidépresseurs, neuroleptiques atypiques) visent à restaurer l'équilibre des systèmes de neurotransmission impliqués dans la motivation, notamment les voies dopaminergiques<ref>Robert S. Marin, « Differential Diagnosis and Classification of Apathy », ''American Journal of Psychiatry'', vol. 147, n° 1, 1990, p. 22-30</ref>. Les thérapies cognitivo-comportementales, en particulier l'activation comportementale, s'attachent à briser le cercle vicieux de l'inaction en programmant progressivement des activités graduées<ref>Christopher R. Martell, Sona Dimidjian, Ruth Herman-Dunn, ''Behavioral Activation for Depression: A Clinician's Guide'', New York, Guilford Press, 2010, p. 35-68</ref>. D'un point de vue philosophique, ces approches reconnaissent implicitement que l'action peut précéder et restaurer la volonté, inversant ainsi l'ordre traditionnel de la causalité volitive. === Aboulie et condition humaine : distinctions méthodologiques nécessaires === Au-delà de son statut de symptôme pathologique, l'aboulie éclaire des dimensions profondes de la condition humaine ordinaire. Il importe toutefois d'établir clairement la distinction entre, d'une part, l'aboulie clinique telle qu'elle est diagnostiquée en psychiatrie et en neurologie, et d'autre part, les expériences existentielles d'inhibition, d'angoisse ou de désaffection du sens que décrivent les philosophes. Ces deux ordres de phénomènes ne doivent pas être confondus, même s'ils peuvent parfois se rencontrer ou s'éclairer mutuellement. La phénoménologie existentielle, notamment chez Sartre et Camus, a décrit des formes d'expérience caractérisées par le sentiment de l'absurde, de l'angoisse et de l'impuissance face à l'action. Ces descriptions philosophiques et littéraires du malaise existentiel résonnent avec le tableau clinique de l'aboulie, suggérant une possible continuité entre le pathologique et l'existentiel. Mais cette parenté phénoménologique ne saurait autoriser une confusion des plans d'analyse : l'aboulie médicale relève d'un dysfonctionnement objectivable des circuits neuronaux, tandis que les crises existentielles décrites par les philosophes concernent le rapport que la conscience entretient avec le sens de l'existence. '''L'absurde camusien et l'inertie existentielle''' Albert Camus a magistralement décrit dans ''Le Mythe de Sisyphe'' le moment où s'efface l'habitude machinale qui distrait l'homme de la question du sens. C'est précisément à cet instant que surgit le sentiment de divorce entre l'homme et sa vie, le sentiment de l'absurde qui engendre une forme d'immobilité spirituelle<ref>Albert Camus, ''Le Mythe de Sisyphe. Essai sur l'absurde'', Paris, Gallimard, 1942, p. 18-35</ref>. L'homme conscient de l'absurde, confronté au silence déraisonnable du monde face à son appel de sens, peut se trouver paralysé par la conscience même de son impuissance à imposer une signification à son existence<ref>Albert Camus, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942, p. 27</ref>. Camus énonce que face à l'absurde, la tentation première est celle du suicide philosophique, c'est-à-dire l'évasion par l'espoir ou l'adhésion à une idée qui transcenderait la vie. Mais il identifie une autre forme d'abandon : la passivité, le renoncement à agir sans même s'accomplir dans la révolte. Cette inertie existentielle partage certains traits phénoménologiques avec l'aboulie clinique : l'incapacité à donner corps à ses résolutions, l'impossibilité de transformer l'intention en acte<ref>Albert Camus, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942, p. 98-110</ref>. Néanmoins, il convient de souligner qu'il s'agit là d'une parenté de structure et non d'une identité de nature. '''Sartre et la question de la liberté face à l'impuissance''' Pour Jean-Paul Sartre, l'être humain est « condamné à être libre », ce qui signifie que l'homme n'a pas de nature prédéterminée mais est constamment confronté à la nécessité de se choisir et de choisir les valeurs qu'il entend réaliser<ref>Jean-Paul Sartre, ''L'Existentialisme est un humanisme'', Paris, Gallimard, 1945, p. 21-66</ref>. Dans ce cadre philosophique, la question de l'aboulie soulève une difficulté particulière. Sartre développe le concept de « mauvaise foi », cette fuite devant l'angoisse de la liberté absolue qui caractérise la condition humaine. La mauvaise foi consiste précisément en cette négation de sa propre liberté : prétendre être comme une chose qu'on ne peut modifier, alors qu'on est, en réalité, liberté incarnée<ref>Jean-Paul Sartre, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943, p. 83-111</ref>. Or, il serait gravement erroné d'interpréter l'aboulie pathologique comme une simple manifestation de mauvaise foi ou comme un « choix » inconscient de l'inaction. Une telle lecture assimilerait à tort un symptôme neuropsychiatrique objectivable à une posture existentielle. Le patient souffrant d'aboulie due à une lésion du cortex préfrontal ou à un épisode dépressif majeur n'« choisit » pas son impuissance au sens sartrien, même si son expérience vécue peut présenter des analogies structurelles avec certaines formes de paralysie existentielle. Cette distinction est capitale pour éviter toute moralisation du symptôme clinique. L'analyse existentialiste de la liberté et de la mauvaise foi concerne le sujet en tant qu'il est capable de se rapporter réflexivement à sa propre existence ; elle ne saurait s'appliquer sans médiation au patient dont les circuits neuronaux de la motivation sont altérés. '''Heidegger, l'angoisse et l'étrangeté du monde''' Martin Heidegger offre une perspective distincte en plaçant l'angoisse (''Angst'') au cœur de l'existence authentique. Pour Heidegger, l'angoisse détruit le sentiment de familiarité que le ''Dasein'' (l'être-humain en tant qu'il est-au-monde) entretient ordinairement avec son univers quotidien. Face à cette perte de repères, le ''Dasein'' fuit vers l'inauthenticité, vers le confort du « On », cette figure impersonnelle de la quotidienneté où l'individu s'efface dans les rôles et les convenances<ref>Martin Heidegger, ''Sein und Zeit'', Tübingen, Niemeyer, 1927, trad. française J. Martineau, Paris, Authentica, 1985, p. 210-230</ref>. L'aboulie pourrait être lue, sur le plan phénoménologique, comme une forme extrême d'une telle fuite, où l'impossibilité à agir devient la manière d'éviter la confrontation avec son propre pouvoir-être. L'inaction offre au sujet une certaine sécurité : elle le dispense de choisir entre les possibilités vertigineuses de son existence. Mais Heidegger souligne que cette sécurité n'est qu'apparente, car le ''Dasein'', confronté à sa finitude et à sa mort, ne peut jamais véritablement s'anesthésier face à l'angoisse. Elle ne peut être qu'enfouie, refoulée, jamais supprimée<ref>Martin Heidegger, ''Sein und Zeit'', p. 343-370</ref>. Là encore, il importe de ne pas confondre l'analyse ontologique de l'existence avec le diagnostic clinique. Les structures existentiales que décrit Heidegger appartiennent à la constitution fondamentale du ''Dasein'', tandis que l'aboulie désigne un trouble spécifique affectant certains individus dans certaines circonstances pathologiques. '''L'acédie médiévale comme prototype anthropologique''' L'aboulie contemporaine résonne singulièrement avec le concept ancien d'acédie (du grec ''akêdia''), ce mal qui frappait les moines érémites confrontés à la monotonie et à la solitude. Évagre le Pontique, théologien du IV{{e}} siècle, décrivait le « démon de midi » qui assiègeait le moine, provoquant une torpeur spirituelle, une incapacité à persévérer dans la prière et l'ascèse<ref>Évagre le Pontique, traité cité dans Jean-Charles Nault, ''Acedia ou l'ennui spirituel'', Paris, Cerf, 2000, p. 45-67</ref>. L'acédie était moins une simple indolence qu'une défaillance du désir même, une désaffection de l'âme face au bien qu'elle se proposait de poursuivre. Thomas d'Aquin, intégrant l'acédie dans sa théologie morale, en fit le péché de l'ennui et de l'inaction, d'où devaient découler tous les autres vices. Ce qui distingue l'acédie de la paresse ordinaire, c'est qu'elle est une atteinte à la volonté elle-même : le sujet ne refuse pas simplement d'agir, il perd la capacité d'investir affectivement son action<ref>Thomas d'Aquin, ''Summa Theologiae'', II-II, q. 35, trad. française, Paris, Éditions du Cerf, 1999, p. 287-310</ref>. L'aboulie contemporaine, en ce sens, ne représente que la sécularisation du diagnostic monastique : là où le moine médiéval perdait sa connexion à Dieu et au bien surnaturel, l'homme moderne perd sa capacité à se relier à ses propres fins, même naturelles et terrestres. '''Kierkegaard et le désespoir comme maladie existentielle''' Søren Kierkegaard, penseur du désespoir et de l'angoisse, a donné de ce phénomène une analyse existentielle pénétrante. Pour Kierkegaard, le désespoir n'est pas une simple tristesse ou un abattement passager ; c'est une « maladie à la mort », une perturbation du rapport que l'individu entretient avec lui-même<ref>Søren Kierkegaard, ''Traité du désespoir'', trad. française C. Fabro, Paris, Gallimard, 1961, p. 43-85</ref>. Le sujet peut être désespéré en ignorant qu'il l'est, c'est-à-dire qu'il persiste dans une existence qui masque une rupture intime profonde. Kierkegaard distingue le désespoir-faiblesse, où l'individu renonce passivement à se constituer lui-même, du désespoir-défi, où il s'affirme contre Dieu ou contre les ordres qui le fondent. Sur le plan phénoménologique, certaines formes d'inhibition existentielle correspondent davantage au désespoir-faiblesse : le sujet ne se refuse pas ardemment à l'action, il y renonce d'une manière quasi léthargique, comme vidé de la force même qui ferait de lui un agent responsable. Cet abandon passif du pouvoir-être révèle selon Kierkegaard une fuite devant l'étrange responsabilité d'avoir à se faire être<ref>Søren Kierkegaard, ''Traité du désespoir'', p. 180-210</ref>. '''L'ennui bergsonien et la mobilité de la vie''' Henri Bergson approche le problème par une voie différente. Sa philosophie de la créativité et de la durée pose que la vie elle-même est mouvement, création continue de nouveauté. Lorsque l'intelligence fige le devenir en images statiques et répétitives, elle engendre une forme de rigidité existentielle contraire à l'élan vital<ref>Henri Bergson, ''L'Évolution créatrice'', Paris, Félix Alcan, 1907, p. 98-135</ref>. Sur le plan métaphorique, l'aboulie pourrait être comprise comme une rupture de ce « ressort de notre activité » qui prolonge en chacun de nous l'impulsion créatrice de la vie. Quand ce ressort se détend, quand la capacité à incarner sa liberté dans des gestes et des créations décline, l'existence s'enlise dans l'inertie qui mime la passivité de la matière. Bergson suggère que cette fixation, cette perte de mobilité spirituelle, est l'inverse de toute véritable éthique, qui consiste à persévérer dans l'effort de création de soi<ref>Henri Bergson, ''La Pensée et le Mouvant'', Paris, Félix Alcan, 1934, p. 213-245</ref>. '''La procrastination ordinaire et le spectre de l'aboulie''' La procrastination, ce phénomène psychologique largement répandu dans les sociétés contemporaines, partage certains traits structurels avec l'aboulie tout en s'en distinguant. La procrastination, c'est le report volontaire d'une action qu'on se sait capable d'accomplir, ce décalage entre ce qu'on se propose de faire et ce qu'on fait réellement<ref>Piers Steel, « The Nature of Procrastination: A Meta-Analytic and Theoretical Review of Quintessential Self-Regulatory Failure », ''Psychological Bulletin'', vol. 133, n° 1, 2007, p. 65-94</ref>. Contrairement à l'aboulie, où la personne demeure immobilisée, la procrastination comporte une certaine fébrilité, une redirection de l'énergie vers d'autres activités substitutives. Le procrastinateur reste actif, mais déploie son énergie pour esquiver la tâche qu'il redoute. Il demeure ainsi dans un rapport à l'action, même si ce rapport est perverti. L'aboulique, en revanche, perd ce rapport lui-même : il ne se détourne pas vers des activités substitutives, il s'enfonce dans une passivité où même la perspective de tâches alternatives perd son attrait. Cependant, les deux phénomènes témoignent d'une même fragilité de la volonté face à la difficulté de l'action, d'une même tension entre ce qu'on proclame vouloir et ce qu'on est capable de réaliser. '''De l'ordinaire au pathologique : une continuité problématique''' Ce qui émerge de cette analyse est la possibilité d'une continuité phénoménologique entre les formes ordinaires du malaise existentiel et l'aboulie clinique. L'angoisse sartrienne, le désespoir kierkegaardien, l'acédie monastique, l'ennui heideggerien ne sont pas des maladies au sens strict ; ce sont des dispositions fondamentales de la conscience humaine face à ses limites, à sa liberté, à l'absurdité de son être-au-monde. L'aboulie pathologique ne représente peut-être que l'extrémisation ou la cristallisation en syndrome médical de ces expériences existentielles. Cela ne signifie pas pour autant que l'aboulie soit « seulement » existentielle et non médicale. Au contraire, cela suggère que les mécanismes cérébraux qui la produisent, loin d'être étrangers à la vie spirituelle et existentielle de l'homme, en forment le substrat matériel. L'aboulie révèle comment le corps et l'esprit, la neurobiologie et l'existence, la causation matérielle et la signification personnelle se nouent inextricablement. Elle est à la fois un dysfonctionnement observable du cerveau et une crise du sens, une pathologie neurochimique et une perturbation de la relation que le sujet entretient avec lui-même et avec son monde. Il reste que cette continuité possible ne doit pas effacer la différence de nature entre l'expérience existentielle ordinaire et le syndrome clinique. L'analyse philosophique de la condition humaine n'équivaut pas à un diagnostic médical, et réciproquement, la description clinique d'un trouble ne saurait se substituer à une réflexion sur le sens de l'existence. C'est précisément cette tension féconde entre les deux ordres d'intelligibilité qui fait de l'aboulie un objet philosophique et médical de premier plan. == Conclusion == L'étude philosophique de l'aboulie révèle les limites des conceptions intellectualistes de la volonté et de l'action. Elle montre que la capacité d'agir ne se réduit ni au désir, ni au jugement, ni même à l'intention, mais requiert une puissance volitive spécifique dont la nature exacte demeure énigmatique. En exhibant la possibilité d'une dissociation entre l'ordre des raisons et l'ordre de l'action, l'aboulie contraint à repenser les rapports entre motivation, décision et exécution motrice. Les neurosciences contemporaines, en cartographiant les circuits cérébraux de la volition, offrent un complément empirique indispensable à l'analyse conceptuelle. Toutefois, la réduction de l'aboulie à un dysfonctionnement neuronal ne dispense pas d'une interrogation phénoménologique sur le vécu subjectif de l'impuissance volitive et sur sa signification existentielle. Enfin, l'aboulie pose des questions éthiques et juridiques pressantes concernant les conditions de la responsabilité et les critères de l'imputabilité. Elle invite à une réflexion nuancée sur les différentes dimensions de l'agentivité humaine et sur la diversité des formes que peut prendre l'autonomie ou son altération. == Notes et références == {{references}} == Bibliographie sélective == === Sources classiques === * Ribot, Théodule, ''Les Maladies de la volonté'', Paris, Germer Baillière, 1883. * Janet, Pierre, ''L'Automatisme psychologique'', Paris, Félix Alcan, 1889. * Janet, Pierre, « La maladie du scrupule ou l'aboulie délirante : Le contenu des obsessions », ''Revue Philosophique de la France et de l'Étranger'', vol. 51, 1901, p. 337-359. * Maine de Biran, ''Œuvres philosophiques'', éd. Pierre Tisserand, 14 volumes, Paris, Félix Alcan, 1920-1949. * Esquirol, Jean-Étienne, ''Des maladies mentales considérées sous les rapports médical, hygiénique et médico-légal'', Paris, J.-B. Baillière, 1838. === Philosophie de l'action et de la volonté === * Davidson, Donald, ''Essays on Actions and Events'', Oxford, Clarendon Press, 1980. * Frankfurt, Harry G., ''The Importance of What We Care About'', Cambridge, Cambridge University Press, 1988. * Holton, Richard, ''Willing, Wanting, Waiting'', Oxford, Oxford University Press, 2009. * Stroud, Sarah, « Weakness of Will », ''Stanford Encyclopedia of Philosophy'', 2008 (révisé 2014). === Neurosciences et philosophie de l'esprit === * Libet, Benjamin, « Unconscious Cerebral Initiative and the Role of Conscious Will in Voluntary Action », ''The Behavioral and Brain Sciences'', vol. 8, n° 4, 1985, p. 529-566. * Searle, John R., ''Intentionality: An Essay in the Philosophy of Mind'', Cambridge, Cambridge University Press, 1983. * Le Heron, Campbell, Matthew A. J. Apps, Masud Husain, « The Anatomy of Apathy: A Neurocognitive Framework for Amotivated Behaviour », ''Neuropsychologia'', vol. 118, 2018, p. 54-67. * Husain, Masud, Jonathan P. Roiser, « Neuroscience of Apathy and Anhedonia: A Transdiagnostic Approach », ''Nature Reviews Neuroscience'', vol. 19, n° 8, 2018, p. 470-484. === Psychiatrie et psychopathologie === * Marin, Robert S., « Apathy: A Neuropsychiatric Syndrome », ''Journal of Neuropsychiatry and Clinical Neurosciences'', vol. 3, n° 3, 1991, p. 243-254. * Andreasen, Nancy C., « Negative Symptoms in Schizophrenia: Definition and Reliability », ''Archives of General Psychiatry'', vol. 39, n° 7, 1982, p. 784-788. * Ey, Henry, ''Études psychiatriques'', tome III, Paris, Desclée de Brouwer, 1954. === Philosophie existentielle === * Camus, Albert, ''Le Mythe de Sisyphe. Essai sur l'absurde'', Paris, Gallimard, 1942. * Sartre, Jean-Paul, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943. * Sartre, Jean-Paul, ''L'Existentialisme est un humanisme'', Paris, Gallimard, 1945. * Heidegger, Martin, ''Sein und Zeit'', Tübingen, Niemeyer, 1927. * Kierkegaard, Søren, ''Traité du désespoir'', trad. française, Paris, Gallimard, 1961. == Notions connexes == * Akrasie (faiblesse de la volonté) * Apathie * Volonté * Intention * Action intentionnelle * Responsabilité morale * Libre arbitre * Motivation * Procrastination {{AutoCat}} jnkq0wpstynxa2pzri3mxw0v0bn2oie Dictionnaire de philosophie/Connaissance 0 83047 767897 753072 2026-06-17T04:51:54Z PandaMystique 119061 767897 wikitext text/x-wiki {{DicoPhilo|Connaissance}} La notion de connaissance traverse l'histoire de la philosophie comme l'un de ses problèmes centraux. Depuis l'interrogation platonicienne jusqu'aux débats contemporains sur la justification épistémique, les philosophes se sont efforcés de comprendre ce que signifie savoir, comment nous acquérons nos connaissances et quelles sont les limites de notre capacité cognitive. Cette question apparemment simple — qu'est-ce que connaître ? — s'est révélée d'une complexité redoutable, engageant des réflexions sur la nature de la vérité, la structure de la pensée, le rôle de l'expérience et les rapports entre le sujet connaissant et l'objet connu. ==Définition et problématique générale== La connaissance désigne généralement une forme particulière de rapport qu'un sujet entretient avec un objet, rapport qui se distingue de la simple opinion ou croyance par sa prétention à la vérité et sa justification rationnelle. Contrairement à la croyance, qui peut être vraie ou fausse sans que le sujet en possède de garantie certaine, la connaissance implique une relation privilégiée au vrai, fondée sur des raisons ou des preuves<ref>Platon, ''Théétète'', 201c-d, trad. M. Narcy, Paris, Flammarion, 2016.</ref>. Cette distinction classique soulève immédiatement plusieurs questions fondamentales : qu'est-ce qui transforme une croyance vraie en connaissance ? Quelle sorte de justification est requise ? Comment distinguer entre ce qui relève du savoir authentique et ce qui n'est qu'apparence de savoir ? La tradition philosophique a longtemps admis, depuis Platon, que la connaissance se définit comme « croyance vraie justifiée » : pour qu'un sujet S connaisse une proposition P, il faut (1) que S croie que P, (2) que P soit vraie, et (3) que S possède une justification adéquate pour croire que P<ref>Edmund Gettier, « Is True Justified Belief Knowledge? », ''Analysis'', vol. 23, 1963, p. 121-123.</ref>. Cette définition tripartite, bien qu'apparemment simple, cache des difficultés considérables qui ont alimenté les controverses épistémologiques pendant des siècles. La question de la nature de la justification, en particulier, divise profondément les philosophes : faut-il que le sujet ait conscience de cette justification (internalisme), ou suffit-il que la croyance soit produite par un processus fiable (externalisme) ? La justification doit-elle être infaillible ou peut-elle être probabiliste ? Ces interrogations structurent encore aujourd'hui le paysage de l'épistémologie contemporaine. ==Les sources de la connaissance : raison et expérience== L'une des controverses les plus anciennes et les plus fécondes en philosophie oppose les partisans de la raison à ceux de l'expérience sensible comme source première de nos connaissances. Cette opposition entre rationalisme et empirisme, cristallisée à l'époque moderne, structure profondément notre compréhension de la connaissance humaine et de ses fondements. ===Le rationalisme=== Le rationalisme soutient que certaines de nos connaissances les plus fondamentales ne dérivent pas de l'expérience, mais procèdent de la raison elle-même. Cette position trouve ses racines chez Platon, pour qui la vraie connaissance (''epistêmê'') se distingue rigoureusement de l'opinion (''doxa'') parce qu'elle porte sur des réalités intelligibles et éternelles — les Formes ou Idées — et non sur le monde sensible, instable et changeant<ref>Platon, ''République'', livres VI-VII, trad. G. Leroux, Paris, Flammarion, GF, 2002.</ref>. Dans l'allégorie de la caverne, Platon montre comment le philosophe doit s'affranchir des apparences sensibles pour accéder aux vérités intelligibles, accessibles seulement par la dialectique, méthode rationnelle par excellence. Le rationalisme moderne, inauguré par René Descartes (1596-1650), pousse cette confiance dans la raison. Dans les ''Méditations métaphysiques'' (1641), Descartes établit que la première certitude — le ''cogito'' (« je pense, donc je suis ») — ne dérive pas de l'expérience sensible, mais d'une intuition rationnelle immédiate<ref>René Descartes, ''Méditations métaphysiques'', méditation seconde, dans ''Œuvres de Descartes'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996, t. VII, p. 25.</ref>. Pour Descartes, l'esprit possède des idées innées — telles que l'idée de Dieu, l'idée de substance ou les vérités mathématiques — qui ne peuvent provenir de l'expérience sensible, toujours trompeuse et incertaine<ref>René Descartes, ''Méditations métaphysiques'', méditation cinquième, AT VII, p. 63-68.</ref>. La méthode cartésienne repose sur la découverte de ces vérités évidentes par l'intuition intellectuelle et leur enchaînement rigoureux par déduction, à la manière des mathématiques. Cette tradition rationaliste trouve son accomplissement dans le système de Gottfried Wilhelm Leibniz (1646-1716) et Baruch Spinoza (1632-1677). Spinoza développe dans l'''Éthique'' (1677) une conception ambitieuse de la connaissance structurée en trois genres : la connaissance par ouï-dire ou expérience vague, la connaissance rationnelle par notions communes, et enfin la connaissance intuitive, la plus haute forme de savoir, qui saisit l'essence singulière des choses dans leur rapport à la substance divine<ref>Baruch Spinoza, ''Éthique'', partie II, proposition 40, scolie 2, trad. Bernard Pautrat, Paris, Seuil, 1988, p. 179-181.</ref>. Cette dernière forme de connaissance, loin d'être abstraite, appréhend le particulier dans sa nécessité éternelle, montrant comment chaque chose découle de la nature divine selon un ordre géométrique. ===L'empirisme=== L'empirisme s'oppose frontalement à cette valorisation de la raison en affirmant que toutes nos connaissances proviennent ultimement de l'expérience sensible. Cette position, défendue notamment par les philosophes britanniques du XVII{{exp|e}} et XVIII{{exp|e}} siècle, refuse l'existence d'idées innées et soutient que l'esprit est au départ comme une « table rase » (''tabula rasa'') sur laquelle l'expérience vient inscrire progressivement son contenu<ref>John Locke, ''Essai sur l'entendement humain'', livre I, chapitre 1, §2, trad. Jean-Michel Vienne, Paris, Vrin, 2001, p. 73.</ref>. John Locke (1632-1704), dans son ''Essai sur l'entendement humain'' (1690), critique systématiquement la doctrine des idées innées et établit que toutes nos idées dérivent soit de la sensation (expérience externe), soit de la réflexion (expérience interne)<ref>John Locke, ''Essai sur l'entendement humain'', livre II, chapitre 1, §2-4, p. 117-119.</ref>. Les idées simples sont reçues passivement par l'esprit, tandis que les idées complexes résultent d'opérations mentales de combinaison, comparaison et abstraction. Cette théorie empiriste de la connaissance implique une limitation de notre savoir : nous ne pouvons connaître que ce qui a été préalablement expérimenté ou ce qui peut être construit à partir de l'expérience. David Hume (1711-1776) pousse l'empirisme dans ses dernières conséquences sceptiques. Dans le ''Traité de la nature humaine'' (1739), il distingue entre impressions (perceptions vives issues de l'expérience immédiate) et idées (copies affaiblies des impressions dans la mémoire et l'imagination)<ref>David Hume, ''Traité de la nature humaine'', livre I, partie I, section 1, trad. Philippe Saltel, Paris, Flammarion, GF, 1995, p. 51-52.</ref>. Cette distinction fondamentale implique qu'aucune idée n'est légitime si elle ne peut être ramenée à des impressions correspondantes. Hume en tire des conclusions dévastatrices pour la métaphysique traditionnelle : les notions de substance, de causalité nécessaire ou d'âme spirituelle ne reposent sur aucune impression réelle et doivent donc être rejetées comme de simples fictions de l'imagination. La critique humienne de la causalité est particulièrement vigoureuse. Hume montre que l'idée de connexion nécessaire entre cause et effet ne dérive d'aucune impression sensible : nous observons seulement une succession régulière de phénomènes, jamais la nécessité de leur liaison<ref>David Hume, ''Traité de la nature humaine'', livre I, partie III, section 2, p. 123-129.</ref>. La croyance causale résulte simplement de l'habitude contractée par l'esprit suite à la répétition d'expériences similaires. Cette analyse transforme ce qui semblait une connaissance rationnelle nécessaire en une simple croyance psychologique, fondée sur la coutume plutôt que sur la raison. Le scepticisme humien ébranle ainsi les fondements mêmes de la connaissance scientifique, qui repose massivement sur l'inférence causale. ===La synthèse kantienne=== Emmanuel Kant (1724-1804) propose, dans la ''Critique de la raison pure'' (1781), une synthèse audacieuse entre rationalisme et empirisme. Réveillé de son « sommeil dogmatique » par la lecture de Hume, Kant reconnaît que « toute notre connaissance commence avec l'expérience », mais refuse d'en conclure qu'elle « dérive toute de l'expérience »<ref>Emmanuel Kant, ''Critique de la raison pure'', introduction, B 1, trad. A. Tremesaygues et B. Pacaud, Paris, PUF, collection Quadrige, 2012 , p. 31.</ref>. La révolution copernicienne kantienne consiste à affirmer que les objets se règlent sur notre connaissance, et non l'inverse : l'esprit humain impose aux phénomènes des formes ''a priori'' (espace et temps pour la sensibilité, catégories pour l'entendement) qui rendent possibles les jugements synthétiques ''a priori'', comme ceux des mathématiques et de la physique. La connaissance résulte donc, selon Kant, de la coopération entre deux sources : la sensibilité, qui reçoit passivement les intuitions sensibles (le contenu empirique), et l'entendement, qui les organise activement selon des concepts ''a priori'' (la forme rationnelle)<ref>Emmanuel Kant, ''Critique de la raison pure'', Logique transcendantale, introduction, B 74-75, p. 77-78.</ref>. Sans intuitions, les concepts sont vides ; sans concepts, les intuitions sont aveugles. Cette double contrainte explique pourquoi nous pouvons avoir une connaissance ''a priori'' (la forme de l'expérience possible) tout en étant limités au domaine phénoménal (les choses telles qu'elles nous apparaissent). Les choses en soi (''noumènes''), au-delà de toute expérience possible, restent inconnaissables. ==Connaissance et scepticisme== Le défi sceptique traverse toute l'histoire de la philosophie et constitue une épreuve décisive pour toute théorie de la connaissance. Les sceptiques contestent notre prétention à posséder des connaissances certaines et invitent à suspendre notre jugement face aux prétentions dogmatiques de la raison. ===Le scepticisme antique=== Le scepticisme philosophique naît en Grèce avec Pyrrhon d'Élis (vers 365-275 av. J.-C.), dont la pensée sera systématisée par Sextus Empiricus (II{{exp|e}} siècle apr. J.-C.) dans les ''Esquisses pyrrhoniennes''. Le scepticisme pyrrhonien ne consiste pas à nier la possibilité de la connaissance (ce qui serait encore une forme de dogmatisme), mais à pratiquer la suspension du jugement (''épochè'') en opposant à tout argument un argument contraire d'égale force (''isosthénie'')<ref>Sextus Empiricus, ''Esquisses pyrrhoniennes'', livre I, §§ 8-10, trad. Pierre Pellegrin, Paris, Seuil, collection Points Essais, 1997, p. 55-57.</ref>. Les sceptiques anciens développent des « tropes » ou modes argumentatifs destinés à induire cette suspension. Les dix tropes d'Énésidème montrent comment toute perception varie selon l'observateur, les circonstances, les relations. Les cinq tropes d'Agrippa sont particulièrement redoutables : face à toute prétention cognitive, le sceptique invoque soit le désaccord (différentes positions également plausibles), soit la régression à l'infini (toute justification requiert elle-même une justification), soit l'argument circulaire, soit l'hypothèse gratuite. Le but ultime de cette pratique sceptique n'est pas théorique mais éthique : atteindre la tranquillité de l'âme (''ataraxie'') en renonçant aux prétentions dogmatiques qui engendrent troubles et conflits. Le scepticisme académique, développé à l'Académie de Platon par Arcésilas et Carnéade, adopte une position différente : plutôt que de suspendre purement le jugement, il propose une théorie de la probabilité ou du vraisemblable (''pithanon''), graduant les degrés d'assentiment selon la force des apparences. ===Le scepticisme moderne=== Le scepticisme renaît à l'époque moderne avec une signification transformée. Alors que le scepticisme ancien visait la tranquillité d'esprit, le scepticisme moderne, de Montaigne à Hume, interroge les fondements mêmes de la connaissance rationnelle et scientifique. Pierre Bayle (1647-1706), dans son ''Dictionnaire historique et critique'' (1697), renouvelle le scepticisme en montrant les contradictions internes des systèmes philosophiques, notamment celui de Spinoza<ref>Pierre Bayle, ''Dictionnaire historique et critique'', article « Spinoza », 5{{exp|e}} édition, Amsterdam, P. Brunel et al., 1740, tome IV, p. 254-278.</ref>. Bayle développe une forme de scepticisme « raisonnable » qui, loin de s'opposer au rationalisme, le pousse à ses limites : c'est précisément la raison critique exigeante qui révèle l'insuffisance de toute prétention dogmatique. Hume représente l'aboutissement du scepticisme moderne. Son scepticisme ne conteste pas tant la possibilité de connaître que l'impossibilité de comprendre rationnellement que nous puissions connaître. La raison, qui éclaire toute chose, se trouve dans l'obscurité lorsqu'elle se tourne vers elle-même et tente de justifier ses propres opérations. Le scepticisme humien révèle ainsi l'opacité constitutive de nos facultés cognitives : nous croyons, nous inférons, nous jugeons, mais nous ne pouvons rendre pleinement raison de ces opérations elles-mêmes. ==Types et degrés de connaissance== La philosophie a élaboré diverses distinctions pour classer les formes de connaissance selon leur objet, leur mode d'acquisition ou leur degré de certitude. ===Connaissance ''a priori'' et ''a posteriori''=== La distinction entre connaissance ''a priori'' (indépendante de l'expérience) et connaissance ''a posteriori'' (fondée sur l'expérience) structure profondément l'épistémologie moderne. Les vérités mathématiques, comme « 2 + 2 = 4 » ou « le triangle a trois angles », semblent connaissables ''a priori'', sans recours à l'observation empirique. En revanche, des propositions comme « le soleil se lève à l'est » ou « l'eau bout à 100°C » sont manifestement ''a posteriori'', requérant l'expérience pour être connues. Kant raffine cette distinction en la croisant avec celle entre jugements analytiques (où le prédicat est contenu dans le sujet) et synthétiques (où le prédicat ajoute quelque chose au sujet). Les jugements analytiques ''a priori'' (comme « tous les célibataires sont non mariés ») sont triviaux, reposant sur la seule analyse des concepts. Les jugements synthétiques ''a posteriori'' (comme « cette table est brune ») sont informatifs mais contingents. L'innovation kantienne consiste à identifier une troisième catégorie : les jugements synthétiques ''a priori'', à la fois informatifs et nécessaires, qui fondent les mathématiques et la physique pure<ref>Emmanuel Kant, ''Critique de la raison pure'', introduction, B 10-14, p. 36-38.</ref>. ===Connaissance par accointance et connaissance par description=== Bertrand Russell (1872-1970) distingue entre connaissance directe (''knowledge by acquaintance''), où nous sommes en présence immédiate de l'objet connu, et connaissance par description (''knowledge by description''), médiatisée par des représentations conceptuelles<ref>Bertrand Russell, ''Problèmes de philosophie'', chapitre 5, trad. Sylvain-Robert Schneider, Paris, Payot, collection Petite Bibliothèque Payot, 1989, p. 73-84.</ref>. Nous avons connaissance directe de nos propres états mentaux et des données sensorielles (ce que Russell appelle « sense-data »), mais notre connaissance du monde physique et d'autrui est nécessairement indirecte, construite à partir de descriptions définies. ===Les degrés de connaissance selon Spinoza=== Spinoza propose une hiérarchie sophistiquée de trois genres de connaissance. Le premier genre, connaissance par ouï-dire ou expérience vague, est le plus bas : connaissance confuse des effets sans compréhension des causes. Le deuxième genre, connaissance rationnelle, procède par notions communes et raisonnement démonstratif, saisissant les propriétés partagées et les relations causales. Le troisième genre, science intuitive, représente la forme suprême de connaissance : saisie immédiate et adéquate de l'essence singulière des choses dans leur nécessité éternelle. Cette connaissance intuitive n'est pas mystique mais rigoureusement rationnelle : elle comprend comment chaque chose particulière découle nécessairement de la nature infinie de Dieu. ==Justification et problèmes contemporains== La question de la justification épistémique demeure au cœur des débats contemporains. Qu'est-ce qui transforme une croyance vraie en connaissance authentique ? ===Le problème de Gettier=== En 1963, Edmund Gettier publie un article bref mais dévastateur qui remet en cause la conception traditionnelle de la connaissance comme croyance vraie justifiée. Gettier propose des contre-exemples où un sujet possède une croyance vraie et justifiée sans que nous soyons prêts à dire qu'il « connaît ». Dans l'un de ses exemples, Smith croit justement (sur la base d'indices convergents) que Jones possède une Ford. Il en infère que « ou bien Jones possède une Ford, ou bien Brown est à Barcelone », en choisissant arbitrairement Barcelone. Or il se trouve que Jones ne possède pas de Ford, mais que Brown est effectivement à Barcelone. Smith a donc une croyance vraie justifiée, mais sa vérité est due au hasard et non à sa justification : nous refusons de dire qu'il « sait ». Les cas de Gettier montrent que la justification doit être non seulement vraie mais également adéquatement connectée à la vérité de la croyance. Diverses solutions ont été proposées : exiger que la justification ne repose sur aucune fausse prémisse (Clark), développer une théorie causale de la connaissance (Goldman), ou encore définir la connaissance en termes de justification infaillibiliste. Ces débats structurent encore largement l'épistémologie analytique contemporaine. ===Internalisme et externalisme=== Un débat majeur oppose internalistes et externalistes sur la nature de la justification. Les internalistes soutiennent que les facteurs qui justifient une croyance doivent être accessibles à la conscience du sujet : pour être justifié à croire P, le sujet doit avoir un accès réflexif aux raisons qui supportent P. Les externalistes, au contraire, admettent que des facteurs externes à la conscience — comme la fiabilité du processus qui a produit la croyance — peuvent suffire à justifier. Le fiabilisme, défendu notamment par Alvin Goldman, illustre cette position externaliste : une croyance est justifiée si elle est produite par un processus cognitif fiable, même si le sujet ignore tout de cette fiabilité<ref>Alvin Goldman, « What is Justified Belief? », dans ''Liaisons: Philosophy Meets the Cognitive and Social Sciences'', Cambridge (Mass.), MIT Press, 1992, p. 105-126.</ref>. Cette conception permet d'attribuer des connaissances aux enfants et aux animaux sans exiger d'eux une conscience réflexive de leurs processus cognitifs. ==Conclusion== La notion de connaissance, loin d'être une évidence, se révèle d'une complexité philosophique redoutable. Des présocratiques aux débats contemporains, les philosophes n'ont cessé d'interroger ce qui distingue le savoir authentique de l'opinion, la nature des sources de nos connaissances, les critères de justification épistémique et les limites de notre capacité cognitive. Les grands clivages entre rationalisme et empirisme, entre internalisme et externalisme, entre fondationnalisme et cohérentisme, structurent encore aujourd'hui les recherches épistémologiques. Si le consensus demeure introuvable sur ces questions fondamentales, c'est peut-être parce que la connaissance humaine elle-même présente une structure hétérogène : nos diverses formes de savoir — perceptuel, conceptuel, scientifique, pratique — obéissent à des logiques différentes et résistent à toute théorie unifiée trop simpliste. L'épistémologie contemporaine tend ainsi vers une forme de pluralisme, reconnaissant la diversité irréductible de nos pratiques cognitives tout en cherchant à en élucider les structures communes. La question « qu'est-ce que connaître ? » reste ouverte, témoignant de cette capacité proprement philosophique à transformer les certitudes apparentes en problèmes féconds. ==Références== {{references|colonnes=2}} ==Bibliographie sélective== * Platon, ''Théétète'', trad. M. Narcy, Paris, Flammarion, 2016. * Platon, ''République'', trad. G. Leroux, Paris, Flammarion, 2002. * René Descartes, ''Méditations métaphysiques'', dans ''Œuvres de Descartes'', éd. Charles Adam et Paul Tannery, Paris, Vrin, 1996. * Baruch Spinoza, ''Éthique'', trad. B. Pautrat, Paris, Seuil, 1988. * John Locke, ''Essai sur l'entendement humain'', trad. J.-M. Vienne, Paris, Vrin, 2001. * David Hume, ''Traité de la nature humaine'', trad. P. Saltel, Paris, Flammarion, 1995. * Emmanuel Kant, ''Critique de la raison pure'', trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 2012. * Sextus Empiricus, ''Esquisses pyrrhoniennes'', trad. P. Pellegrin, Paris, Seuil, 1997. * Bertrand Russell, ''Problèmes de philosophie'', trad. S.-R. Schneider, Paris, Payot, 1989. * Edmund Gettier, « Is Justified True Belief Knowledge? », ''Analysis'', vol. 23, 1963, p. 121-123. * Alvin Goldman, « What is Justified Belief? », dans ''Liaisons: Philosophy Meets the Cognitive and Social Sciences'', Cambridge, MIT Press, 1992. {{autocat}} 98ujfqxtlfwffaqtz2px5arhqgwdnaj Dictionnaire de philosophie/Croyance 0 83049 767891 753080 2026-06-17T04:46:22Z PandaMystique 119061 767891 wikitext text/x-wiki {{DicoPhilo|Croyance}} La '''croyance''' (du latin ''credere'', croire) désigne un état mental dans lequel un sujet tient une proposition pour vraie, indépendamment du degré de certitude ou de justification dont il dispose. Cette notion occupe une place centrale en épistémologie depuis l'Antiquité, car elle permet de distinguer différents types de rapports cognitifs au monde : la simple opinion (''doxa''), la croyance justifiée et la connaissance (''epistémè''). Contrairement à la connaissance, la croyance ne requiert pas nécessairement de preuve ou de garantie épistémique, même si les philosophes débattent depuis Platon de la nature exacte de cette distinction<ref>Platon, ''Théétète'', 201c-210b, trad. M. Narcy, Paris, Flammarion, 1995, p. 234-278</ref>. La question philosophique fondamentale que soulève la notion de croyance est double : d'une part, quelle est la nature de l'acte de croire ? D'autre part, quelles conditions une croyance doit-elle remplir pour être considérée comme rationnelle ou justifiée ? Ces interrogations traversent toute l'histoire de la philosophie et donnent lieu à des réponses divergentes selon les traditions philosophiques. == La distinction platonicienne : croyance et connaissance == === La croyance comme opinion === Dans le ''Théétète'', Platon établit une distinction fondamentale entre l'opinion vraie (''alethès doxa'') et la connaissance (''epistémè'')<ref>Platon, ''Théétète'', 201c-d</ref>. L'opinion vraie se caractérise par le fait qu'elle atteint la vérité sans pour autant constituer une connaissance authentique. Socrate illustre ce point par l'exemple des avocats qui, par des arguments rhétoriques, persuadent un jury d'accepter une vérité sans lui transmettre pour autant la connaissance de cette vérité. La croyance vraie diffère ainsi de la connaissance en ce qu'elle ne comporte pas de ''logos'', c'est-à-dire de justification rationnelle ou d'explication<ref>Platon, ''Théétète'', 201d-202c</ref>. Cette distinction platonicienne établit une hiérarchie épistémique : au sommet se trouve la connaissance des Formes intelligibles, accessible par la dialectique ; en dessous, l'opinion vraie qui se rapporte aux choses sensibles ; et tout en bas, l'opinion fausse. La croyance, dans ce cadre, est un état mental intermédiaire qui peut s'avérer véridique sans pour autant constituer une saisie authentique de la réalité. === Le problème de la fausse croyance === Platon soulève dans le ''Théétète'' un problème redoutable : comment est-il possible de croire faussement ? Si croire que X est Y suppose une relation à X et Y, et si cette relation est fausse (X n'est pas Y), alors il semblerait qu'il n'y ait rien à quoi se rapporte la croyance, et donc qu'elle ne soit pas réellement une croyance<ref>Platon, ''Théétète'', 187d-200d</ref>. La solution esquissée consiste à admettre que nous pouvons connaître suffisamment une chose X pour l'identifier comme sujet de discours, sans pour autant tout savoir à son propos, notamment si elle possède ou non la propriété Y. == La conception aristotélicienne : croyance et assentiment == Pour Aristote, la croyance (''pistis'') se distingue de la simple appréhension d'un concept par l'intervention d'un jugement. Appréhender une proposition n'équivaut pas à y croire : il faut un acte supplémentaire d'assentiment (''kataphasis'') ou de rejet (''apophasis''). Cette distinction sera reprise et développée par les philosophes scolastiques médiévaux, puis par Descartes<ref>Aristote, ''De l'âme'', III, 3, 427b-428a, trad. R. Bodéüs, Paris, Flammarion, 1993, p. 212-215</ref>. Aristote considère que la croyance est toujours propositionnelle : on ne croit pas simplement "cheval", mais "le cheval est blanc" ou "il y a un cheval". Cette structure propositionnelle implique une prise de position du sujet face à un contenu représentationnel. La croyance se distingue ainsi de la simple imagination qui peut représenter sans affirmer. == La théorie cartésienne du jugement == === Croyance, perception et volonté === Descartes opère une transformation décisive dans la compréhension de la croyance en distinguant radicalement deux facultés : l'entendement (''intellectus''), qui perçoit les idées, et la volonté (''voluntas''), qui donne son assentiment<ref>Descartes, René, ''Méditations métaphysiques'', IV, AT VII 56-57, trad. M. Beyssade et J.-M. Beyssade, Paris, Flammarion, 1979, p. 147-151</ref>. La croyance n'est pas un acte de l'entendement mais un acte de la volonté par lequel nous affirmons ou nions ce que l'entendement nous présente. Cette théorie a des conséquences importantes pour la question de la responsabilité épistémique. Puisque la croyance est un acte volontaire, nous sommes responsables de nos erreurs lorsque nous donnons notre assentiment à des idées confuses ou obscures. L'erreur ne provient ni de l'entendement, qui perçoit ce qu'il perçoit, ni de la volonté en elle-même, qui est libre, mais du mauvais usage de la volonté qui consent à des perceptions inadéquates<ref>Descartes, ''Méditations'', IV, AT VII 58-62</ref>. === La clarté et distinction comme critère === Descartes établit que nous devons suspendre notre jugement (''suspensio judicii'') tant que nous ne percevons pas clairement et distinctement la vérité d'une proposition. Seules les idées claires et distinctes contraignent légitimement notre assentiment. Cette contrainte n'est pas une violence faite à la volonté mais au contraire l'expression de sa plus haute liberté : lorsque l'entendement perçoit clairement que quelque chose est vrai, la volonté ne peut que consentir, et ce consentement est parfaitement libre parce que parfaitement éclairé<ref>Descartes, ''Méditations'', IV, AT VII 58-59</ref><ref>Jayasekera, Marie de Marneffe, "Responsibility in Descartes's Theory of Judgment", ''Ergo'', vol. 3, n° 12, 2016, p. 319-347</ref>. Cette conception introduit une norme épistémique stricte : nous avons le devoir intellectuel de ne croire que ce que nous percevons clairement et distinctement. La croyance rationnelle exige donc une discipline de la volonté et une vigilance constante contre la précipitation du jugement. == L'empirisme britannique : croyance et expérience == === Locke et la justification des croyances === John Locke développe une théorie évidentaliste de la croyance dans son ''Essai sur l'entendement humain'' (1689). Selon lui, la croyance (''belief'') doit être proportionnée à l'évidence disponible. Nous avons un devoir épistémique de ne croire que ce qui est supporté par des preuves suffisantes, que ces preuves proviennent de l'intuition, de la démonstration ou de l'expérience sensible<ref>Locke, John, ''Essai sur l'entendement humain'', Livre IV, chap. XV-XIX, trad. J.-M. Vienne, Paris, Vrin, 2001, p. 743-841</ref>. Locke distingue trois degrés de connaissance : la connaissance intuitive (par exemple, la conscience de notre propre existence), la connaissance démonstrative (comme les mathématiques et l'existence de Dieu) et la connaissance sensible (l'existence des choses extérieures)<ref>Locke, ''Essai'', Livre IV, chap. II</ref>. La croyance intervient lorsque nous n'avons pas de connaissance certaine mais seulement une probabilité basée sur l'expérience et le témoignage. Cette position évidentaliste aura une influence considérable sur la philosophie des religions, notamment dans le débat sur la rationalité de la croyance religieuse. Locke soutient qu'accepter une révélation divine exige d'abord d'établir rationnellement que Dieu existe et qu'il a effectivement révélé la proposition en question, typiquement par des miracles attestés<ref>Locke, ''Essai'', Livre IV, chap. XVIII-XIX</ref>. === Hume : croyance, vivacité et causalité === David Hume propose une théorie radicalement différente de la croyance dans son ''Traité de la nature humaine'' (1739-1740). Pour lui, la croyance n'est pas un acte de volonté mais une "manière particulière de concevoir une idée"<ref>Hume, David, ''Traité de la nature humaine'', Livre I, partie III, section VII, trad. P. Baranger et P. Saltel, Paris, Flammarion, 1995, p. 173-179</ref>. La différence entre une simple idée et une croyance ne réside pas dans le contenu représentationnel, mais dans la vivacité (''vivacity'') ou la force (''force'') avec laquelle l'idée est conçue. Croire que p, c'est avoir une idée de p qui est plus vive, plus ferme, plus stable qu'une simple fiction de l'imagination<ref>Hume, ''Traité'', I, III, VII, §5</ref>. Cette vivacité provient du transfert de la vivacité d'une impression présente vers une idée associée par la relation de causalité. Par exemple, lorsque je vois de la fumée (impression), l'habitude d'avoir constamment observé que la fumée est suivie du feu fait que mon idée du feu acquiert une vivacité qui la transforme en croyance. La croyance est ainsi le produit d'un mécanisme psychologique naturel plutôt que d'une délibération rationnelle<ref>Hume, ''Traité'', I, III, VIII</ref><ref>Hume, David, ''Enquête sur l'entendement humain'', section V, trad. A. Leroy, Paris, Flammarion, 1983, p. 91-115</ref>. Dans l'Appendice du ''Traité'', Hume reconnaît que sa théorie initiale pose problème : des poèmes ou des fictions peuvent susciter des idées très vives sans pour autant constituer des croyances. Il révise alors sa théorie en distinguant deux types de vivacité : la vivacité phénoménologique (l'intensité des images mentales) et la vivacité doxastique (un sentiment sui generis qui caractérise la croyance)<ref>Hume, ''Traité'', Appendice, §7-10</ref>. La croyance se caractérise par une "force", une "solidité" ou une "fermeté" qui fait que les réalités pèsent davantage dans notre pensée et influencent davantage nos actions et nos passions que les simples fictions. == Le kantisme et l'idéalisme allemand == === Kant : opinion, croyance et savoir === Emmanuel Kant établit dans la ''Critique de la raison pure'' une distinction tripartite entre l'opinion (''Meinen''), la croyance ou foi (''Glauben'') et le savoir (''Wissen'')<ref>Kant, Emmanuel, ''Critique de la raison pure'', "Doctrine transcendantale de la méthode", chap. II, section III, trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, A820-831/B848-859</ref>. Ces trois attitudes se distinguent par leur rapport à la suffisance subjective et objective de la tenue-pour-vrai (''Fürwahrhalten''). Le '''savoir''' requiert une suffisance tant subjective qu'objective : le sujet est convaincu et il y a des raisons objectives suffisantes. L'''opinion''' n'est suffisante ni subjectivement ni objectivement : le sujet reconnaît que sa conviction est incertaine et qu'elle ne repose pas sur des fondements suffisants. La '''croyance''' est subjectivement suffisante mais objectivement insuffisante : le sujet est fermement convaincu, mais reconnaît que cette conviction ne peut être fondée sur des preuves théoriques contraignantes. Kant distingue en outre trois types de croyance : la croyance pragmatique (par exemple, croire qu'un médecin peut guérir), la croyance doctrinale (croire à l'existence d'autres habitants dans l'univers) et la croyance morale (croire en Dieu et en l'immortalité de l'âme). Seule cette dernière a, selon Kant, une nécessité rationnelle, non pas théorique mais pratique : nous devons postuler l'existence de Dieu et l'immortalité de l'âme comme conditions de possibilité de l'accomplissement du souverain bien<ref>Kant, ''Critique de la raison pure'', A828-829/B856-857</ref><ref>Kant, Emmanuel, ''Critique de la raison pratique'', "Dialectique", trad. F. Picavet, Paris, PUF, 1943, p. 124-148</ref>. === Hegel et la foi rationnelle === Dans sa ''Phénoménologie de l'esprit'', Hegel critique la conception kantienne d'une foi qui serait séparée du savoir. Pour Hegel, la foi (''Glaube'') n'est qu'un moment dans le développement de l'esprit qui doit être dépassé dans le savoir absolu<ref>Hegel, Georg Wilhelm Friedrich, ''Phénoménologie de l'esprit'', trad. J. Hyppolite, Paris, Aubier, 1941, tome II, p. 227-241</ref>. La véritable réconciliation de la foi et de la raison ne consiste pas à les maintenir séparées dans des domaines distincts, mais à comprendre que la foi authentique contient déjà implicitement le concept rationnel qu'elle devra expliciter. La religion, pour Hegel, exprime sous forme représentative (''Vorstellung'') ce que la philosophie exprime sous forme conceptuelle (''Begriff''). La croyance religieuse n'est donc pas irrationnelle, mais elle représente une forme de rationalité encore immature qui doit s'élever au concept philosophique. == Le pragmatisme : croyance et action == === William James et la volonté de croire === William James, dans ''La Volonté de croire'' (1896), défend une position controversée selon laquelle, dans certaines circonstances, nous avons le droit, voire le devoir, de croire sans preuve suffisante<ref>James, William, ''La Volonté de croire'', trad. L. Moulin, Paris, Les Empêcheurs de penser en rond, 2005</ref>. Lorsqu'une option est vivante (les alternatives sont psychologiquement réelles), forcée (nous ne pouvons pas suspendre notre jugement) et momentanée (l'occasion de choisir ne se représentera pas), alors nous sommes en droit de laisser notre nature passionnelle décider, plutôt que d'attendre des preuves qui pourraient ne jamais venir. James applique particulièrement cette thèse à la croyance religieuse. Si l'existence de Dieu ne peut être ni prouvée ni réfutée de manière concluante, et si cette croyance a des conséquences pratiques importantes pour notre vie, alors nous sommes en droit de croire ou de ne pas croire en fonction de nos besoins vitaux et de nos aspirations les plus profondes. === Peirce et la fixation de la croyance === Charles Sanders Peirce développe une conception pragmatiste de la croyance dans son article "La Fixation de la croyance" (1877)<ref>Peirce, Charles Sanders, "The Fixation of Belief", ''Popular Science Monthly'', vol. 12, 1877, p. 1-15</ref>. Pour Peirce, la croyance est essentiellement une disposition à l'action : croire que p, c'est être disposé à agir comme si p était vrai. Le doute, à l'inverse, est un état d'inconfort qui suspend l'action et stimule l'enquête. L'enquête scientifique est, selon Peirce, la méthode la plus efficace pour fixer durablement nos croyances, car elle seule est capable de corriger ses propres erreurs en confrontant continuellement nos hypothèses à l'expérience. Contrairement aux méthodes de la ténacité, de l'autorité ou de la réflexion a priori, la méthode scientifique produit des croyances qui convergent vers la vérité à long terme. == La phénoménologie : croyance et intentionnalité == === Husserl et la thèse doxique === Edmund Husserl, dans ses ''Recherches logiques'' et ses ''Idées directrices pour une phénoménologie'', analyse la croyance (''Glaube'') comme une modalité de la thèse doxique. Tout acte de conscience comporte une composante doxique : nous ne nous contentons pas de représenter un objet, nous le positionnons comme existant, possible, probable, douteux, etc.<ref>Husserl, Edmund, ''Idées directrices pour une phénoménologie'', §§103-114, trad. P. Ricœur, Paris, Gallimard, 1950, p. 349-379</ref>. La croyance naturelle (''natürlicher Glaube'') ou thèse générale de l'attitude naturelle consiste à poser le monde comme existant. Cette thèse peut être modalisée (croyance probable, doute) ou neutralisée (mise entre parenthèses, ''épochè''). La phénoménologie husserlienne met ainsi en évidence la structure intentionnelle de la croyance : croire, c'est toujours croire-à ou croire-que, c'est-à-dire se rapporter à un objet intentionnel sous un certain mode. === Sartre : croyance et mauvaise foi === Jean-Paul Sartre, dans ''L'Être et le Néant'', développe une critique phénoménologique de la croyance ordinaire. Pour Sartre, la croyance authentique est impossible car elle impliquerait une coïncidence parfaite avec soi-même que la structure de la conscience interdit<ref>Sartre, Jean-Paul, ''L'Être et le Néant'', Paris, Gallimard, 1943, p. 107-111</ref>. Toute croyance comporte une part de non-croyance : "Croire, c'est n'être pas tout à fait sûr ; croire, c'est savoir qu'on croit, donc c'est ne plus croire tout à fait." Cette analyse conduit Sartre à sa célèbre théorie de la mauvaise foi, qui consiste précisément à se cacher à soi-même que l'on ne croit pas vraiment ce que l'on prétend croire. La mauvaise foi est une modalité fondamentale de l'existence humaine par laquelle la conscience tente de se figer en être-en-soi tout en préservant sa liberté comme être-pour-soi. == Philosophie analytique contemporaine == === La définition tripartite de la connaissance === Depuis Platon, une tradition philosophique définit la connaissance comme croyance vraie justifiée. Cette définition tripartite a été remise en question par Edmund Gettier dans un article de 1963 qui présente des contre-exemples célèbres<ref>Gettier, Edmund, "Is Justified True Belief Knowledge?", ''Analysis'', vol. 23, n° 6, 1963, p. 121-123</ref>. Gettier montre qu'on peut avoir une croyance vraie justifiée sans pour autant avoir de connaissance, lorsque la vérité de la croyance est due au hasard plutôt qu'à la justification. Ce problème a engendré une vaste littérature en épistémologie analytique, avec diverses solutions proposées : ajouter une condition de non-défaisabilité, exiger un lien causal approprié entre la croyance et le fait, ou adopter une théorie fiabiliste de la justification. Ces débats montrent que la nature exacte de la relation entre croyance et connaissance reste un problème philosophique vivant. === Le fiabilisme === Le fiabilisme, développé notamment par Alvin Goldman, soutient que la justification d'une croyance dépend de sa genèse causale<ref>Goldman, Alvin, "What Is Justified Belief?", in George Pappas (dir.), ''Justification and Knowledge'', Dordrecht, Reidel, 1979, p. 1-23</ref>. Une croyance est justifiée si et seulement si elle est produite par un processus cognitivement fiable, c'est-à-dire un processus qui tend à produire un ratio élevé de croyances vraies par rapport aux croyances fausses. Cette théorie est externaliste : un sujet peut avoir des croyances justifiées sans avoir accès aux facteurs qui les justifient. Cette position s'oppose aux théories internalistes qui exigent que le sujet ait un accès réflexif aux raisons de ses croyances. Le débat entre internalisme et externalisme structure une grande partie de l'épistémologie contemporaine. === Contextualisme et épistémologie des vertus === Le contextualisme épistémique soutient que les conditions pour attribuer une connaissance varient selon le contexte conversationnel. Dans un contexte ordinaire, nous pouvons dire que nous "savons" que nous avons des mains, mais dans un contexte philosophique où des scénarios sceptiques sont envisagés (comme l'hypothèse du cerveau dans une cuve), nous ne pouvons plus le dire<ref>DeRose, Keith, "Contextualism and Knowledge Attributions", ''Philosophy and Phenomenological Research'', vol. 52, n° 4, 1992, p. 913-929</ref>. L'épistémologie des vertus, développée par Ernest Sosa, Linda Zagzebski et John Greco, propose de comprendre la connaissance non pas comme croyance vraie justifiée mais comme croyance vraie provenant de l'exercice de vertus intellectuelles<ref>Sosa, Ernest, ''A Virtue Epistemology: Apt Belief and Reflective Knowledge'', vol. I, Oxford, Clarendon Press, 2007</ref>. Cette approche met l'accent sur l'agent cognitif et ses dispositions plutôt que sur les propriétés abstraites des croyances. == Croyance et rationalité == === L'évidentalisme === L'évidentalisme, défendu notamment par Locke puis par W.K. Clifford au XIXe siècle, soutient que nous avons un devoir épistémique de proportionner nos croyances à l'évidence disponible. Clifford formule cette norme de manière particulièrement stricte : "Il est mauvais, toujours, partout, et pour quiconque, de croire quoi que ce soit sur la base d'une évidence insuffisante"<ref>Clifford, William Kingdon, "The Ethics of Belief", ''Contemporary Review'', vol. 29, 1877, p. 289-309</ref>. Cette position implique que beaucoup de nos croyances ordinaires, notamment les croyances religieuses, sont irrationnelles si elles ne sont pas appuyées par des preuves suffisantes. L'évidentalisme établit ainsi un lien étroit entre rationalité épistémique et justification probatoire. === Bayésianisme et degrés de croyance === Le bayésianisme épistémique modélise la croyance rationnelle en termes de degrés de confiance (''credences'') qui obéissent aux axiomes du calcul des probabilités<ref>Ramsey, Frank P., "Truth and Probability" (1926), in D.H. Mellor (dir.), ''Philosophical Papers'', Cambridge, Cambridge University Press, 1990, p. 52-94</ref>. Une croyance rationnelle n'est pas un simple état binaire (croire ou ne pas croire) mais un degré de confiance allant de 0 (certitude de la fausseté) à 1 (certitude de la vérité). La rationalité bayésienne exige que nos degrés de croyance soient cohérents (satisfaisant les axiomes de la probabilité) et que nous les mettions à jour selon la règle de Bayes lorsque nous recevons de nouvelles informations. Cette approche permet de modéliser de manière formelle le raisonnement inductif et l'apprentissage à partir de l'expérience. == Croyance religieuse et foi == === La distinction entre foi et croyance === Dans le contexte religieux, il est important de distinguer la foi (''fides'') de la simple croyance (''opinio''). Thomas d'Aquin définit la foi comme "l'acte de l'intelligence qui, sous l'impulsion de la volonté mue par Dieu au moyen de la grâce, donne son assentiment aux vérités divines"<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 2, a. 9, trad. A.-M. Roguet, Paris, Cerf, 1985, tome 2, p. 133</ref>. La foi n'est donc pas une simple opinion incertaine, mais un assentiment ferme fondé non pas sur l'évidence intrinsèque de son objet, mais sur l'autorité de Dieu qui révèle. Contrairement à la connaissance qui repose sur l'évidence, et à l'opinion qui demeure hésitante, la foi est à la fois certaine (en raison de l'autorité divine) et obscure (car son objet dépasse la capacité naturelle de l'intelligence humaine)<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 1-7</ref>. === Le fidéisme et ses critiques === Le fidéisme désigne la position selon laquelle la foi religieuse est indépendante de la raison, voire en conflit avec elle. Cette position a été défendue sous diverses formes par Tertullien (''Credo quia absurdum''), Pascal avec son "pari", et Kierkegaard pour qui la foi exige un "saut" par-dessus l'absurdité rationnelle<ref>Kierkegaard, Søren, ''Crainte et tremblement'', trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, Paris, Payot, 2000</ref>. Cette conception a été vivement critiquée tant par les théologiens rationalistes que par les philosophes des Lumières. Elle semble faire de la foi un acte arbitraire et immuniser les croyances religieuses contre toute critique rationnelle. Les thomistes objectent que si la foi était vraiment contraire à la raison, elle ne pourrait être ni vertueuse ni raisonnable. === La réforme réformée en épistémologie === Alvin Plantinga et Nicholas Wolterstorff ont développé ce qu'on appelle l'"épistémologie réformée", qui défend la rationalité de la croyance en Dieu sans argument<ref>Plantinga, Alvin et Wolterstorff, Nicholas (dir.), ''Faith and Rationality'', Notre Dame, University of Notre Dame Press, 1983</ref>. Selon cette approche, la croyance en Dieu peut être "proprement basique" (''properly basic''), c'est-à-dire justifiée sans être inférée d'autres croyances, tout comme nos croyances perceptuelles ou mémorielles. Plantinga soutient que les êtres humains possèdent un ''sensus divinitatis'', une faculté naturelle qui, dans des circonstances appropriées, produit spontanément la croyance en Dieu. Si cette faculté fonctionne correctement, les croyances qu'elle produit constituent une connaissance authentique même en l'absence d'arguments<ref>Plantinga, Alvin, ''Warranted Christian Belief'', Oxford, Oxford University Press, 2000</ref>. == Conclusion == La notion de croyance demeure au cœur des préoccupations philosophiques contemporaines, tant en épistémologie qu'en philosophie de l'esprit et en philosophie des religions. Les débats actuels prolongent et renouvellent les questions classiques : Quelle est la structure de la croyance ? En quoi diffère-t-elle de la connaissance ? Quelles normes doivent gouverner nos croyances ? Avons-un contrôle volontaire sur nos croyances ? Ces questions ne sont pas seulement théoriques mais comportent des enjeux pratiques importants concernant la rationalité de nos engagements cognitifs, la responsabilité épistémique, et la possibilité d'un dialogue rationnel entre personnes ayant des systèmes de croyances différents. Elles montrent que la philosophie de la croyance reste un domaine vivant de la recherche philosophique, où se croisent l'héritage des grands penseurs du passé et les méthodes rigoureuses de la philosophie analytique contemporaine. == Références == {{references|colonnes=2}} == Bibliographie == * Engel, Pascal, ''La Dispute : une introduction à la philosophie analytique'', Paris, Minuit, 1997 * Pouivet, Roger, ''Qu'est-ce que croire ?'', Paris, Vrin, 2003 * Swinburne, Richard, ''Faith and Reason'', 2e éd., Oxford, Clarendon Press, 2005 * BonJour, Laurence, ''The Structure of Empirical Knowledge'', Cambridge, Harvard University Press, 1985 * Alston, William P., ''Epistemic Justification'', Ithaca, Cornell University Press, 1989 * Zagzebski, Linda, ''Virtues of the Mind'', Cambridge, Cambridge University Press, 1996 {{autocat}} 45kzln8urs9hsmpeq0j7wlyu9x2ge17 Dictionnaire de philosophie/Contingence 0 83050 767895 760047 2026-06-17T04:50:12Z PandaMystique 119061 767895 wikitext text/x-wiki {{DicoPhilo|Contingence}} La contingence (du latin ''contingere'', « arriver par hasard », « échoir ») désigne, en philosophie, le mode d'être de ce qui pourrait ne pas être ou être autrement. Elle s'oppose à la nécessité, qui caractérise ce qui ne peut pas ne pas être. Cette distinction fondamentale traverse toute l'histoire de la philosophie et structure les débats métaphysiques, logiques, théologiques et éthiques depuis l'Antiquité. == Définitions et distinctions conceptuelles == === Contingent, nécessaire, possible, impossible === Dans la tradition logique et métaphysique, la contingence s'inscrit dans le carré des modalités, qui articule quatre concepts fondamentaux<ref>Jules Vuillemin, ''Nécessité ou contingence. L'aporie de Diodore et les systèmes philosophiques'', Paris, Éditions de Minuit, 1984</ref><ref>Logique modale et théorie des modalités, ''Encyclopédie philosophique'', Paris, PUF, 2011</ref> : * Le nécessaire : ce qui ne peut pas ne pas être (par exemple, les vérités mathématiques comme « 2+2=4 ») * L{{'}}impossible : ce qui ne peut pas être (par exemple, un cercle carré) * Le possible : ce qui peut être sans contradiction (par exemple, ma présence en ce lieu) * Le contingent : ce qui peut être ou ne pas être, ce qui n'est ni nécessaire ni impossible Le contingent et le nécessaire sont contradictoires : être contingent, c'est précisément ne pas être nécessaire. Toute chose est soit nécessaire, soit contingente<ref>Alain Badiou, ''Logique des mondes'', Paris, Seuil, 2006, p. 381-412</ref>. En revanche, le possible et le contingent sont subcontraires : ils peuvent être vrais ensemble. Quelque chose peut en effet être à la fois possible et contingent, mais pas faux ensemble. === Contingence et facticité === Dans la philosophie existentialiste, notamment chez Heidegger et Sartre, la contingence se rapproche de la notion de facticité (''Faktizität''). La facticité désigne le fait que l'existence humaine se découvre toujours déjà jetée dans le monde (''Geworfenheit''), sans l'avoir choisi<ref>Martin Heidegger, ''Sein und Zeit'' (''Être et Temps''), Tübingen, Max Niemeyer, 1927, § 29, p. 135-140</ref><ref>Jean-Paul Sartre, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943, p. 120-128</ref>. Comme l'écrit Sartre dans ''La Nausée'' : « L'essentiel est la contingence. Je veux dire que par définition, l'existence n'est pas la nécessité. Exister c'est être là, simplement »<ref>Jean-Paul Sartre, ''La Nausée'', Paris, Gallimard, 1938, p. 185</ref>. Cette contingence radicale de l'existence ne peut être dépassée par aucun « être nécessaire et cause de soi » : elle est « l'absolu, par conséquent la gratuité parfaite »<ref>Sartre, ''La Nausée'', op. cit., p. 188</ref>. La facticité comprend plusieurs dimensions<ref>Vincent de Coorebyter, ''Sartre face à la phénoménologie. Autour de L'intentionnalité et de La transcendance de l'Ego'', Bruxelles, Ousia, 2000, p. 219-265</ref> : * L'émergence contingente du pour-soi au sein de l'en-soi * La déréliction ou situation de l'être humain qui se trouve toujours-déjà-là * La finitude de l'existence marquée par la naissance et la mort que nous n'avons pas choisies == La contingence dans la philosophie antique et médiévale == === Aristote et la contingence des futurs === Aristote inaugure la réflexion systématique sur la contingence dans son traité ''De l'Interprétation'' (chapitre 9), où il aborde la question des futurs contingents<ref>Aristote, ''De l'Interprétation'', chapitre 9, 18a 28 - 19b 4</ref><ref>Jules Vuillemin, ''Nécessité ou contingence'', op. cit., p. 11-58</ref>. Le problème est le suivant : une proposition portant sur un événement futur (« Il y aura une bataille navale demain ») est-elle déjà vraie ou fausse aujourd'hui ? Si elle est déjà déterminée, tout arrive par nécessité et la contingence disparaît. Si elle n'est ni vraie ni fausse, le principe de non-contradiction semble menacé. Aristote distingue plusieurs types de contingence liés à sa doctrine des quatre causes<ref>Émile Bréhier, ''Histoire de la Philosophie'', vol. 1, Paris, PUF, 1981, p. 289-312</ref> : * Les événements qui arrivent par hasard (''apo tuchès''), sans cause propre déterminée * Les actes libres procédant d'une cause indifférente (la volonté) * Les événements naturels qui arrivent « le plus souvent » (''hôs epi to polu'') mais qui peuvent être empêchés par une cause faillible Pour Aristote, la contingence est réelle : certains événements ne sont pas prédéterminés et peuvent effectivement se produire ou non. Cette position se situe entre le déterminisme absolu et l'indéterminisme pur<ref>Guy Picard, « Matière, contingence et indéterminisme chez saint Thomas », ''Laval théologique et philosophique'', vol. 22, n° 2, 1966, p. 197-233</ref>. === Avicenne : essence et existence === Le philosophe persan Avicenne (Ibn Sīnā, 980-1037) introduit une distinction majeure qui aura une influence considérable sur la scolastique médiévale : celle entre essence (''māhiyya'') et existence (''wujūd'')<ref>Amélie-Marie Goichon, ''La distinction de l'essence et de l'existence d'après Ibn Sīnā (Avicenne)'', Paris, Desclée de Brouwer, 1937</ref><ref>Avicenne, ''La Métaphysique du Shifā'', livres I à V, traduction Georges C. Anawati, Paris, Vrin, 1978, p. 97-112</ref>. Pour Avicenne, l{{'}}essence d'une chose (ce qu'elle est) ne contient pas en elle-même son existence (le fait qu'elle soit). L'essence est en elle-même ni existante ni non-existante : elle est neutre ou indifférente à l'existence<ref>Goichon, ''La distinction de l'essence et de l'existence'', op. cit., p. 87-103</ref>. Par exemple, l'essence « humanité » peut être pensée sans que l'on conçoive nécessairement qu'elle existe actuellement. Cette neutralité de l'essence fonde la contingence des êtres : leur essence ne les rend pas nécessaires. Avicenne distingue alors deux types d'êtres<ref>Avicenne, ''Métaphysique du Shifā'', op. cit., livre VIII, chapitre 1-3</ref><ref>Michael E. Marmura, « Avicenna on Primary Concepts in the Metaphysics of His al-Shifā' », dans ''Probing in Islamic Philosophy'', Binghamton, Global Academic Publishing, 2005, p. 141-167</ref> : * L{{'}}Être nécessaire par soi (''wājib al-wujūd bi-dhātihi'') : Dieu, dont l'essence implique nécessairement l'existence * L{{'}}être contingent ou possible par soi (''mumkin al-wujūd bi-dhātihi'') : toute créature, dont l'existence ne découle pas de son essence mais lui est conférée de l'extérieur par une cause efficiente Cette distinction permet à Avicenne de formuler sa célèbre preuve de l'existence de Dieu à partir de la contingence du monde<ref>Avicenne, ''Métaphysique du Shifā'', livre VIII, chapitre 3-7</ref><ref>Robert Wisnovsky, ''Avicenna's Metaphysics in Context'', Ithaca, Cornell University Press, 2003, p. 213-257</ref> : puisque tout être contingent a besoin d'une cause pour exister, et qu'on ne peut remonter à l'infini dans la chaîne des causes, il doit exister un Être nécessaire par soi qui donne l'existence à tous les êtres contingents. === Thomas d'Aquin : contingence et participation === Thomas d'Aquin (1225-1274) reprend la distinction avicennienne entre essence et existence, mais l'inscrit dans une métaphysique de la participation et de la composition<ref>Étienne Gilson, ''L'Être et l'essence'', Paris, Vrin, 1948, p. 139-187</ref><ref>Cornelio Fabro, ''Participation et causalité selon S. Thomas d'Aquin'', Louvain/Paris, Publications universitaires de Louvain/Béatrice-Nauwelaerts, 1961</ref>. Pour Thomas, dans tout être créé, l{{'}}''esse'' (l'acte d'être) et l{{'}}''essentia'' (l'essence) sont réellement distincts<ref>Thomas d'Aquin, ''De ente et essentia'', chapitre 4-5</ref><ref>Thomas d'Aquin, ''Somme théologique'', Ia, question 3, article 4</ref>. Cette composition réelle fonde la contingence de la créature : son essence ne contient pas en elle-même la raison de son existence. Thomas distingue également la contingence de droit et ce qu'on pourrait appeler une forme de nécessité hypothétique<ref>Picard, « Matière, contingence et indéterminisme », op. cit., p. 197-233</ref><ref>Thomas d'Aquin, ''Summa contra Gentiles'', livre III, chapitre 86</ref>. Les événements naturels sont contingents en ce sens que leur cause propre peut être empêchée (la fleur de noisetier peut ne pas produire de noisette si elle est détruite). Cependant, une fois toutes les causes réunies, l'effet suit nécessairement. La contingence ne signifie donc pas indétermination absolue, mais dépendance à l'égard de causes qui peuvent être empêchées<ref>Thomas d'Aquin, ''Commentaire sur le Perihermeneias d'Aristote'', livre I, leçon 13-15</ref>. La matière première joue également un rôle dans la contingence des êtres naturels<ref>Thomas d'Aquin, ''De principiis naturae'', chapitre 1-2</ref><ref>Picard, « Matière, contingence et indéterminisme », op. cit., p. 207-215</ref>. Étant pure puissance, elle est le principe d'indétermination qui explique que les formes substantielles puissent se succéder dans la génération et la corruption. La contingence a ainsi « sa racine dans la matière »<ref>Thomas d'Aquin, ''Commentaire sur le Perihermeneias'', I, leçon 14, n. 8</ref>. === Duns Scot : univocité de l'être et contingence === Jean Duns Scot (vers 1266-1308) apporte une contribution majeure à la pensée de la contingence en liant celle-ci à sa doctrine de l{{'}}univocité de l'être<ref>Jean Duns Scot, ''Opus Oxoniense'' (''Ordinatio''), livre I, distinction 3, question 1-3</ref><ref>Olivier Boulnois, ''Être et représentation. Une généalogie de la métaphysique moderne à l'époque de Duns Scot (XIIIe-XIVe siècle)'', Paris, PUF, 1999, p. 267-325</ref>. Contre Thomas d'Aquin qui défend l{{'}}analogie de l'être (l'être se dit différemment de Dieu et des créatures), Scot affirme que l'être possède un sens univoque : il se dit de la même manière de Dieu et des créatures, bien que Dieu soit être infini et les créatures êtres finis<ref>Duns Scot, ''Ordinatio'', I, d. 3, q. 1-2, n. 26-55</ref>. Cette univocité permet à Scot de penser la contingence de manière plus radicale. Pour lui, la contingence ne réside pas seulement dans le rapport de l'essence à l'existence, mais dans la volonté divine elle-même<ref>Duns Scot, ''Ordinatio'', I, d. 39-40</ref><ref>Ludger Honnefelder, ''Ens inquantum ens. Der Begriff des Seienden als solchen als Gegenstand der Metaphysik nach der Lehre des Johannes Duns Scotus'', Münster, Aschendorff, 1979, p. 312-358</ref>. Dieu ne crée pas par nécessité de nature, mais par un acte libre et contingent de sa volonté. Les lois de la nature elles-mêmes sont contingentes : « ''Non quaerenda ratio quorum non est ratio'' » (on ne doit pas chercher la raison de ce dont il n'y a pas de raison)<ref>Duns Scot, ''Lectura'', I, d. 39, q. 1-5, n. 49</ref>. Scot développe également la notion d{{'}}eccéité (''haecceitas'') ou principe d'individuation<ref>Duns Scot, ''Ordinatio'', II, d. 3, q. 1-6</ref><ref>Peter King, « Duns Scotus on the Common Nature and the Individual Differentia », ''Philosophical Topics'', vol. 20, n° 2, 1992, p. 50-76</ref>. Ce qui fait qu'un être est cet individu singulier (la « Socratéité » de Socrate) ne peut être expliqué ni par la matière ni par la forme universelle, mais constitue un principe ontologique irréductible. Cette doctrine souligne le caractère contingent et singulier de toute existence individuelle. == La contingence à l'époque moderne == === Leibniz : contingence et liberté === Gottfried Wilhelm Leibniz (1646-1716) élabore une théorie sophistiquée de la contingence qui cherche à concilier la liberté humaine, la contingence du monde et la nécessité des vérités éternelles<ref>Émile Bréhier, ''Histoire de la philosophie'', vol. II, Paris, PUF, 1981, p. 246-262</ref><ref>Robert Sleigh, ''Leibniz and Arnauld: A Commentary on Their Correspondence'', New Haven, Yale University Press, 1990, p. 77-103</ref>. Sa distinction entre vérités de raison et vérités de fait structure sa pensée<ref>Leibniz, ''Essais de Théodicée sur la bonté de Dieu, la liberté de l'homme et l'origine du mal'', Amsterdam, Isaac Troyel, 1710, § 282-288</ref> : * Les vérités de raison sont nécessaires : leur contraire implique contradiction (par exemple, les vérités mathématiques) * Les vérités de fait sont contingentes : leur contraire est possible sans contradiction (par exemple, « César a franchi le Rubicon ») Leibniz introduit la notion fondamentale de nécessité hypothétique ou morale<ref>Leibniz, ''Théodicée'', op. cit., § 36-37, § 230-237</ref><ref>André Robinet, ''Architectonique disjonctive, automates systémiques et idéalité transcendantale dans l'œuvre de G.W. Leibniz'', Paris, Vrin, 1986, p. 345-367</ref>. Selon le principe de raison suffisante, tout ce qui arrive a une raison qui fait qu'il arrive plutôt qu'autrement. Cependant, cette raison « incline sans nécessiter »<ref>Leibniz, ''Théodicée'', § 45</ref>. La volonté est déterminée par les raisons les plus fortes, mais cette détermination n'est pas une nécessité absolue ou métaphysique : le choix contraire reste métaphysiquement possible, bien qu'il soit moralement impossible (c'est-à-dire contraire à la perfection de l'agent rationnel). Cette solution permet à Leibniz d'affirmer à la fois<ref>Leibniz, ''Discours de métaphysique'', § 13 et § 30</ref><ref>Yvon Belaval, ''Leibniz critique de Descartes'', Paris, Gallimard, 1960, p. 447-478</ref> : * Que Dieu a créé librement le monde * Que le monde actuel est le meilleur des mondes possibles * Que les actions humaines sont libres bien que déterminées par des raisons La contingence se situe ainsi dans l'écart entre la possibilité logique (ce qui n'implique pas contradiction) et l{{'}}actualité (ce qui existe effectivement). Parmi une infinité de mondes possibles, Dieu a librement choisi d'actualiser celui qui contient le maximum de perfection. === Kant : modalités et limites de la raison === Emmanuel Kant (1724-1804) inscrit la réflexion sur la contingence dans le cadre de sa philosophie critique. Dans la ''Critique de la raison pure'', les modalités (nécessaire, contingent, possible, impossible) ne sont plus seulement des déterminations de l'être, mais des catégories de l'entendement qui structurent notre expérience<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'' (''Critique de la raison pure''), Riga, Johann Friedrich Hartknoch, 1781/1787, B 106, A 80</ref><ref>Alexis Philonenko, ''L'œuvre de Kant'', vol. 1, Paris, Vrin, 1969, p. 127-145</ref>. Kant distingue<ref>Kant, ''Critique de la raison pure'', B 3-4</ref><ref>Alain Renaut, ''Kant aujourd'hui'', Paris, Aubier, 1997, p. 234-256</ref> : * Les jugements a priori : nécessaires et universels (par exemple, « tout effet a une cause ») * Les jugements a posteriori ou empiriques : contingents, car leur contraire est possible La contingence caractérise ainsi tout ce qui relève de l{{'}}expérience empirique<ref>Kant, ''Critique de la raison pure'', A 1-2/B 1-2</ref>. Les objets de l'expérience sont contingents parce que leur existence n'est pas déductible a priori des concepts purs de l'entendement. Seule l'expérience peut nous informer de ce qui existe effectivement. Kant critique les preuves traditionnelles de l'existence de Dieu, notamment la preuve cosmologique qui prétend déduire l'existence d'un Être nécessaire de la contingence du monde<ref>Kant, ''Critique de la raison pure'', A 603-614/B 631-642</ref><ref>Luc Ferry, ''Kant. Une lecture des trois Critiques'', Paris, Grasset, 2006, p. 98-115</ref>. Pour Kant, une telle déduction illégitime applique les catégories de l'entendement (comme la causalité) au-delà des limites de l'expérience possible, dans le domaine du suprasensible. Dans la ''Critique de la faculté de juger'', Kant rencontre la contingence sous un nouveau jour : celle du vivant<ref>Emmanuel Kant, ''Kritik der Urteilskraft'' (''Critique de la faculté de juger''), Berlin/Libau, Lagarde und Friederich, 1790, § 64-67</ref><ref>Catherine Malabou, ''Avant demain. Épigenèse et rationalité'', Paris, PUF, 2014, p. 37-89</ref>. L'organisme vivant manifeste une finalité qui ne peut être expliquée par les seules lois mécaniques de la nature. Cette contingence du vivant révèle les limites du déterminisme mécaniste et suggère une forme d{{'}}auto-organisation qui échappe à la causalité efficiente. === Spinoza : négation de la contingence === Baruch Spinoza (1632-1677) se distingue radicalement de la tradition en niant la contingence<ref>Baruch Spinoza, ''Ethica ordine geometrico demonstrata'' (''Éthique''), posthume 1677, partie I, proposition 29 et 33</ref><ref>Pierre Macherey, ''Introduction à l'Éthique de Spinoza. La première partie : la nature des choses'', Paris, PUF, 1998, p. 267-289</ref>. Pour Spinoza, tout ce qui existe existe nécessairement en vertu de la nature divine. Dieu, ou la Nature (''Deus sive Natura''), est la substance unique dont tout le reste découle comme des modes<ref>Spinoza, ''Éthique'', I, proposition 14-18</ref>. Dans l'Éthique, Spinoza affirme : « De la souveraine puissance de Dieu, ou de sa nature infinie, une infinité de choses en une infinité de modes, c'est-à-dire tout, a nécessairement découlé ou en suit, toujours avec la même nécessité ; de même que de toute éternité et pour l'éternité il suit de la nature du triangle que ses trois angles égalent deux droits »<ref>Spinoza, ''Éthique'', I, proposition 16</ref><ref>Ferdinand Alquié, ''Le rationalisme de Spinoza'', Paris, PUF, 1981, p. 123-145</ref>. L'existence du monde est donc mathématiquement nécessaire. La contingence n'est pour Spinoza qu'une illusion subjective née de notre ignorance des causes<ref>Spinoza, ''Éthique'', I, proposition 33, scolie 1</ref><ref>Alexandre Matheron, ''Individu et communauté chez Spinoza'', Paris, Éditions de Minuit, 1988, p. 34-56</ref>. Nous disons qu'une chose est contingente seulement parce que nous ne connaissons pas les causes qui la déterminent nécessairement. Si nous avions une connaissance adéquate de la chaîne causale, nous verrions que tout est nécessaire. Cette négation de la contingence a des conséquences majeures : * Il n'y a pas de libre arbitre au sens d'une volonté indéterminée<ref>Spinoza, ''Éthique'', II, proposition 48</ref> * La liberté se confond avec la nécessité comprise : être libre, c'est agir selon sa seule nature, sans contrainte extérieure<ref>Spinoza, ''Éthique'', I, définition 7 ; IV, proposition 66-73</ref> * Les lois de la nature sont éternelles et immuables<ref>Spinoza, ''Éthique'', I, appendice</ref> == La contingence dans la philosophie contemporaine == === L'existentialisme : facticité et contingence radicale === L'existentialisme du XXe siècle fait de la contingence une dimension constitutive de l'existence humaine. Martin Heidegger (1889-1976), dans ''Être et Temps'', décrit le ''Dasein'' (l'être-là humain) comme fondamentalement marqué par la facticité : il se trouve toujours-déjà-jeté dans le monde sans l'avoir choisi<ref>Heidegger, ''Sein und Zeit'', op. cit., § 29, p. 135-140</ref><ref>Emmanuel Levinas, ''En découvrant l'existence avec Husserl et Heidegger'', Paris, Vrin, 1949, p. 91-116</ref>. Jean-Paul Sartre (1905-1980) radicalise cette dimension dans ''L'Être et le Néant'' et ''La Nausée''<ref>Sartre, ''L'Être et le Néant'', op. cit., p. 116-142</ref><ref>Sartre, ''La Nausée'', op. cit., p. 180-190</ref>. Pour Sartre, la contingence ne concerne pas seulement les circonstances de notre existence, mais l'existence elle-même : « L'existence précède l'essence »<ref>Jean-Paul Sartre, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946, p. 17-21</ref>. L'être humain n'a pas de nature prédéfinie : il est « condamné à être libre », c'est-à-dire à se définir par ses choix<ref>Sartre, ''L'existentialisme est un humanisme'', op. cit., p. 37-39</ref>. Cette contingence radicale se manifeste dans plusieurs dimensions<ref>Francis Jeanson, ''Sartre par lui-même'', Paris, Seuil, 1955, p. 34-67</ref> : * La contingence de la naissance : « Personne n'a demandé à naître » * La contingence du monde : le sentiment de « trop » (''de trop'') qui saisit Roquentin devant la racine de marronnier<ref>Sartre, ''La Nausée'', op. cit., p. 181</ref> * La contingence de la mort : « un fait contingent qui [...] m'échappe par principe »<ref>Sartre, ''L'Être et le Néant'', op. cit., p. 630-631</ref> Simone de Beauvoir (1908-1986) approfondit cette réflexion en articulant contingence et situation<ref>Simone de Beauvoir, ''Le Deuxième Sexe'', Paris, Gallimard, 1949, tome I, p. 31-47</ref><ref>Michèle Le Dœuff, ''L'Étude et le Rouet. Des femmes, de la philosophie, etc.'', Paris, Seuil, 1989, p. 89-124</ref>. Contre Sartre qui affirmerait que toute situation peut être transcendée par la liberté, Beauvoir insiste sur le fait que les possibilités concrètes varient selon les situations. L'exemple de la femme enfermée dans un harem montre que la contingence des situations limite réellement la liberté. === Quentin Meillassoux : la contingence absolue === Le philosophe français Quentin Meillassoux (né en 1967) propose dans ''Après la finitude'' (2006) une réhabilitation spéculative de la contingence qu'il qualifie de contingence absolue<ref>Quentin Meillassoux, ''Après la finitude. Essai sur la nécessité de la contingence'', Paris, Seuil, 2006</ref><ref>Graham Harman, ''Quentin Meillassoux: Philosophy in the Making'', Edinburgh, Edinburgh University Press, 2011, p. 67-98</ref>. Contre le « corrélationnisme » qui affirme l'impossibilité d'accéder au réel indépendamment de notre rapport à lui, Meillassoux soutient que la seule nécessité absolue est la contingence elle-même : rien n'a de raison d'être ou de rester tel qu'il est. Cette « factualité » radicale signifie qu'aucune loi de la nature n'est nécessaire : tout pourrait devenir autre sans raison. La contingence n'est pas une propriété des êtres, mais le principe absolu du réel<ref>Meillassoux, ''Après la finitude'', op. cit., p. 79-103</ref>. == Enjeux philosophiques == === Contingence et liberté === La contingence est intimement liée à la question de la liberté humaine<ref>Henri Bergson, ''Essai sur les données immédiates de la conscience'', Paris, PUF, 1889, chapitre III</ref><ref>Vladimir Jankélévitch, ''L'Alternative'', Paris, Alcan, 1938, p. 23-89</ref>. Si tout est nécessairement déterminé, quelle place reste-t-il pour la liberté ? Trois positions principales s'affrontent : * Le déterminisme absolu (Spinoza) : tout est nécessaire, la liberté consiste dans la compréhension de cette nécessité<ref>Spinoza, ''Éthique'', op. cit., V, propositions 1-10</ref> * Le libertarianisme : la liberté requiert une indétermination réelle, une contingence dans l'ordre causal<ref>Jean-Baptiste Guillon, « Le libertarianisme agent-causal aujourd'hui », ''Klēsis – Revue philosophique'', n° 29, 2014, p. 1-40</ref> * Le compatibilisme (Leibniz, Hume) : la liberté est compatible avec le déterminisme si celui-ci n'est pas une nécessité absolue mais une détermination par des raisons<ref>David Hume, ''An Enquiry Concerning Human Understanding'', London, 1748, section VIII</ref><ref>Daniel Dennett, ''Elbow Room: The Varieties of Free Will Worth Wanting'', Cambridge (Mass.), MIT Press, 1984</ref> La notion de contingence modale permet de penser une liberté qui n'est ni pur arbitraire ni nécessité absolue : nos choix sont déterminés par des raisons, mais le choix contraire reste métaphysiquement possible<ref>Thomas Pink, ''Free Will: A Very Short Introduction'', Oxford, Oxford University Press, 2004, p. 67-89</ref>. === Contingence et théologie === La contingence du monde a servi de fondement à plusieurs preuves de l'existence de Dieu<ref>Paul Clavier, ''Les avatars de la preuve cosmologique. Essai sur l'argument de la contingence'', Paris, Vrin, 2015</ref><ref>Richard Swinburne, ''The Existence of God'', Oxford, Clarendon Press, 1979, chapitre 7-8</ref> : * La preuve cosmologique : tout être contingent a une cause ; il doit donc exister un Être nécessaire qui soit la cause première de tous les êtres contingents * Chez Avicenne et Thomas d'Aquin, cette preuve s'appuie sur la distinction entre essence et existence<ref>Goichon, ''La distinction de l'essence et de l'existence'', op. cit., p. 145-178</ref><ref>Thomas d'Aquin, ''Somme théologique'', Ia, question 2, article 3 (« troisième voie »)</ref> * Leibniz y ajoute le principe de raison suffisante : la série des êtres contingents doit avoir sa raison dans un Être nécessaire<ref>Leibniz, ''Théodicée'', op. cit., § 7-8</ref> Inversement, la contingence pose le problème du mal<ref>Alvin Plantinga, ''God, Freedom, and Evil'', Grand Rapids, Eerdmans, 1974</ref><ref>Marilyn McCord Adams et Robert Merrihew Adams (éd.), ''The Problem of Evil'', Oxford, Oxford University Press, 1990</ref> : si Dieu est parfait et tout-puissant, pourquoi a-t-il créé un monde imparfait ? La contingence du monde permet de répondre que Dieu a choisi librement parmi les possibles, mais ce choix même soulève des questions sur la bonté divine. === Contingence et déterminisme scientifique === La science moderne, en particulier la physique newtonienne, semblait établir un déterminisme universel : connaissant l'état du monde à un instant donné et les lois de la nature, on pourrait en principe prédire tous les événements futurs. Ce déterminisme semble exclure toute contingence réelle<ref>Pierre-Simon de Laplace, ''Essai philosophique sur les probabilités'', Paris, Courcier, 1814, introduction</ref><ref>Ernst Cassirer, ''Determinismus und Indeterminismus in der modernen Physik'', Göteborg, Elanders, 1936</ref>. Cependant, plusieurs développements scientifiques ont remis en question ce déterminisme<ref>Ian Hacking, ''The Taming of Chance'', Cambridge, Cambridge University Press, 1990</ref><ref>John Earman, ''A Primer on Determinism'', Dordrecht, Reidel, 1986</ref> : * La mécanique quantique introduit une forme d'indétermination fondamentale au niveau microscopique<ref>Werner Heisenberg, ''Physik und Philosophie'', Stuttgart, Hirzel, 1959, chapitre 3</ref> * La théorie du chaos montre que même dans des systèmes déterministes, de petites variations initiales peuvent produire des effets radicalement différents, rendant la prédiction impossible en pratique<ref>James Gleick, ''Chaos: Making a New Science'', New York, Viking, 1987</ref> * La biologie révèle des formes d{{'}}auto-organisation et d{{'}}émergence qui ne se réduisent pas au déterminisme mécanique<ref>Ilya Prigogine et Isabelle Stengers, ''La Nouvelle Alliance. Métamorphose de la science'', Paris, Gallimard, 1979, p. 185-234</ref><ref>Malabou, ''Avant demain'', op. cit., p. 127-178</ref> Ces découvertes scientifiques renouvellent la question philosophique de la contingence et de son statut ontologique. ==Références== {{references|colonnes=2}} == Bibliographie == === Sources primaires === * Aristote, ''De l'Interprétation'', traduction et commentaire par J. Tricot, Paris, Vrin, 1969 * Avicenne (Ibn Sīnā), ''La Métaphysique du Shifā'', traduction G.C. Anawati, Paris, Vrin, 1978-1985 * Thomas d'Aquin, ''Somme théologique'', traduction A.-M. Roguet, Paris, Cerf, 1984-1986 * Jean Duns Scot, ''Traité du premier principe'', traduction R. Imbach, Paris, Vrin, 2001 * Gottfried Wilhelm Leibniz, ''Essais de Théodicée'', Paris, Garnier-Flammarion, 1969 * Emmanuel Kant, ''Critique de la raison pure'', traduction A. Tremesaygues et B. Pacaud, Paris, PUF, 1968 * Baruch Spinoza, ''Éthique'', traduction B. Pautrat, Paris, Seuil, 1999 * Jean-Paul Sartre, ''L'Être et le Néant'', Paris, Gallimard, 1943 * Jean-Paul Sartre, ''La Nausée'', Paris, Gallimard, 1938 === Études === * Boulnois, Olivier, ''Être et représentation. Une généalogie de la métaphysique moderne à l'époque de Duns Scot'', Paris, PUF, 1999 * Clavier, Paul, ''Les avatars de la preuve cosmologique. Essai sur l'argument de la contingence'', Paris, Vrin, 2015 * Gilson, Étienne, ''L'Être et l'essence'', Paris, Vrin, 1948 * Goichon, Amélie-Marie, ''La distinction de l'essence et de l'existence d'après Ibn Sīnā'', Paris, Desclée de Brouwer, 1937 * Jankélévitch, Vladimir, ''La Mort'', Paris, Flammarion, 1977 * Knuuttila, Simo, ''Modalities in Medieval Philosophy'', London, Routledge, 1993 * Meillassoux, Quentin, ''Après la finitude. Essai sur la nécessité de la contingence'', Paris, Seuil, 2006 * Picard, Guy, « Matière, contingence et indéterminisme chez saint Thomas », ''Laval théologique et philosophique'', vol. 22, n° 2, 1966, p. 197-233 * Vuillemin, Jules, ''Nécessité ou contingence. L'aporie de Diodore et les systèmes philosophiques'', Paris, Éditions de Minuit, 1984 == Voir aussi == * {{Page|Nécessité}} * {{Page|Liberté}} * {{Page|Modalité}} * {{Page|Déterminisme}} * {{Page|Essence}} * {{Page|Existence}} * {{Page|Facticité}} * {{Page|Hasard}} * {{Page|Destin}} * {{Page|Causalité}} * {{Page|Possible}} {{autocat}} 0s878wc1utoh8xs2ergi76a3btuczix Dictionnaire de philosophie/Aristote 0 83057 767915 765551 2026-06-17T05:37:54Z PandaMystique 119061 767915 wikitext text/x-wiki {{DicoPhilo|Aristote|lecture=oui}} Aristote (en grec ancien Ἀριστοτέλης, ''Aristotélēs'', 384-322 av. J.-C.) est un philosophe grec dont l'œuvre conservée couvre la logique, la philosophie de la nature, la biologie, la métaphysique, l'éthique, la politique, la rhétorique et la poétique. Né à Stagire en Chalcidique, il fut élève de Platon à l'Académie d'Athènes pendant une vingtaine d'années, puis précepteur d'Alexandre de Macédoine, avant de fonder à Athènes sa propre école, le Lycée. La transmission de ses écrits, complexe et partiellement lacunaire, a fortement conditionné l'ordre dans lequel ils nous sont parvenus ainsi que les modalités de leur interprétation : les dialogues exotériques publiés de son vivant ne subsistent qu'à l'état de fragments, tandis que les traités acroamatiques que nous lisons aujourd'hui ont été édités, organisés et titrés au Ier siècle av. J.-C. par Andronicos de Rhodes<ref>Sur l'histoire de la transmission, voir Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007, p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999, Introduction.</ref>. L'œuvre conservée a exercé une influence durable sur la philosophie ancienne tardive, sur les traditions arabe et latine médiévales, ainsi que sur plusieurs renaissances modernes de l'aristotélisme. Sa réception se fait selon des angles variables : les commentateurs néoplatoniciens en font une propédeutique au platonisme, les théologiens médiévaux y voient « le philosophe » par excellence (''Philosophus''), tandis que la science moderne se construit en partie en réaction à la physique péripatéticienne, sans pour autant rompre toujours avec elle de manière unilatérale<ref>Sur la pluralité des « Aristote » selon les époques, voir Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021, Introduction.</ref>. Au {{XXe siècle}}, le projet « génétique » de Werner Jaeger – qui distinguait trois périodes (platonicienne, critique, empirique) dans la pensée du Stagirite – a été largement abandonné par la recherche universitaire, qui aborde aujourd'hui le corpus comme un ensemble cohérent sans être pour autant systématique<ref>Daniel Larose, ''Aristote de A à Z'', op. cit. ; voir aussi Pellegrin, ''Dictionnaire Aristote'', p. 6-8.</ref>. Le présent article expose successivement la vie et le contexte historique d'Aristote, la constitution et la transmission de son œuvre, son rapport à Platon, puis ses doctrines en logique (l{{'}}''Organon''), philosophie de la nature, biologie, métaphysique et philosophie pratique (éthique, politique, rhétorique et poétique). Une dernière section traite de la réception et de la postérité de la pensée aristotélicienne. == Vie et contexte historique == === Origines familiales et contexte macédonien === Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>. Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Selon Werner Jaeger, ces origines ioniennes pourraient avoir favorisé son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106. Cette thèse, défendue par Jaeger dans le cadre de son interprétation génétique de la pensée d'Aristote, est aujourd'hui discutée par les historiens.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>. Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. === Formation à l'Académie de Platon (367-347 av. J.-C.) === À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, l'un des principaux foyers intellectuels du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, école philosophique fondée vers 387 av. J.-C.<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>. Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. La tradition antique rapporte que Platon l'aurait surnommé le Liseur (''anagnôstês'') ou l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms, qui pourraient attester la reconnaissance par le Maître des dons de son élève, sont rapportés par les sources biographiques tardives. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>. La tradition d'une rupture violente entre Aristote et Platon, attestée par certaines sources tardives, est aujourd'hui considérée par la critique moderne comme issue probablement des polémiques ultérieures entre épicuriens et péripatéticiens<ref>Les récits de Diogène Laërce évoquant une rupture violente sont jugés peu fiables par la plupart des biographes modernes. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments suggèrent au contraire des liens durables entre les deux philosophes : Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il évoque Platon comme un maître<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l{{'}}''Éthique à Nicomaque'', Aristote écrit : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été condensée en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>. Aristote participa à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la qualité littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>. === Voyages et maturation (348-335 av. J.-C.) === À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote quitte alors Athènes — selon certaines hypothèses parce qu'il aurait espéré la succession, selon d'autres en raison du climat politique antimacédonien<ref>Voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5.</ref>. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne trois ans (347-345), accompagné probablement de Xénocrate<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris des observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l{{'}}''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>. Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et exécuté<ref>Selon les sources antiques, Hermias refusa, malgré les tortures, de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote composa un Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>. Après la mort d'Hermias, Aristote quitte Assos pour Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l{{'}}''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>. === Précepteur d'Alexandre le Grand (343-336 av. J.-C.) === En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>. L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Selon Plutarque, Aristote aurait fait connaître à Alexandre une édition annotée de l{{'}}''Iliade''. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte également un mot d'Alexandre selon lequel il aimait Aristote autant que son père : « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa peut-être à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu<ref>Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>. Les relations entre le maître et l'élève demeurent difficiles à reconstituer avec certitude. Alors qu'Aristote, dans ses ''Politiques'', prône une distinction entre Grecs et Barbares<ref>Aristote considère, dans certains passages, que les Barbares sont naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux<ref>Sur ces divergences, voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lors du départ d'Alexandre pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Callisthène, refusant d'adopter la proskynèse exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C.<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>. === Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) === En 335-334 av. J.-C., après la défaite athénienne face à la Macédoine à Chéronée (338 av. J.-C.), Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), nommé d'après le temple d'Apollon Lycien situé à proximité<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>. Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période durant laquelle il rédige la plupart des traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Selon Aulu-Gelle, son enseignement comportait deux modalités : le matin, des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux disciples avancés ; l'après-midi, des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>. Aristote professait, selon la tradition, en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une bibliothèque et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Selon Pline l'Ancien, Alexandre aurait aidé son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23. Cette tradition est cependant tardive et son authenticité est discutée.</ref>. Il entreprit également avec ses collaborateurs la rédaction des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>. === Exil et mort (323-322 av. J.-C.) === À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une réaction antimacédonienne éclate à Athènes<ref>Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation rappelle évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>. Sans attendre le jugement, Aristote quitte Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère<ref>Selon Aulu-Gelle, Aristote aurait déclaré vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>. Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, probablement des suites d'une maladie d'estomac<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, n'est pas retenue par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé par Diogène Laërce (V, 11-16), prescrit notamment que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire<ref>Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>. Aristote laissait deux enfants : Pythias, née de son premier mariage, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos<ref>C'est à ce dernier que fut dédiée l'''Éthique à Nicomaque'' — sans qu'il soit certain que ce titre traduise une dédicace personnelle plutôt qu'un choix éditorial postérieur. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>. == L'œuvre aristotélicienne : constitution et transmission == La constitution et la transmission de l'œuvre d'Aristote représentent l'un des dossiers les plus complexes de l'histoire de la philosophie antique. L'accès à la pensée du Stagirite est tributaire d'un processus historique long, marqué par des péripéties qui ont conditionné la forme sous laquelle nous lisons aujourd'hui ses écrits<ref>Pour une synthèse récente, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 5-7 ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. === La double nature de l'œuvre aristotélicienne === L'œuvre d'Aristote se composait à l'origine de deux types d'écrits distincts. D'une part, les écrits exotériques (ἐξωτερικοὶ λόγοι), destinés à un public extérieur à l'école et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27.</ref>. Ces dialogues de jeunesse, dont Cicéron louait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119.</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'', l'''Eudème ou De l'âme'' sur l'immortalité de l'âme, le ''Protreptique'' et le traité ''Sur la philosophie''<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886.</ref>. Ces œuvres ne nous sont parvenues que sous forme de fragments. D'autre part, les écrits acroamatiques ou ésotériques (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7.</ref>. Ces textes constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui. Ils prennent vraisemblablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs. Selon Pierre Pellegrin, on pourrait considérer en termes modernes que « le texte aristotélicien que nous lisons aujourd'hui est plutôt le compte-rendu d'un séminaire donné par Aristote, qu'un ouvrage rédigé en bonne et due forme »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. === Le sort de la bibliothèque d'Aristote === L'histoire de la transmission est intimement liée au destin de la bibliothèque personnelle d'Aristote. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52.</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à Nélée de Scepsis, fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3.</ref>. Nélée, en quittant Athènes pour retourner à Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. Les ouvrages auraient ainsi été enfouis pendant près de deux siècles. Ce récit de Strabon, longtemps accepté tel quel, est aujourd'hui partiellement contesté : la recherche moderne souligne qu'il ne faut pas conclure de la dispersion d'une partie des manuscrits autographes que les œuvres d'Aristote auraient été totalement inaccessibles avant Andronicos<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31. La critique moderne souligne que les philosophes hellénistiques (stoïciens, épicuriens) connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel aux écrits du Stagirite.</ref>. Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par Apellicon de Téos, un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36.</ref>. Apellicon entreprit de restaurer les manuscrits endommagés, mais aurait, selon Strabon, commis de nombreuses erreurs en comblant les lacunes<ref>Strabon, ''Géographie'', XIII, 1, 54.</ref>. === Le transfert à Rome et l'édition d'Andronicos === En 86 av. J.-C., lors de la prise d'Athènes, le général Sylla s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54.</ref>. À Rome, ces manuscrits furent confiés au grammairien Tyrannion d'Amisos<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1.</ref>. C'est finalement Andronicos de Rhodes, onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33.</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique probablement différent de celui voulu par Aristote, en regroupant les traités par affinité de contenu. La division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d'Organon), physiques, biologiques, métaphysiques, éthiques et politiques en résulte<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8.</ref>. Comme le souligne Pellegrin, Andronicos « a uni des passages qui étaient originairement disjoints, gommé des contradictions, ménagé des transitions », et il a probablement « introduit dans le texte des matériaux issus de discussions et de critiques » faites en marge des cours du Lycée<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. C'est également à Andronicos que l'on doit le titre de Métaphysique (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques »<ref>Voir ''Métaphysique'', éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3.</ref>. === Les conséquences pour notre accès au texte === Cette histoire éditoriale a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. La perte quasi totale des écrits exotériques nous prive d'un pan de son œuvre, celui qui était le mieux connu dans l'Antiquité<ref>Sur l'« autre » Aristote perdu, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6.</ref>. L'état fragmentaire des manuscrits retrouvés et leur restauration introduisent des incertitudes textuelles. L'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote. La reconstruction d'une chronologie relative des œuvres pose des difficultés méthodologiques. Werner Jaeger, dans son ouvrage ''Aristoteles. Grundlegung einer Geschichte seiner Entwicklung'' (1923), a proposé de dater les textes selon leur plus ou moins grande proximité avec le platonisme<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit.</ref>. Cette « approche génétique » a été largement critiquée et n'est plus acceptée dans son ensemble : le « degré de platonicité » d'un texte est difficile à évaluer, et le corpus aristotélicien se prête mal aux examens stylométriques utilisés pour le corpus platonicien<ref>Pour une critique de l'approche génétique de Jaeger, voir Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 6-8 ; Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction. La recherche actuelle aborde l'œuvre comme un tout cohérent sans pour autant la juger systématique.</ref>. Le texte d'Aristote tel que nous le connaissons est ainsi le produit d'une longue chaîne de transmission, qui passe par les commentateurs néoplatoniciens (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972.</ref>. == Aristote et Platon : continuité et rupture == La relation entre Aristote et Platon a fait l'objet d'interprétations divergentes dans l'histoire de la philosophie. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, ont insisté sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32.</ref>. À l'inverse, une partie de la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences. Coleridge résume cette opposition dans la formule : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90.</ref>. La recherche contemporaine privilégie une approche plus nuancée, qui examine simultanément les points de continuité et de rupture. Aristote s'oppose à Platon sur des questions ontologiques fondamentales, tout en demeurant tributaire de l'héritage académicien. Comme il l'écrit lui-même : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, op. cit., p. 44.</ref>. === La critique aristotélicienne des Idées platoniciennes === ==== Le rejet de la séparation (''chôrismos'') ==== L'un des points de rupture entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934.</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315.</ref>. Aristote refuse cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2.</ref>. Ses objections portent sur trois points principaux<ref>Pour une analyse détaillée de ces critiques, voir Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004, chap. 3-4.</ref>. Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61.</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement observés. Selon Aristote, Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs'')<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29.</ref>. Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b.</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10.</ref>. Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient, selon Aristote, à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4.</ref>. « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60.</ref>. ==== L'hylémorphisme aristotélicien ==== À la théorie platonicienne de la participation, Aristote oppose la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12.</ref>. La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. La forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'')<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2.</ref>. « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372.</ref>. Cette conception hylémorphique permet de répondre à plusieurs problèmes posés par la théorie platonicienne. Elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. Elle sauvegarde l'individualité des substances premières, c'est-à-dire des individus concrets (''tode ti'')<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3.</ref>. Elle unifie enfin forme et finalité : la forme est à la fois cause formelle et cause finale, ce vers quoi tend le développement naturel de la chose<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27.</ref>. === La critique de la participation et de l'imitation === Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique ces notions, qu'il juge métaphoriques et non explicatives<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26.</ref>. La notion de participation pose des problèmes conceptuels que Platon lui-même a identifiés dans le ''Parménide''<ref>Platon, ''Parménide'', 130e-134e.</ref>. Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise<ref>Platon, ''Parménide'', 131a-e.</ref>. Selon Aristote, Platon n'a pas résolu ces difficultés : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21.</ref>. Pour Aristote, « ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49.</ref>. Pour Aristote, la ressemblance entre les individus d'une même espèce s'explique par la possession d'une même forme immanente, transmise dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna'')<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8.</ref>. Trois facteurs interviennent dans la génération : la matière (fournie par la femelle, selon Aristote), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32. Cette doctrine de la « contribution » respective des sexes reflète des préjugés de l'époque qu'il importe de signaler ; voir, pour une mise au point critique, Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021.</ref>. === Substance, essence et ''ousia'' === Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations différentes chez Platon et Aristote. Comme le note Pellegrin, ''ousia'' est en fait « difficile à traduire, car le terme représente, chez Aristote, trois choses différentes : la forme, la matière, et le composé des deux »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Ousia / Substance », p. 175-176, citant ''Métaphysique'', Z, 3, 1029a27-33.</ref>. Chez Platon, l{{'}}''ousia'' désigne principalement l'Idée, la réalité véritable, immuable et éternelle, par opposition aux choses sensibles<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d.</ref>. Chez Aristote, l{{'}}''ousia'' désigne avant tout, dans les ''Catégories'', la substance première : l'individu concret qui existe par lui-même<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7.</ref>. Aristote distingue alors la substance première de la substance seconde, qui désigne l'espèce ou le genre auquel appartient l'individu<ref>Aristote, ''Catégories'', 5, 2a14-17.</ref>. Le rapport entre cette doctrine des ''Catégories'' et la théorie de la substance développée dans les livres centraux de la ''Métaphysique'' (Z, H, Θ) est l'un des points les plus discutés de l'aristotélisme contemporain. Annick Jaulin souligne que la « doctrine » aristotélicienne de la substance n'est pas une donnée stabilisée mais l'objet d'une recherche : Aristote « invente une théorie de la forme qui intègre le mouvement »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Dans la ''Métaphysique'', la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance, mais cette identification soulève à son tour la question de l'unité du composé hylémorphique<ref>Pour un panorama des débats, voir Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, Metzler, 2011, chap. IV.18 ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 5-7.</ref>. Comme le résume Pellegrin, « ''ousia'' signifie donc la chose (la substance) et ses causes internes, la matière et la forme ; la forme est ce qui correspond à l'essence »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 176.</ref>. === Éléments de continuité entre Platon et Aristote === Au-delà des divergences ontologiques, Platon et Aristote partagent plusieurs convictions communes. La première est la primauté de la forme sur la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon comme pour Aristote, la matière pure, prise en elle-même, est indéterminée<ref>Platon, ''Timée'', 49a-52d ; Aristote, ''Métaphysique'', Z, 10, 1036a8-9.</ref>. La deuxième est la finalité dans la nature. Platon présente le cosmos comme l'œuvre d'un Démiurge qui organise la matière en regardant vers les Idées<ref>Platon, ''Timée'', 28a-30c.</ref>. Aristote intériorise et naturalise cette téléologie : la nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9. Pour une discussion détaillée de la téléologie aristotélicienne, voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>. La troisième est la connaissance par les causes : pour les deux philosophes, la véritable connaissance scientifique consiste à connaître les causes (''aitiai'') des choses<ref>Platon, ''Phédon'', 96a-99d ; Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4.</ref>. Aristote reproche cependant à Platon d'avoir négligé la cause efficiente et la cause finale<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4.</ref>. La quatrième concerne la définition et l'universel. Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier<ref>Platon, ''Théétète'', 201c-210b ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7.</ref>. Mais Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; ''Seconds Analytiques'', I, 2, 71b33-72a5.</ref>. === La dialectique et le rôle de l'expérience sensible === Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate, qui consiste à examiner les opinions par le dialogue argumenté<ref>Platon, ''République'', VII, 533c-534e ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4.</ref>. Aristote conserve cette approche : il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), examine les difficultés (''aporiai''), avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7.</ref>. Cependant, pour Aristote, la dialectique est un outil préparatoire et non une science apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26.</ref>. Une divergence importante porte sur le rôle de l'expérience sensible. Pour Platon, les sens nous maintiennent dans l'opinion (''doxa'')<ref>Platon, ''Phédon'', 66b ; ''République'', VII, 514a-517c.</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible : la science porte sur l'universel, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê'')<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242 ; ''De l'Âme'', III, 8, 432a3-10.</ref>. === Bilan : continuité et rupture === Une partie de l'historiographie contemporaine décrit l'aristotélisme comme une reformulation immanentiste des problèmes hérités du platonisme : la forme « descend » du ciel des Idées pour s'incarner dans les choses, le Bien se réalise dans l'accomplissement de la nature propre de chaque être, la philosophie reconnaît que seuls existent les individus concrets dans lesquels l'universel se réalise. Cette caractérisation, parfois résumée par l'expression « naturalisation du platonisme », demeure toutefois une thèse interprétative dont la portée varie selon les commentateurs ; elle ne fait pas consensus dans la recherche universitaire et doit être attribuée à des travaux secondaires précis<ref>Cette interprétation est défendue notamment par certains chercheurs proches de la tradition de Pierre Aubenque ; voir ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. D'autres travaux, notamment Annick Jaulin, ''Aristote. La métaphysique'', op. cit., insistent au contraire sur l'originalité radicale de la démarche aristotélicienne et son enracinement dans la tradition des penseurs de la nature, plus que dans une « naturalisation » du platonisme.</ref>. Plus généralement, la querelle entre Platon et Aristote est l'une des plus discutées de l'histoire de la métaphysique occidentale. La tradition philosophique ultérieure n'a jamais tranché définitivement, oscillant entre tentatives de conciliation (néoplatoniciens, Thomas d'Aquin) et radicalisations de l'opposition (nominalistes médiévaux, empiristes modernes). == La logique : l’''Organon''== ===Présentation générale=== L’''Organon'' désigne le groupe des six traités logiques d’Aristote : les ''Catégories'', le ''De interpretatione'' (ou ''Peri hermeneias''), les ''Premiers Analytiques'', les ''Seconds Analytiques'', les ''Topiques'' et les ''Réfutations sophistiques''. Ces ouvrages couvrent l’étude des termes simples, celle des propositions, la théorie générale du syllogisme, la théorie de la science démonstrative, l’art de la dialectique et la critique des raisonnements fallacieux. Ils ont fourni à la pensée occidentale, pendant deux millénaires, le cadre dominant pour analyser les conditions du raisonnement valide, l’architecture du savoir scientifique et les règles du débat rationnel. L’importance historique de l’ensemble est grande. C’est dans ces traités qu’Aristote dégage pour la première fois la notion de syllogisme, distingue formellement la validité d’un raisonnement de la vérité de ses prémisses, élabore les instruments logiques liés à la contradiction, au tiers exclu et à la bivalence, et propose une théorie de l’explication scientifique fondée sur la connaissance des causes. La défense philosophique du principe de non-contradiction se trouve, elle, surtout dans la ''Métaphysique'' (livre Γ), et non dans l’''Organon'' lui-même. La syllogistique aristotélicienne a été enseignée dans les écoles et les universités jusqu’au XIX{{e}} siècle, et ses concepts continuent de nourrir des débats contemporains en philosophie de la logique, en métaphysique modale et en philosophie des sciences. L’unité de l’ensemble est cependant problématique. Aristote n’a jamais composé un ouvrage intitulé ''Organon'' ; le terme et le regroupement sont des opérations éditoriales tardives, attribuées à la tradition péripatéticienne et notamment à Andronicos de Rhodes au I{{er}} siècle avant notre ère. L’ordre traditionnel des traités, qui place la théorie de la science démonstrative au cœur du dispositif, traduit un choix interprétatif qui n’est probablement pas celui d’Aristote lui-même : la recherche contemporaine tend à attribuer aux ''Topiques'' une ancienneté relative et à voir dans la syllogistique formelle un développement plus tardif. Lire la logique aristotélicienne demande donc de tenir compte simultanément de la lettre des traités, de la tradition exégétique qui les a reçus et organisés, et des hypothèses de la recherche actuelle qui en renouvelle les enjeux. ===Architecture et destinée de l’''Organon''=== ====Le titre « ''Organon'' » : une création tardive==== Le terme grec ''organon'' signifie « instrument », « outil ». La désignation des six traités logiques sous ce titre commun obéit à une tradition qui ne remonte pas, semble-t-il, à Aristote lui-même.<ref>Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 7-50.</ref> Pierre Pellegrin rappelle, dans son introduction générale à l’''Organon'' paru chez Flammarion, que « "logique", "instrument" sont des termes qu’Aristote emploie en leurs acceptions ordinaires », et non au sens technique que leur ont donné les commentateurs néo-platoniciens. Quand le biologiste Aristote parle d’''organon'', il pense d’abord à l’organe corporel et accessoirement à l’instrument artificiel ; c’est avec la lecture stoïcienne et péripatéticienne que cet « instrument » devient l’instrument ''par excellence'' de la philosophie, c’est-à-dire la logique. L’enjeu de cette précision dépasse l’érudition. Si la qualification de « logique » et le regroupement des six traités sous l’étiquette « Organon » sont des opérations posthumes, l’ordre traditionnel dans lequel on lit aujourd’hui ces textes (''Catégories'', ''De interpretatione'', ''Premiers Analytiques'', ''Seconds Analytiques'', ''Topiques'', ''Réfutations sophistiques'') n’a rien d’évident ni de nécessaire. Cet ordre s’impose à partir du IV{{e}} siècle de notre ère, et il porte la marque d’un choix interprétatif fondamental. ====L’intervention d’Andronicos de Rhodes==== Vers le milieu du I{{er}} siècle avant notre ère, Andronicos de Rhodes entreprend une édition systématique du corpus aristotélicien à laquelle nous devons en grande partie le texte que nous possédons aujourd’hui. Selon une lecture défendue notamment par Pellegrin et Brunschwig, et qui doit être présentée comme une interprétation forte plutôt que comme un fait définitivement établi, l’intervention d’Andronicos aurait avant tout consisté à réduire la part de la dialectique au profit de celle de l’analytique.<ref>Voir Pellegrin, P., « Introduction générale à l’''Organon'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 26-44 ; Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXIII-XLVIII.</ref> Pellegrin résume ainsi ce travail : la « logique » d’Aristote, qu’il n’appelait peut-être pas ainsi mais qui reçut très rapidement ce nom sous l’influence de la division stoïcienne de la philosophie, était avant Andronicos principalement un ensemble de traités consacrés à des activités dialectiques et notamment réfutatives. Cette réorganisation, si on l’admet, a des conséquences théoriques importantes. En plaçant les ''Seconds Analytiques'' (la théorie du syllogisme scientifique) au centre de gravité de l’''Organon'', Andronicos oriente la lecture de la logique aristotélicienne vers une épistémologie de la science démonstrative à laquelle tous les autres traités servent de propédeutique. Les ''Catégories'' préparent à l’étude des termes, le ''De interpretatione'' à celle des propositions, les ''Premiers Analytiques'' à l’analyse formelle du syllogisme en général ; les ''Topiques'' et les ''Réfutations sophistiques'' apparaissent comme un appendice consacré aux formes secondaires du raisonnement (raisonnements à partir de prémisses simplement probables, raisonnements fallacieux). Or, comme l’a soutenu Brunschwig dans son édition des ''Topiques'', il est très probable que la chronologie de la composition aristotélicienne aille en partie dans le sens inverse : les ''Topiques'' seraient un traité ancien, écrit du temps où Aristote était encore membre de l’Académie platonicienne, et la syllogistique formelle des ''Premiers Analytiques'' représenterait un développement théorique postérieur, élaboré à partir des problèmes rencontrés dans la pratique dialectique. Pellegrin écrit, en synthétisant cette hypothèse : « Le syllogisme scientifique serait alors une forme particulière du syllogisme en général qui aurait des contraintes supplémentaires, au moins au nombre de deux : avoir des prémisses vraies, antérieures à la conclusion et plus connues qu’elle, et donner dans le moyen terme la cause de la conclusion. » Si cette hypothèse est correcte, ce que nous appelons la « logique aristotélicienne » serait, dans son projet originel, une codification de l’affrontement dialectique, c’est-à-dire d’une pratique d’argumentation entre un ''questionneur'' et un ''répondant'' ; la théorie du syllogisme scientifique en constituerait une spécification ultérieure. Comme l’écrit Brunschwig, cité par Pellegrin, le questionneur dialectique « doit construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant. » Toute la logique aristotélicienne, dans cette perspective, naîtrait du souci de codifier cet exercice argumentatif et de distinguer les bons arguments des mauvais. ====Logique : partie de la philosophie ou instrument ?==== Une question agitée dès l’Antiquité, et sur laquelle Aristote lui-même ne se prononce jamais explicitement, est celle du statut de la logique. Est-elle une ''partie'' de la philosophie, comme le soutiendront les Stoïciens (qui distinguent éthique, physique et logique), ou en est-elle un ''instrument'' (organon), c’est-à-dire un outil méthodologique préalable à toute investigation philosophique ? La tradition péripatéticienne, et notamment Alexandre d’Aphrodise, défend la seconde thèse : la logique n’est pas une science indépendante avec son propre objet, mais une discipline formelle qui prépare à l’étude de tout objet. Cette conception coïncide avec le statut subordonné qu’Aristote accorde lui-même à l’analyse logique : la logique étudie les ''formes'' du raisonnement valide, indépendamment du ''contenu'' particulier des propositions. Cette caractérisation appelle une nuance. La logique aristotélicienne n’est pas purement formelle au sens contemporain du terme. Comme l’a montré Paolo Crivelli, « bien qu’on puisse créditer Aristote de la thèse selon laquelle la logique est formelle, la manière dont elle est formelle pour lui diffère de celle dont elle l’est pour beaucoup de philosophes et logiciens modernes ».<ref>Crivelli, P., « Truth and Formal Validity in the Prior Analytics », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 4.</ref> La forme du raisonnement, chez Aristote, n’est pas une pure structure syntaxique substituable à n’importe quelle matière : elle implique des relations sémantiques entre les termes, des relations qui présupposent une certaine ontologie. La logique aristotélicienne est traversée, du début à la fin, par des questions qui, du point de vue moderne, relèvent plutôt de la sémantique, de l’ontologie et de la métaphysique. ====Ce qu’il faut retenir==== L’''Organon'' n’est pas un livre composé par Aristote mais un regroupement éditorial dû à la tradition péripatéticienne. L’ordre traditionnel des traités traduit une lecture orientée vers la science démonstrative, contre laquelle la recherche contemporaine (Brunschwig, Pellegrin) propose une hypothèse alternative selon laquelle la dialectique des ''Topiques'' serait antérieure et la syllogistique formelle un développement postérieur. La logique aristotélicienne se présente comme un instrument plutôt qu’une partie de la philosophie, mais elle reste, dans son fonctionnement même, traversée par des questions sémantiques et ontologiques. ===Chapitre I. ''Les Catégories'' : les genres suprêmes de l’être=== ====Le titre, l’objet et l’authenticité du traité==== Le traité que la tradition désigne sous le titre de ''Catégories'' (en grec ''Katêgoriai'', plus rarement ''Pro tôn topôn'', « Préliminaire aux ''Topiques'' ») se présente comme une œuvre brève, divisée en deux parties hétérogènes.<ref>Sur le titre ''Pro tôn topôn'' et son sens, voir Bodéüs, R., introduction à Aristote, ''Catégories'', Les Belles Lettres, 2002.</ref> La première (chapitres 1 à 9) traite des « antéprédicaments » (homonymes, synonymes, paronymes ; choses dites avec ou sans combinaison) puis des dix catégories proprement dites, avec une attention particulière portée à la substance, à la quantité, à la relation et à la qualité. La seconde partie (chapitres 10 à 15), appelée « post-prédicaments », traite de notions plus diverses : les opposés, l’antériorité, la simultanéité, le mouvement et les sens du verbe « avoir ». L’authenticité de cette seconde partie a été contestée dès Andronicos, et elle continue de l’être. L’authenticité même de la première partie a été discutée dès l’Antiquité. Pellegrin, à la fin de son introduction au traité, conclut prudemment que le fait, indéniable, que la philosophie d’Aristote serait inintelligible sans la doctrine des catégories n’établit nullement l’authenticité du traité éponyme.<ref>Pellegrin, P., « Présentation des ''Catégories'' », dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007, p. 67-92, ici p. 90-92.</ref> Que la doctrine soit aristotélicienne, et qu’elle soit centrale pour l’aristotélisme, est indubitable ; mais cela ne prouve pas que ce traité particulier ait été composé par Aristote en personne. Il pourrait s’agir d’un manuel péripatéticien tardif fidèle à la pensée du maître. Pour notre propos, peu importe : nous nous attacherons à exposer la doctrine telle qu’elle se présente dans le texte canonique. ====Les antéprédicaments : homonymes, synonymes, paronymes==== Le traité s’ouvre sur trois définitions qui paraissent, au premier abord, purement linguistiques mais qui ont en réalité une portée ontologique réelle. Sont dits homonymes, écrit Aristote, « les objets dont le nom seul est commun, alors que l’énonciation correspondant à ce nom est différente ».<ref>Aristote, ''Catégories'' 1, 1a1-2.</ref> L’exemple canonique est celui du mot grec ''zôion'', qui désigne aussi bien l’animal vivant que la figure peinte ou dessinée (le peintre, en grec, se dit ''zôgraphos'', de ''graphein'' qui peut signifier écrire, tracer, dessiner ou peindre). Un homme et la représentation peinte d’un homme reçoivent l’un et l’autre le nom ''zôion'', mais la définition de ce qu’est, pour chacun, « être un ''zôion'' » est radicalement différente : pour l’homme, ''zôion'' signifie « être animé doué de sensation » ; pour la peinture, ''zôion'' signifie « figure représentée sur une surface ». L’homonymie n’est donc pas seulement un fait linguistique : elle révèle que ce qui partage un même nom peut relever d’essences entièrement distinctes. Sont dits synonymes au contraire « les objets dont le nom est commun, et pour lesquels l’énonciation correspondant à ce nom est la même ».<ref>Aristote, ''Catégories'' 1, 1a6-12.</ref> Un homme et un bœuf sont tous deux « animal », et l’énonciation de ce que c’est, pour eux, qu’être animal (vivant doué de sensation) est identique. L’usage aristotélicien de ''sunônumon'' est donc presque l’inverse du nôtre : la synonymie ne désigne pas deux mots qui ont le même sens, mais deux objets qui appartiennent à la même espèce ou au même genre. Sont dits enfin paronymes « les objets qui tiennent leur appellation d’un certain objet, alors qu’ils en diffèrent par la dérivation » : ''grammatikos'' (le lettré) tient son nom de ''grammatikê'' (le savoir-lire), ''andreios'' (le courageux) tient son nom de ''andreia'' (le courage).<ref>Aristote, ''Catégories'' 1, 1a12-15.</ref> Le paronyme partage la racine du nom de la qualité dont il est porteur, mais il s’en distingue par sa flexion morphologique. Ces trois catégories ne sont pas de simples préliminaires : elles structurent toute la suite du traité. L’homonymie permettra de distinguer entre des emplois irréductibles d’un même mot ; la synonymie sera invoquée pour caractériser le rapport entre la substance première et la substance seconde ; la paronymie permettra de comprendre comment des qualités donnent lieu à des qualifications. La question de l’« unité de l’être », sur laquelle nous reviendrons, prend également racine dans cette opposition entre homonymie et synonymie : si l’être est dit en plusieurs sens, est-il homonyme purement et simplement, ou s’agit-il d’une ''homonymie focale'' (selon la terminologie introduite par G.E.L. Owen) où plusieurs sens se rapportent à un sens premier ? ====Termes dits avec et sans combinaison ; les quatre classes d’étants==== Au chapitre 2, Aristote introduit deux distinctions importantes. La première oppose ce qui « est dit selon une combinaison » (par exemple « un homme court », « un homme gagne ») à ce qui « est dit sans combinaison » (par exemple « homme », « bœuf », « court », « gagne »). Cette distinction prépare l’analyse des catégories qui, comme termes simples, sont précisément ce qui est dit ''sans combinaison''. L’analyse des combinaisons (c’est-à-dire des propositions) sera réservée au ''De interpretatione''. La seconde distinction est plus subtile et constitue l’épine dorsale de la doctrine ontologique du traité. Aristote distingue, parmi les étants, ceux qui « se disent d’un sujet » et ceux qui « sont dans un sujet ».<ref>Aristote, ''Catégories'' 2, 1a20-1b9.</ref> Il en résulte quatre classes : (1) Ce qui se dit d’un sujet ''et'' est dans un sujet : par exemple le ''savoir'' (en général), qui se dit d’un sujet (par exemple le savoir-lire dont il est le genre) et qui est dans l’âme (sujet d’inhérence). Ce sont les universels non substantiels. (2) Ce qui se dit d’un sujet mais n’est dans aucun sujet : par exemple l’''homme'' en tant qu’espèce, qui se dit de tel homme particulier (Socrate) mais n’est pas une qualité ou un accident ''inhérent'' à un substrat. Ce sont les universels substantiels. (3) Ce qui est dans un sujet mais ne se dit d’aucun sujet : par exemple ''tel savoir-lire particulier'' qui réside dans une âme particulière, ou ''tel blanc particulier'' présent dans un corps particulier. Ce sont les individus accidentels (parfois appelés « tropes » dans la philosophie analytique contemporaine). (4) Ce qui ne se dit d’aucun sujet et n’est dans aucun sujet : c’est ''Socrate'', ''tel cheval'', ''tel arbre'', les substances premières au sens strict. La distinction fondamentale est ici celle entre prédication (« se dire de ») et inhérence (« être dans »). La prédication transporte avec elle la définition : si « animal » se dit de Socrate, alors la définition d’« animal » s’applique à Socrate (Socrate est un être animé doué de sensation). L’inhérence, en revanche, ne transporte pas la définition : « blanc » est dans Socrate, mais Socrate n’est pas la définition de « blanc ». Cette différence est centrale pour comprendre comment les genres et les espèces sont des « substances secondes » alors que la couleur ou la qualité ne le sont pas. ====Les dix catégories : une liste, deux interprétations==== Le chapitre 4 livre la liste canonique des dix « genres suprêmes ». Aristote écrit que « chacun des termes qui sont dits sans aucune combinaison indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') ».<ref>Aristote, ''Catégories'' 4, 1b25-27.</ref> Les exemples qu’il donne sont volontairement concrets : un homme, un cheval (substance) ; long de deux coudées, long de trois coudées (quantité) ; blanc, instruit (qualité) ; double, moitié (relation) ; au Lycée, sur l’Agora (lieu) ; hier, l’an dernier (temps) ; couché, assis (position) ; chaussé, armé (possession) ; couper, brûler (action) ; être coupé, être brûlé (passion). Cette liste a posé, dès l’Antiquité, deux types de problèmes. Premièrement, elle n’est pas systématiquement reprise par Aristote : dans plusieurs autres traités, on trouve des listes plus courtes (à huit ou six catégories), et Aristote ne fournit nulle part une justification rigoureuse du nombre dix. Deuxièmement, son objet même est contesté : s’agit-il de divisions du langage, de divisions de la pensée, ou de divisions de la réalité ? Pellegrin rappelle dans son introduction la pluralité des interprétations historiques. Friedrich Trendelenburg, au XIX{{e}} siècle, a soutenu une interprétation grammaticale : les catégories correspondraient aux parties du discours grec, les quatre premières (substance, quantité, qualité, relation) aux noms et adjectifs, les quatre dernières (action, passion, position, possession) aux verbes, les deux intermédiaires (lieu, temps) aux adverbes. Cette lecture a l’avantage de réduire l’apparent désordre de la liste, mais elle a été critiquée par Émile Benveniste qui a objecté que la grammaire grecque ne propose pas exactement cette division. Une lecture ontologique, au contraire, voit dans les catégories les genres suprêmes de l’étant : Franz Brentano, dans sa thèse de 1862 ''Von der mannigfachen Bedeutung des Seienden nach Aristoteles'' (''De la diversité des acceptions de l’être d’après Aristote''), en a donné l’exposition la plus achevée. Mais cette lecture, comme le note Pellegrin, peine à expliquer le rapport étroit entre catégories et prédication. La solution la plus juste consiste sans doute à reconnaître, avec Pellegrin, que les catégories sont à l’intersection d’une analyse logique du discours et d’une décomposition ontologique de la réalité. Elles sont à la fois des types de prédication et des genres de l’être : la double dimension est constitutive de la doctrine, et toute tentative de réduire l’une à l’autre manque l’originalité du projet aristotélicien. Un éclairage supplémentaire vient des ''Topiques'' (I, 9), où Aristote distingue ce que ''katègoria'' peut désigner : tantôt les dix « catégories » (ce que c’est, qualité, quantité, etc.), tantôt les quatre prédicables (accident, genre, propre, définition), tantôt encore les catégories que l’on signifie quand on signifie une essence. Comme l’explique Pellegrin, quand on dit d’un homme particulier qu’il est un homme, on lui donne comme prédicat essentiel une substance ; quand on dit de telle couleur blanche qu’elle est du blanc, on lui donne comme prédicat essentiel une qualité. La doctrine des catégories articule indissociablement une typologie des relations prédicatives et une typologie des genres d’être : elle est au croisement de la logique et de la métaphysique. ====La substance première et la substance seconde==== Parmi les dix catégories, l’une occupe une position privilégiée : la substance (''ousia''). Aristote écrit, au début du chapitre 5 : « La substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d’un certain sujet et n’est pas dans un certain sujet ; par exemple tel homme ou tel cheval ».<ref>Aristote, ''Catégories'' 5, 2a11-14.</ref> La substance première est donc l’individu concret, ce que la tradition appellera plus tard ''tode ti'', « ceci », « ce quelque chose-ci ». Elle se distingue par une double caractéristique négative : elle n’est ni dite d’un sujet (elle n’est pas un prédicat) ni dans un sujet (elle n’est pas une qualité ou un accident inhérent à un substrat). Cette définition a une conséquence ontologique importante : sans les substances premières, rien d’autre ne pourrait exister. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances ».<ref>Aristote, ''Catégories'' 5, 2a34-2b6.</ref> Si l’on supprime les hommes et les chevaux particuliers, on supprime du même coup l’espèce « homme » et l’espèce « cheval », qui se disent d’eux ; on supprime également les couleurs, les qualités, les actions, qui sont dans eux. La substance première est le substrat ultime (''hypokeimenon''), ce dont tout se dit mais qui n’est dit de rien d’autre.<ref>Cf. Aristote, ''Métaphysique'' Z, 3, 1028b36-37.</ref> Mais Aristote reconnaît également l’existence de substances secondes : ce sont les espèces et les genres auxquels appartiennent les substances premières. L’homme (espèce) et l’animal (genre) sont des substances secondes parce qu’ils se disent des substances premières. Aristote précise que « parmi les substances secondes, l’espèce est plus substance que le genre, car elle est plus proche de la substance première » : un homme particulier est plus immédiatement reconnu comme « un homme » que comme « un animal », et la définition d’« homme » est plus précise que celle d’« animal ». Cette articulation entre substance première et substance seconde est l’une des thèses les plus originales du traité. D’un côté, Aristote affirme la primauté ontologique de l’individu sur l’universel, ce qui le distingue du Platon des dialogues médians, pour qui les Idées (universelles) sont plus réelles que les choses sensibles. D’un autre côté, il reconnaît à l’espèce et au genre une réalité substantielle, ce qui ne les réduit pas à de purs concepts mentaux. La synonymie y joue un rôle important : la substance et ses différences se disent de façon synonyme de la substance première, c’est-à-dire avec partage de la définition. Quand je dis que « Socrate est homme » et que « Socrate est animal », je transporte sur Socrate les définitions complètes de « homme » et d’« animal » ; ce n’est pas le cas quand je dis « Socrate est blanc », car je n’attribue pas à Socrate la définition de la blancheur (Socrate n’est pas la couleur blanche). Il faut signaler que la doctrine de la substance présentée dans les ''Catégories'' n’est pas identique à celle que développeront les livres centraux de la ''Métaphysique'' (Z, H, Θ). Dans la ''Métaphysique'', Aristote cherche dans la forme ou l’essence (''eidos'') le principe de substantialité de l’individu : la forme n’est pas simplement identifiée à un universel au sens d’un genre ou d’une espèce ; elle est ce qui, dans l’individu lui-même, en fait ce qu’il est et le rend connaissable. Cette recherche d’un principe immanent de substantialité crée une tension avec la doctrine des ''Catégories'', qui assignait la primauté à l’individu concret comme totalité indivise. Cette tension nourrit l’un des grands débats interprétatifs de l’aristotélisme contemporain : la doctrine des ''Catégories'' est-elle une étape antérieure et moins mûre, qu’Aristote dépasse dans la ''Métaphysique'' ? Ou bien les deux doctrines coexistent-elles dans le système, chacune ayant son domaine de validité ? Bodéüs, dans son introduction de l’édition des Belles Lettres, défend une lecture compatibiliste où la substance première des ''Catégories'' (l’individu) reste première en un sens, tandis que la ''Métaphysique'' cherche, à l’intérieur de l’individu, ce qui en fait la substantialité (sa forme). ====Les propriétés caractéristiques de la substance==== Les chapitres 5 à 9 des ''Catégories'' dégagent ensuite plusieurs propriétés permettant d’identifier la substance et de la distinguer des accidents. Ces « propriétés topiques » ne visent pas à donner une définition de la substance, mais, comme le précise une note de l’édition Flammarion, à préparer le lecteur à construire et à utiliser les lieux appropriés à un type de prédication donné. Elles sont des outils dialectiques utiles dans la discussion. Première propriété : toute substance n’est pas dans un sujet. Cette propriété ne lui est cependant pas exclusive ; les différences (''diaphorai'') ne sont pas non plus dans un sujet, sans être pour autant des substances. Aristote précise aussi que les parties des substances (la main, le pied) sont elles-mêmes des substances, contre une objection qui pourrait les considérer comme des qualités du tout. Deuxième propriété : la substance et ses différences se disent de façon synonyme. Quand je dis que « Socrate est homme » et que « Socrate est bipède » (où « bipède » est une différence spécifique de l’homme), je transporte la définition complète de chacun de ces termes sur Socrate. Troisième propriété : toute substance « indique un certain ceci » (''tode ti''). Cette caractéristique vaut éminemment pour les substances premières, qui sont des individus numériquement uns. Pour les substances secondes (espèce, genre), Aristote précise qu’elles désignent plutôt « une certaine sorte d’objet » (''poion ti'') : non pas un individu particulier, mais le type auquel des individus appartiennent. Les substances secondes sont substances en ce qu’elles fondent l’identité essentielle des substances premières, mais elles ne sont pas des « ceci » au même titre. Quatrième propriété : la substance n’admet pas le plus ou le moins. On ne dit pas qu’un homme est « plus homme » qu’un autre, ni qu’un cheval est « moins cheval » : être homme ou être cheval ne souffre pas de degrés. Au contraire, les qualités admettent le plus ou le moins (un homme peut être plus blanc qu’un autre, plus instruit, plus juste). Cinquième propriété, la plus remarquable : la substance est capable de recevoir les contraires tout en restant la même et numériquement une. Le même Socrate peut être tantôt assis, tantôt debout ; tantôt en bonne santé, tantôt malade ; tantôt joyeux, tantôt triste. Cette capacité à supporter le changement tout en demeurant identique à soi-même constitue, selon Aristote, le « caractère le plus propre » de la substance ; c’est ce qui en fait précisément le substrat (''hypokeimenon'') du devenir. Une qualité particulière ne peut pas recevoir les contraires : telle blancheur ne peut devenir noirceur (elle est remplacée par une noirceur, qui est une autre qualité). Seule la substance traverse le changement sans cesser d’être ce qu’elle est. ====L’être n’est pas un genre : l’unité problématique de l’étant==== La doctrine des catégories soulève une difficulté philosophique : si l’être se dit en plusieurs sens irréductibles (être substance, être qualité, être quantité, etc.), comment préserver l’unité de son concept ? Cette question, qu’Aristote pose dans la ''Métaphysique'' (B, 3, 998b22), reçoit une réponse qui structure son ontologie : l’être n’est pas un genre. La raison en est, comme l’explique l’''Aristoteles-Handbuch'', un argument technique sous forme de ''reductio ad absurdum'' : si l’être était un genre, alors les différences spécifiques qui le diviseraient en espèces seraient elles-mêmes des étants ; or aucun genre ne peut être prédiqué de ses différences spécifiques (sinon les différences seraient déjà comprises dans le genre, et la division spécifique serait impossible) ; donc, si l’être était un genre, ses différences ne seraient pas des étants, ce qui est absurde.<ref>Rapp, C., et Corcilius, K. (dir.), ''Aristoteles-Handbuch'', Stuttgart, J. B. Metzler, 2021, partie IV.</ref> L’être ne peut donc pas être un genre au sens propre. Mais alors, l’être est-il purement homonyme ? Aristote refuse cette conséquence. Il développe, principalement dans le livre Γ de la ''Métaphysique'', une troisième voie : les différentes acceptions de l’être ne sont ni univoques (comme à l’intérieur d’un genre) ni purement équivoques (comme dans le cas de l’homonymie au sens strict), mais elles se rapportent toutes à un terme premier, la substance. « L’être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée » (Γ, 2, 1003a33-b10). Une qualité ne peut être qu’en tant qu’elle est ''qualité d’une substance'' ; une quantité ne peut être qu’en tant qu’elle est ''quantité d’une substance''. La substance constitue le pôle de référence par rapport auquel les autres significations de l’être se définissent. Cette structure est ce que la tradition appelle ''homonymie focale'' ou ''signification focale'' (''focal meaning'', dans la formulation de G.E.L. Owen). L’''Aristoteles-Handbuch'' l’illustre par un exemple aristotélicien : la santé est dite, en sens divers, du teint, de la gymnastique, de la médecine, et de l’homme. Ces sens ne sont pas univoques (un teint sain et un homme sain ne sont pas « sains » de la même façon), mais ils ne sont pas non plus purement homonymes : tous se rapportent à la santé de l’homme (le teint ''signe'' cette santé, la gymnastique la ''préserve'', la médecine la ''produit''). De même pour l’être : tous les modes d’être se rapportent à la substance, qui constitue le « cas privilégié » par rapport auquel les autres se définissent. ====Ce qu’il faut retenir==== Les ''Catégories'' opèrent au croisement de la logique, de la grammaire et de l’ontologie. Le traité distingue homonymes, synonymes et paronymes ; il présente quatre classes d’étants articulées par les relations de prédication et d’inhérence ; il dresse la liste des dix catégories ; il accorde la primauté à la substance première (l’individu concret) tout en reconnaissant l’existence des substances secondes (espèces et genres). La doctrine de l’''homonymie focale'' permet à Aristote de préserver une unité conceptuelle de l’être sans en faire un genre univoque, ouvrant ainsi la voie à la métaphysique. ===Chapitre II. ''Le De interpretatione'' (Peri hermeneias) : le jugement et la proposition=== ====Titre, objet et méthode du traité==== Le titre grec du traité, ''Peri hermeneias'', désigne « ce qui concerne l’interprétation », mais avec une nuance importante : ''hermeneia'' ne renvoie pas à un ''acte'' (qui serait ''hermeneusis''), mais à ''son produit'' ; non pas l’interpréter, mais l’interprété. Catherine Dalimier, dans son introduction à l’édition Flammarion, propose d’y voir un traité « sur l’expression de la proposition déclarative » (''Peri tou logou apophantikou hermeneias''), c’est-à-dire sur cette forme particulière de discours qui est susceptible d’être vraie ou fausse.<ref>Dalimier, C., introduction au ''De l’interprétation'', dans Aristote, ''Catégories'' / ''Sur l’interprétation'', GF Flammarion, 2007.</ref> L’objet du traité, à la différence des ''Catégories'' qui s’intéressaient aux termes simples (atomes logiques), est la proposition déclarative comme unité minimale de la connaissance et de la communication. Aristote y examine la structure du discours qui peut être validé comme vrai ou faux, les conditions du jugement, les rapports entre langage, pensée et réalité. C.W.A. Whitaker, dans une interprétation que Pellegrin et Dalimier trouvent éclairante, a proposé de lire l’ensemble du traité comme une exploration systématique de la contradiction (''antiphasis''), du « couple de contradictoires ».<ref>Whitaker, C.W.A., ''Aristotle’s'' De Interpretatione: ''Contradiction and Dialectic'', Oxford, Clarendon Press, 1996.</ref> La proposition serait étudiée non pas pour elle-même, mais en tant qu’elle s’inscrit dans un couple affirmation/négation qui constitue l’unité minimale de toute évaluation logique. Cette lecture restitue au ''De interpretatione'' sa cohérence interne et le rattache aux ''Topiques'' et aux ''Réfutations sophistiques'', où la contradiction joue un rôle central. ====Le triangle sémiotique : choses, pensées, mots==== Le traité s’ouvre, au chapitre 1, sur une réflexion sur le statut du langage qui constitue l’un des textes fondateurs de la philosophie occidentale du signe. Aristote y établit un triangle sémiotique à trois étages. Les sons émis par la voix (''ta en tê phonê'') sont des symboles (''symbola'') des affections de l’âme (''ta en tê psychê pathêmata''), c’est-à-dire des pensées, des concepts mentaux. Les mots écrits sont à leur tour des symboles des mots prononcés. Les pensées, enfin, sont des ressemblances (''homoiômata'') des choses (''pragmata'').<ref>Aristote, ''De l’interprétation'' 1, 16a3-8.</ref> On obtient donc trois niveaux : les choses ; les concepts mentaux qui leur ressemblent ; les sons et les écritures qui symbolisent ces concepts. Ce qui importe, c’est la ''différence de relation'' entre les niveaux. La relation entre les sons (ou les écritures) et les pensées est conventionnelle (''kata sunthêkên'') : « De même que l’écriture n’est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes ». La diversité des langues humaines manifeste précisément ce caractère conventionnel : il n’y a pas de raison naturelle pour laquelle telle pensée devrait être exprimée par tel son plutôt que par tel autre. En revanche, la relation entre les pensées et les choses est une relation de ressemblance : les états de l’âme « sont identiques chez tous », parce qu’ils reflètent la structure même du réel, qui est, elle, universelle. Cette doctrine a plusieurs conséquences. D’abord, elle prend ses distances avec le naturalisme cratylien : aucun mot n’est par nature le nom de telle chose, c’est l’institution sociale qui assigne tel signe à tel signifié. Ensuite, elle fonde la possibilité d’une communication véridique : si les pensées sont des reflets fidèles des choses, alors la traduction et la compréhension interlinguistique sont possibles, parce qu’au-delà de la diversité des conventions linguistiques, on retrouve une communauté de concepts mentaux qui est elle-même garantie par l’unité du réel. Enfin, elle implique une certaine subordination du langage à la pensée : ce que le langage fait, c’est exprimer (par signes conventionnels) des pensées qui, elles, ressemblent aux choses ; le langage n’est pas le lieu primaire de la vérité, mais sa manifestation extérieure. Aristote précise immédiatement, au chapitre 1, que la vérité et la fausseté n’apparaissent qu’avec la composition ou la séparation. Un mot isolé (« homme », « blanc », « cheval ») ne peut être ni vrai ni faux. Même un mot qui désigne quelque chose d’inexistant (« bouc-cerf », hybride imaginaire) signifie quelque chose, mais n’est ni vrai ni faux : il faut, pour qu’un énoncé soit susceptible d’être vrai ou faux, qu’on y ajoute « être » ou « ne pas être », qu’on attribue ou qu’on nie quelque chose de quelque chose. La vérité est d’abord propositionnelle. ====Le nom (''onoma'')==== Avant d’examiner la proposition, Aristote analyse ses constituants. Le nom (''onoma'') est défini, au chapitre 2, comme « un vocable signifiant par convention, sans référence à un temps, et dont aucune partie, considérée séparément, n’est signifiante ».<ref>Aristote, ''De l’interprétation'' 2, 16a19-21.</ref> Cette définition condense quatre caractères : (1) Le nom est un vocable (''phonê''), une réalité phonique. Cette précision exclut, par exemple, les sons des animaux (qui ne sont pas des mots) ou les bruits inarticulés. (2) Il est signifiant : il a un sens, il indique quelque chose. (3) Il signifie par convention (''kata sunthêkên'') : aucun vocable n’est nom par nature ; il ne le devient que lorsqu’il est institué comme symbole. (4) Il est sans référence au temps : c’est précisément ce qui le distingue du verbe. « Santé » est un nom, parce qu’il signifie quelque chose sans indiquer si cette chose existe maintenant, a existé ou existera ; « est-en-bonne-santé » est un verbe, parce qu’il consignifie le temps présent. (5) Aucune de ses parties n’est signifiante prise séparément. Aristote prend l’exemple grec ''Kalippos'' (« Beaucheval », un nom propre) : ''kalos'' (beau) signifie quelque chose hors du nom composé, ''hippos'' (cheval) aussi ; mais dans ''Kalippos'', ces parties ne signifient plus rien : le nom propre est une unité signifiante qui n’est pas la somme de ses constituants apparents. Aristote introduit également deux notions dérivées. Les noms indéfinis (''aoriston onoma''), comme « non-homme », ne sont pas des noms à proprement parler, mais ils ont une fonction logique importante (notamment dans la négation et dans certaines opérations de la syllogistique). Les noms fléchis (''ptôseis''), comme « de Philon », « à Philon », formes casuelles du nom propre, ne sont pas non plus des noms au sens strict, parce qu’ils n’entrent pas dans une affirmation ou une négation simple : « est-Philon » est susceptible de vrai ou de faux ; « est-à-Philon » ne l’est pas (il manque quelque chose). ====Le verbe (''rhêma'')==== Le verbe (''rhêma''), examiné au chapitre 3, se distingue du nom par deux caractères spécifiques : (1) Il consignifie le temps : « Santé est un nom, est-en-bonne-santé est un verbe ; car il signifie en plus que c’est un attribut maintenant. »<ref>Aristote, ''De l’interprétation'' 3, 16b6-8.</ref> Le terme « consignifier » (''prossêmainein'') est important : le verbe ne signifie pas le temps comme son objet propre (sinon « hier » serait un verbe), mais il signifie quelque chose ''en plus'' de ce qu’il signifie principalement, et ce supplément est le temps. Ce qu’un verbe signifie principalement, c’est une action ou un état (la santé, le fait de marcher) ; ce qu’il consignifie, c’est l’ancrage temporel de cette action ou de cet état dans le présent. (2) Il est toujours signe d’attribution : « il est toujours signe d’attributs, par exemple de choses qu’on dit d’un sujet ». Le verbe, autrement dit, indique toujours quelque chose qu’on attribue à autre chose ; il a une fonction prédicative inscrite dans sa nature même. Catherine Dalimier note dans ses commentaires à l’édition Flammarion que le terme grec ''rhêma'' ne recouvre pas exactement notre concept de « verbe ». Pour Aristote, « marcher » à l’infinitif est encore un nom (parce qu’il n’a, à lui seul, ni valeur temporelle déterminée, ni valeur d’attribution effective) ; il faut « marche » (présent de l’indicatif) pour avoir un ''rhêma'' au sens strict. C’est pourquoi certains traducteurs renoncent à traduire ''rhêma'' par « verbe » et préfèrent calquer le grec. Aristote distingue, comme pour les noms, des rhèmes indéfinis (« n’est-pas-en-bonne-santé », « n’est-pas-malade ») et des rhèmes fléchis (« était-en-bonne-santé », « sera-en-bonne-santé », formes au passé ou au futur). Les rhèmes indéfinis ne sont pas des verbes proprement dits parce qu’ils peuvent appartenir indifféremment à un être existant ou à un non-existant ; ils manquent de la détermination ontologique du verbe authentique. Les rhèmes fléchis ne sont pas des verbes au sens strict parce qu’ils n’ancrent pas l’attribution dans le présent. ====Le verbe « être » : la copule problématique==== Un cas particulier mérite une attention spéciale : le verbe « être » (''einai''), examiné à la fin du chapitre 3. Aristote affirme que « être ou ne pas être n’est pas un signe de la chose réelle, pas même si tu dis "étant" tout court ; car en soi, ce n’est rien, mais il consignifie une certaine composition qu’on ne peut concevoir sans les composants ».<ref>Aristote, ''De l’interprétation'' 3, 16b22-25.</ref> Cette phrase fait l’objet de débats interprétatifs intenses. Selon la lecture traditionnelle (Waitz, Sisson), Aristote suggérerait que le verbe « être » est purement copulatif, c’est-à-dire vide de signifié conceptuel propre : il n’aurait qu’une fonction grammaticale de liaison entre sujet et prédicat. Selon Ammonius et la lecture néo-platonicienne, « être » aurait une signification propre (la « participation » ou la « privation » de l’étant) mais seulement en seconde place ; en première place, il signale la composition qui constitue la proposition. Cette difficulté est centrale pour deux raisons. Premièrement, elle touche à la nature même de la proposition prédicative : qu’est-ce qui se passe, ontologiquement, quand je dis « Socrate est blanc » ? Le « est » ajoute-t-il quelque chose au monde ou est-il un pur outil syntaxique ? Deuxièmement, elle prépare la doctrine, développée dans la ''Métaphysique'', selon laquelle « être » se dit en plusieurs sens (sens copulatif, sens existentiel, sens véritatif), et selon laquelle ces différents sens correspondent à autant de modalités différentes de l’analyse. ====La proposition déclarative (''logos apophantikos'')==== Aristote distingue, au chapitre 4, plusieurs sortes de discours (''logos''). Tout discours n’est pas susceptible d’être vrai ou faux : la prière, l’ordre, la question, l’exclamation sont des discours signifiants mais qui ne se prêtent pas à l’évaluation alèthique. Seul le discours déclaratif (''logos apophantikos''), celui qui ''manifeste'' (du verbe ''apophainein'') un état de choses, peut être vrai ou faux. Aristote précise que les autres formes de discours relèvent plutôt de la rhétorique ou de la poétique. La proposition déclarative se divise en deux espèces : l’affirmation (''kataphasis'') et la négation (''apophasis''). L’affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos'') ; la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'').<ref>Aristote, ''De l’interprétation'' 5, 17a25-26.</ref> Ce qui distingue donc une affirmation d’une négation, ce n’est pas simplement la présence d’une particule négative : c’est l’opération mentale de composition (''synthesis'') ou de division (''diairesis'') qui s’y effectue. Affirmer, c’est ''unir'' mentalement deux termes ; nier, c’est ''séparer'' mentalement deux termes. C’est cette opération qui rend possible la vérité ou la fausseté, comme l’expliquera plus tard la ''Métaphysique'' (Γ, 7, 1011b26-27) : « dire que ce qui est est et que ce qui n’est pas n’est pas, c’est le vrai ; dire que ce qui est n’est pas ou que ce qui n’est pas est, c’est le faux ». La vérité est une ''correspondance'' entre la composition mentale et la composition réelle ; quand l’âme unit ce qui, dans le réel, est uni, elle dit vrai ; quand elle sépare ce qui, dans le réel, est uni, ou unit ce qui, dans le réel, est séparé, elle dit faux. ====La contradiction (''antiphasis'')==== Le chapitre 6 introduit la notion de contradiction, au cœur du traité selon l’interprétation de Whitaker. La contradiction, c’est précisément le couple formé par une affirmation et la négation qui lui correspond, où l’on affirme et nie « la même chose de la même chose », sans homonymie, et avec toutes les précisions nécessaires « pour nous défendre des sophistes ».<ref>Aristote, ''De l’interprétation'' 6, 17a33-37.</ref> Cette définition technique cache une thèse philosophique de fond : pour qu’il y ait débat rationnel, il faut que les énoncés qu’on confronte forment un véritable couple de contradictoires, c’est-à-dire qu’ils portent vraiment sur le même sujet sous le même rapport. Aristote précise les conditions à respecter : il faut affirmer et nier la même chose, du même sujet, au même moment, sous le même rapport, et selon le même sens des termes. Si ces conditions ne sont pas réunies, l’apparente contradiction n’en est pas une véritable, et le débat risque de tomber dans le sophisme. Par exemple, « Socrate est assis » et « Socrate n’est pas assis » ne sont pas réellement contradictoires si l’une concerne hier et l’autre aujourd’hui ; ils ne le sont pas non plus si « assis » est pris dans deux sens différents (assis sur une chaise / assis comme on dit d’un raisonnement bien « assis »). La doctrine de la contradiction n’est pas une simple règle formelle : elle est le fondement de la possibilité même d’une discussion rationnelle, et elle structure aussi bien la dialectique que la science. ====Quantité, qualité et le carré logique==== Le chapitre 7 introduit deux distinctions qui, croisées, donneront naissance au carré logique de la tradition scolastique. La première distinction concerne la quantité des propositions. Une proposition peut être universelle (« tout homme est blanc », « aucun homme n’est blanc »), particulière (« quelque homme est blanc », « quelque homme n’est pas blanc »), singulière (« Callias est blanc »), ou indéterminée (« l’homme est blanc », sans préciser tous, certains, ou tel homme particulier). La seconde distinction concerne la qualité : affirmative ou négative. En croisant les deux distinctions principales (universelle/particulière × affirmative/négative), on obtient quatre formes de propositions catégoriques que la tradition désignera par les voyelles A, E, I, O (désignations qui ne sont pas aristotéliciennes mais scolastiques, dérivées des verbes latins ''Affirmo'' et ''Nego'') : A pour l’universelle affirmative (« tout homme est mortel ») ; E pour l’universelle négative (« aucun homme n’est immortel ») ; I pour la particulière affirmative (« quelque homme est juste ») ; O pour la particulière négative (« quelque homme n’est pas juste »). Aristote établit, au chapitre 7, les relations qui existent entre ces formes. A et O sont contradictoires : elles ne peuvent être simultanément vraies ni simultanément fausses. E et I sont également contradictoires. A et E sont contraires : elles ne peuvent être simultanément vraies, mais elles peuvent être simultanément fausses (« tout homme est juste » et « aucun homme n’est juste » sont peut-être toutes deux fausses). I et O sont sub-contraires : elles ne peuvent être simultanément fausses, mais elles peuvent être simultanément vraies. Enfin, A entraîne I (et E entraîne O) : c’est la subalternation. Si tous les hommes sont mortels, alors quelque homme est mortel. Ce dispositif, qui paraît élémentaire, est la base de toute la logique des propositions catégoriques et préfigure une bonne partie de la syllogistique des ''Premiers Analytiques''. ====Les futurs contingents : le chapitre 9==== Le chapitre 9 du ''De interpretatione'' est, comme l’écrit Catherine Dalimier, l’objet de spéculations qui mobilisent depuis l’Antiquité « des générations de logiciens ». Il pose l’une des questions les plus profondes de la logique modale : le principe de bivalence (toute proposition est vraie ou fausse) s’applique-t-il aux propositions portant sur des événements futurs contingents ? Le problème se formule avec une grande clarté. Considérons deux propositions contradictoires : « Il y aura demain une bataille navale » et « Il n’y aura pas demain une bataille navale ». D’après le principe du tiers exclu, l’une de ces deux propositions est vraie et l’autre est fausse. Or, si l’une d’elles est ''dès maintenant'' vraie, alors l’événement qu’elle décrit est ''dès maintenant'' déterminé : il ''doit'' se produire (ou ne pas se produire) demain. Mais cela conduit à un fatalisme logique : tout ce qui doit arriver est déjà fixé, la délibération humaine est illusoire, le hasard et la liberté sont supprimés. Or il est manifeste, pour Aristote, que certains événements à venir sont contingents (ils peuvent se produire comme ne pas se produire) et que la délibération a un sens. L’''Aristoteles-Handbuch'' résume avec précision la structure de l’argument fataliste. La prémisse en est une version ''temporalisée'' du principe de bivalence : tout énoncé est, ''à tout moment'', soit vrai soit faux ; donc, dès aujourd’hui, l’énoncé « il y aura demain une bataille navale » est vrai ou faux. Si cet énoncé est dès aujourd’hui vrai, alors sa vérité est déjà ''advenue'' aujourd’hui ; or ce qui est advenu est immuable (« nécessaire » en un certain sens) ; donc il est nécessaire que demain ait lieu une bataille navale. Le raisonnement, généralisé à tous les énoncés sur l’avenir, conduit à la nécessité de tout ce qui doit arriver, c’est-à-dire au déterminisme intégral. La solution d’Aristote est, comme le note Dalimier, subtile. Il maintient le principe de bivalence pour les propositions portant sur le présent et le passé : ce qui est, est ; ce qui n’est pas, n’est pas ; le passé est immuable. Mais pour les futurs contingents, il propose une distinction délicate : « il est nécessaire que l’affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie ».<ref>Aristote, ''De l’interprétation'' 9, 19a36-39.</ref> La disjonction « il y aura ou il n’y aura pas demain une bataille navale » est nécessairement vraie (parce que l’un des deux disjoints doit être vrai) ; mais aucun des disjoints pris séparément n’est encore ''déterminément'' vrai ou faux. Selon l’interprétation classique, cette thèse revient à ''suspendre'' l’application déterminée de la bivalence aux futurs contingents, sans pour autant abandonner le principe du tiers exclu pour leur disjonction. L’interprétation de cette doctrine reste discutée. Certains commentateurs (Hintikka) ont contesté que le chapitre 9 ait pour objet de réfuter le fatalisme et ont vu dans Aristote un partisan d’un certain principe de plénitude (selon lequel tout ce qui est possible doit s’actualiser à un moment ou à un autre). D’autres (Crivelli, Weidemann) maintiennent l’interprétation classique : Aristote rejette la version temporalisée de la bivalence pour les énoncés sur les contingents futurs. La logique formelle contemporaine a élaboré, à partir de cette discussion, des logiques plurivalentes (Łukasiewicz) et des logiques temporelles (Prior) qui formalisent cette thèse de la suspension de la bivalence pour le futur. L’enjeu philosophique est important : la doctrine aristotélicienne des futurs contingents prépare une articulation entre logique, métaphysique de la causalité, et philosophie de l’action. Elle préserve la possibilité du hasard, de la délibération, et de la liberté humaine, sans pour autant renoncer aux principes de la rationalité. ====Les propositions modales==== Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales, c’est-à-dire les propositions qui ne se contentent pas d’affirmer ou de nier qu’un prédicat appartient à un sujet, mais qui qualifient cette appartenance comme nécessaire, possible, contingente ou impossible. Aristote distingue quatre modalités fondamentales. Le ''possible'' (''dynaton'', ''endechomenon'') désigne ce qui peut être ; l’''impossible'' (''adynaton''), ce qui ne peut pas être ; le ''contingent'', ce qui peut être ou ne pas être (possibilité bilatérale, dont on dira plus loin un mot) ; le ''nécessaire'' (''anankaion''), ce qui ne peut pas ne pas être. L’analyse aristotélicienne des modalités présente plusieurs particularités sur lesquelles Richard Patterson a particulièrement insisté.<ref>Patterson, R., ''Aristotle’s Modal Logic: Essence and Entailment in the Organon'', Cambridge, Cambridge University Press, 1995.</ref> La première est la distinction entre ''possibilité unilatérale'' et ''possibilité bilatérale'' (ou contingence). Quand je dis « il est possible que S soit P » au sens unilatéral, je veux dire seulement que S peut être P, sans exclure que S soit nécessairement P (la possibilité unilatérale est compatible avec la nécessité). Quand je dis « il est possible que S soit P » au sens bilatéral (la contingence proprement dite), je veux dire à la fois que S peut être P ''et'' que S peut ne pas être P : la chose est possible mais pas nécessaire, elle peut tomber d’un côté ou de l’autre. Cette distinction est cruciale parce qu’elle commande des règles d’inférence et de conversion différentes : « Tout S peut être P » au sens unilatéral n’a pas la même force logique que « Tout S peut être P » au sens bilatéral, et certains syllogismes valides dans un cas ne le sont plus dans l’autre. Aristote observe également que les propositions modales ne se convertissent pas comme les propositions assertoriques. Une proposition assertorique de type I (« quelque S est P ») se convertit simplement en « quelque P est S ». Mais une proposition modale du type « il est possible que quelque S soit P » ne se convertit pas toujours, ou ne se convertit qu’à condition de spécifier le mode de possibilité. Aristote consacre de longs développements, dans les ''Premiers Analytiques'', à examiner ces règles particulières. Patterson met également en évidence la dimension essentialiste de la logique modale aristotélicienne. Quand Aristote dit qu’un énoncé est nécessaire, il ne pense pas, comme la logique modale contemporaine, à un opérateur abstrait s’appliquant à une proposition entière (« il est nécessaire que P »). Il pense à une relation entre des termes qui exprime une connexion essentielle. « Il est nécessaire que tout homme soit animal » ne signifie pas seulement que dans tous les mondes possibles, tout homme est animal ; cela signifie qu’« être animal » fait partie de l’''essence'' de « être homme », et que cette appartenance à l’essence rend la prédication nécessaire. La nécessité est ancrée dans la nature même des choses, dans leur ''quiddité''. Cette caractéristique rend délicate la transposition de la logique modale aristotélicienne dans les langages formels modernes, qui utilisent des opérateurs propositionnels faisant abstraction de la structure essentielle des termes. Les propositions modales jouent un rôle important dans la théorie de la science, comme l’expliqueront les ''Seconds Analytiques'' : la science porte sur le nécessaire, non sur le contingent. Une démonstration scientifique part de prémisses nécessaires et conclut à des nécessités, parce qu’elle vise des vérités universelles et invariables. La théorie modale s’articule ainsi à l’épistémologie aristotélicienne, et les chapitres 12-13 du ''De interpretatione'' préparent les développements plus techniques que livrera Aristote dans la syllogistique modale des ''Premiers Analytiques''. ====Portée philosophique du ''De interpretatione''==== L’importance du ''De interpretatione'' dépasse son objet apparent. Catherine Dalimier souligne, en conclusion de son introduction, que le traité dessine le cadre logique de toute science possible pour Aristote. En établissant que la vérité réside dans la composition et la division opérées par l’intellect, et non dans les choses isolées ni dans les concepts isolés, Aristote fait du jugement le lieu propre de la manifestation de l’être. Cette doctrine sera reprise et développée par toute la philosophie occidentale jusqu’à Kant (qui en fera la base de sa logique transcendantale) et au-delà. Le traité a également une portée pour la philosophie du langage. La distinction entre nom et verbe, l’analyse du caractère conventionnel du signe linguistique, la théorie de la signification et de la référence, la doctrine des futurs contingents : autant de thèmes qui ont nourri la philosophie analytique contemporaine, comme l’a montré Suzanne Husson dans ''Interpréter le De Interpretatione''.<ref>Husson, S. (éd.), ''Interpréter le'' De Interpretatione, Paris, Vrin, 2009.</ref> ====Ce qu’il faut retenir==== Le ''De interpretatione'' fixe l’unité minimale du jugement, la proposition déclarative, et en analyse les composants (nom, verbe, copule). Il définit la contradiction comme couple affirmation/négation et établit les quatre formes catégoriques A, E, I, O. Il pose deux problèmes qui occuperont la postérité : celui des futurs contingents (suspension de la bivalence pour les énoncés sur l’avenir) et celui des modalités (nécessaire, possible, contingent, impossible), avec des règles de conversion propres. La théorie aristotélicienne y montre son caractère sémantique, ancré dans une métaphysique des essences plutôt que dans un formalisme abstrait. ===Chapitre III. ''Les Premiers Analytiques'' : la théorie formelle du syllogisme=== ====Le projet des ''Premiers Analytiques''==== Les ''Premiers Analytiques'' (''Analytica priora'') exposent la théorie du syllogisme dans sa généralité. Leur objet, comme l’explique Aristote dès la première phrase du livre I, est la ''démonstration'', et plus particulièrement le ''syllogisme'' en tant qu’instrument de toute démonstration. Ce qui distingue les ''Premiers'' des ''Seconds Analytiques'', c’est que l’analyse y porte sur la ''forme'' du syllogisme indépendamment de la vérité de ses prémisses. Un syllogisme valide est un syllogisme dont la conclusion suit nécessairement des prémisses, ''que ces prémisses soient vraies ou fausses''. La théorie est donc, en un certain sens, formelle : elle s’intéresse à la structure du raisonnement, non à son contenu particulier. Comme l’observe Pellegrin, cette caractérisation des ''Premiers Analytiques'' comme étude formelle ne doit pas être prise au sens contemporain, où la formalité signifie généralement la possibilité de substituer n’importe quel contenu à une structure syntaxique. Pour Aristote, le formalisme est plus mesuré : il s’agit de dégager les règles qui permettent de dire qu’un raisonnement ''conclut'' à partir de ses prémisses, et ces règles présupposent encore une certaine sémantique des termes. ====La définition du syllogisme==== Aristote définit le syllogisme (''syllogismos''), au chapitre 1 du livre I, dans une formule devenue célèbre : « un discours dans lequel, certaines choses étant posées, quelque chose d’autre que ces données en résulte nécessairement par le seul fait de ces données ».<ref>Aristote, ''Premiers Analytiques'' I, 1, 24b18-20.</ref> Cette définition condense plusieurs conditions qu’il faut prendre soin de distinguer. Première condition : pluralité des prémisses. Un syllogisme suppose au moins deux propositions posées (les prémisses). Aristote ne considère pas comme syllogisme l’inférence à partir d’une seule prémisse. Deuxième condition : la conclusion doit être ''autre chose'' que les prémisses (« quelque chose d’autre que ces données »). Cette clause exclut, en principe, les raisonnements purement tautologiques. Troisième condition : la conclusion doit suivre nécessairement. La nécessité du syllogisme est essentielle : il ne suffit pas que la conclusion soit en fait vraie quand les prémisses sont vraies, il faut qu’elle ne ''puisse pas'' ne pas être vraie quand les prémisses le sont. Quatrième condition, la plus subtile, mise en lumière par Crivelli : la conclusion doit suivre « par le seul fait de ces données » (''tô tauta einai''). Cette clause ajoute à la nécessité une exigence supplémentaire : non seulement la conclusion suit nécessairement, mais elle suit ''en vertu'' des prémisses elles-mêmes, et non d’une autre raison. Crivelli interprète cette clause comme exigeant que le caractère d’avoir la conclusion résultant nécessairement des prémisses devrait être partagé par toutes les inférences de la même structure, ou « forme ». C’est une exigence de ''formalité'' : le syllogisme conclut non pas accidentellement (parce qu’il se trouve, par hasard, que ces prémisses-là ont cette conclusion-là), mais en vertu de la structure formelle du raisonnement. Cette clause permet à Aristote de distinguer le syllogisme d’autres formes d’inférence nécessaire. Comme le rappelle Orna Harari, Aristote affirme explicitement, en ''Premiers Analytiques'' I, 32 (47a31-35) : « tout syllogisme est nécessaire, mais tout ce qui suit nécessairement n’est pas un syllogisme ».<ref>Harari, O., ''Knowledge and Demonstration: Aristotle’s Posterior Analytics'', Dordrecht, Springer / Kluwer, 2004, chap. 3.</ref> Il existe des inférences valides (par exemple les déductions hypothétiques, ou les raisonnements ''par l’absurde'') qui ne sont pas des syllogismes parce qu’elles ne respectent pas la structure formelle requise. ====Termes, prémisses et structure du syllogisme==== Le syllogisme aristotélicien possède une structure rigoureusement délimitée. Il comprend trois termes : le grand terme (ou ''majeur''), le petit terme (ou ''mineur''), et le moyen terme (''mesos'') qui assure la liaison entre les deux extrêmes. Il comporte deux prémisses : la ''majeure'' (qui contient le grand terme) et la ''mineure'' (qui contient le petit terme). Chaque prémisse contient également le moyen terme. Il aboutit enfin à une conclusion qui relie le petit terme au grand terme, sans contenir le moyen terme. L’exemple le plus connu, repris par toute la tradition scolastique, est celui qui prend Socrate comme petit terme : « Tout homme est mortel ; or Socrate est un homme ; donc Socrate est mortel ». Il faut noter qu’il s’agit là d’un exemple à terme singulier, scolaire et postérieur à Aristote ; la syllogistique aristotélicienne traite d’abord des propositions catégoriques entre termes généraux. Une formulation plus conforme à l’analyse aristotélicienne serait : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel », où les trois termes (animal, homme, mortel) sont tous généraux et se prêtent aux quantifications universelles. Le moyen terme joue, dans cette structure, un rôle central. Il est ce ''par quoi'' la conclusion est établie. Comme le résume Pellegrin, l’analytique tout entière peut se comprendre comme une technique de recherche du moyen terme : trouver des termes qui permettent de relier deux extrêmes de manière universelle et nécessaire. ====Les trois figures du syllogisme==== Aristote distingue, selon la position du moyen terme dans les prémisses, trois figures syllogistiques. Dans la première figure, le moyen terme est sujet dans la majeure et prédicat dans la mineure : « M est P ; S est M ; donc S est P ». Exemple (Barbara) : « Tout animal est mortel ; tout homme est animal ; donc tout homme est mortel ». Dans la deuxième figure, le moyen terme est prédicat dans les deux prémisses : « P est M ; S est M » (avec l’une des deux prémisses négative). Exemple (Cesare) : « Aucune pierre n’est animée ; tout cheval est animé ; donc aucun cheval n’est une pierre ». Dans la troisième figure, le moyen terme est sujet dans les deux prémisses : « M est P ; M est S ». Exemple (Darapti) : « Tout homme est rationnel ; tout homme est animal ; donc quelque animal est rationnel ». Aristote considère la première figure comme la plus parfaite, et il faut bien comprendre pourquoi. Une figure est dite « parfaite » quand la nécessité de la conclusion est immédiatement évidente, sans qu’il soit besoin de justifier cette nécessité par un détour. Or la première figure exprime de manière directe le principe que la tradition scolastique appellera le ''dictum de omni et nullo'' (« le dit du tout et du rien ») : ce qui est affirmé (ou nié) de tout un genre est affirmé (ou nié) de tout ce qui tombe sous ce genre. Si « tout animal est mortel » et « tout homme est un animal », alors on voit immédiatement que « tout homme est mortel », parce que les hommes, étant des animaux, héritent de tout ce qu’on dit de tous les animaux. Le moyen terme « animal », en se trouvant entre le grand terme (mortel) et le petit terme (homme), permet à la propriété « mortel » de descendre par transitivité jusqu’aux hommes. Les syllogismes des deuxième et troisième figures, en revanche, sont qualifiés d’« imparfaits » non parce qu’ils seraient invalides, mais parce que leur validité ne se voit pas immédiatement : on doit la ''dériver''. Pour cela, Aristote les ramène, par diverses opérations (notamment la conversion des prémisses), à des syllogismes parfaits de la première figure. Démontrer la validité d’un syllogisme de la deuxième figure, c’est montrer qu’il peut être traduit en un syllogisme équivalent de la première figure, où la nécessité de la conclusion est immédiatement saisie. ====Les modes valables : Barbara, Celarent, Darii, Ferio==== À l’intérieur de chaque figure, Aristote détermine les modes qui permettent de conclure validement, en croisant les quantités (universelle/particulière) et les qualités (affirmative/négative) des prémisses. La tradition scolastique a inventé des noms mnémotechniques (Barbara, Celarent, Darii, Ferio pour la première figure ; Cesare, Camestres, Festino, Baroco pour la deuxième ; Darapti, Felapton, Disamis, Datisi, Bocardo, Ferison pour la troisième), où les voyelles indiquent les types des prémisses et de la conclusion (A, E, I, O). Pour la première figure, les quatre modes valables sont : Barbara (AAA), « Tout M est P ; tout S est M ; donc tout S est P » ; Celarent (EAE), « Aucun M n’est P ; tout S est M ; donc aucun S n’est P » ; Darii (AII), « Tout M est P ; quelque S est M ; donc quelque S est P » ; et Ferio (EIO), « Aucun M n’est P ; quelque S est M ; donc quelque S n’est pas P ». Aristote considère également les autres combinaisons et montre lesquelles ne concluent pas (par la méthode des contre-exemples : on trouve une combinaison de termes qui rend les prémisses vraies et la conclusion fausse). ====La conversion et l’ekthèse==== Pour ramener les modes des deuxième et troisième figures à la première, Aristote emploie principalement deux techniques. La conversion (''antistrophê'') consiste à transformer une prémisse en interchangeant son sujet et son prédicat. Aristote établit, au début du livre I, des règles de conversion. La E (universelle négative) se convertit simplement : « Aucun S n’est P » se convertit en « Aucun P n’est S ». La I (particulière affirmative) se convertit simplement aussi : « Quelque S est P » se convertit en « Quelque P est S ». La A (universelle affirmative) se convertit ''par accident'' : « Tout S est P » se convertit en « Quelque P est S » (mais non en « Tout P est S »). La O (particulière négative), enfin, ne se convertit pas. Ces règles permettent de transformer un syllogisme imparfait en un syllogisme parfait de la première figure, et donc de prouver sa validité. L’''ekthèse'' (''ekthesis'', mot grec qui signifie littéralement « exposition », au sens d’« exposer », « mettre en avant ») est une technique plus rare, utilisée notamment pour valider Baroco et Bocardo, deux modes que la conversion ne suffit pas à ramener à la première figure. Le procédé consiste à introduire un terme supplémentaire, plus restreint, qui ''exemplifie'' la condition exprimée par une prémisse particulière. Si l’on a, par exemple, « quelque S n’est pas P », l’ekthèse pose un terme N qui désigne précisément cette portion de S qui n’est pas P, puis raisonne sur N comme sur un nouveau sujet. Le syllogisme se trouve ainsi reformulé sous une forme qui se prête à un raisonnement direct. Comme l’a montré Jonathan Lear, l’ekthèse n’implique pas une « imagination » au sens moderne, ni un appel à l’intuition sensible : c’est une procédure logique rigoureuse qui pose un cas particulier auquel s’appliquent les conditions de la prémisse, et qui permet de rendre manifeste une nécessité qui était implicitement contenue dans les prémisses originales.<ref>Lear, J., ''Aristotle and Logical Theory'', Cambridge, Cambridge University Press, 1980, chap. 1.</ref> Sa parenté avec certaines techniques de preuve mathématique (raisonner sur un cas particulier représentatif) est manifeste. ====La syllogistique modale (Patterson)==== Aux chapitres 3 et 8 à 22 du livre I, Aristote étend la syllogistique aux propositions modales (nécessaires, possibles, contingentes). Cette extension a été l’un des grands chantiers de l’aristotélisme contemporain, et Richard Patterson a proposé une lecture qui permet de comprendre la cohérence d’un système qui a souvent paru aux interprètes (Łukasiewicz, McCall, Hintikka) traversé de contradictions internes. La thèse centrale de Patterson est qu’Aristote fait usage de ce qu’il appelle un ''modal copula'' : la modalité ne s’applique pas à la proposition entière (''de dicto'' : « il est nécessaire que tout homme soit animal »), ni au seul prédicat (''de re'' : « tout homme est nécessairement-animal »), mais à la copule elle-même qui relie sujet et prédicat. Au lieu de dire « tout homme ''est'' animal » (forme assertorique), on dirait « tout homme ''est-nécessairement'' animal » : c’est le « est » lui-même, la liaison prédicative, qui est qualifié modalement. Cette structure est elle-même ambiguë entre deux lectures : une lecture forte (''strong cop'') et une lecture faible (''weak cop''). Dans la lecture forte, la proposition « Animal Ns (nécessaire selon copule forte) Tout-Homme » signifie qu’il existe une connexion ''per se'', c’est-à-dire essentielle, entre les termes : « animal » entre dans la définition d’« homme », c’est sa nature même d’être animal. Les propositions de la science démonstrative, telles que les ''Seconds Analytiques'' les caractérisent, sont des propositions à ''strong cop necessity''. Dans la lecture faible, « Animal Nw Tout-Blanc » par exemple signifie seulement que tout ce qui est blanc est nécessairement animal, non pas parce qu’il y aurait une connexion essentielle entre blancheur et animalité, mais parce que ''de fait'', dans le monde considéré, tout ce qui est blanc se trouve être animal. Cette lecture ''de re'' étendue est plus large : elle inclut des cas où le prédicat appartient nécessairement au sujet sans pour autant entrer dans son essence. Patterson montre que cette dualité éclaire une foule de difficultés que Łukasiewicz avait considérées comme des incohérences. La validité des syllogismes modaux dépend de la lecture qu’on adopte : certains modes sont valides en lecture forte mais non en lecture faible, et inversement. La syllogistique modale aristotélicienne n’est pas un système formel inconsistant ; c’est un système ancré dans une métaphysique essentialiste où la distinction entre essence et accident détermine les règles d’inférence valides. Cette interprétation a également l’intérêt de montrer comment les ''Premiers Analytiques'' préparent les ''Seconds Analytiques''. Les syllogismes scientifiques de la démonstration sont ''par excellence'' des syllogismes modaux à ''strong cop necessity'', où les termes sont liés par des connexions ''per se''. La logique modale n’est pas une curiosité périphérique chez Aristote : elle est l’instrument logique de sa théorie de la science. ====Syllogisme et déduction : une équivalence problématique==== Un point souvent débattu, sur lequel Harari et Crivelli ont apporté des éclairages utiles, concerne la prétention d’Aristote à identifier syllogisme et déduction. Aristote affirme, en ''Premiers Analytiques'' I, 23 (40b20), que tous les syllogismes se forment dans les trois figures, et il ajoute que toute déduction est en principe réductible à un syllogisme. Cette thèse, que Lear appelle « la thèse d’Aristote », est plus forte qu’il n’y paraît. D’un côté, Aristote reconnaît certaines exceptions : les déductions hypothétiques (« si A alors B ; or A ; donc B ») et les raisonnements ''par l’absurde'' ne se ramènent pas à la forme syllogistique standard. D’un autre côté, il maintient que toute ''démonstration scientifique'' directe, dans la mesure où elle vise à établir une connexion essentielle entre des termes, peut être recoulée dans une forme syllogistique. Comme le montre Harari, la logique syllogistique aristotélicienne n’est pas une logique des propositions au sens contemporain (où les prémisses peuvent être de structures variées), mais une logique des prédications. Elle suppose que toute proposition se laisse analyser en sujet-prédicat (« A appartient à B », « A n’appartient pas à B », etc.), et que la combinaison des termes via un moyen terme est l’opération fondamentale du raisonnement valide. C’est précisément cette restriction qui fait sa puissance et son intérêt, mais aussi ses limites par rapport aux logiques modernes plus expressives. ====Ce qu’il faut retenir==== Les ''Premiers Analytiques'' fournissent la théorie générale du syllogisme. Aristote en donne la définition technique (trois termes, deux prémisses, conclusion nécessaire), distingue trois figures (selon la position du moyen terme), identifie les modes valides à l’intérieur de chacune, et propose des techniques (conversion, ekthèse) pour ramener les figures imparfaites à la première, considérée comme parfaite parce qu’elle exprime directement le principe ''dictum de omni et nullo''. La syllogistique modale, lue avec Patterson, révèle une logique ancrée dans une métaphysique essentialiste. Aristote prétend identifier syllogisme et déduction, mais il reconnaît des inférences valides qui ne sont pas des syllogismes (déductions hypothétiques, raisonnements par l’absurde). ===Chapitre IV. ''Les Seconds Analytiques'' : la science démonstrative=== ====Le projet des ''Seconds Analytiques'' et la définition de la science==== Les ''Seconds Analytiques'' (''Analytica posteriora'') prolongent les ''Premiers Analytiques'' mais opèrent un déplacement important. Là où les ''Premiers'' étudiaient le syllogisme dans sa forme générale, les ''Seconds'' s’attachent à une espèce particulière du syllogisme : le syllogisme démonstratif ou scientifique (''apodeixis''). C’est cette espèce qui produit la science, c’est-à-dire la connaissance véritable. Aristote ouvre le traité, au chapitre 2 du livre I, par une définition triple de la science : « Nous estimons posséder la science d’une chose d’une manière absolue quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu’en outre il n’est pas possible que la chose soit autre qu’elle n’est ».<ref>Aristote, ''Seconds Analytiques'' I, 2, 71b9-12.</ref> Cette définition condense trois exigences. Premièrement, la science est connaissance ''par les causes''. Savoir qu’il pleut n’est pas avoir la science de la pluie ; savoir ''pourquoi'' il pleut, ''par quelle cause'', c’est avoir la science. Deuxièmement, cette connaissance doit être ''certaine'' : il faut savoir que la cause est ''bien'' la cause, et non se contenter d’opinions plausibles. Troisièmement, elle porte sur des nécessités : ce qui est connu scientifiquement « ne peut pas être autrement ». La science ne porte pas sur le contingent (qui peut être ou ne pas être), mais sur ce qui est nécessairement ce qu’il est. Orna Harari soulève une question importante quant au sens du terme ''epistêmê''. La traduction traditionnelle par « science » ou « connaissance » a été contestée : certains commentateurs contemporains soutiennent que le sens d’''epistêmê'' chez Aristote serait plus proche de l’''understanding'' (compréhension) que de la ''knowledge'' (connaissance) au sens moderne, parce qu’Aristote serait moins préoccupé par le problème de la justification que par celui de la saisie des structures explicatives. Harari elle-même propose de distinguer deux types de compréhension chez Aristote : une compréhension perceptuelle, liée à l’expérience sensible, et une compréhension conceptuelle, qui saisit les essences universelles. La science aristotélicienne intègre ces deux dimensions : elle part de la perception pour aboutir à la saisie de structures essentielles. ====La démonstration : structure et conditions des prémisses==== La démonstration est, selon Aristote, le syllogisme qui produit la science. Mais tout syllogisme valide n’est pas une démonstration : il faut, pour cela, que les prémisses satisfassent à des exigences supplémentaires. Aristote en énumère six, dans le chapitre 2 du livre I (71b20-25). Les prémisses de la démonstration doivent être vraies (une démonstration ne peut produire la science si elle part du faux : ce serait une démonstration apparente, non réelle). Elles doivent être premières (''prôta'') et immédiates (''amesa'') : elles ne dérivent pas elles-mêmes d’une démonstration, et il n’y a pas de moyen terme entre leur sujet et leur prédicat. Ce sont les principes (''archai'') à partir desquels toute démonstration procède. Elles doivent être plus connues que la conclusion : la connaissance de la conclusion repose sur la connaissance des prémisses ; il faut donc que celles-ci soient mieux connues, faute de quoi nous expliquerions l’obscur par le plus obscur. Elles doivent être antérieures à la conclusion (antériorité non chronologique mais ontologique et explicative : les prémisses sont ce qui rend la conclusion vraie, ce qui la fonde). Elles doivent être causes de la conclusion (''aitia tou symperasmatos'') : la démonstration ne se contente pas de prouver que quelque chose est ; elle explique ''pourquoi'' c’est. Cette exigence, qui distingue la démonstration scientifique du simple syllogisme valide, est ce qu’Aristote oppose au « syllogisme du fait » (''syllogismos tou hoti'') : un syllogisme du fait peut prouver qu’un état de choses existe, mais s’il ne donne pas la cause, il n’est pas un syllogisme du ''pourquoi'' (''syllogismos tou dioti''), et il n’est pas démonstration. Elles doivent être enfin mieux connaissables par nature, même si elles peuvent être moins connues par nous. La science consiste à passer de ce qui nous est plus familier (les phénomènes sensibles, les conclusions immédiates) à ce qui est plus connaissable en soi (les principes universels, les essences). Comme le montre David Bronstein, ces conditions sont liées entre elles : c’est parce que les prémisses sont causes de la conclusion qu’elles lui sont antérieures, et c’est parce qu’elles sont premières qu’elles sont mieux connaissables par nature.<ref>Bronstein, D., ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016.</ref> ====Le rôle du moyen terme : prouver le pourquoi==== Le moyen terme joue, dans la démonstration scientifique, un rôle qui dépasse celui qu’il a dans le syllogisme général. Aristote affirme, en ''Seconds Analytiques'' II, 2 (90a6) : « le moyen terme est la cause ». Cette identification a des implications importantes. L’exemple classique qu’Aristote donne, dans le livre II, est celui de l’éclipse de la lune. Si l’on cherche à ''démontrer'' que la lune subit des éclipses, on construit un syllogisme : tout ce qui est privé de lumière par interposition de la Terre subit une éclipse ; la lune est privée de lumière par interposition de la Terre ; donc la lune subit des éclipses. Le moyen terme (« être privé de lumière par interposition de la Terre ») n’est pas seulement un ''lien logique'' qui permet de relier le sujet (la lune) au prédicat (subir une éclipse). Il est la cause physique réelle de l’éclipse. C’est l’interposition de la Terre qui ''fait'' qu’il y a éclipse ; le syllogisme, pour être démonstratif, doit identifier cette cause et la mettre dans le moyen terme. Pellegrin a souligné, dans son étude des ''Seconds Analytiques'', que connaître scientifiquement les choses, c’est les connaître sous la forme ou dans l’ordre où elles se trouvent dans la démonstration. La démonstration n’est pas une procédure heuristique pour découvrir des explications nouvelles ; elle est plutôt la forme canonique du savoir scientifique, où les relations causales sont déployées de la manière la plus claire et la plus explicite. Aristote distingue, en ''Seconds Analytiques'' II, 11, quatre types de causes correspondant aux quatre causes de la ''Physique'' (II, 3) : la cause matérielle, la cause formelle, la cause efficiente (ou motrice) et la cause finale. La démonstration scientifique peut faire intervenir l’une ou l’autre de ces causes selon la nature de l’explication recherchée. Pellegrin a consacré un article remarqué à l’analyse de ce chapitre, soulignant les difficultés particulières que pose la démonstration de la cause finale, où le syllogisme doit faire intervenir un ''en vue de quoi'' qui ne se laisse pas réduire à un simple lien logique.<ref>Pellegrin, P., « Causal Explanation and Demonstration in ''Posterior Analytics'' II 11 », dans A. P. Mesquita et R. Santos (dir.), ''New Essays on Aristotle’s Organon'', Routledge, 2024, chap. 7.</ref> ====Les principes : axiomes, hypothèses et définitions==== Toute démonstration présuppose, comme on l’a vu, des principes (''archai'') qui ne peuvent être eux-mêmes démontrés. Aristote rejette à la fois la possibilité d’une régression infinie (qui ferait de chaque prémisse l’objet d’une démonstration ultérieure, sans terme) et celle d’une démonstration circulaire (où A serait démontré par B et B par A). Il faut donc admettre l’existence de principes premiers connus ''sans'' démonstration. Aristote distingue trois catégories de principes. Les axiomes (''axiômata'') ou principes communs sont des principes qui s’appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction (« il est impossible que le même attribut appartienne et n’appartienne pas en même temps au même sujet et sous le même rapport », ''Métaphysique'' Γ, 3, 1005b19-20). Vient ensuite le principe du tiers exclu (« entre deux contradictoires, il n’y a pas de moyen terme »). Aristote considère ces axiomes comme des principes que toute pensée rationnelle présuppose nécessairement : les contester reviendrait à contester la possibilité même de penser et de parler. Il défend le principe de non-contradiction, dans le livre Γ de la ''Métaphysique'', par une ''réfutation dialectique'' de ses adversaires : dès lors que celui qui le conteste « dit quelque chose de déterminé », il présuppose le principe qu’il prétend nier. Les hypothèses (''hypotheseis'') et les thèses (''theseis'') sont des principes propres à chaque science. Aristote distingue les hypothèses, qui affirment l’existence de certaines entités (les points en géométrie, les unités en arithmétique), et les thèses, qui prennent position sans nécessairement affirmer une existence. En géométrie, l’hypothèse selon laquelle « il existe des points » est un principe que la science ne démontre pas, mais qu’elle pose comme condition de possibilité de ses démonstrations. Les définitions (''horoi'') sont des énoncés qui disent ce qu’est une chose, son essence (''ti esti''). Aristote consacre une grande partie du livre II des ''Seconds Analytiques'' à examiner si l’essence peut être démontrée. Il conclut négativement : la définition n’est pas une démonstration, parce qu’elle ne procède pas par syllogisme et qu’elle pose plutôt qu’elle ne prouve. Toutefois, certaines définitions peuvent ''découler'' de démonstrations : c’est le cas des définitions causales. La définition du tonnerre, par exemple (« bruit dans les nuages causé par l’extinction du feu »), peut être obtenue à partir d’une démonstration qui établit la cause (l’extinction du feu) du phénomène (le bruit dans les nuages). ====L’unité et la diversité des sciences==== Une thèse importante des ''Seconds Analytiques'' est l’interdiction du passage d’un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre (le genre des objets dont elle traite), et elle ne peut emprunter ses principes ou ses démonstrations à une autre science. La géométrie ne peut démontrer une vérité d’arithmétique ; la physique ne peut démontrer une vérité de biologie en utilisant des principes physiques. Cette règle, expliquée en ''Seconds Analytiques'' I, 7, garantit l’autonomie des sciences. Chaque science a ses propres principes, son propre objet, ses propres méthodes adaptées à la nature de son objet. Comme l’écrira Aristote dans l’''Éthique à Nicomaque'' (I, 3) : il faut chercher dans chaque domaine la précision que cet objet permet ; il serait absurde d’exiger d’un mathématicien la rigueur d’un orateur, et tout aussi absurde d’exiger d’un orateur la précision du mathématicien. Aristote admet cependant trois exceptions à cette règle d’autonomie. La première est la subordination d’une science à une autre : l’optique est subordonnée à la géométrie, en ce qu’elle utilise les théorèmes géométriques mais les applique à un objet particulier (la lumière). Il ne s’agit pas d’un transfert illicite, parce que la science subordonnée prend ses principes d’une science supérieure dont elle dépend. La deuxième est le partage des axiomes communs : le principe de non-contradiction n’est pas le monopole d’une science particulière, il est utilisé par toutes. Aristote précise toutefois que chaque science l’utilise « dans la mesure » où son objet l’exige. La troisième est l’existence des sciences mixtes (''metaxu'') : l’astronomie mathématique, la mécanique, l’harmonique sont des sciences qui utilisent les mathématiques pour étudier des phénomènes physiques. Ce sont des cas particuliers où la transition d’un genre à un autre est légitime parce que les phénomènes étudiés ont une structure mathématique intrinsèque. Cette théorie de l’unité-diversité des sciences fonde l’organisation aristotélicienne du savoir. Chaque science possède une méthode adaptée à son objet : les mathématiques procèdent par démonstration nécessaire à partir d’axiomes ; la physique tient compte du changement et des causes naturelles ; la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly''), formule importante parce qu’elle reconnaît que le vivant n’obéit pas à une nécessité aussi rigoureuse que la matière inerte ; l’éthique et la politique se contentent de vérités qui valent « pour la plupart », parce que leur objet (l’action humaine) est essentiellement contingent. ====La connaissance des principes : induction et intellection==== Si toute science procède de principes indémontrables, comment pouvons-nous connaître ces principes eux-mêmes ? Cette question, posée dès le chapitre 3 du livre I, reçoit sa réponse dans le dernier chapitre des ''Seconds Analytiques'' (II, 19), l’un des textes les plus discutés de l’aristotélisme. La réponse d’Aristote articule plusieurs étapes. La connaissance des principes ne peut pas être innée (comme le voudrait Platon avec sa théorie de la réminiscence), parce qu’il serait absurde que nous possédions une connaissance plus exacte que la science et que nous l’ignorions. Mais elle ne peut pas non plus naître de rien, parce que toute connaissance présuppose une certaine connaissance préalable. La solution est qu’il existe en nous une ''capacité'' (''dynamis'') de connaître les principes, capacité qui n’est pas elle-même une connaissance déterminée mais qui se déploie progressivement à partir de la sensation. Aristote décrit ce processus en plusieurs étapes. La sensation (''aisthêsis'') est la base : elle saisit les choses singulières. La sensation laisse des traces qui constituent la mémoire (''mnêmê'') : nous nous souvenons des choses perçues. L’accumulation et l’organisation des souvenirs produisent l’expérience (''empeiria'') : nous reconnaissons des régularités, des cas semblables. À partir de l’expérience se forme l’universel (''katholou'') qui « se repose dans l’âme » et constitue l’art (''technê'') ou la science (''epistêmê'').<ref>Aristote, ''Seconds Analytiques'' II, 19, 100a3-9.</ref> Aristote compare ce processus, dans une image célèbre, à une armée en déroute : « comme dans une bataille, quand une déroute se produit, un soldat fait halte, puis un autre, puis un autre, jusqu’à ce que se reconstitue le rang originel ». De même, à partir d’une multitude d’impressions sensorielles d’abord confuses, l’âme construit progressivement la saisie de l’universel. Le terme qu’Aristote emploie pour ce processus est ''epagôgê'', qu’on traduit traditionnellement par induction. Mais Orna Harari a montré, dans une analyse minutieuse, que ce terme a chez Aristote (au moins) deux sens distincts. Dans un premier sens, l’induction argumentative, ''epagôgê'' désigne un type d’inférence qui établit (ou justifie) une proposition universelle à partir de cas particuliers. C’est l’usage qu’on trouve dans les ''Topiques'' et dans les ''Premiers Analytiques'' II, 23. Cette induction est une ''forme de raisonnement'' qui peut être confrontée au syllogisme. Dans un second sens, l’induction cognitive ou perceptuelle, ''epagôgê'' désigne un acte cognitif par lequel l’esprit reconnaît dans le particulier l’aspect universel. C’est cet usage qu’on trouve, selon Harari, en ''Seconds Analytiques'' II, 19 et I, 1. Quand Aristote dit que nous saisissons les principes par induction, il ne veut pas dire que nous les ''prouvons'' à partir de cas particuliers ; il veut dire que la perception elle-même, en saisissant un cas particulier, nous ouvre l’accès à l’universel qui s’y manifeste. La saisie ultime des principes premiers relève d’une faculté qu’Aristote nomme intellect (''nous'') ou intuition intellectuelle. C’est, écrit-il en ''Seconds Analytiques'' II, 19 (100b12), « la disposition par laquelle nous connaissons les principes ». Le ''nous'' est, selon Aristote, supérieur même à la science démonstrative, parce qu’il saisit ce qui rend la science possible. Comme le formule l’''Éthique à Nicomaque'' VI, 6 : « l’intellect a pour objet les principes, dont aucune définition ne peut rendre compte ». Cette doctrine soulève des difficultés notoires que les commentateurs ont longuement débattues. Comment l’intellect peut-il être à la fois une ''capacité innée'' (en puissance, depuis la naissance) et le ''résultat d’un apprentissage'' (en acte, à partir de l’expérience) ? Comment articuler le rôle de l’induction (qui est un processus discursif) et celui de l’intellect (qui est, selon l’''Éthique à Nicomaque'', ''non discursif'') ? Harari propose une articulation : l’induction est la ''procédure'' qui prépare la saisie ; l’intellect est l’''état cognitif'' qui résulte de cette préparation et qui ''saisit'' effectivement les principes. Les deux sont nécessaires : l’induction sans intellect est aveugle ; l’intellect sans induction n’a pas de matière à saisir. ====Le statut épistémologique des ''Seconds Analytiques'' : démonstration ou méthode ?==== Une question importante, sur laquelle Pellegrin et d’autres commentateurs (Brunschwig, Bronstein) ont insisté, concerne le statut même de la démonstration aristotélicienne. La démonstration est-elle une méthode de découverte, un instrument heuristique pour trouver des vérités nouvelles ? Ou est-elle plutôt la forme canonique du savoir établi, c’est-à-dire la manière dont une science déjà constituée s’expose et se transmet ? La lecture traditionnelle, dominante depuis l’Antiquité jusqu’à la Renaissance, voyait dans la démonstration une méthode de découverte. La science moderne, à partir de Bacon et de Descartes, a critiqué cette lecture : la démonstration syllogistique, disait Bacon, ne fait que tirer ce qu’on a déjà mis dans les prémisses ; elle ne produit pas de connaissance nouvelle. La lecture contemporaine, esquissée par Pellegrin et défendue par Bronstein, propose une autre interprétation. La démonstration n’est pas une méthode de ''découverte'', mais la ''forme du savoir scientifique constitué''. Une fois qu’une science a identifié ses principes (par induction et intellection) et a établi les connexions causales entre les phénomènes qu’elle étudie, elle peut ''exposer'' ce savoir sous la forme d’une chaîne de syllogismes démonstratifs. La démonstration est l’organisation rationnelle d’un savoir, son architecture logique, et non pas la procédure par laquelle ce savoir a été acquis. Cette interprétation a deux mérites. D’abord, elle dissout l’objection baconienne-cartésienne : si la démonstration n’est pas une méthode de découverte, elle ne peut pas être critiquée pour ne pas en être une. Ensuite, elle restitue l’unité du projet aristotélicien : les ''Topiques'' (méthode dialectique de découverte des prémisses), les ''Premiers Analytiques'' (forme générale du syllogisme) et les ''Seconds Analytiques'' (forme spécifique du syllogisme scientifique) ne sont pas des projets disjoints, mais les pièces d’un dispositif où la dialectique fournit les matériaux que la science organise sous forme démonstrative. ====Ce qu’il faut retenir==== Les ''Seconds Analytiques'' développent la théorie de la science démonstrative. La science est connaissance par les causes, certaine et nécessaire ; la démonstration est le syllogisme qui la produit, à six conditions ; le moyen terme est la cause. Les principes (axiomes, hypothèses, définitions) ne sont pas démontrables, et chaque science a son genre propre (interdiction de la ''metabasis''). La connaissance des principes procède par induction sensorielle et culmine dans l’intellect (''nous''). La démonstration s’entend mieux, selon une lecture contemporaine, comme forme du savoir constitué que comme méthode heuristique de découverte. ===Chapitre V. ''Les Topiques'' : l’art de la dialectique=== ====La dialectique : définition et statut==== Les ''Topiques'' constituent, selon l’hypothèse défendue notamment par Brunschwig, le traité chronologiquement parmi les plus anciens de l’''Organon'' (bien que l’arrangement andronicien l’ait relégué à la fin). Ils sont consacrés à l’art de la dialectique (''dialektikê''), c’est-à-dire à la pratique de la discussion réglée entre deux interlocuteurs. Aristote distingue dès le premier chapitre du livre I trois types de raisonnement selon la nature de leurs prémisses. Le syllogisme démonstratif part de prémisses ''vraies et premières'', ou de prémisses qui sont elles-mêmes connues par des prémisses vraies et premières : c’est l’objet des ''Seconds Analytiques''. Le syllogisme dialectique part de prémisses qui sont des opinions valables (''endoxa''), c’est-à-dire « des opinions qui sont admises par tous, ou par la plupart, ou par les sages, et parmi les sages, par tous, ou par la plupart, ou par les plus connus et les plus reconnus ».<ref>Aristote, ''Topiques'' I, 1, 100a29-b23.</ref> Le syllogisme éristique ou sophistique, enfin, part de prémisses qui ''paraissent'' être des opinions valables sans l’être réellement : c’est l’objet des ''Réfutations sophistiques''. La distinction entre démonstration et dialectique n’est pas une distinction de ''forme'' (les deux sont des syllogismes au sens des ''Premiers Analytiques'') mais de ''matière'' : ce qui les distingue, c’est la nature des prémisses qu’elles utilisent. Cette différence a néanmoins des conséquences importantes. La démonstration vise la connaissance scientifique ; la dialectique vise une argumentation rationnelle dans les domaines où la certitude scientifique n’est pas accessible, c’est-à-dire la grande majorité des domaines de la pensée et de la vie humaine. ====La structure du débat dialectique==== Le débat dialectique aristotélicien possède une structure formellement très précise. Comme l’a montré Brunschwig dans son introduction à l’édition des ''Topiques'' (Belles Lettres), il met en présence deux protagonistes : le questionneur et le répondant. Le répondant (en grec, ''apokrinomenos'') commence par défendre une thèse, c’est-à-dire une proposition à laquelle il s’engage. Cette thèse peut être affirmative ou négative ; le répondant est libre de la choisir. Une fois la thèse posée, son rôle consiste à la ''défendre'' contre les attaques du questionneur, en accordant ou en refusant les prémisses que celui-ci lui propose. Le questionneur (en grec, ''erôtôn'') a la tâche la plus lourde : il doit, écrit Brunschwig, « construire une argumentation formellement contraignante, ayant pour prémisses des propositions auxquelles le répondant ne puisse refuser son assentiment, et pour conclusion la proposition contradictoire de celle que soutient le répondant ».<ref>Brunschwig, J., introduction à Aristote, ''Topiques'' (livres I-IV), Les Belles Lettres, 1967, rééd. 2007, p. XXXVIII.</ref> Autrement dit, le questionneur doit ''réfuter'' la thèse du répondant en tirant, à partir de prémisses que le répondant ne peut refuser, la contradictoire de cette thèse. Cette structure n’est pas un simple jeu : elle est le modèle aristotélicien du débat rationnel. Toute discussion philosophique sérieuse, toute confrontation intellectuelle où l’on cherche à éprouver la solidité d’une opinion, peut être analysée selon ce modèle. Et la fonction des ''Topiques'' est de fournir au questionneur (et secondairement au répondant) un manuel pratique pour mener ce type de discussion avec efficacité. ====Les quatre prédicables==== Avant de présenter les ''topoi'' eux-mêmes, Aristote introduit, au livre I, une distinction importante : celle des quatre prédicables. Quand on attribue un prédicat à un sujet, on peut le faire de quatre manières. Par accident (''sumbebêkos''), le prédicat n’est ni essentiel au sujet ni de même extension que lui : « Socrate est blanc » ; « blanc » est un accident de Socrate, qui peut être remplacé par un autre attribut sans que Socrate cesse d’être Socrate. Par genre (''genos''), le prédicat est essentiel au sujet mais d’une extension plus large que lui : « Socrate est animal » ; « animal » est le genre auquel appartient l’espèce « homme », et Socrate, en tant qu’homme, hérite de tout ce qui appartient à l’animal. Par propre (''idion''), le prédicat n’est pas essentiel au sujet mais lui est coextensif (il s’applique à tout le sujet et seulement à lui) : « L’homme est rieur » ; être rieur n’entre pas dans la définition de l’homme, mais tout homme est rieur et tout rieur est homme. Par définition (''horos''), enfin, le prédicat est à la fois essentiel et coextensif au sujet : « L’homme est animal raisonnable » ; la définition exprime l’essence de manière exhaustive, en composant le genre et la différence spécifique. Cette classification fournit un cadre pour organiser les ''topoi''. Les livres II et III des ''Topiques'' sont consacrés aux topoi de l’accident, le livre IV aux topoi du genre, le livre V à ceux du propre, les livres VI et VII à ceux de la définition. Pour chaque type de prédication, on dispose d’arguments qui permettent soit de l’établir soit de la réfuter. Pour démontrer qu’un prédicat est ''accidentel'' à un sujet, par exemple, on n’utilisera pas les mêmes outils que pour démontrer qu’il en constitue le ''genre'' : la stratégie argumentative dépend du type de relation prédicative qu’on cherche à établir ou à contester. Cette classification aristotélicienne en quatre prédicables sera reprise par Porphyre dans son ''Isagoge'' (introduction aux ''Catégories''), qui en proposera une version à cinq prédicables (genre, espèce, différence, propre, accident). La version à cinq prédicables, qu’on appelle souvent les « cinq voix de Porphyre », a dominé la tradition logique médiévale ; mais le découpage proprement aristotélicien est bien celui à quatre prédicables. ====Les ''topoi'' : qu’est-ce qu’un lieu commun ?==== Le mot grec ''topos'' signifie « lieu », et l’''Aristoteles-Handbuch'' explique l’image : comme un général doit identifier le « lieu » à partir duquel attaquer son adversaire, le dialecticien doit identifier les ''lieux'' d’argumentation à partir desquels il pourra construire ses prémisses. Aristote ne donne nulle part une définition précise du ''topos'', mais on peut le caractériser comme un schéma général d’argumentation sous lequel tombent plusieurs arguments concrets. Un exemple permet de saisir : le topos du plus et du moins (II, 10). Si ce qui est plus susceptible d’appartenir à quelque chose ne lui appartient pas, ce qui l’est moins ne lui appartiendra pas non plus. À partir de ce schéma général, on peut construire une multitude d’arguments concrets : si même la mer ne te paraît pas froide, comment l’eau de la rivière le serait-elle ? si même Socrate, qui est sage, ne sait pas la solution, comment quelqu’un de moins sage la saurait-il ? Le ''topos'' n’est pas un argument particulier, c’est une matrice qui permet d’engendrer des arguments adaptés à chaque cas. Aristote présente, dans les ''Topiques'', plusieurs centaines de ''topoi''. Le projet est moins celui d’une théorie systématique que celui d’un manuel pratique : on y trouve des conseils stratégiques (livre VIII) sur la manière de poser les questions, de cacher ses intentions, d’amener progressivement le répondant à accorder les prémisses dont on a besoin. ====Les trois utilités de la dialectique==== Aristote précise, au chapitre 2 du livre I, à quoi sert la dialectique. Il distingue trois utilités. La première est l’entraînement intellectuel (''gymnasia'') : le débat dialectique est un exercice qui forme l’esprit, comme le sport forme le corps ; il habitue à formuler clairement ses idées, à anticiper les objections, à raisonner rapidement. La deuxième concerne les rencontres avec autrui : pour discuter efficacement avec ceux qui n’ont pas reçu de formation philosophique (« les Plusieurs »), il faut pouvoir argumenter à partir de leurs propres opinions, c’est-à-dire à partir des ''endoxa''. La dialectique fournit les outils pour ce type de discussion. La troisième utilité concerne les sciences philosophiques elles-mêmes ; c’est la plus importante et la plus subtile. Aristote affirme que la dialectique permet d’examiner ''critiquement'' (''peirastikê'') les principes des sciences, en confrontant les opinions opposées. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. Cette méthode est mise en œuvre par Aristote lui-même dans la quasi-totalité de ses traités : il commence presque toujours par exposer les opinions de ses prédécesseurs (les ''endoxa''), il en montre les insuffisances et les contradictions (les ''aporiai''), et il dégage progressivement sa propre position en cherchant à ''préserver'' ce qui était vrai dans les opinions reçues tout en évitant leurs erreurs. Cette troisième utilité a un poids philosophique particulier. Elle implique que la dialectique n’est pas seulement un instrument de discussion publique, mais un instrument de recherche philosophique. Elle permet d’aborder les principes que la science démonstrative ne peut pas elle-même fonder : comme l’écrit Aristote en ''Topiques'' I, 2, les principes des sciences ne peuvent être tirés des sciences elles-mêmes (puisque les principes sont premiers dans chaque science), mais ce sont seulement les ''endoxa'' qui peuvent y conduire. La dialectique, par son examen critique des opinions reçues, fournit un chemin vers les principes ; chemin qui ne remplace pas l’intuition intellectuelle (''nous'') mais qui la prépare et l’éclaire. L’''Aristoteles-Handbuch'' formule cette idée de la manière suivante : l’argumentation à partir des ''endoxa'', exercée dans la dialectique, ouvre la seule voie vers la consolidation argumentative des principes, quand bien même ceux-ci auraient été d’abord saisis par voie inductive et noétique. La dialectique aristotélicienne n’est pas une simple sous-discipline de la logique : elle est un mode d’accès à la vérité qui complète la démonstration par le bas (en approchant les principes) et la science par le haut (en discutant leurs présupposés). ====Ce qu’il faut retenir==== Les ''Topiques'' codifient l’art du débat dialectique entre questionneur et répondant. Le syllogisme dialectique part de prémisses simplement probables (''endoxa'') et non de prémisses vraies. Aristote distingue quatre prédicables (accident, genre, propre, définition) qui organisent les centaines de ''topoi'' du traité. La dialectique a trois utilités : entraînement intellectuel, discussion avec autrui, recherche philosophique. Cette dernière utilité est philosophiquement importante : elle permet d’approcher les principes que la science démonstrative présuppose sans pouvoir les fonder. ===Chapitre VI. ''Les Réfutations sophistiques'' : les paralogismes et leur démasquage=== ====Le projet des ''Réfutations sophistiques''==== Les ''Réfutations sophistiques'' (''Peri sophistikôn elenchôn'') sont parfois considérées comme un appendice (ou même comme un neuvième livre) des ''Topiques''. Leur projet est complémentaire : alors que les ''Topiques'' enseignent à construire des syllogismes dialectiques ''valides'', les ''Réfutations sophistiques'' étudient les syllogismes qui ''paraissent'' valides sans l’être. Aristote y entreprend une typologie systématique des paralogismes (raisonnements fallacieux) pour permettre au dialecticien de les détecter et de les démasquer. L’''Aristoteles-Handbuch'' précise le projet : il s’agit pour Aristote de fournir une analyse critique de la pratique argumentative des sophistes. Le sophiste est, pour Aristote (à la suite de Platon), celui qui « se donne l’apparence de la sagesse sans l’être réellement » et qui « gagne son argent avec l’apparence de la sagesse ». Pour produire cette apparence, le sophiste utilise des paralogismes, c’est-à-dire des raisonnements qui ressemblent à des syllogismes valides sans en être réellement. ====Les six sophismes liés au langage==== Aristote distingue treize types de sophismes, qu’il classe en deux catégories. Six dépendent du langage (''para tên lexin''), sept en sont indépendants.<ref>Aristote, ''Réfutations sophistiques'' 4, 165b23-166b19. Voir Dorion, L.-A., ''Les Réfutations Sophistiques d’Aristote'', Paris, Vrin, 1995.</ref> Les six sophismes liés au langage sont d’abord l’''homonymie'', qui exploite l’ambiguïté d’un mot ayant plusieurs sens : « Le chien aboie ; or la canicule est un chien (en grec, ''kuôn'' signifie à la fois le chien et la constellation du Chien) ; donc la canicule aboie. » Vient ensuite l’''amphibologie'', qui repose sur l’ambiguïté syntaxique d’une phrase : « Je veux que vous capturiez les ennemis » peut signifier « je veux que ce soit vous qui capturiez les ennemis » ou « je veux que les ennemis soient capturés par vous ». Le sophisme de la ''composition'' consiste à confondre un sens où plusieurs termes sont pris ensemble et un sens où ils sont pris séparément. L’exemple d’Aristote : « Il est possible de se tenir debout pendant qu’on est assis » peut signifier soit qu’il est possible d’être à la fois assis et debout au même moment (sens composé, faux), soit qu’il est possible, pour quelqu’un actuellement assis, de se tenir debout à un autre moment (sens divisé, vrai). Le sophisme de la ''division'' procède à la confusion inverse, en prenant séparément ce qui doit être pris ensemble. Le sophisme de l’''accentuation'' joue sur une ambiguïté qui repose sur la prononciation, l’accent ou la quantité des syllabes. Enfin, le sophisme de la ''forme de l’expression'' confond des expressions qui ont la même forme grammaticale mais relèvent de catégories différentes : on peut par exemple traiter « courir » comme s’il désignait une qualité quand il désigne en réalité une action. ====Les sept sophismes hors du langage==== Les sept sophismes qui ne dépendent pas du langage sont les suivants. Le sophisme de l’''accident'' confond ce qui est attribué à un sujet de manière essentielle et ce qui ne lui est attribué que de manière accidentelle. L’exemple classique d’Aristote : « Coriskos est différent de Socrate ; or Socrate est un homme ; donc Coriskos est différent d’un homme. » Le paralogisme consiste à transférer la différence entre Coriskos et Socrate (en tant qu’individus) à la relation entre Coriskos et l’humanité, comme si le fait que Socrate soit un homme rendait toute différence d’avec Socrate une différence d’avec l’humanité. Le ''passage du qualifié à l’absolu'' (''secundum quid'') confond ce qui est vrai sous un certain rapport et ce qui est vrai absolument : « L’Éthiopien est blanc des dents ; donc l’Éthiopien est blanc. » L’''ignorance de la réfutation'' (''ignoratio elenchi'') consiste à produire une réfutation qui ne réfute pas vraiment la thèse adverse, parce qu’elle ne porte pas exactement sur la même chose, ou ne respecte pas les conditions de la véritable contradiction. La ''pétition de principe'' (''petitio principii'') suppose dans les prémisses ce qu’on prétend démontrer dans la conclusion. Le ''faux enchaînement'' consiste à prendre pour cause ce qui n’est pas la cause. C’est le sophisme du ''non causa pro causa'', particulièrement répandu dans les ''reductio ad impossibile'' mal conduits. La ''prise de l’antécédent comme conséquent'' infère « si A alors B ; or B ; donc A » (qui est formellement invalide). L’''Aristoteles-Handbuch'' en donne un exemple éclairant : si l’interlocuteur a admis que la terre est mouillée, le sophiste en conclut faussement qu’il a plu ; il a tacitement renversé la véritable relation de conséquence (« s’il a plu, la terre est mouillée ») en la pseudo-relation (« si la terre est mouillée, il a plu »). La ''réunion de plusieurs questions en une'', enfin, consiste à poser une question complexe (« Avez-vous cessé de battre votre femme ? ») où une réponse unique implique des concessions sur plusieurs points distincts. ====La réduction à l’''ignoratio elenchi''==== Un point important, souvent négligé, est qu’Aristote affirme, au chapitre 6 des ''Réfutations'', que tous les treize types de sophismes peuvent être ramenés à un seul : l’ignorance de la réfutation (''ignoratio elenchi''). Pour chacune des treize espèces, la cause de la tromperie peut être analysée comme une méconnaissance de ce qu’est une véritable réfutation. Une réfutation authentique exige que le syllogisme conclue à la ''contradictoire exacte'' de la thèse adverse, c’est-à-dire qu’il porte sur le même sujet, sous le même rapport, dans le même sens des termes, etc. Les sophismes manquent toujours, d’une manière ou d’une autre, à l’une de ces conditions : ils produisent une apparente contradiction qui n’est pas une véritable contradiction. C’est pourquoi la définition rigoureuse de la contradiction (que le ''De interpretatione'' avait déjà élaborée) est la clef de la détection de tous les paralogismes. ====Logique et défense de la rationalité==== Au-delà de son utilité technique, l’étude des sophismes a une portée philosophique propre. Elle implique qu’il existe des règles objectives du raisonnement correct, indépendantes de l’habileté rhétorique de celui qui argumente. Cette thèse a été souvent lue, dans la tradition interprétative, comme une réponse au relativisme attribué aux sophistes (relativisme dont Protagoras est le représentant emblématique). Une partie de la recherche contemporaine nuance cependant cette lecture. Comme l’a montré L.-A. Dorion dans son étude sur la dialectique aristotélicienne, la « réponse aux sophistes » n’est pas un combat frontal contre des adversaires identifiés, mais une délimitation du domaine de la science par rapport à celui de l’argumentation persuasive. Aristote ne prétend pas réfuter le sophiste ; il prétend établir les conditions minimales pour qu’un discours rationnel soit possible. Comme dans la défense du principe de non-contradiction au livre Γ de la ''Métaphysique'', il s’agit moins de démontrer une thèse que de montrer que toute pensée présuppose certains principes faute de quoi elle s’effondre dans l’inintelligibilité. C’est en ce sens que les ''Réfutations sophistiques'' ne sont pas un appendice mineur, mais une pièce nécessaire de l’''Organon'' : elles défendent la rationalité elle-même contre ses propres dégradations possibles. La logique aristotélicienne n’est pas seulement une théorie du raisonnement valide ; elle est aussi une éthique du raisonnement, qui distingue la recherche honnête de la vérité de la manipulation rhétorique des esprits. ====Ce qu’il faut retenir==== Les ''Réfutations sophistiques'' classent treize types de paralogismes (six liés au langage, sept indépendants du langage) et les ramènent tous à un seul, l’ignorance de la réfutation. Le traité défend les conditions minimales du discours rationnel et complète, par leur démasquage, la théorie du raisonnement valide exposée dans les autres traités de l’''Organon''. ===Conclusion. Postérité et lectures contemporaines de l’''Organon''=== ====Continuités et transformations==== L’''Organon'' a fourni, pendant deux millénaires, le modèle dominant de la rationalité occidentale. Les ''Éléments'' d’Euclide, avec leur méthode axiomatique-déductive, ont été lus dans la tradition comme un exemple privilégié d’organisation déductive du savoir, en consonance avec l’idéal aristotélicien de science (sans qu’il faille pour autant supposer qu’Euclide ait composé son ouvrage en application directe du programme aristotélicien). La théologie scolastique médiévale, des grands commentateurs arabes (Al-Farabi, Avicenne, Averroès) à Thomas d’Aquin, a fait du syllogisme et de la démonstration les instruments fondamentaux de la pensée rationnelle. Les universités européennes, jusqu’au XVII{{e}} siècle, ont enseigné la logique sur la base des traités aristotéliciens. La révolution scientifique moderne a ébranlé cet édifice. Bacon, dans le ''Novum Organum'' (1620, dont le titre même est un défi à Aristote), dénonce la stérilité de la logique syllogistique : elle ne fait que tirer ce qu’on a déjà mis dans les prémisses, elle ne produit pas de connaissance nouvelle. Descartes, dans le ''Discours de la méthode'', reproche au syllogisme de servir « plutôt à expliquer à autrui les choses qu’on sait, ou même à parler sans jugement de celles qu’on ignore, qu’à les apprendre ». La science moderne, avec son recours à l’expérimentation, à l’hypothèse provisoire, à la méthode hypothético-déductive, semble s’écarter résolument du modèle aristotélicien. Cette rupture, longtemps présentée comme totale, est aujourd’hui nuancée par la recherche contemporaine. Comme le rappelle Pellegrin, la transition vers la science moderne combine continuités, relectures et oppositions plutôt qu’une opposition unilatérale. Les scolastiques tardifs (Zabarella, Pacius) avaient déjà élaboré, à l’intérieur du cadre aristotélicien, des distinctions méthodologiques (entre démonstration ''quia'' et démonstration ''propter quid'', entre méthode résolutive et méthode compositive) qui annoncent les analyses modernes. ====Les apports durables de la logique aristotélicienne==== Quelles que soient les critiques adressées à la logique aristotélicienne, son apport historique reste considérable. Premièrement, Aristote a établi pour la première fois les règles de la déduction valide. Il a distingué clairement la ''forme'' du raisonnement (qui détermine sa validité) de sa ''matière'' (qui détermine la vérité de ses prémisses). Cette distinction, qui paraît aujourd’hui évidente, a constitué un acquis durable de la philosophie. Deuxièmement, Aristote a montré la nécessité des principes premiers. Toute chaîne de justification doit s’arrêter quelque part, faute de quoi elle régresse à l’infini ou se mord la queue. Cette analyse du « trilemme d’Agrippa » avant l’heure est l’une des contributions les plus profondes des ''Seconds Analytiques'' à la théorie de la connaissance. Troisièmement, sa conception de l’explication scientifique comme connaissance des causes (''hoti'' contre ''dioti'') continue de nourrir la réflexion contemporaine en philosophie des sciences. Les analyses contemporaines de l’explication scientifique (Hempel, Salmon, Woodward) peuvent être mises en dialogue avec les distinctions aristotéliciennes. Quatrièmement, sa logique modale, longtemps négligée, a connu un renouveau avec le développement des logiques modales contemporaines (Kripke, Hintikka). La distinction entre modalité ''de dicto'' et ''de re'', déjà esquissée chez Aristote selon Patterson, est au cœur des débats actuels en métaphysique modale. Cinquièmement, sa réflexion sur les futurs contingents a inspiré toute une famille de logiques non classiques (Łukasiewicz, Prior, logiques temporelles) qui formalisent l’idée d’une suspension de la bivalence pour les énoncés sur l’avenir. ====Aristote dans la philosophie analytique contemporaine==== La philosophie analytique du XX{{e}} siècle, après une longue phase de scepticisme à l’égard de la logique aristotélicienne (Russell, dans ses premiers travaux, jugeait la syllogistique aristotélicienne sans intérêt logique réel), a redécouvert la richesse de l’''Organon''. Les travaux de Łukasiewicz, Patzig, Lear, Patterson, Crivelli, Malink, Bronstein, Harari ont rendu à la logique aristotélicienne sa profondeur conceptuelle. Plusieurs lignes de recherche méritent d’être signalées. La première concerne les rapports entre logique et métaphysique chez Aristote. Comme le montrent Patterson pour la logique modale et Harari pour la théorie de la démonstration, la logique aristotélicienne n’est pas une logique formelle abstraite, mais une logique ancrée dans une métaphysique des essences, des substances et des causes. Cette articulation, longtemps tenue pour une faiblesse, apparaît aujourd’hui comme une originalité féconde, en consonance avec les essentialismes contemporains (Kripke, Putnam, Fine). La deuxième concerne les rapports entre dialectique et science. Pellegrin, Brunschwig, Berti, Crubellier ont montré que la dialectique aristotélicienne n’est pas une simple discipline subordonnée à la science, mais un mode d’accès à la vérité qui complète la démonstration et qui prépare la saisie des principes. Cette réhabilitation de la dialectique a des résonances avec les approches contemporaines de l’épistémologie, qui reconnaissent le rôle des présuppositions, des controverses et de la discussion dans l’élaboration des connaissances. La troisième concerne les rapports entre langage, pensée et réalité. Le triangle sémiotique du ''De interpretatione'', la doctrine des catégories comme genres de l’être, l’analyse de la prédication, ont été réexaminés par la philosophie analytique du langage et par l’ontologie contemporaine. ====Bilan==== L’''Organon'' d’Aristote n’est pas un monument figé : c’est un ensemble vivant de questions, de distinctions et d’arguments qui continue de nourrir la pensée philosophique. Sa lecture exige une triple attention : à la ''lettre'' du texte, qui est souvent dense et elliptique ; à la ''tradition'' interprétative, qui en a sédimenté les significations ; et à la ''recherche contemporaine'', qui en renouvelle les enjeux. C’est par cette triple attention que l’''Organon'' peut être restitué dans sa fécondité, comme l’œuvre d’un penseur qui, plus de vingt-trois siècles après sa mort, continue de nous apprendre comment penser. == La philosophie de la nature == === Introduction générale : qu'est-ce que la « philosophie de la nature » chez Aristote ? === Avant d'entrer dans le détail des doctrines, il convient de poser ce que recouvre, chez Aristote, l'expression de « philosophie de la nature ». Le malentendu est en effet grand pour le lecteur moderne, habitué à entendre par « physique » une science mathématisée des phénomènes matériels, héritière de Galilée et de Newton. Or la ''phusikê'' aristotélicienne ne procède ni par mathématisation des phénomènes, ni par expérimentation provoquée. Elle se présente comme une enquête conceptuelle sur les êtres qui possèdent en eux-mêmes un principe interne de mouvement et de repos, ce qu'Aristote appelle les ''phusei onta'' ou « êtres par nature »<ref>Aristote, ''Physique'', II, 1, 192b13-23. Pour une introduction d'ensemble : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012, partie III ; Andrea Falcon, ''Aristotle and the Science of Nature : Unity Without Uniformity'', Cambridge, Cambridge University Press, 2005.</ref>. Cette enquête forme un ensemble cohérent qui s'organise selon une hiérarchie de généralité. La ''Physique'' en huit livres pose les principes les plus généraux : la définition même de la nature, des causes, du mouvement, du temps, du lieu, de l'infini ; le livre VIII conduit, par voie de raisonnement, à un principe immobile du mouvement<ref>Aristote, ''Physique'', VIII, 1-10 ; sur l'unité du livre VIII et sa relation avec la ''Métaphysique'' Λ, voir Sarah Broadie, « Que fait le premier moteur d'Aristote ? », ''Revue philosophique de la France et de l'étranger'', 1993, et l'article « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Le ''De caelo'' ou ''Du ciel'' descend d'un degré et étudie le cosmos dans sa structure générale : la sphère céleste et son cinquième élément, la Terre au centre du monde, les quatre éléments sublunaires et leurs mouvements naturels. Le ''De generatione et corruptione'' poursuit en examinant les transformations mutuelles des éléments et la naissance des corps composés. Les ''Météorologiques'' étudient tous les phénomènes qui se produisent entre la Terre et la sphère lunaire : pluie, vents, comètes, tremblements de terre, mers et fleuves. Le ''De anima'' traite enfin de l'âme comme principe des êtres vivants, et les ''Parva naturalia'' développent les fonctions vitales particulières (sensation, mémoire, sommeil, longévité, respiration). La biologie d'Aristote (''Histoire des animaux'', ''Parties des animaux'', ''Génération des animaux'', ''Mouvement des animaux'') constitue le sommet appliqué de cet édifice, mais elle a fait l'objet d'un commentaire séparé qui n'est pas repris ici. Comme le souligne Pierre-Marie Morel dans son introduction au volume ''Aristote et la notion de nature'', la recherche contemporaine prête une attention renouvelée aux différents aspects de la philosophie aristotélicienne de la nature comme science et à sa place, centrale, dans l'ensemble du système<ref name="morel">Pierre-Marie Morel (éd.), ''Aristote et la notion de nature : Enjeux épistémologiques et pratiques'', Bordeaux, Presses Universitaires de Bordeaux, 1997, introduction.</ref>. La ''phusis'' n'est pas chez Aristote un domaine régional : elle constitue le paradigme à partir duquel se pense l'unité du réel, ce que confirme le fait que la métaphysique elle-même, dans les livres centraux, prenne pour modèle d'analyse la substance naturelle. Comme le rappelle encore Morel, reconnaître l'unité première du concept de ''phusis'' permet d'en apprécier la polysémie et la portée, en adoptant une pluralité d'approches<ref name="morel" />. L'intérêt philosophique de l'entreprise dépasse son intérêt historique. La philosophie de la nature aristotélicienne offre un modèle d'intelligibilité non réductionniste : elle prend les phénomènes au sérieux dans leur complexité propre, refuse de les ramener à un substrat homogène, et reconnaît à chaque niveau de réalité ses principes propres. Cette posture explique le retour contemporain à Aristote dans des domaines aussi divers que la philosophie de la biologie, la philosophie de l'esprit ou l'éthique des vertus<ref>Sur l'actualité de la philosophie naturelle d'Aristote, voir Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', Cambridge, Cambridge University Press, 2010, ainsi que James G. Lennox, ''Aristotle's Philosophy of Biology'', Cambridge, Cambridge University Press, 2001.</ref>. === Première partie. La ''Physique'' : les principes du mouvement et du changement === ==== Chapitre I. La nature (''phusis'') comme principe interne de mouvement ==== ===== 1.1. Le texte fondateur : ''Physique'' II, 1 ===== C'est au début du livre II de la ''Physique'' qu'Aristote livre sa définition canonique de la nature : « la nature est principe et cause de mouvement et de repos pour la chose en laquelle elle se trouve immédiatement, par soi et non par accident »<ref>Aristote, ''Physique'', II, 1, 192b21-23. Pour une analyse détaillée du chapitre, voir William Charlton, ''Aristotle's Physics, Books I and II'', Oxford, Clarendon Press, 1992, p. 88-92, ainsi que les essais réunis par Lindsay Judson, ''Aristotle's Physics : A Collection of Essays'', Oxford, Clarendon Press, 1991.</ref>. Cette formule, d'apparence simple, contient en germe toute la philosophie de la nature aristotélicienne. Il faut en peser chaque mot. « Principe et cause » : la nature n'est pas une chose, mais un ''principe'', c'est-à-dire un point de départ, une source intelligible des phénomènes. Elle est « cause » au sens où Aristote distingue quatre types de causalité, sur lesquels nous reviendrons. « De mouvement et de repos » : la ''kinêsis'' aristotélicienne ne se restreint pas au déplacement local, mais englobe toutes les formes de changement : génération, corruption, croissance, altération, déplacement. Le repos n'en est pas le simple contraire ; il est l'état d'achèvement où la nature se trouve enfin pleinement actualisée, ou l'état précaire d'un être qui ne peut plus changer. « Pour la chose en laquelle elle se trouve immédiatement » : ce qui est par nature porte en soi son principe de changement. Une plante ne croît pas parce qu'on la pousse à croître, mais parce qu'elle possède en elle-même la capacité de croître. Les graines, à condition de trouver les éléments matériels nécessaires, deviennent par elles-mêmes des arbres. « Par soi et non par accident » : un médecin peut, certes, se soigner lui-même ; mais il le fait alors « par accident », au sens où ce n'est pas en tant que médecin (en tant que possédant son art à l'extérieur de soi) qu'il se soigne, mais en tant que matière passible de l'art médical. Au contraire, un être naturel se modifie de l'intérieur, en vertu de ce qu'il est essentiellement. ===== 1.2. L'opposition naturel / artificiel ===== L'exemple classique du lit éclaire cette définition. Si l'on plante en terre un lit en bois et qu'il en sorte quelque chose, ce sera du bois (un rejeton naturel issu de la matière du lit), non un autre lit<ref>Aristote, ''Physique'', II, 1, 193a12-17.</ref>. Le bois, en effet, possède en lui-même un principe de croissance ; le lit, en revanche, n'est qu'un agencement extérieur imposé par l'art du menuisier. Cet exemple, qu'Aristote reprend de manière insistante, ne vise pas à dévaloriser l'art (la ''technè'' a une dignité propre) mais à délimiter avec netteté le champ de la nature. Dans les ''phusei onta'', le principe du mouvement est intérieur ; dans les artefacts, il est extérieur. Cette distinction commande l'autonomie de la science physique : si tous les changements étaient l'effet de causes externes (un démiurge, des Idées séparées), il n'y aurait pas de physique au sens propre, mais une cosmologie théologique. La physique aristotélicienne ne nie pas l'existence d'un principe immobile (le livre VIII y conduira inéluctablement), mais elle commence par reconnaître la consistance propre du domaine naturel. ===== 1.3. L'homologie nature / art et la formule « l'art imite la nature » ===== Aristote n'oppose toutefois pas brutalement nature et art. Une homologie subtile les rapproche : tous deux produisent des choses, tous deux mettent en œuvre des fins, tous deux articulent matière et forme. C'est pourquoi la formule fameuse « l'art imite la nature » (''hê technê mimeitai tên phusin'') peut, sans paradoxe, faire de la ''phusis'' le modèle de toute ''technè''<ref>Aristote, ''Physique'', II, 8, 199a15-17. La formulation complète distingue deux fonctions de l'art par rapport à la nature : l'achèvement et l'imitation.</ref>. La formule complète d'Aristote est d'ailleurs plus nuancée : « l'art tantôt achève ce que la nature est incapable de mener à terme, tantôt l'imite ». L'art n'est donc pas pure imitation, mais collaboration et continuation de la nature. L'analyse fine de cette formule, comme le montre Alain Petit dans le volume Morel<ref>Alain Petit, « Forme et nature, ou comment l'art imite la nature », dans P.-M. Morel (éd.), ''Aristote et la notion de nature'', op. cit., p. 51-66.</ref>, soulève une difficulté centrale : Aristote prête-t-il à la nature une finalité « objective », sur le modèle d'une démiurgie cachée, ou bien la « ressemblance » de l'art et de la nature signifie-t-elle simplement que la nature, en tant qu'elle s'achemine régulièrement vers un état d'achèvement, présente une intelligibilité analogue à celle de l'art ? Les commentateurs récents ont insisté sur le caractère non-intentionnel de la téléologie aristotélicienne : la nature ne se ''propose'' pas une fin, comme un artisan se proposerait de fabriquer une statue ; elle s'achemine vers un état d'achèvement qui ''est'' sa fin. Cette précision importe pour le lecteur moderne : ne projetons pas sur Aristote une « finalité divine » externe, comme celle du Dieu artisan platonicien du ''Timée''. Chez Aristote, la finalité est immanente à chaque être ; elle s'identifie à sa forme et coïncide, dans l'achèvement, avec elle. Comme l'écrit Morel, « la nature ne tend pas seulement vers une fin, elle réalise une fin »<ref name="morel" />, mais elle la réalise sans représentation, sans visée intentionnelle, par sa seule structure interne. ===== 1.4. La nature : forme ou matière ? ===== ''Physique'' II, 1 pose une autre question : faut-il identifier la nature à la matière (comme le voulaient les premiers physiologues, Thalès, Anaximène, Héraclite) ou à la forme ? Aristote tranche en faveur de la forme, mais n'élimine pas la matière. Il y a deux raisons à cela. D'une part, la matière est ce qui sous-tend (''hupokeimenon'') tout changement : sans matière, pas de génération possible. La matière est principe au sens où elle est cette part d'indétermination grâce à laquelle un être peut devenir autre. D'autre part, et plus profondément, la nature comme principe est davantage la forme que la matière, car c'est la forme qui définit ce qu'une chose ''est'' et vers quoi elle s'achemine. La graine n'est pas pleinement la nature du chêne ; le chêne adulte, qui réalise pleinement sa forme spécifique, l'est davantage. Comme l'indique Aristote, « la nature entendue comme devenir est un passage à la nature en tant que telle » (''hê phusis hê legomenê hôs genesis hodos estin eis phusin'')<ref>Aristote, ''Physique'', II, 1, 193b12-13.</ref>. Le devenir est mouvement ''vers'' la nature pleinement réalisée. Cette tension entre nature comme forme et nature comme processus fait toute la richesse de la notion. Elle commande aussi l'organisation des recherches ultérieures. Si la nature était simple matière, il faudrait s'en tenir à un examen quantitatif. Si elle était pure forme, il faudrait s'en tenir à un examen logique des essences. Mais parce qu'elle est forme ''en train de se réaliser dans la matière'', la science physique requiert une articulation des deux points de vue. ===== 1.5. La nature, principe « passif » de mouvement ? ===== Bernard Besnier a soulevé, dans le volume Morel, une question subtile mais qui pèse lourd dans l'économie du système : si la nature est principe de mouvement, est-elle pour autant l'agent du mouvement ? Une lecture rapide laisserait croire que tout être naturel est ''automoteur'', c'est-à-dire qu'il se meut lui-même. Mais Aristote refuse cette conséquence : les êtres naturels ne se meuvent pas tous eux-mêmes, et notamment les éléments simples ne se meuvent pas eux-mêmes (un caillou ne décide pas de tomber). D'où la suggestion de Besnier : la nature serait principe ''passif'' de mouvement, c'est-à-dire principe par lequel un être est ''susceptible'' de subir tel ou tel mouvement conforme à sa nature, lorsqu'un agent extérieur le met en branle<ref>Bernard Besnier, « La nature comme principe passif de mouvement », dans P.-M. Morel (éd.), ''Aristote et la notion de nature'', op. cit., p. 27-49.</ref>. Le caillou, par sa nature, ''est apte à'' tomber ; quand on retire ce qui le retenait, il tombe. Cette lecture, qui sauve la cohérence avec le principe « tout ce qui est mû est mû par autre chose » (livre VII), explique aussi pourquoi la définition aristotélicienne du mouvement, au livre III, recourt aux concepts d'acte et de puissance plutôt qu'à celui de simple agent. ==== Chapitre II. Les principes du devenir : substrat, forme, privation ==== ===== 2.1. Le programme de ''Physique'' I ===== Avant de définir le mouvement, Aristote consacre le livre I de la ''Physique'' à élucider les principes du devenir. La question est ancienne : depuis Parménide, qui niait toute génération au nom du principe que rien ne saurait venir du non-être, la philosophie grecque butait sur l'aporie du changement. Aristote ne cherche pas à réfuter Parménide par l'expérience (ce serait, dit-il, comme tenter de prouver à un aveugle l'existence des couleurs) : Parménide se place hors du domaine de la physique. Il s'agit plutôt de montrer que la notion de changement est cohérente, dès lors qu'on distingue convenablement ses principes<ref>Aristote, ''Physique'', I, 2, 184b25-185a20. Pour une discussion approfondie, voir le volume collectif Katerina Ierodiakonou, Paul Kalligas et Vassilis Karasmanis (éd.), ''Aristotle's Physics Alpha : Symposium Aristotelicum'', Oxford, Oxford University Press, 2019.</ref>. L'analyse aristotélicienne, déployée aux chapitres 6 à 9 du livre I, identifie trois principes pour rendre compte de tout changement : le substrat (''hupokeimenon''), la forme (''morphê'' ou ''eidos'') et la privation (''sterêsis''). Lorsqu'un homme devient musicien, c'est l'homme qui est le substrat ; la musicalité est la forme acquise ; et la non-musicalité antérieure est la privation. Sans le substrat, on ne pourrait dire « cet homme est devenu musicien » : il n'y aurait que substitution, et non changement véritable. Sans la privation, la forme nouvelle ne serait pas « nouvelle ». Sans la forme, il n'y aurait rien de gagné. ===== 2.2. Comment échapper à Parménide ===== La force de cette analyse tient à la solution qu'elle apporte au paradoxe éléate. Parménide demandait : quand quelque chose vient à l'être, vient-il du non-être (auquel cas il vient de rien) ou de l'être (auquel cas il était déjà) ? Aristote répond par une distinction. Le devenir ne procède pas du non-être absolu, mais du non-être ''relatif'' à une forme déterminée, c'est-à-dire de la privation. Le musicien ne vient pas de rien : il vient de l'homme non-musicien. Et il ne vient pas non plus de quelque chose qui était déjà actuellement musicien : il vient d'un substrat qui était musicien ''en puissance''. Voilà introduit, en filigrane, le couple acte / puissance qui sera développé en détail au livre III et au livre IX de la ''Métaphysique''<ref>Aristote, ''Physique'', III, 1-3 ; ''Métaphysique'', Θ (IX). Voir l'édition Tricot (Paris, Vrin, plusieurs rééditions).</ref>. ===== 2.3. La matière connue par analogie ===== Mais qu'est-ce, plus précisément, que ce substrat ? Aristote distingue deux acceptions. Dans le cas où le changement n'est qu'accidentel (un homme devient musicien), le substrat est la chose elle-même (l'homme), qui demeure dans son essence. Dans le cas où le changement est substantiel (un être nouveau apparaît, comme dans la naissance), le substrat est plus difficile à saisir : c'est la matière elle-même, considérée non comme tel ou tel matériau particulier (le bronze, le bois) mais comme ce qui, n'étant pas encore tel ou tel être déterminé, est en puissance d'être déterminé. Cette « matière première » est connue, dit Aristote, ''par analogie''<ref>Aristote, ''Physique'', I, 7, 191a8-12.</ref> : ce que la matière est pour la forme dans le devenir d'une statue, c'est ce qu'elle est, plus généralement, dans tout devenir. Le concept échappe ainsi à la saisie directe, comme tout ce qui n'est pas pleinement actuel. Cette indétermination fait scandale aux modernes, qui aimeraient tenir entre leurs mains une matière première mesurable. Mais elle est la condition même de la possibilité du changement : si la matière était dès le départ pleinement déterminée, elle ne pourrait recevoir de nouvelles déterminations. ==== Chapitre III. Les quatre causes ==== ===== 3.1. La doctrine canonique : ''Physique'' II, 3 et 7 ===== Comprendre un être naturel, c'est en connaître les causes. Or il y a, selon Aristote, quatre acceptions du mot « cause ». Cette doctrine, exposée en ''Physique'' II, 3 et reprise en ''Métaphysique'' A, 3 et Δ, 2, structure toute la pensée aristotélicienne de la nature<ref>Aristote, ''Physique'', II, 3, 194b16-195a3 ; ''Métaphysique'', A, 3, 983a24-b6. Voir R. J. Hankinson, ''Cause and Explanation in Ancient Greek Thought'', Oxford, Clarendon Press, 1998, chap. 4-5.</ref>. La cause matérielle est ce dont une chose est faite : le bronze pour la statue, le bois pour le lit, les briques et les pierres pour la maison. Elle répond à la question : « de quoi ? » La cause formelle est l'essence ou la définition de la chose, ce qui fait qu'elle est ce qu'elle est. La forme de la statue d'Hermès n'est pas le bronze, mais la configuration qui lui donne sa figure et sa signification. Elle répond à la question : « qu'est-ce que c'est ? » La cause efficiente est le « ce d'où vient le commencement du changement » : le sculpteur qui produit la statue, le père qui engendre l'enfant, le médecin qui guérit. Elle répond à la question : « par qui ? » ou « par quoi ? » La cause finale est « ce en vue de quoi » la chose existe ou s'opère : la santé pour la promenade, l'ornement du temple pour la statue, la maturité pour la croissance. Elle répond à la question : « pour quoi ? » ===== 3.2. La coïncidence des causes formelle, efficiente et finale ===== Ces quatre causes ne sont pas mutuellement exclusives. Au contraire, dans bien des cas, plusieurs causes coïncident. Aristote insiste sur ce point : dans la génération naturelle, la cause formelle, la cause efficiente et la cause finale se rejoignent dans la même forme spécifique<ref>Aristote, ''Physique'', II, 7, 198a24-27.</ref>. C'est l'homme adulte (forme actuelle) qui engendre l'homme à venir (cause efficiente), et c'est vers la forme d'homme adulte que tend l'embryon (cause finale). On pourrait dire, avec une formulation contemporaine, que la forme spécifique fonctionne comme une ''attractrice'' du processus génératif : elle est ce qui structure le développement à chaque étape. Seule la cause matérielle reste, en un sens, distincte : elle est ce dans quoi la forme s'inscrit, mais elle est dirigée par elle. Dans le vocabulaire aristotélicien, la matière est « en puissance » ce que la forme est « en acte ». ===== 3.3. La nécessité hypothétique ===== Cette subordination de la matière à la forme commande une thèse de portée durable : la nécessité dans la nature n'est pas pure nécessité matérielle, mais nécessité ''hypothétique'' (''ex hupotheseôs''). La formule signifie ceci : si une fin doit être atteinte, alors certaines conditions matérielles doivent être remplies. Une scie, pour scier, doit être en fer ou en un matériau dur ; non parce que le fer engendre la scie, mais parce que la fonction (scier) requiert un matériau capable de la remplir. De même, un œil, pour voir, doit avoir telle structure de l'humeur cristalline ; non parce que cette structure produit la vision, mais parce que la vision la requiert<ref>Aristote, ''Physique'', II, 9, 199b34-200b8 ; ''Parties des animaux'', I, 1, 639b21-640a10. Voir Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012, chap. 1, pour une analyse rigoureuse de la finalité aristotélicienne comme thèse explicative.</ref>. La nécessité hypothétique inverse ainsi la lecture matérialiste : ce n'est pas la matière qui détermine la forme, mais la forme qui détermine ce qu'il faut de matière. Cela ne signifie pas que la matière soit indifférente, ni que la nécessité matérielle ne joue aucun rôle. Aristote reconnaît qu'il y a, dans la nature, des effets qui résultent des seules propriétés de la matière (la couleur des yeux, par exemple, peut être indifférente à la fonction visuelle). Mais le schéma général est celui d'une finalité qui sélectionne et oriente la matière. ===== 3.4. La téléologie aristotélicienne et ses interprétations ===== La téléologie aristotélicienne a été l'objet de débats acharnés, depuis l'Antiquité jusqu'à nos jours. Trois grandes interprétations s'affrontent. L'interprétation forte, traditionnelle, prête à la nature une finalité « objective » qui structure réellement les processus, sans pour autant impliquer une intention consciente. C'est la position que défendent, parmi les contemporains, Allan Gotthelf et Mariska Leunissen<ref>Voir notamment Mariska Leunissen, ''Explanation and Teleology in Aristotle's Science of Nature'', op. cit., et son article dans Christof Rapp, Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, J. B. Metzler, 2021. Pour Gotthelf, voir l'ouvrage déjà cité.</ref>. Pour eux, la téléologie n'est pas une simple façon de parler, mais la meilleure explication des régularités observables dans la nature, en particulier dans le vivant. L'interprétation déflationniste, défendue par Wolfgang Wieland dans son ouvrage classique de 1962, voit dans la téléologie aristotélicienne un « facteur d'intelligibilité » plutôt qu'une thèse métaphysique forte : Aristote n'attribuerait pas à la nature une visée au sens propre, mais utiliserait le vocabulaire finaliste comme cadre d'explication<ref>Wolfgang Wieland, ''Die aristotelische Physik'', Göttingen, Vandenhoeck & Ruprecht, 1962.</ref>. Cette lecture, qui a longtemps dominé l'aristotélisme allemand, est aujourd'hui largement contestée par les études anglo-saxonnes, qui voient dans la téléologie aristotélicienne une thèse réaliste sur la structure des processus naturels. Une voie intermédiaire, défendue notamment par Alain Petit dans le volume Morel, refuse à la fois la psychologisation de la finalité (la nature ne « vise » pas) et la déflation totale (la finalité n'est pas qu'une métaphore). Comme l'écrit Morel : « la nature réalise des fins qu'elle ne se propose pas, et ainsi, si l'on peut dire, et sans ajouter au paradoxe, elle les réalise mieux »<ref name="morel" />. La finalité naturelle est ''immanente'' et ''non-intentionnelle'', mais elle est ''réelle''. Cette discussion n'a rien d'académique : elle commande la possibilité même d'une biologie qui ne se réduise pas à la mécanique sans pour autant verser dans le créationnisme. C'est précisément ce que cherchent les biologistes des systèmes contemporains lorsqu'ils parlent de « causalité descendante » ou de « contraintes formelles ». ==== Chapitre IV. Le mouvement (''kinêsis'') : définition et espèces ==== ===== 4.1. La définition canonique : ''Physique'' III, 1 ===== Au début du livre III, Aristote propose ce qui est sans doute la définition la plus discutée de toute la ''Physique'' : le mouvement est « l'entéléchie de ce qui est en puissance, en tant que tel » (''hê tou dunamei ontos entelecheia hêi toiouton'')<ref>Aristote, ''Physique'', III, 1, 201a10-11. Voir Edward Hussey, ''Aristotle's Physics, Books III and IV'', Oxford, Clarendon Press, 1983, p. 55-65.</ref>. Cette définition est notoirement obscure. Charlton, dans son commentaire de ''Physique'' I et II, juge qu'elle est l'une des phrases les plus ardues d'Aristote<ref>William Charlton, ''Aristotle's Physics, Books I and II'', op. cit., préface ; comparer avec l'analyse de Hussey, op. cit., qui souligne le caractère paradoxal de la formule.</ref>. Elle articule trois concepts : l'entéléchie (''energeia'' / ''entelecheia'', terme aristotélicien désignant l'actualité), la puissance (''dunamis''), et la qualification « en tant que tel ». Il importe de souligner que l'entéléchie en question, dans la définition du mouvement, n'est pas une actualité achevée : Aristote vise précisément une actualité incomplète, paradoxalement en cours de réalisation. Pour comprendre cette formule, il faut suivre l'analyse que propose Bernard Besnier dans le volume Morel<ref>Bernard Besnier, dans P.-M. Morel (éd.), ''Aristote et la notion de nature'', op. cit.</ref>. Le mouvement, dit Aristote, est l'acte d'un être qui n'est pas encore pleinement actualisé. Prenons l'exemple de la construction d'une maison. Tant que la maison est encore à construire, elle est en puissance ; quand elle est construite, elle est en acte. Mais la ''construction'', l'activité même par laquelle la maison passe de la puissance à l'acte, n'est ni la pure puissance (sinon rien ne se passerait) ni l'acte achevé (sinon la maison serait déjà construite) : elle est l'acte de la maison-en-puissance ''en tant qu'elle est en puissance''. Voilà ce que vise la formule. La précision « en tant que tel » mérite l'attention. La pierre du chantier est aussi « en puissance d'être brisée » ; mais ce n'est pas en tant que telle qu'elle est en train d'être construite. Le mouvement est l'actualisation d'une puissance déterminée, considérée précisément dans sa puissance. Comme le souligne Besnier, cette définition « consiste à appliquer la relation acte/puissance […] au spectre des catégories ». Le mouvement n'est pas une réalité indépendante ; il est toujours mouvement ''de quelque chose'' selon une catégorie déterminée. Cela conduit aux quatre espèces de changement. ===== 4.2. Les quatre espèces de changement ===== Aristote distingue quatre types de changement, selon les catégories de la substance, de la qualité, de la quantité et du lieu<ref>Aristote, ''Physique'', V, 1, 225a34-225b9.</ref>. Le changement substantiel correspond à la génération et à la corruption : c'est la naissance ou la mort d'une substance. Une plante naît, un animal meurt. Aristote considère que c'est un cas-limite : à proprement parler, ce n'est pas un mouvement (''kinêsis'' au sens strict), car il n'y a pas de substrat qui demeurerait identique à lui-même tout au long du processus. C'est plutôt un ''metabolê'', un changement absolu. Le changement qualitatif ou altération (''alloiôsis'') est la transformation d'une qualité dans un substrat qui demeure : un fruit qui mûrit change de couleur et de saveur sans changer d'essence ; un homme apprend la grammaire et devient grammairien. Le changement quantitatif est l'accroissement (''auxêsis'') ou la diminution (''phthisis'') : la croissance d'un enfant, l'amaigrissement d'un malade. Le changement local ou translation (''phora'') est le déplacement d'un être d'un lieu à un autre. ===== 4.3. Le primat du mouvement local ===== Parmi ces quatre espèces, Aristote établit que le mouvement local est ''premier''<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7.</ref>. Cette priorité a plusieurs sens. Logiquement, le mouvement local peut exister sans les autres : un caillou peut être déplacé sans changer ni de forme, ni de qualité, ni de quantité. À l'inverse, les autres mouvements présupposent des transports locaux : la croissance suppose l'absorption d'aliments, qui sont déplacés. Ontologiquement, c'est le mouvement le plus pur, parce qu'il n'altère pas ce qu'il meut. Cosmologiquement enfin, c'est le mouvement local circulaire éternel des sphères célestes qui sera, au livre VIII, l'effet immédiat du moteur immobile. Cette hiérarchie n'est pas indifférente. Elle prépare le passage de la ''Physique'' au ''De caelo'' : si le mouvement local est premier, alors la science du ciel, qui étudie le mouvement local par excellence (le mouvement circulaire éternel des astres), occupe une place stratégique dans la philosophie de la nature. ==== Chapitre V. Le lieu (''topos'') et le vide (''kenon'') ==== ===== 5.1. La théorie du lieu : ''Physique'' IV, 1-5 ===== Le mouvement local suppose un lieu. Mais qu'est-ce qu'un lieu ? La question n'a rien d'évident. Le lieu n'est ni la matière qui le remplit (puisque la matière peut changer de lieu) ni la forme de ce qui s'y trouve (puisque le lieu lui survit quand la chose s'en va). Il faut donc, pour le définir, dégager une dimension propre. Aristote y procède en quatre étapes<ref>Aristote, ''Physique'', IV, 1-5. Pour une analyse détaillée, voir Hussey, ''Aristotle's Physics, Books III and IV'', op. cit., p. 99-121, ainsi que Benjamin Morison, ''On Location : Aristotle's Concept of Place'', Oxford, Clarendon Press, 2002.</ref>. D'abord, il établit que le lieu existe : la simple observation du transport (l'eau qui s'évapore et l'air qui prend sa place) montre qu'il y a quelque chose qui demeure, indépendant des corps qui s'y succèdent. Ensuite, il discute les conceptions reçues : le lieu n'est ni la matière ni la forme. Puis il pose sa propre définition : le lieu est « la limite immobile première du contenant » (''to peras tou periechontos akinêton prôton'')<ref>Aristote, ''Physique'', IV, 4, 212a20-21.</ref>. Enfin, il en déduit les propriétés : le lieu n'est pas un point, ni un corps, ni un intervalle vide entre les corps. L'idée fondamentale est que le lieu d'un corps est défini par les surfaces du corps qui l'enveloppe immédiatement. Mon lieu, en ce moment, est défini par la surface intérieure de l'air qui m'entoure. Quand je me déplace, je quitte un lieu (cette surface) pour un autre. Cette conception, étrange à nos yeux, présente trois traits caractéristiques. Elle est ''relationnelle'' : le lieu n'existe pas indépendamment des corps qui s'enveloppent les uns les autres ; il n'y a pas, comme chez Newton, un espace absolu préexistant. Elle est ''finitiste'' : le cosmos a une limite extérieure (la sphère des fixes), au-delà de laquelle il n'y a rien, pas même de l'espace vide. Et elle est ''anisotrope'' : il y a, dans le cosmos, des lieux privilégiés (le centre, la périphérie), qui ne sont pas équivalents et qui orientent les mouvements naturels. ===== 5.2. Le refus du vide ===== La question du vide reçoit, en ''Physique'' IV, 6-9, une réponse négative tranchée. Contre les Atomistes (Leucippe, Démocrite), qui faisaient du vide la condition même du mouvement, Aristote soutient que le vide est impossible<ref>Aristote, ''Physique'', IV, 6-9, 213a12-217b28.</ref>. Ses arguments sont multiples. Le plus célèbre porte sur la vitesse. Aristote soutient (à tort, comme l'établira Galilée) que la vitesse de chute d'un grave est inversement proportionnelle à la résistance du milieu. Or si le milieu était nul (dans le vide), la vitesse serait infinie, ce qui est absurde. Donc le vide n'existe pas. Cet argument, fragile à nos yeux, repose sur la conception aristotélicienne du mouvement comme requérant un milieu pour s'effectuer. D'autres arguments viennent de la cohérence de la doctrine du lieu. Si le lieu est défini par la surface du contenant, alors un vide serait un lieu sans contenu, ce qui est contradictoire (le lieu existe par et pour son contenu). Si le mouvement requiert une orientation (haut, bas, droite, gauche), alors un vide pur, indifférencié, ne pourrait orienter aucun mouvement. Le refus du vide commande toute la dynamique aristotélicienne, et il sera l'un des points les plus contestés à la Renaissance, puis dans la première moitié du XVII{{e}} siècle. Torricelli, en 1643, démontre par son expérience du tube de mercure que le « vide barométrique » est physiquement réalisable ; Pascal, par les expériences sur le Puy-de-Dôme en 1648, en confirme l'existence et établit la pression atmosphérique. La doctrine aristotélicienne, défendue jusque-là par les scolastiques sous la forme de la « horreur du vide », s'effondre alors progressivement. Mais il faut situer la position d'Aristote dans son cadre : pour lui, la nature est un ''plein'' continu, où chaque mouvement est transmis de proche en proche par contact. ==== Chapitre VI. Le temps (''chronos'') ==== ===== 6.1. Le temps, « nombre du mouvement » ===== La question du temps occupe les chapitres 10 à 14 du livre IV de la ''Physique''. Comme le souligne Chelsea C. Harry dans son ouvrage ''Chronos in Aristotle's Physics'', ces chapitres ont retrouvé une attention soutenue dans les études contemporaines, notamment depuis les commentaires de Couloubaritsis, Coope et Roark<ref>Chelsea C. Harry, ''Chronos in Aristotle's Physics : On the Nature of Time'', Springer, 2015. Voir aussi Ursula Coope, ''Time for Aristotle : Physics IV.10-14'', Oxford, Clarendon Press, 2005, et Tony Roark, ''Aristotle on Time : A Study of the Physics'', Cambridge, Cambridge University Press, 2011.</ref>. Aristote commence par poser une aporie : le temps existe-t-il, et comment ? Le passé n'est plus, le futur n'est pas encore, le présent est un instant indivisible : où donc le temps trouve-t-il son être ? La solution aristotélicienne consiste à lier intrinsèquement le temps au mouvement, sans pour autant les identifier. Le temps n'est pas le mouvement (un mouvement est dans un mobile particulier, alors que le temps est partout présent), mais il est « quelque chose du mouvement » (''ti tês kinêseôs''). Plus précisément, le temps est « le nombre du mouvement selon l'antérieur et le postérieur » (''arithmos kinêseôs kata to proteron kai husteron'')<ref>Aristote, ''Physique'', IV, 11, 219b1-2.</ref>. « Nombre » signifie ici : ce par quoi nous comptons et mesurons. Quand nous discernons des phases successives dans un mouvement et que nous les mettons en série, nous comptons le temps. Le « maintenant » (''to nun'') joue, dans le temps, le rôle que joue le mobile dans le mouvement : il est ce qui assure la continuité tout en marquant les divisions. ===== 6.2. Le temps et l'âme ===== Aristote pose ensuite une question délicate : si le temps est nombre, et que le nombre suppose quelqu'un qui compte, le temps existerait-il sans l'âme<ref>Aristote, ''Physique'', IV, 14, 223a16-29. Sur ce passage, voir Harry, ''Chronos in Aristotle's Physics'', op. cit., chap. 5, et Coope, ''Time for Aristotle'', op. cit.</ref> ? Sa réponse est nuancée : sans l'âme, il y aurait bien le mouvement, mais le temps comme nombre actuellement compté n'existerait pas. Il y aurait du « numérable », mais pas de « numéré ». Cette thèse n'implique pas un idéalisme du temps, comme on pourrait être tenté de le lire à la lumière de Kant. Pour Aristote, le mouvement est réel indépendamment de l'âme ; c'est seulement la ''mensuration'' du temps qui requiert un esprit qui compte. La distinction est subtile : il y a, dans le réel, des successions et des durées, indépendamment de toute conscience ; mais le temps mesuré, scandé en intervalles déterminés, requiert un sujet capable de comparer les phases et de les nombrer. C'est par cette ouverture que la psychologie pourra rejoindre la cosmologie : le « sens du temps » dont parlent les ''Parva naturalia'' (notamment le ''De memoria'') trouve ici son fondement physique. ===== 6.3. Le temps et le mouvement céleste ===== Aristote insiste enfin sur le lien entre le temps et le mouvement uniforme. Le temps est nombre du mouvement, mais c'est par référence au mouvement le plus régulier qu'il se mesure. Or le mouvement le plus régulier, le plus simple et le plus continu est le mouvement circulaire des sphères célestes. Le temps « universel » se mesure donc par référence au mouvement de la sphère des fixes, qui accomplit une révolution en un jour. Cette articulation conduit naturellement aux thèses du livre VIII et au ''De caelo''. ==== Chapitre VII. L'éternité du mouvement et le moteur immobile ==== ===== 7.1. Le mouvement est-il éternel ? ''Physique'' VIII, 1 ===== Le livre VIII de la ''Physique'' aborde la question la plus haute : le mouvement a-t-il commencé, ou est-il éternel ? Aristote argumente en faveur de son éternité par un raisonnement de réduction à l'absurde<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6. Voir l'analyse de Sarah Broadie, ''Nature, Change, and Agency in Aristotle's Physics'', Oxford, Clarendon Press, 1982.</ref>. Supposons que le mouvement ait eu un commencement. Avant ce commencement, il n'y avait pas de mouvement. Mais alors, pour que le mouvement commence, il fallait qu'un agent agisse sur un patient. Or cet agent, pour agir, devait passer de l'inactivité à l'activité, ce qui suppose un mouvement antérieur. Régression à l'infini, qui contredit l'hypothèse. Donc le mouvement n'a jamais commencé. Le même raisonnement vaut pour la fin du mouvement : si le mouvement devait cesser, il faudrait un agent qui le fasse cesser, donc un nouveau mouvement, etc. Le mouvement est ainsi éternel dans les deux sens. Cette thèse heurte de front le créationnisme judéo-chrétien. Au Moyen Âge, elle posera l'un des problèmes les plus aigus aux théologiens. Thomas d'Aquin tentera de la concilier avec la création ''ex nihilo'' en distinguant le commencement ''philosophique'' (que la raison ne peut établir avec certitude) du commencement ''révélé'' (que la foi atteste). Bonaventure, plus radical, cherchera à démontrer rationnellement, contre Aristote, que le monde a nécessairement eu un commencement temporel : il avance plusieurs arguments, dont le plus célèbre soutient qu'un nombre infini de jours révolus est impossible, puisqu'on ne saurait ajouter à l'infini ni le parcourir effectivement. La condamnation parisienne de 1277, par l'évêque Étienne Tempier, frappera entre autres les thèses aristotéliciennes sur l'éternité du monde, montrant à quel point cette doctrine fut perçue comme dangereuse. ===== 7.2. Le principe : « tout ce qui est mû est mû par autre chose » ===== Aux livres VII et VIII, Aristote pose le principe fondateur de sa dynamique : « tout ce qui est mû est mû par autre chose » (''pan to kinoumenon hupo tinos kineitai'')<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15 ; VIII, 4-5.</ref>. Ce principe soutient toute la mécanique aristotélicienne : il n'y a pas d'auto-mouvement absolu au sens strict ; tout mouvement requiert un principe moteur distinct de ce qui est mû en tant que mû. Cette thèse semble contredite par les êtres vivants, qui paraissent se mouvoir d'eux-mêmes. Aristote distingue alors, à l'intérieur du vivant, ce qui est moteur et ce qui est mû : l'âme, comme forme du corps vivant, joue le rôle de principe moteur ; le corps, en tant que matière, est ce qui est mû. Cette distinction n'introduit pas un moteur extérieur au vivant (l'âme n'est pas séparée du corps), mais un principe moteur interne, distinct toutefois du corps en tant que mû. Au sein de l'âme elle-même, il faut encore distinguer les facultés qui agissent et celles qui sont actualisées. Le principe « tout ce qui est mû est mû par autre chose » est ainsi sauvé. Comme le note l'introduction de Moraux à l'édition Belles Lettres du ''Du ciel'', le rapport entre le corps premier (l'éther) et le moteur immobile reste cependant problématique chez Aristote<ref>Paul Moraux, introduction à Aristote, ''Du ciel'', Paris, Les Belles Lettres, 1965, p. xxx-lxxxv.</ref>. Si l'éther se meut naturellement en cercle, pourquoi aurait-il besoin d'un moteur supplémentaire ? Mais si tout mobile requiert un moteur distinct, alors l'éther ne peut s'auto-mouvoir, et il faut un moteur extérieur. La tension entre ces deux thèses traverse toute la cosmologie d'Aristote, et a donné lieu à des « hypothèses génétiques » (Jaeger, Solmsen) qui tentent d'y voir l'effet d'une évolution doctrinale<ref>Werner Jaeger, ''Aristoteles : Grundlegung einer Geschichte seiner Entwicklung'', Berlin, Weidmann, 1923 ; Friedrich Solmsen, ''Aristotle's System of the Physical World'', Ithaca, Cornell University Press, 1960.</ref>. ===== 7.3. Le moteur immobile ===== Pour éviter la régression à l'infini, Aristote pose donc l'existence d'un moteur immobile (''prôton kinoun akinêton'') qui meut sans être mû. Ce moteur ne peut mouvoir par contact ou par poussée, comme le ferait un agent ordinaire ; sinon il serait lui-même affecté, donc mû. Il meut « comme l'objet du désir meut le désirant »<ref>Aristote, ''Physique'', VIII, 6, 259b20 sq. ; voir aussi ''Métaphysique'', Λ, 7, 1072a25-b3.</ref>, c'est-à-dire comme cause finale plutôt que comme cause efficiente immédiate. Cette doctrine, esquissée à la fin du livre VIII de la ''Physique'', sera développée en ''Métaphysique'' Λ, 6 et suivants. Le moteur immobile y est caractérisé comme acte pur, sans matière ni puissance, donc immuable, indivisible et éternel. Sa vie consiste tout entière en l'acte le plus haut qui se puisse concevoir : la pensée. Mais comme il ne peut penser que l'objet le plus parfait, et que l'objet le plus parfait est lui-même, le moteur immobile est « pensée de la pensée » (''noêsis noêseôs noêsis'')<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b34. Voir l'édition Tricot ou la traduction commentée de Marie-Paule Duminil et Annick Jaulin, ''Aristote. Métaphysique : Livre Lambda'', GF Flammarion, 2008.</ref>. Cette formule fait du divin aristotélicien une activité réflexive et autosuffisante, infiniment éloignée du Dieu créateur biblique. Le moteur immobile n'a pas conscience du monde qu'il meut ; il ne le providencialise pas ; il se contente d'être ce vers quoi le monde tend par amour. C'est par leur désir d'imiter sa perfection que les sphères célestes accomplissent leur révolution éternelle. La question du nombre exact des moteurs immobiles fait elle-même problème. Le livre Λ, 8 de la ''Métaphysique'' évoque, à côté du Premier Moteur, des moteurs immobiles supplémentaires associés aux mouvements particuliers des sphères célestes. Aristote envisage ainsi 47 ou 55 moteurs distincts, selon qu'on suit le compte d'Eudoxe ou celui de Calippe. La compatibilité de cette pluralité avec la primauté radicale du Premier Moteur reste l'un des débats les plus discutés de l'aristotélisme contemporain<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a13-1074b14. Sur la pluralité des moteurs, voir l'article « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy'', section sur la cosmologie ; ainsi que Lindsay Judson, « Heavenly Motion and the Unmoved Mover », dans Mary Louise Gill et James G. Lennox (éd.), ''Self-Motion : From Aristotle to Newton'', Princeton, Princeton University Press, 1994, p. 155-171.</ref>. La doctrine n'envisage donc pas un moteur strictement unique, mais une hiérarchie de principes immobiles, dominée par un premier d'entre eux. La doctrine pose aussi des problèmes sur la nature exacte de la causalité du moteur. Enrico Berti a soutenu, dans une longue série d'articles, que le Premier Moteur aristotélicien doit être compris comme une ''cause efficiente'', et non simplement comme une cause finale, contre l'interprétation traditionnelle<ref>Enrico Berti, ''Nuovi studi aristotelici. II : Fisica, antropologia e metafisica'', Brescia, Morcelliana, 2005, en particulier les chapitres sur le Premier Moteur. Voir aussi le débat entre Berti et Aryeh Kosman dans les actes du ''Symposium Aristotelicum'' consacré à la ''Métaphysique'' Λ.</ref>. Sa thèse repose sur une relecture de plusieurs passages où le Premier Moteur paraît agir réellement, et non simplement attirer. La question reste ouverte. Pour notre propos, retenons que le Premier Moteur est éternel, immatériel, immobile, et qu'il meut éternellement la sphère des fixes par l'amour qu'il suscite. Il n'est pas le « créateur » du monde au sens biblique : il ne tire rien du néant, et le monde existe éternellement. Il rend compte de la permanence du mouvement cosmique : c'est à lui qu'Aristote rapporte, en dernière instance, l'éternité de la révolution céleste, dont le rythme régule à son tour celui des autres sphères et la vie sublunaire tout entière. === Deuxième partie. Le ''De caelo'' : la structure du cosmos === ==== Chapitre I. Le cinquième élément (l'éther) et le mouvement circulaire ==== ===== 1.1. La déduction du corps premier ===== Le ''De caelo'' s'ouvre par l'une des constructions doctrinales les plus marquantes de la philosophie ancienne. Aristote y déduit, à partir de considérations sur les mouvements simples, l'existence d'un cinquième élément, l'éther (''aithêr''), distinct des quatre éléments empédocléens (terre, eau, air, feu). Le raisonnement, qu'on lit en ''De caelo'' I, 2, procède ainsi<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17. Édition de référence : trad. Paul Moraux, Paris, Les Belles Lettres, 1965 ; nouvelle édition par Michel Federspiel, ''Du ciel'', Paris, Les Belles Lettres, 2016.</ref>. Il existe deux types de mouvements simples : le rectiligne (centripète ou centrifuge) et le circulaire. À chaque type de mouvement simple doit correspondre un corps simple dont ce mouvement est naturel. Or les quatre éléments traditionnels ont des mouvements rectilignes (vers le centre pour la terre et l'eau, vers la périphérie pour l'air et le feu). Il manque donc un cinquième corps, dont le mouvement naturel soit circulaire. Ce corps existe : c'est l'éther, dont sont faites les sphères célestes et les astres. Comme le souligne Federspiel dans son introduction à l'édition Belles Lettres de 2016, ce raisonnement « déductif » repose sur des prémisses qui ne sont pas elles-mêmes démontrées : que tout mouvement simple correspond à un corps simple, et que le mouvement circulaire est simple<ref>Michel Federspiel, introduction à Aristote, ''Du ciel'', Paris, Les Belles Lettres, 2016.</ref>. La force du système tient à sa cohérence interne, non à son enracinement empirique. ===== 1.2. Les propriétés de l'éther ===== De la nature même du mouvement circulaire, Aristote déduit les propriétés du cinquième corps. Le mouvement circulaire n'a pas de contraire (alors que le rectiligne ascendant a pour contraire le rectiligne descendant) ; il peut donc être éternel, sans avoir à craindre la corruption qu'engendrerait son contraire. Le cinquième corps est ainsi inengendré et incorruptible. Il ne croît ni ne diminue, ne s'altère pas qualitativement. Il n'a ni pesanteur ni légèreté, ces qualités étant propres aux corps mus en ligne droite. Comme le note Federspiel, ce « bijou doctrinal du ''Traité du ciel'' » est l'un des philosophèmes d'Aristote dont l'influence fut la plus durable, comparable, en portée historique, à la théorie des Idées de Platon<ref name="federspiel-intro">Michel Federspiel, introduction à Aristote, ''Du ciel'', op. cit.</ref>. Le terme et certaines représentations d'un milieu subtil et incorruptible connaîtront en effet une longue postérité : repris par les commentateurs, intégré aux doctrines de l'âme dans le néoplatonisme (où il devient le « véhicule subtil » de l'âme), incorporé à l'angélologie chrétienne comme substance des puissances célestes, repris par l'alchimie de la Renaissance comme « quinte essence ». L'« éther luminifère » dont les physiciens du XIX{{e}} siècle supposeront l'existence pour expliquer la transmission des ondes lumineuses et électromagnétiques ne reprend pas la doctrine aristotélicienne du cinquième corps, dont il est doctrinalement très éloigné, mais hérite par certains traits l'idée d'un milieu pénétrant, sans pesanteur, et omniprésent. Il faudra l'expérience de Michelson-Morley en 1887 et la relativité d'Einstein pour le chasser définitivement de la physique. ===== 1.3. Confirmations « endoxiques » ===== Aristote ne se contente pas de la déduction. En ''De caelo'' I, 3, il confirme la théorie par trois arguments « endoxiques », c'est-à-dire fondés sur les opinions admises. D'abord, le ''consensus gentium'' : tous les peuples ont placé le divin dans le lieu le plus élevé, ce qui suggère que ce lieu est d'une nature supérieure. Ensuite, l'observation traditionnelle : « durant tout le passé, à en croire les souvenirs qui se sont transmis d'âge en âge, il n'est jamais apparu de changement, ni dans le dernier ciel dans son ensemble, ni dans aucune de ses parties propres »<ref>Aristote, ''Du ciel'', I, 3, 270b13-15.</ref>. Enfin, l'étymologie : les Anciens auraient nommé ce lieu « éther » (''aithêr'') parce qu'il « parcourt sans cesse » (''aei thein'') le temps sans bornes, étymologie reprise de Platon (''Cratyle'', 410b). Ces arguments montrent qu'Aristote, malgré la rigueur de sa méthode, accorde une place considérable aux ''endoxa'', les opinions reçues, dans la confirmation de ses thèses cosmologiques. Comme le remarque Federspiel, les premiers chapitres du livre I forment un ensemble où se construit, selon son expression, un véritable ''mythologoumène'' aristotélicien<ref name="federspiel-intro" />. La cosmologie aristotélicienne, à son sommet, mêle déduction conceptuelle et adhésion aux représentations traditionnelles. ==== Chapitre II. La structure du cosmos ==== ===== 2.1. La cosmologie géocentrique ===== Le cosmos aristotélicien est sphérique, fini, géocentrique et anisotrope. La Terre, sphérique elle aussi, est immobile au centre. Aristote argumente longuement en faveur de cette immobilité, contre les pythagoriciens qui plaçaient la Terre sur une orbite autour d'un « feu central »<ref>Aristote, ''Du ciel'', II, 13-14, 293a18-298a20.</ref>. Ses arguments mêlent observation (les graves tombent vers le centre du monde, ce qui suggère que la Terre, étant elle-même grave, occupe ce centre) et raisonnement (un corps situé sur une trajectoire ne pourrait être en repos absolu, ce qui contredit la stabilité observable de notre demeure). La sphéricité de la Terre, sur laquelle Aristote insiste également, est démontrée par plusieurs arguments restés classiques. D'abord, l'ombre que la Terre projette sur la Lune lors des éclipses lunaires est toujours circulaire, ce qui n'est possible que si l'astre projetant l'ombre est sphérique. Ensuite, à mesure que les voyageurs se déplacent vers le sud, ils découvrent des étoiles méridionales jusque-là invisibles, et les constellations changent de hauteur sur l'horizon : Aristote cite à cet égard les exemples de l'Égypte et de la région de Chypre, où l'on observe des étoiles non perceptibles plus au nord. Enfin, la chute des graves vers le centre, si elle est universelle, ne peut produire qu'un agglomérat sphérique. Aristote rapporte aussi le chiffre, attribué aux mathématiciens de son temps, d'une circonférence terrestre de 400 000 stades, soit environ 70 000 kilomètres : surestimation par rapport au chiffre réel (environ 40 000 km), mais témoignage d'un effort de mensuration sérieux qu'Ératosthène affinera au siècle suivant. Autour de la Terre se déploient les sphères concentriques. D'abord les quatre éléments sublunaires, en couches étagées : l'eau au-dessus de la terre, l'air au-dessus de l'eau, le feu au-dessus de l'air. Puis, à partir de la sphère de la Lune, le domaine de l'éther, divisé en sphères qui portent les astres : la sphère de la Lune, celle de Mercure, celle de Vénus, celle du Soleil, celles de Mars, Jupiter, Saturne, et enfin la sphère des fixes, qui ferme le monde. ===== 2.2. Le système des sphères ===== Aristote, suivant Eudoxe et Calippe, complique cette image simple en multipliant les sphères pour rendre compte des irrégularités apparentes du mouvement des planètes. Selon le compte standard, Eudoxe avait posé 27 sphères au total (3 pour le Soleil, 3 pour la Lune, 4 pour chacune des cinq planètes alors connues, plus 1 pour la sphère des fixes) ; Calippe avait porté ce nombre à 34, en ajoutant des sphères pour mieux ajuster certaines anomalies observées. Aristote, pour sa part, en pose un nombre supérieur<ref>Aristote, ''Métaphysique'', Λ, 8, 1073b17-1074a14.</ref> : il introduit en effet des sphères « déroulantes » destinées à neutraliser, sur les sphères inférieures, l'effet des sphères extérieures qui les enveloppent, ce qui porte le total, selon les calculs et les manuscrits, à 47 ou 55 sphères. Chaque planète n'est donc pas mue par une seule sphère, mais par plusieurs, dont les axes diffèrent et qui se composent pour produire le mouvement observé. Cette astronomie, dérivée d'Eudoxe, vise à « sauver les phénomènes », c'est-à-dire à rendre compte des trajectoires apparentes des astres errants (les planètes, les ''planêta astra'') à partir de mouvements circulaires uniformes. La règle est ferme : aucun corps céleste ne peut avoir un autre mouvement naturel que circulaire ; si l'on observe des trajectoires en boucle, c'est qu'elles résultent de la composition de plusieurs mouvements circulaires. Cette exigence dictera l'astronomie pendant deux millénaires : elle conduira Ptolémée à introduire ses « épicycles » et ses « équants », et Copernic lui-même, au XVI{{e}} siècle, refusera encore l'idée d'orbites non circulaires. Il faudra Kepler, en 1609, pour briser cette contrainte par sa première loi (les orbites sont elliptiques). ===== 2.3. Anisotropie du cosmos ===== Le cosmos aristotélicien n'est pas isotrope. Contre Platon (''Timée'', 62c), qui défendait un univers où le « haut » et le « bas » seraient relatifs, Aristote insiste sur l'existence de directions absolues. Le centre et la périphérie sont des lieux privilégiés, et les couples haut/bas, droite/gauche, devant/derrière structurent l'espace cosmique. Cette anisotropie n'est pas une simple curiosité culturelle : elle commande la dynamique aristotélicienne. C'est parce qu'il y a un centre absolu vers lequel tendent les graves, et une périphérie absolue vers laquelle tendent les corps légers, que les mouvements naturels rectilignes sont possibles. Sans centre ni périphérie, les éléments simples n'auraient pas de lieu propre, et leur mouvement naturel serait inintelligible. ==== Chapitre III. Les quatre éléments sublunaires et leurs mouvements naturels ==== ===== 3.1. Le couple lourd / léger ===== Dans le monde sublunaire, les quatre éléments d'Empédocle (terre, eau, air, feu) se distinguent par leurs mouvements naturels. La terre et l'eau sont ''lourdes'' : elles tendent vers le centre. L'air et le feu sont ''légers'' : ils tendent vers la périphérie du monde sublunaire (la sphère intérieure de la Lune). Aristote distingue deux acceptions de la pesanteur. Le lourd et le léger ''relatifs'' : l'eau est plus lourde que l'air, mais plus légère que la terre. Et le lourd et le léger ''absolus'' : la terre est purement lourde (elle se dirige toujours vers le centre), le feu est purement léger (il se dirige toujours vers la périphérie). Cette distinction, explicite en ''De caelo'' IV, 1, conditionne toute la dynamique des transformations élémentaires<ref>Aristote, ''Du ciel'', IV, 1-4, 308a13-312a21.</ref>. ===== 3.2. Une dynamique des qualités, non des quantités ===== Comme le souligne Pierre Pellegrin, Aristote attache une grande importance à l'évidence sensible dans son traitement des questions physiques<ref name="pellegrin">Pierre Pellegrin, ''Le Vocabulaire d'Aristote'', Paris, Ellipses, 2001 ; voir aussi son ''Dictionnaire Aristote'', Paris, Ellipses, 2007.</ref>. Aristote écrit lui-même : « le résultat final […] pour la science physique c'est l'évidence sensible qui toujours l'emporte »<ref>Aristote, ''Du ciel'', III, 7, 306a11.</ref>. Cette confiance dans l'expérience commune explique en partie pourquoi sa physique privilégie les qualités (chaud, froid, sec, humide ; lourd, léger) sur les quantités mathématisables. Comme le rappelle Federspiel à la suite de Carteron, Koyré et Clavelin, la physique aristotélicienne est essentiellement non mathématique, et l'on ne peut la mathématiser sans en fausser l'esprit<ref>Henri Carteron, ''La Notion de force dans le système d'Aristote'', Paris, Vrin, 1923 ; Alexandre Koyré, ''Études galiléennes'', Paris, Hermann, 1939 ; Maurice Clavelin, ''La Philosophie naturelle de Galilée'', Paris, Armand Colin, 1968.</ref>. La vitesse, par exemple, n'est pas chez Aristote une grandeur indépendante mesurable : elle est une qualité du mouvement, qui dépend du mobile. Il n'y a pas de cinématique aristotélicienne au sens moderne. Quand Aristote utilise des proportions (par exemple en ''Phys.'' VII, 5 ou en ''De caelo'' I, 6), c'est dans le cadre étroit de la théorie euclidienne des grandeurs homogènes, non d'une mécanique mathématisée. ===== 3.3. La cause des mouvements naturels ===== La question est : qu'est-ce qui fait que le caillou tombe et que la flamme monte ? Aristote refuse l'explication mécanique pure (un ''vis impressa'' qui pousserait les corps) ; pour lui, le mouvement naturel est l'expression d'une tendance interne du corps à rejoindre son lieu propre. Comme le souligne Moraux dans son introduction à ''Du ciel'', Aristote « croyait découvrir une propriété intrinsèque du corps. Même s'il n'y avait rien au centre de l'univers, les lourds s'y rendraient, dit-il, en vertu de leur nature propre »<ref>Paul Moraux, introduction à Aristote, ''Du ciel'', op. cit.</ref>. Mais cette tendance interne suppose un agent. Et l'agent, selon le livre VIII de la ''Physique'', est ce qui a provoqué le passage de la puissance à l'acte. Quand l'eau (lourde en acte, légère en puissance) se transforme en air (léger en acte) sous l'action de la chaleur, l'ascension de cet air vers son lieu naturel n'est que le dernier épisode d'une série de changements. La cause véritable du transport est l'agent qui a provoqué le passage à la nouvelle entéléchie. C'est ce que Moraux résume ainsi : « la cause véritable de ce transport réside donc dans l'agent qui a provoqué le passage à l'entéléchie ». ===== 3.4. Le rôle du milieu et la critique galiléenne ===== La dynamique aristotélicienne est fondée sur l'hypothèse d'une résistance proportionnelle du milieu. La vitesse de chute d'un grave est, selon Aristote, proportionnelle à son poids et inversement proportionnelle à la résistance du milieu. C'est cette dernière clause qui rend le vide impossible : dans le vide, la vitesse serait infinie. Cette dynamique sera contestée par Galilée. Le résultat le plus connu est que, dans le vide, tous les corps tombent à la même vitesse (loi de la chute libre). Mais comme le souligne Federspiel, il faut éviter une lecture simpliste de cette « révolution scientifique »<ref name="federspiel-intro" />. La transition entre la physique aristotélicienne et la mécanique moderne s'est opérée par étapes, à travers de nombreuses relectures internes au cadre péripatéticien (théorie de l'''impetus'' chez Jean Philopon puis Buridan, distinctions médiévales entre vitesse et accélération). On ne saurait dater d'un événement unique le passage à la modernité. === Troisième partie. Le ''De generatione et corruptione'' : génération, corruption et transformation === ==== Chapitre I. Les deux espèces de génération ==== ===== 1.1. La génération absolue et la génération relative ===== Le traité ''De la génération et de la corruption'' prolonge l'examen des transformations dans le domaine sublunaire<ref>Édition française de référence : Aristote, ''De la génération et de la corruption'', éd. et trad. Marwan Rashed, Paris, Les Belles Lettres, 2005.</ref>. Sa question centrale est : qu'est-ce qui se passe lorsqu'un être nouveau apparaît ? Aristote distingue deux types de génération<ref>Aristote, ''De la génération et de la corruption'', I, 3, 317a17-b18.</ref>. La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît, un arbre meurt. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien, un fruit mûrit. La distinction, qui peut paraître scolastique, joue en réalité un rôle considérable. Elle permet de répondre à un double péril : l'éléatisme de Parménide, qui niait toute génération au nom du principe que le non-être ne peut produire l'être, et l'atomisme de Démocrite, qui réduisait toute génération à l'agrégation et la dissociation d'atomes éternels. Aristote, comme dans la ''Physique'', sauve la possibilité du devenir en distinguant ses degrés et ses modalités. ===== 1.2. Critique de l'atomisme ===== Le ''De caelo'' III, 4 et le ''De gen. corr.'' I, 8 contiennent les principales critiques aristotéliciennes de l'atomisme<ref>Aristote, ''Du ciel'', III, 4, 303a3-303b8 ; ''De la génération et de la corruption'', I, 8, 324b25-326b6.</ref>. Ces critiques sont nombreuses et techniques, mais on peut en dégager trois grandes lignes. D'abord, Aristote conteste la possibilité physique d'une « génération » qui serait simple agrégation : si les atomes sont éternels et immuables, il n'y a pas véritablement de naissance ni de mort, mais seulement des arrangements et des séparations. Ce qui apparaît comme génération est, dans cette perspective, illusion subjective. Ensuite, il conteste la cohérence interne du système. Si les atomes sont indivisibles, comment se fait-il que les corps puissent paraître plus ou moins denses ? Si la division s'arrête à un certain seuil, pourquoi à celui-ci plutôt qu'à un autre ? Enfin, il conteste la pertinence explicative de l'atomisme. Réduire toute qualité à des arrangements géométriques d'atomes, c'est manquer la spécificité des qualités sensibles : la chaleur, le froid, le doux, l'amer ne se laissent pas réduire à des configurations spatiales. ==== Chapitre II. Action et passion ==== ===== 2.1. L'unité d'action et de passion ===== Une question centrale du ''De gen. corr.'' est : comment l'agent agit-il sur le patient ? Aristote refuse une lecture qui les séparerait : l'action n'est pas dans l'agent et la passion dans le patient, comme deux processus distincts. Au contraire, action et passion sont ''un seul et même mouvement'', considéré sous deux aspects<ref>Aristote, ''De la génération et de la corruption'', I, 7, 323b18-324a19.</ref>. Cette thèse, qui paraît étrange, est commandée par la doctrine du mouvement de ''Physique'' III. Le mouvement, on l'a vu, est l'entéléchie du mobile en tant que mobile. Or cet acte est ''dans le patient'', non dans l'agent. C'est dans la chose chauffée, et non dans le feu, que se trouve l'acte du chauffage. L'agent n'est, par rapport à cet acte, que le porteur antérieur de la forme à transmettre. Comme l'écrit Besnier dans le volume Morel : « il n'a [le moteur] pour privilège que l'antériorité de l'actualité de cette forme de mobilité (il a cette mobilité en acte, avant que la puissance sur laquelle il agit dans le mobile ne soit, à son tour, actualisée) »<ref>Bernard Besnier, dans P.-M. Morel (éd.), ''Aristote et la notion de nature'', op. cit.</ref>. Cette doctrine, qu'on appelle parfois la « théorie de la cinésis dans le patient », explique pourquoi le maître peut, en enseignant, ne pas apprendre lui-même : c'est dans l'élève, et non dans le maître, que se trouve l'acte d'apprendre. ===== 2.2. Le contact comme condition de l'action ===== Pour qu'il y ait action, il faut qu'il y ait contact (''haphê'') entre l'agent et le patient. Cette thèse exclut toute action à distance dans l'ordre physique ordinaire ; il faut une transmission de proche en proche. Elle commande la cohérence du système physique aristotélicien : les sphères célestes meuvent les sphères inférieures par contact, l'éther environne les éléments sublunaires, et la chaîne de transmission se poursuit jusqu'aux mouvements observables. Aristote distingue cependant le contact réciproque (entre deux corps qui se touchent et s'affectent mutuellement) du contact unilatéral (où l'agent affecte le patient sans en être affecté). Cette distinction prépare la conception d'une action sans réciprocité, dont l'analogie sera mobilisée pour penser l'action du moteur immobile. Il faut toutefois être prudent : le moteur immobile, immatériel et incorporel, ne meut pas comme un corps qui en pousserait un autre. La référence au contact ne fournit ici qu'une analogie limitée, et la lecture traditionnelle privilégie l'interprétation du moteur immobile comme cause finale plutôt que comme agent au sens physique du terme. Le « contact sans réciprocité » est donc une notion locale, valide pour certaines actions sublunaires, plutôt qu'un modèle direct pour la causalité du moteur immobile. ==== Chapitre III. Le mélange (''mixis'') ==== ===== 3.1. Qu'est-ce qu'un véritable mélange ? ===== L'analyse du mélange compte parmi les moments les plus techniques et les plus féconds du traité<ref>Aristote, ''De la génération et de la corruption'', I, 10, 327a30-328b22. Voir Marwan Rashed, introduction à son édition, op. cit., pour une analyse fine.</ref>. Aristote distingue le véritable mélange (''mixis'') de la simple juxtaposition (''sunthesis''). Dans la juxtaposition, les composants conservent leur identité : un tas de blé et un tas d'orge, mêlés mécaniquement, restent un tas de grains de blé et de grains d'orge, identifiables séparément. Dans le mélange véritable, les composants forment un nouveau corps homogène, dont les qualités ne sont plus celles des composants pris à part. Mais comment une telle fusion est-elle possible ? Si les composants disparaissaient totalement, on aurait une corruption suivie d'une génération, et non un mélange. Si les composants subsistaient inchangés, on aurait une simple juxtaposition. Il faut donc une troisième voie : les composants subsistent ''en puissance'', leurs qualités s'unissant pour former une qualité intermédiaire. ===== 3.2. La doctrine de la « subsistance en puissance » ===== Cette doctrine est subtile : les composants d'un mélange ne sont ni totalement présents (en acte) ni totalement absents. Ils subsistent en puissance, au sens où l'on peut, par analyse, les retrouver. C'est ce qui distingue le mélange véritable de la simple corruption : un alliage, par exemple, peut être décomposé pour retrouver les métaux qui le composent ; un mélange de cuivre et d'étain donne du bronze, mais le bronze peut être analysé pour redonner cuivre et étain. Cette analyse a des implications considérables pour la chimie aristotélicienne. Tous les corps composés (les ''homéomères'' d'Aristote, c'est-à-dire la chair, l'os, le sang, la pierre, le métal) sont des mélanges des quatre éléments en proportions diverses. La diversité des corps naturels résulte de cette combinatoire élémentaire, mais d'une combinatoire qualitative (un certain équilibre du chaud, du froid, du sec, de l'humide) plutôt que quantitative au sens moderne. Cette doctrine permet en outre de penser l'unité substantielle des composés sans tomber dans le dilemme entre, d'un côté, l'atomisme (qui ramène toute unité à une simple agrégation extrinsèque), et, de l'autre, l'éléatisme (qui ne reconnaît aucune réalité aux mixtes). Le bronze n'est pas un cuivre-et-étain superposés, ni une nouvelle substance qui aurait absorbé le cuivre et l'étain ; il est une réalité une, dont les composants subsistent à titre de potentialités récupérables. Cette conception influencera profondément la chimie médiévale et la pensée alchimique, qui voient dans la transmutation des métaux la possibilité de réorganiser ces équilibres qualitatifs internes. === Quatrième partie. Les ''Météorologiques'' : les phénomènes du monde sublunaire === ==== Chapitre I. Le programme de la science naturelle ==== ===== 1.1. La place des ''Météorologiques'' dans le système ===== Les ''Météorologiques'' occupent une place stratégique dans la philosophie naturelle aristotélicienne<ref>Édition française : Aristote, ''Les Météorologiques'', éd. et trad. Pierre Louis, Paris, Les Belles Lettres, 1982 ; nouvelle édition partielle par Jocelyn Groisard. Voir aussi l'introduction du ''Aristoteles-Handbuch'' sur la place de ce traité dans le système.</ref>. Après la ''Physique'' (principes généraux du mouvement), le ''De caelo'' (cosmologie générale) et le ''De generatione et corruptione'' (transformations élémentaires), les ''Météorologiques'' étudient les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Les Météorologiques'', I, 1, 338a20-339a5.</ref>. Le terme « météorologique » a chez Aristote un sens beaucoup plus large que celui qu'il a en français contemporain. Il désigne tous les phénomènes qui se produisent entre la surface de la Terre et la sphère de la Lune. Il englobe donc les phénomènes atmosphériques (pluie, neige, grêle, vent, tonnerre, éclair, foudre), mais aussi des phénomènes que nous classerions ailleurs : les comètes, la Voie lactée, les tremblements de terre, les marées, le cours des fleuves, la formation des minéraux et des métaux dans la terre. Ce vaste champ s'organise selon un principe explicatif fondateur : tout ce qui se produit dans le monde sublunaire dépend, en dernier ressort, de l'action des corps célestes (principalement du Soleil) sur les éléments terrestres. ===== 1.2. La dépendance du sublunaire au supralunaire ===== Cette dépendance n'est pas une astrologie au sens vulgaire. Aristote n'attribue pas aux astres une influence sur les destinées individuelles. Il s'agit plutôt d'une doctrine cosmologique cohérente : le mouvement éternel du ciel, par sa régularité, communique au monde sublunaire la chaleur et l'organisation qui rendent possible la génération et la corruption. Comme le souligne le ''Aristoteles-Handbuch'', cette articulation entre les deux mondes (éternel et corruptible, supralunaire et sublunaire) est la marque distinctive de la philosophie naturelle aristotélicienne<ref>Christof Rapp, Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., section sur les ''Météorologiques''.</ref>. L'unité du système ne repose ni sur une homogénéité matérielle (l'éther est radicalement distinct des quatre éléments) ni sur une géométrie commune, mais sur une chaîne causale qui descend du ciel à la terre. ==== Chapitre II. Les deux exhalaisons ==== ===== 2.1. La doctrine des deux exhalaisons ===== Au cœur des ''Météorologiques'' se trouve la théorie des deux exhalaisons<ref>Aristote, ''Les Météorologiques'', I, 3-4, 340b14-342a33.</ref>. Sous l'effet de la chaleur solaire, la Terre émet deux types d'évaporations : une exhalaison humide (vapeur d'eau, issue principalement des mers et des fleuves) et une exhalaison sèche (émanation chaude et combustible, issue de la terre elle-même). Ces deux exhalaisons, en montant vers les régions supérieures de l'atmosphère, donnent naissance à la plupart des phénomènes météorologiques. L'exhalaison humide, refroidie par les régions élevées, retombe sous forme de pluie, de neige ou de grêle. L'exhalaison sèche, enflammée au contact de la sphère du feu (immédiatement sous la sphère de la Lune), produit les phénomènes ignés : étoiles filantes, comètes, Voie lactée. ===== 2.2. Limites et fécondité de la doctrine ===== Ces explications, bien souvent fausses au regard de la science moderne, témoignent d'une démarche véritablement naturaliste. Aristote ne fait pas appel aux dieux pour expliquer le tonnerre ou la comète, comme le faisaient encore les théogonies de son temps. Il propose des explications par causes naturelles, qui mettent en jeu des principes universels (la chaleur, l'humidité, la transformation des éléments). Comme l'observe Pellegrin, ces explications restent contraintes par les moyens techniques de leur époque<ref name="pellegrin" />. L'absence de microscope, de chimie quantitative, de météorologie instrumentale, limite radicalement la portée des théories. Mais la ''démarche'' (expliquer le naturel par le naturel) inaugure ce qui deviendra la science moderne. ===== 2.3. Le livre IV des ''Météorologiques'' : vers une chimie qualitative ===== Le livre IV des ''Météorologiques'' (dont l'authenticité aristotélicienne est aujourd'hui débattue) propose une véritable chimie qualitative, en s'appuyant sur les couples chaud/froid et sec/humide<ref>Sur la question de l'authenticité du livre IV, voir Hans Baltussen, « Philology or Philosophy ? Simplicius on the Use of Quotations », ''Apeiron'', 2003 ; ainsi que les introductions des éditions récentes du traité.</ref>. Toute substance se caractérise par une combinaison de ces qualités, et ses transformations s'expliquent par des modifications de cette combinaison. Cette approche, prolongée par les commentateurs antiques et médiévaux, fournira à l'alchimie son cadre conceptuel jusqu'au XVII{{e}} siècle. Elle ne sera renversée que par la chimie de Lavoisier, qui substituera aux quatre éléments une nomenclature des corps simples fondée sur l'analyse pondérale. === Cinquième partie. Le ''De anima'' : l'âme, forme du corps vivant === ==== Chapitre I. La définition de l'âme ==== ===== 1.1. Le statut du ''De anima'' ===== Le ''De anima'' occupe une place singulière dans le corpus aristotélicien<ref>Édition française : Aristote, ''De l'âme'', éd. A. Jannone, trad. E. Barbotin, Paris, Les Belles Lettres, 1966 ; voir aussi la traduction de Richard Bodéüs, ''De l'âme'', Paris, GF Flammarion, 1993.</ref>. Il appartient en partie à la philosophie naturelle (puisque l'âme est principe de mouvement du vivant, et que le vivant est un être naturel), mais il déborde sur ce qu'on appellerait aujourd'hui psychologie ou philosophie de l'esprit. Aristote l'annonce dès le début (I, 1) : la connaissance de l'âme est l'une des plus précieuses parmi celles qui contribuent à toute vérité, et particulièrement à la connaissance de la nature. Le traité s'ouvre par un long examen des opinions des prédécesseurs (livre I), avant de proposer la définition aristotélicienne de l'âme (livre II, 1) puis d'analyser les facultés (livres II, 2 à III, 8) et enfin l'intellect (III, 4-8). ===== 1.2. La définition canonique : ''De anima'' II, 1 ===== La définition aristotélicienne de l'âme est posée en ''De anima'' II, 1 : l'âme est « l'entéléchie première d'un corps naturel ayant la vie en puissance » (''hê psuchê estin entelecheia hê prôtê sômatos phusikou dunamei zôên echontos'')<ref>Aristote, ''De l'âme'', II, 1, 412a27-28. Sur cette définition et les difficultés de sa traduction, voir Christopher Shields, ''Aristotle : De Anima'', Oxford, Clarendon Press, 2016, p. 162-176.</ref>. Décortiquons cette formule, qui condense toute la doctrine. « Entéléchie » : l'âme est l'actualité (''entelecheia'') correspondante d'un corps qui possède la vie en puissance. Le terme désigne ici un état d'achèvement et de réalisation, à distinguer du simple processus. « Première » : Aristote distingue l'entéléchie première de l'entéléchie seconde. La science possédée est entéléchie première par rapport à l'apprentissage qui y conduit ; l'exercice actuel de la science est entéléchie seconde par rapport à la science possédée. De même, l'âme est entéléchie première : elle est la ''capacité actuelle'' de vivre, la ''disposition stable'' à la vie, et non l'exercice de telle ou telle fonction vitale particulière. Quand un homme dort, il a son âme en entéléchie première (il vit), mais ses fonctions sensorielles ne sont pas en entéléchie seconde (il ne sent pas actuellement). « D'un corps naturel » : l'âme est l'entéléchie d'un corps. Elle n'est pas séparable du corps comme une chose distincte (contre Platon), mais elle est aussi distincte du corps en ce qu'elle en est la forme (contre les matérialistes). Le corps n'est pas l'instrument extérieur de l'âme, ni l'âme une partie du corps : ils forment ensemble la substance vivante. « Ayant la vie en puissance » : le corps doit être déjà disposé à la vie. Un cadavre n'a plus la vie en puissance : son âme l'a quitté, et il n'est plus un corps naturel au sens propre, mais un agrégat en voie de décomposition. L'œil mort n'est plus un œil que par homonymie, dit Aristote : il en garde l'apparence, mais non l'essence. ===== 1.3. L'analogie de la hache et de l'œil ===== Pour rendre cette définition intuitive, Aristote propose deux analogies célèbres<ref>Aristote, ''De l'âme'', II, 1, 412b10-413a3.</ref>. Si la hache était un être naturel, son essence serait son aptitude à trancher : la « tranche » serait son âme, le bois et le fer, sa matière. Quand la hache n'est plus capable de trancher, elle n'est plus une hache que de nom. De même, si l'œil était un animal complet, sa vue en serait l'âme : l'œil est la matière de la vue, et quand celle-ci disparaît, l'œil n'est plus un œil sinon par homonymie, comme un œil de pierre ou d'image. Ces analogies illustrent l'hylémorphisme : l'âme est à la matière vivante ce que la fonction est à l'organe. Elle n'est pas une chose à part, mais elle n'est pas non plus la simple matière organisée : elle est le principe formel et fonctionnel qui fait que cette matière est une matière ''vivante''. ===== 1.4. L'hylémorphisme contemporain ===== La doctrine hylémorphique de l'âme connaît un regain d'intérêt dans la philosophie de l'esprit contemporaine. Elle est invoquée comme alternative à la fois au dualisme cartésien (qui sépare âme et corps) et au réductionnisme matérialiste (qui identifie l'âme à des processus cérébraux). Des philosophes comme Christopher Shields, Sophia Connell ou Jennifer Whiting voient dans l'hylémorphisme aristotélicien une voie féconde pour penser l'unité du vivant<ref>Christopher Shields, ''Aristotle : De Anima'', op. cit. ; Sophia M. Connell, ''Aristotle on Female Animals'', Cambridge, Cambridge University Press, 2016 ; Jennifer Whiting, « Living Bodies », dans Martha Nussbaum et Amélie Rorty (éd.), ''Essays on Aristotle's De Anima'', Oxford, Clarendon Press, 1992.</ref>. Dans les sciences cognitives, des courants comme la cognition incarnée (''embodied cognition'') ou l'énactivisme présentent certaines analogies avec l'hylémorphisme aristotélicien : l'esprit n'y est pas un programme abstrait susceptible de s'incarner dans n'importe quel support, mais une activité d'un corps spécifique, dont la structure et la fonction sont indissociables. Ces rapprochements doivent toutefois être pris avec prudence : les sciences cognitives contemporaines travaillent dans un cadre biologique, neurologique et expérimental très différent de celui d'Aristote, et la psychologie aristotélicienne reste, fondamentalement, une théorie de l'âme comme principe général du vivant, et non une psychologie du mental au sens moderne. ==== Chapitre II. Les trois âmes et leurs facultés ==== ===== 2.1. La hiérarchie des âmes ===== Aristote distingue trois niveaux de vie, et donc trois niveaux d'âme<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-415a13.</ref>. Cette hiérarchie n'est pas une stratification en couches séparées, mais une ''inclusion'' : chaque niveau supérieur intègre les niveaux inférieurs. L'âme végétative ou nutritive (''threptikon'') est le niveau le plus simple. Elle est commune à tous les vivants : plantes, animaux, hommes. Elle assure les trois fonctions fondamentales de la vie : la nutrition (assimilation des aliments), la croissance (augmentation de la masse vivante) et la reproduction (génération d'un être semblable). C'est elle qui définit la vie au sens minimal : sans nutrition ni reproduction, il n'y a pas de vivant. L'âme sensitive (''aisthêtikon'') ajoute, chez les animaux, la sensation, le désir et le mouvement local. Elle suppose toujours l'âme nutritive (un animal doit manger pour vivre), mais l'enrichit de fonctions nouvelles. La sensation permet à l'animal de discriminer son environnement ; le désir lui fait poursuivre ce qui est bon et fuir ce qui est mauvais ; le mouvement local lui permet d'agir sur cet environnement. L'âme intellective (''dianoêtikon'' ou ''noetikon'') est propre à l'homme. Elle ajoute, aux fonctions précédentes, la pensée rationnelle : le concept, le jugement, le raisonnement. ===== 2.2. La géométrie des âmes ===== Pour penser cette inclusion, Aristote propose une analogie avec les figures géométriques<ref>Aristote, ''De l'âme'', II, 3, 414b28-32.</ref>. Le triangle est inclus dans le quadrilatère au sens où le quadrilatère, en se définissant, présuppose et utilise les propriétés du triangle ; mais le triangle ne se confond pas avec un cas particulier du quadrilatère. De même, l'âme sensitive présuppose l'âme nutritive (sans nutrition, pas de sensation), mais elle n'est pas un cas particulier de la nutrition. Cette analogie a une portée méthodologique : Aristote rappelle, à la fin du chapitre, que c'est de chaque âme séparément qu'il faut traiter. Il n'y a pas d'« âme en général » dont les âmes particulières seraient des espèces : il y a des modes de vie qui s'enchaînent en complexité croissante. ===== 2.3. La triple causalité de l'âme ===== Au chapitre 4 du livre II, Aristote précise que l'âme est ''triplement'' cause du vivant : elle en est la cause formelle (elle est la forme du corps), la cause efficiente (elle initie les mouvements vitaux) et la cause finale (le corps est en vue de l'âme)<ref>Aristote, ''De l'âme'', II, 4, 415b8-28.</ref>. Cette concentration des causes dans l'âme illustre, au plus haut degré, la coïncidence des causes formelle, efficiente et finale dans la nature, déjà indiquée en ''Physique'' II, 7. ==== Chapitre III. La sensation et l'intellection ==== ===== 3.1. La théorie de la sensation ===== Au livre II, chapitre 5 et suivants, Aristote propose sa théorie de la sensation. La sensation est définie comme « la réception de la forme sensible sans la matière »<ref>Aristote, ''De l'âme'', II, 12, 424a17-21.</ref>. L'analogie célèbre est celle de la cire qui reçoit l'empreinte du sceau : la cire prend la forme du sceau (le motif gravé) sans recevoir le métal dont il est fait (l'or, le bronze). Cette analogie a une portée propre : elle indique que la sensation n'est ni une simple modification physique (comme le matérialisme ancien le voulait), ni une création spirituelle pure (comme le platonisme l'envisageait), mais une réception qualitative qui suppose à la fois une affection corporelle et une saisie formelle. C'est la doctrine que les scolastiques résumeront par la formule ''sensus est susceptivus formarum sine materia''. Concrètement, lorsque je vois un objet rouge, mon œil reçoit la « rougeur » au sens où il est actualisé selon cette qualité, mais il ne devient pas physiquement rouge comme un tissu teinté : il accueille la forme sans la matière qui la portait. Ce double caractère (physique parce que l'organe est affecté, formel parce que ce qui est reçu est l'aspect intelligible et non la matière du sensible) explique en grande partie le caractère cognitif de la sensation, qui n'est pas une simple réaction mécanique mais déjà un acte de discrimination. ===== 3.2. Les cinq sens et le sens commun ===== Aristote distingue les cinq sens externes (vue, ouïe, odorat, goût, toucher), chacun ayant son objet propre (la couleur pour la vue, le son pour l'ouïe, etc.). Mais il y a aussi un ''sens commun'' (''koinê aisthêsis''), qui n'est pas un sixième sens mais une faculté que partagent les cinq sens : elle perçoit ce qui n'est pas réductible à un sens particulier (le mouvement, le repos, la figure, le nombre, la grandeur). C'est elle aussi qui nous permet de comparer les sensations de différents sens (ce que je vois et ce que je touche est-il la même chose ?), et qui nous donne conscience de sentir<ref>Aristote, ''De l'âme'', III, 1-2, 424b22-427a16. Pour une étude approfondie, voir Pavel Gregorić, ''Aristotle on the Common Sense'', Oxford, Oxford University Press, 2007.</ref>. Comme le note Morel à propos du ''De memoria'', le sens commun est, en dernière instance, logé dans le cœur<ref>Pierre-Marie Morel, ''Aristote. Petits traités d'histoire naturelle'', Paris, GF Flammarion, 2000, introduction.</ref>. Aristote, comme on le verra plus loin, défend une doctrine cardiocentrique, contre l'encéphalocentrisme déjà entrevu par Alcméon de Crotone et qui sera défendu par les médecins hippocratiques puis par Galien. ===== 3.3. L'imagination et la mémoire ===== Outre la sensation, l'âme dispose d'une faculté qu'Aristote appelle ''phantasia'', traduite traditionnellement par « imagination » mais dont le sens est plus large. La ''phantasia'' est la capacité de produire et de retenir des images (''phantasmata'') qui sont comme des « affections » résiduelles des sensations passées. Elle joue un rôle médiateur entre la sensation et la pensée : sans ''phantasia'', il n'y aurait ni mémoire (qui retient les images du passé) ni pensée (qui s'exerce sur des images abstraites). Aristote pose à ce propos une formule fameuse : « jamais l'âme ne pense sans ''phantasme'' »<ref>Aristote, ''De l'âme'', III, 7, 431a16-17. Voir Pierre-Marie Morel, ''De la mémoire et de la réminiscence'', Paris, GF Flammarion, 2000, et Caston Victor, « Why Aristotle needs Imagination », ''Phronesis'', 1996.</ref>. Cette thèse soulève une difficulté majeure : comment l'intellect, qui est immatériel, peut-il dépendre d'images sensibles, qui sont matérielles ? L'enquête sur ce point traverse l'aristotélisme arabe et latin, et nourrit encore les débats contemporains sur la phénoménologie de la pensée. ===== 3.4. L'intellect (''nous'') : le passage le plus controversé ===== Au livre III, chapitre 5, Aristote consacre un texte d'une vingtaine de lignes à l'intellect, qui est l'un des plus brefs et des plus controversés de toute son œuvre<ref>Aristote, ''De l'âme'', III, 5, 430a10-25. Pour une analyse historique des interprétations, voir F. Brentano, ''Die Psychologie des Aristoteles'', Mainz, 1867 ; H. Davidson, ''Alfarabi, Avicenna, and Averroes on Intellect'', Oxford, Oxford University Press, 1992.</ref>. Il y distingue deux moments de l'intellect : un intellect ''patient'' (''pathêtikos''), qui reçoit les formes intelligibles, et un intellect ''agent'' (''poiêtikos''), comparé à la lumière qui « fait passer à l'acte » les couleurs en puissance. Le texte aristotélicien lui-même est extrêmement elliptique : il ne contient pas explicitement le vocabulaire de l'« abstraction » des formes à partir des images sensibles. Cette formulation, qui dominera la scolastique latine, est principalement héritée des lectures avicennienne et thomiste, qui ont systématisé ce qu'Aristote suggérait à peine. L'intellect agent est-il une partie de l'âme humaine, ou bien une réalité séparée et divine ? Est-il immortel, ou périt-il avec le corps ? Sur ces questions, la tradition commentatoriale a divergé profondément. Alexandre d'Aphrodise (vers 200 ap. J.-C.) y voyait un intellect divin, séparé, identifié au Premier Moteur. Avicenne et Averroès, dans la tradition arabe, en faisaient un intellect séparé unique pour toute l'humanité. Thomas d'Aquin, contre Averroès, défendait l'individualité de l'intellect agent en chaque âme humaine. Cette discussion, qui a façonné toute la métaphysique de l'esprit médiévale, dépasse le strict cadre de la philosophie de la nature. Mais elle illustre comment, à la frontière de la psychologie naturelle et de la métaphysique, Aristote ouvre des questions qui vont structurer la pensée occidentale pour des siècles. === Sixième partie. Les ''Parva naturalia'' : les fonctions vitales === ==== Chapitre I. Organisation des « Petits traités d'histoire naturelle » ==== ===== 1.1. Un corpus complémentaire au ''De anima'' ===== Les ''Parva naturalia'' forment un ensemble de courts traités qui étudient en détail les fonctions vitales examinées plus généralement dans le ''De anima''<ref>Édition française : Aristote, ''Petits traités d'histoire naturelle'', éd. et trad. Pierre-Marie Morel, Paris, GF Flammarion, 2000 ; voir aussi l'édition de René Mugnier, Paris, Les Belles Lettres, 1953.</ref>. Là où le ''De anima'' posait la définition de l'âme et la hiérarchie de ses facultés, les ''Parva naturalia'' descendent au niveau des opérations particulières et de leurs organes. Aristote lui-même indique le programme au début du ''De sensu''<ref>Aristote, ''De la sensation'', 1, 436a1-17.</ref>. Le corpus comprend principalement les traités suivants : ''De sensu et sensibilibus'' (sur la sensation et les sensibles), ''De memoria et reminiscentia'' (sur la mémoire et la réminiscence), ''De somno et vigilia'' (sur le sommeil et la veille), ''De insomniis'' (sur les rêves), ''De divinatione per somnum'' (sur la divination dans les songes), ''De longitudine et brevitate vitae'' (sur la longue et la brève durée de la vie), ''De juventute et senectute'' (sur la jeunesse et la vieillesse), ''De respiratione'' (sur la respiration), ''De vita et morte'' (sur la vie et la mort). ===== 1.2. Sensibles propres, sensibles communs et sensibles par accident ===== Le ''De sensu'' précise et complète la doctrine de la sensation du ''De anima''. Aristote y distingue trois types de sensibles. Les sensibles propres sont propres à un sens particulier : la couleur pour la vue, le son pour l'ouïe, l'odeur pour l'odorat, la saveur pour le goût, la texture (chaud, froid, dur, mou) pour le toucher. Les sensibles communs sont perceptibles par plusieurs sens : le mouvement, le repos, la figure, la grandeur, le nombre. Les sensibles par accident ne sont sensibles qu'indirectement : je vois cet homme blanc, où la blancheur est sensible ''par soi'' (sensible propre) et l'homme est sensible ''par accident'' (à travers la blancheur que je vois). ===== 1.3. Le sommeil et le rêve ===== Le ''De somno'' propose une analyse remarquable du sommeil. Pourquoi dormons-nous ? La réponse aristotélicienne mêle physiologie et finalité<ref>Aristote, ''Du sommeil et de la veille'', 2-3, 455a4-458a32.</ref>. Physiologiquement, le sommeil résulte d'un cycle complexe : les évaporations issues de la digestion s'élèvent vers la région de la tête, où elles se refroidissent ; refroidies, elles redescendent ensuite vers la région du cœur, siège de la sensation. C'est cet afflux refroidi autour du cœur qui empêche, temporairement, l'exercice des facultés sensorielles. La doctrine du sommeil s'inscrit donc dans le cadre cardiocentrique : ce n'est pas la « lourdeur » céphalique en tant que telle qui produit le sommeil, mais la modification thermique qu'elle entraîne au niveau du principe sensitif, situé dans le cœur. Finalement, le sommeil sert au repos des facultés sensorielles, qui ne pourraient exercer leur fonction continûment sans s'épuiser. Le ''De insomniis'' analyse les rêves comme des persistances de mouvements sensoriels après la disparition des stimuli externes. Les images sensorielles, conservées par la ''phantasia'', sont activées pendant le sommeil sans être contrôlées par l'intellect ni recoupées par les sensations actuelles, d'où leur caractère parfois absurde ou fantasmagorique. Quant au ''De divinatione per somnum'', il aborde une question délicate dans la culture grecque : les rêves prophétisent-ils l'avenir ? Aristote répond avec une prudence sceptique. Certains rêves peuvent annoncer un événement futur, mais c'est par hasard ou par une cause naturelle, non par une révélation divine. La position est subtile : Aristote ne nie pas le phénomène, mais en refuse l'interprétation surnaturelle. ==== Chapitre II. Le cardiocentrisme et la chaleur innée ==== ===== 2.1. Le cœur, principe de la vie ===== Aristote défend, contre la tradition médicale qui plaçait le siège des fonctions intellectuelles dans le cerveau (les médecins hippocratiques), une doctrine cardiocentrique : c'est dans le cœur que résident le principe vital, le sens commun et l'origine du mouvement<ref>Aristote, ''Parties des animaux'', III, 4, 665b9-667b13. Édition française : Aristote, ''Les Parties des animaux'', éd. et trad. Pierre Louis, Paris, Les Belles Lettres, 1956.</ref>. Cette doctrine est argumentée dans les ''Parties des animaux'' (notamment III, 4) et reprise dans plusieurs traités des ''Parva naturalia''. Le cœur est le premier organe à se former dans l'embryon, et c'est par lui que partent les vaisseaux qui irriguent tout le corps. Il est le siège de la chaleur innée (''emphuton thermon''), source de toute vie. Le cerveau, froid et humide, n'a qu'une fonction subalterne : il sert à modérer la chaleur excessive du cœur, comme un système de refroidissement. Comme le détaille le ''Aristoteles-Handbuch'', le cœur est le siège et l'origine des fonctions fondamentales de l'âme : la nutrition et la croissance, la perception sensorielle et le mouvement<ref>Christof Rapp, Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., section sur les ''Parties des animaux''.</ref>. Dans le ''De motu animalium'', Aristote ajoute que c'est dans la région cardiaque qu'agit le ''pneuma symphyton'' (souffle congénital), instrument du mouvement volontaire<ref>Aristote, ''Mouvement des animaux'', éd. et trad. Pierre-Marie Morel, Paris, GF Flammarion, 2013.</ref>. ===== 2.2. Une erreur féconde ===== Du point de vue de l'anatomie moderne, cette doctrine est fausse : c'est le cerveau, et non le cœur, qui est le siège de la sensation et du mouvement volontaire. Galien, au II{{e}} siècle, le démontrera expérimentalement par ses fameuses vivisections, en montrant notamment que la section du nerf laryngé récurrent provoque la perte de la voix : c'est donc bien le cerveau, et non le cœur, qui contrôle les fonctions motrices et sensorielles. Mais comme le note Pellegrin, aucune observation n'a amené Aristote à renverser l'une quelconque des conceptions fantaisistes qu'il a sur le fonctionnement du corps vivant<ref name="pellegrin" />. Cette erreur n'est pas anecdotique : elle révèle les contraintes méthodologiques de la science aristotélicienne. Aristote pratique la dissection (notamment dans l'''Histoire des animaux''), mais l'anatomie comparée ne lui permet pas de discerner la fonction nerveuse du cerveau. Il interprète les phénomènes selon des cadres préconçus (la primauté de la chaleur, l'analogie entre les fonctions vitales et les processus de cuisson) qui orientent l'observation. L'erreur est cependant féconde. Le cardiocentrisme aristotélicien, repris par les commentateurs, sera contesté à partir du XVI{{e}} siècle par les anatomistes modernes : Vésale (1543) renouvelle l'anatomie par la dissection systématique des cadavres humains ; Harvey (1628) découvre la circulation du sang et donne au cœur son rôle de pompe musculaire, dégagé de toute fonction cognitive ; Willis (1664) jette les bases de la neurologie moderne avec son ''Cerebri anatome''. La fausse doctrine d'Aristote, en provoquant la critique, a contribué au progrès de la science. ===== 2.3. La chaleur innée et le pneuma ===== La notion de chaleur innée occupe une place centrale dans la physiologie aristotélicienne. C'est elle qui distingue le vivant du non-vivant, la respiration servant à la maintenir et à la modérer. Cette chaleur est associée à un ''pneuma'' (souffle), véhicule des opérations vitales et organe de communication entre l'âme et le corps. Le pneuma aristotélicien n'est pas l'air ordinaire : il est un « corps subtil » apparenté, par ses propriétés, à l'éther céleste. Aristote suggère, dans le ''De generatione animalium'', que la chaleur de la semence n'est pas identique à celle du feu, mais s'apparente à la nature des astres : « ce souffle chaud que charrie la semence n'est pas identique au feu, mais il présente une certaine analogie avec l'élément des astres, la chaleur solaire étant, elle aussi, principe de vie »<ref>Aristote, ''De la génération des animaux'', II, 3, 736b29-737a7. Édition française : éd. et trad. Pierre Louis, Paris, Les Belles Lettres, 1961.</ref>. Cette suggestion, que Moraux qualifie de « curieuse allusion à l'élément astral », a donné lieu à de longs développements dans la tradition (Théophraste, Cicéron, Cléanthe), où le pneuma devient le véhicule de l'âme et le pont entre cosmologie et psychologie. Comme le note Morel, l'analyse du pneuma engage la spécificité même de la ''phusis'' : « le sperme n'apporte donc pas simplement la chaleur mais une chaleur qui vient de l'âme »<ref name="morel" />. La biologie aristotélicienne se distingue ainsi à la fois du matérialisme (la matière seule n'engendre pas la vie) et du dualisme (l'âme n'est pas un esprit séparé venant animer un corps mort), en posant un ''intermédiaire'' qui est à la fois matériel et porteur de forme. === Conclusion : la philosophie de la nature aristotélicienne aujourd'hui === Le parcours qui vient d'être proposé permet de mesurer l'ampleur et la cohérence de la philosophie de la nature aristotélicienne. Quatre traits caractéristiques méritent d'être soulignés en conclusion. Premier trait : l'autonomie de la nature. Aristote refuse à la fois la réduction de la nature à un substrat homogène (matière des Présocratiques, atomes des Atomistes) et son absorption dans une cause extérieure (Idées platoniciennes, Démiurge du ''Timée''). La nature a en elle-même son principe ; elle constitue un domaine propre, irréductible aux mathématiques comme à la théologie. Cette autonomie fonde la possibilité même d'une science de la nature. Deuxième trait : l'articulation matière/forme. L'hylémorphisme aristotélicien fournit un cadre qui permet de penser l'unité du vivant et la continuité du devenir sans les réduire ni à la matière brute ni à un esprit pur. Ce cadre, tombé en disgrâce avec la révolution mécaniste, retrouve aujourd'hui une actualité dans la philosophie de la biologie et de l'esprit. Troisième trait : la téléologie immanente. La nature aristotélicienne est ''finalisée'', mais sans intentionnalité. Elle s'achemine vers des états d'achèvement qui sont à la fois ses formes propres et ses fins. Cette téléologie immanente, qui ne suppose ni dessein divin ni conscience naturelle, offre une voie médiane entre le mécanisme aveugle et le créationnisme. Quatrième trait : la hiérarchie des sciences. La philosophie de la nature s'organise en une hiérarchie cohérente, qui descend des principes les plus généraux (''Physique'') aux phénomènes les plus particuliers (biologie). Chaque niveau a ses principes propres, sans se réduire au niveau inférieur. Cette hiérarchie n'est pas une stratification, mais une articulation d'ordre dans l'unité d'un système. L'enquête contemporaine, telle qu'elle se déploie dans des travaux de référence comme ceux de Morel, Judson, Ierodiakonou-Kalligas-Karasmanis, Harry, ou dans l'édition de Federspiel, met en lumière des aspects nouveaux de cette construction. La philosophie de la nature d'Aristote conserve une portée philosophique réelle, où des questions importantes continuent à être posées et reformulées. Comme le rappelle Federspiel à propos du seul ''Traité du ciel'', l'œuvre aristotélicienne « a été une matrice où puisèrent pendant près de deux mille ans les philosophes, les physiciens et les théologiens, païens, chrétiens, juifs ou musulmans »<ref name="federspiel-intro" />. Cette fortune historique tient à la profondeur conceptuelle de l'analyse aristotélicienne, qui a articulé avec rigueur les grandes questions du devenir, de la matière, de la forme, de la causalité et de la finalité. Lire Aristote, ce n'est donc pas seulement étudier un système scientifique périmé ; c'est comprendre la formation de concepts qui ont durablement structuré la pensée occidentale de la nature. == La biologie et la connaissance du vivant == === Préliminaire : situer le corpus biologique d’Aristote === Avant d’entrer dans le détail, il importe de mesurer la place qu’occupe l’œuvre biologique dans le corpus aristotélicien et le renouveau qu’elle a connu dans la recherche du dernier demi-siècle. Pendant des siècles, on a tenu les traités zoologiques pour une compilation de curiosités, marginale par rapport aux écrits proprement « philosophiques » (la ''Métaphysique'', l’''Éthique à Nicomaque'', l’''Organon''). Étienne Gilson le rappelait dès l’ouverture de ''D’Aristote à Darwin... et retour'' : l’''Histoire des animaux'' est « l’un des moins fréquentés des philosophes » modernes, qui « ne le considèrent pas comme philosophique au sens moderne du mot », tandis que les savants le tiennent « pour scientifiquement démodé ». Or, ajoute-t-il, « il est pourtant indiscutablement aristotélicien, ce qui suggère que la manière dont Aristote lui-même concevait science et philosophie n’est plus exactement la nôtre »<ref>Étienne Gilson, ''D’Aristote à Darwin... et retour'', Paris, Vrin, 1971, chap. I.</ref>. Cette désaffection a été retournée par les travaux pionniers de David Balme, Allan Gotthelf, James G. Lennox et Pierre Pellegrin, à partir des années 1960-1980. Le ''Cambridge Companion to Aristotle’s Biology'', dirigé par Sophia Connell (2021), et le volume ''Aristotle’s Parts of Animals : A Critical Guide'' (2026) attestent l’ampleur prise par ce champ : la biologie n’est plus une annexe, mais un lieu où se met à l’épreuve la philosophie première, c’est-à-dire la théorie de la substance, de la causalité, de la définition et de l’âme. Étudier les vivants, ce n’est plus chez Aristote sortir du domaine philosophique, c’est y entrer pleinement<ref>Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle’s Biology'', Cambridge, Cambridge University Press, 2021 ; Sophia M. Connell (éd.), ''Aristotle’s Parts of Animals : A Critical Guide'', Cambridge, Cambridge University Press, 2026.</ref>. Trois grandes œuvres en constituent le noyau, articulées selon une division de tâches scrupuleusement réfléchie : l’''Histoire des animaux'', qui collecte et organise les faits ; les ''Parties des animaux'', qui en cherche les causes du point de vue de la structure adulte ; la ''Génération des animaux'', qui les explique du point de vue du devenir embryonnaire. Autour de ce noyau gravitent les ''Petits Traités d’histoire naturelle'' (''Parva naturalia''), le ''De motu animalium'' et le ''De incessu animalium'' (locomotion), ainsi que le ''De anima'', qui pose les principes psychologiques sans lesquels le projet biologique resterait inintelligible. L’unité de cet ensemble n’est pas accidentelle ; elle reflète la division même que dresse Aristote entre l’enquête sur le « fait » (''hoti'') et l’enquête sur le « pourquoi » (''dihoti''), inscrite au cœur des ''Seconds Analytiques''<ref>Sur les éditions : les références aux traités d’Aristote suivent la pagination Bekker. Pour les éditions et traductions françaises de référence, voir Pierre Louis (éd.), ''Histoire des animaux'', 3 vol., Paris, Belles Lettres (CUF), 1964-1969 ; ''Les Parties des animaux'', Paris, Belles Lettres, 1956 ; ''De la génération des animaux'', Paris, Belles Lettres, 1961 ; pour le ''De anima'', Richard Bodéüs (éd.), ''De l’âme'', Paris, GF-Flammarion, 1993 ; pour le ''De motu animalium'' et le ''De incessu animalium'', Pierre-Marie Morel (éd.), ''Petits traités d’histoire naturelle'', Paris, GF-Flammarion, 2000 ; édition critique de Klaus Corcilius et Oliver Primavesi, ''De motu animalium'', Hambourg, Meiner, 2018.</ref>. === L’''Histoire des animaux'' : l’enquête empirique === ==== Méthode et organisation : le sens de l’''historia'' ==== Le mot grec ''historia'' ne signifie pas « histoire » au sens temporel, mais « enquête », « recherche » ; il désigne une investigation par laquelle l’esprit prend connaissance de ce qui est, avant d’en chercher les causes. Le terme apparaît déjà dans des emplois pré-aristotéliciens, par exemple chez Hérodote, qui annonce son ouvrage comme une ''epideixis historiês'', ou dans le traité hippocratique ''De vetere medicina''. Mais Aristote précise et restreint l’emploi du mot. Selon Lennox, « Aristote tend à restreindre la portée du terme ''historia'' à la première étape de l’enquête naturelle, c’est-à-dire à un type particulier d’investigation pré-démonstrative »<ref>James G. Lennox, ''Aristotle’s Philosophy of Biology : Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001, chap. 2 (« Between Data and Demonstration : The ''Analytics'' and the ''Historia Animalium'' »).</ref>. L’''Historia animalium'' n’est donc pas une fin en soi, mais une étape dans une démarche qui culmine dans l’explication causale. Dans un passage devenu classique (HA I, 6, 491a7-14), Aristote annonce d’abord saisir « les différences et les attributs qui appartiennent à tous les animaux », puis « en découvrir les causes ». Comme l’a souligné Balme, ce passage emploie le vocabulaire technique de la théorie de la démonstration : il distingue l’enquête qui établit les ''différences'' propres à chaque genre d’animal, et la recherche des causes qui s’appuie sur cette première enquête. Lue à la lumière des ''Seconds Analytiques'' II, l’''Historia animalium'' apparaît alors comme une enquête méthodique destinée à organiser l’information empirique de manière à faciliter la découverte des moyens termes des démonstrations causales<ref>David M. Balme, « ''Genos'' and ''eidos'' in Aristotle’s Biology », ''Classical Quarterly'' 12, 1962, p. 81-98 ; voir aussi son édition de l’''Historia animalium'' (Cambridge, 2002).</ref>. Cette lecture transforme la perception du traité. Considéré comme une taxinomie au sens linnéen, l’ouvrage serait, selon Balme, « hopelessly inadequate » : son vocabulaire taxinomique se réduit aux deux termes ''genos'' et ''eidos'', sans hiérarchie fixe, et aucune classification exhaustive n’y apparaît. Considéré comme une collection de monographies sur chaque espèce, le traité est plus décevant encore. Mais lu comme l’assise empirique d’une science démonstrative, il prend cohérence : ce n’est pas un dictionnaire des animaux, c’est une enquête qui rassemble ''des différences'' en convoquant les animaux comme témoins. L’œuvre, dont l’authenticité de plusieurs livres est discutée (les livres VII, VIII, IX et X soulèvent des questions philologiques distinctes, notamment le livre X sur la stérilité, généralement tenu pour inauthentique), couvre un programme exposé en HA I, 6. Le ''Aristoteles-Handbuch'' de Rapp et Corcilius en récapitule la structure : caractéristiques morphologiques (les ''moria'', parties du corps), différences de mode de vie (''bioi''), de caractère (''êthê'') et d’activités (''praxeis''). Aristote y décrit l’anatomie externe et interne, la reproduction, le régime alimentaire, l’habitat et le comportement de plusieurs centaines d’espèces, depuis les poissons et céphalopodes méditerranéens, dont la connaissance présuppose des observations directes ou des informations recueillies auprès de pêcheurs, jusqu’aux insectes sociaux et aux mammifères domestiques. La précision de certaines descriptions, comme celle du placenta du requin lisse, longtemps tenue pour fabuleuse avant que la zoologie moderne n’en confirme la véracité, témoigne d’un travail empirique d’une ampleur considérable<ref>Sur la qualité des observations aristotéliciennes en zoologie marine, voir D’Arcy Wentworth Thompson, ''A Glossary of Greek Fishes'', Londres, Oxford University Press, 1947 ; et Geoffrey E. R. Lloyd, ''Science, Folklore and Ideology'', Cambridge, Cambridge University Press, 1983, chap. 1.</ref>. ==== L’homogène et l’hétérogène : la distinction fondatrice ==== Le traité s’ouvre sur une distinction qu’Étienne Gilson tient pour l’une des « constantes de la philosophie de la nature » : « Des parties dont se composent les animaux, certaines sont simples, d’autres sont composées. Celles qui sont simples se divisent elles-mêmes en parties de nature uniforme ; par exemple, la chair est faite de chairs ; les parties composées se divisent en parties qui ne sont pas uniformes entre elles. Ainsi, par exemple, la main ne se divise pas en mains ni le visage en visages »<ref>Aristote, ''Histoire des animaux'', I, 1, 486a5-14 ; voir le commentaire de Gilson, ''op. cit.'', chap. I.</ref>. C’est la distinction entre les ''homéomères'' (''homoiomerê'', parties homogènes) et les ''anhoméomères'' (''anomoiomerê'', parties hétérogènes ou non-uniformes), qui anticipe la distinction moderne entre tissus et organes, sans toutefois s’y superposer exactement. Les homéomères englobent la chair, l’os, le tendon, le nerf, mais aussi les fluides comme le sang, le lait, la bile, la moelle. Le critère est simple : si l’on coupe un fragment d’os, on obtient encore de l’os ; si l’on coupe un fragment de chair, on obtient encore de la chair. Les anhoméomères, à l’inverse, sont composés de plusieurs homéomères agencés en vue d’une fonction : main, visage, jambe, cœur, foie, poumon. Comme le précise Aristote en une formule lapidaire, « la main ne se divise pas en mains, ni le visage en visages ». Cette distinction n’est pas qu’une commodité descriptive ; elle structure tout l’édifice. Dans les ''Parties des animaux'', le livre II est consacré aux homéomères, les livres III et IV aux anhoméomères. Et c’est dans ce qui est « hétérogène » que se trouve le siège propre de la finalité, car une partie hétérogène ne se définit pas par sa matière mais par sa fonction. Une main, par exemple, n’est pas seulement un outil de préhension : elle est, selon la formule de PA IV, 10, 687a19-23, « l’instrument des instruments » (''organon organôn''), liée chez l’homme à la station droite, à l’intelligence pratique et à la polyvalence technique. Sa définition fonctionnelle est ainsi à plusieurs niveaux : saisir, manipuler, fabriquer. Le passage du discours sur la matière au discours sur la fonction est inscrit dans la nature même des parties hétérogènes : les homéomères sont « pour » les anhoméomères, et leur composition est subordonnée aux fonctions que ces derniers ont à remplir. ==== La classification : la thèse Balme-Pellegrin et ses débats ==== L’idée d’une classification linnéenne avant la lettre, où ''genos'' signifierait « genre » et ''eidos'' « espèce » au sens taxinomique fixe, a longtemps dominé la lecture d’Aristote. Pierre Pellegrin, dans ''La classification des animaux chez Aristote'', et David Balme, dans plusieurs études, ont contesté cette projection rétrospective. Selon eux, dans les œuvres zoologiques, ''genos'' et ''eidos'' ne désignent pas des rangs taxinomiques fixes, mais sont des termes ''relationnels'' : un même groupe d’animaux peut être appelé ''eidos'' d’un ''genos'' plus large, et ''genos'' contenant plusieurs ''eidê'' à un niveau inférieur. Les crabes, par exemple, sont à la fois un ''eidos'' de crustacés et un ''genos'' contenant plusieurs ''eidê'' de crabes (HA I, 6, 490b14-19 ; PA IV, 8, 683b25-29). Pellegrin résume la conséquence : « ''genos'' et ''eidos'' sont des notions qui voyagent trop pour fournir une base stable à une taxinomie animale »<ref>Pierre Pellegrin, ''Aristotle’s Classification of Animals : Biology and the Conceptual Unity of the Aristotelian Corpus'', Berkeley, University of California Press, 1986, p. 82 et 121.</ref>. Cette thèse a une conséquence importante : Aristote n’a pas tenté de construire une taxinomie complète et hiérarchisée à la manière de Linné. Sa classification n’est pas une taxinomie hiérarchique mais une démarche comparative, différentielle et explicative, qui combine critères morphologiques, fonctionnels et écologiques. Pour Pellegrin, ce qu’Aristote vise n’est pas tant les espèces-tout que les ''parties fonctionnelles'' : la division aristotélicienne « ne peut nous donner comme « dernières espèces » la définition d’un animal entier, mais est nécessairement limitée à la définition des fonctions organiques ou des parties fonctionnelles ». L’interprétation a rencontré des objections. Le ''Aristoteles-Handbuch'' (article « ''Art und Gattung'' », par K. Cho et W. Kullmann) souligne que les chapitres méthodologiques de PA I et HA I distinguent ''eidos'' et ''genos'' avec netteté : les animaux dont les parties sont identiques en forme tombent sous un même ''eidos'', ceux dont les parties ne diffèrent que selon le « plus ou moins » tombent sous un même ''genos'' (HA I, 1, 486a14-b8 ; PA I, 3, 644a23-25). En pratique, des groupes désignés comme ''eidos'' (l’homme, la chèvre, le cerf) ne sont jamais subdivisés à leur tour. Aristote semble donc disposer d’un concept d’espèce-tout (''atomon eidos'', ''eschaton eidos''), distinct de l’usage relationnel des termes pour les groupes intermédiaires<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', Stuttgart, J. B. Metzler, 2021, chap. IV.26 « Art und Gattung ».</ref>. La position aujourd’hui équilibrée, dans le sillage de Lennox et de Mary Louise Gill, reconnaît la justesse partielle de la thèse Balme-Pellegrin pour les niveaux supérieurs et intermédiaires, tout en maintenant que pour les espèces atomiques (l’homme, le lion, le cheval), Aristote dispose d’un concept d’espèce robuste, qui constitue l’unité ontologique fondamentale de sa zoologie. L’enjeu n’est pas seulement philologique ; il engage la question du ''réalisme'' d’Aristote. Les anti-réalistes (Balme, Pellegrin) lisent la zoologie comme une science des différences et des fonctions, sans engagement ontologique fort sur les espèces. Les réalistes (Lennox, Henry, Charles) maintiennent que les espèces atomiques sont les véritables substances de la science aristotélicienne du vivant. ==== Les grands groupes : sang et non-sang, ''megista genê'' ==== À l’intérieur de l’enquête, Aristote établit de grandes divisions opératoires. La division fondamentale oppose ''enaima'' (animaux à sang) et ''anaima'' (animaux sans sang), qui correspondent globalement, mais imparfaitement, à ce que la zoologie moderne nomme vertébrés et invertébrés. La correspondance est imparfaite parce qu’Aristote sait que certains animaux sans sang, notamment les céphalopodes et les crustacés, possèdent un fluide analogue au sang, simplement plus pâle ou différemment coloré : il refuse pourtant de l’appeler du sang à proprement parler, et fonde la grande coupure sur cette distinction qualitative. Cette division n’est pas dichotomique au sens platonicien : elle opère à un seul niveau et ne prétend pas épuiser les distinctions pertinentes. Au sein des ''enaima'', Aristote reconnaît plusieurs « plus grands genres » (''megista genê''). Pour faciliter le repérage, on peut indiquer leurs équivalents modernes approximatifs, en gardant à l’esprit qu’il s’agit d’équivalences pédagogiques et non d’identifications taxinomiques strictes : oiseaux, poissons, ce que nous appelons aujourd’hui les cétacés (qu’il distingue avec finesse des poissons, en raison notamment de leur respiration pulmonaire et de leur viviparité), vivipares quadrupèdes (proches de nos mammifères), ovipares quadrupèdes (qui regroupent ce que nous appelons amphibiens et reptiles, sans qu’Aristote les distingue), et l’homme. Au sein des ''anaima'', il identifie les coquillages (''ostrakoderma''), les crustacés (''malakostraka''), les céphalopodes (''malakia'', dont il étudie la pieuvre avec une précision remarquable, notamment l’hectocotyle, organe reproducteur dont la fonction ne sera comprise qu’au {{s-|XIX}}), et les insectes (''entoma'', catégorie large qui englobe les arachnides). Cette grille apparaît à HA II, 15, 505b26 ; elle annonce, sans le construire, l’esprit de la systématique moderne. Aristote ne définit pas avec rigueur les groupes intermédiaires, et l’on ne trouve pas chez lui de classification ''complète'' des mammifères ou des oiseaux. Il introduit cependant des concepts d’ordre essentiels : la division des vivipares à pieds en multifides (à plusieurs doigts), bisulques (à pied fendu) et solipèdes (à sabot unique) (HA II, 1, 499b6 ; PA IV, 10, 690a5) anticipe certaines distinctions encore reconnues. Sa connaissance précise du sang du dauphin, de la respiration pulmonaire des cétacés, de la viviparité de certains squales, témoigne d’une attention biologique remarquable pour son temps. ==== Continuité, degrés du vivant et limites de la ''scala naturae'' ==== Aristote reconnaît que les espèces forment un continuum. Entre les plantes et les animaux, certains êtres comme les éponges, les ascidies ou les actinies occupent des positions intermédiaires : ils sont fixés au substrat à la manière des plantes, mais montrent des signes de sensibilité qui les apparentent aux animaux. Aristote en tire une formule selon laquelle « la nature passe si graduellement du sans-vie au vivant qu’on ne peut, du fait de la continuité, trouver de limite, ni de quel côté tombe l’intermédiaire » (HA VIII, 1, 588b4-12)<ref>Sur la portée de ce passage et la prudence à observer dans son interprétation, voir Geoffrey E. R. Lloyd, « Aristotle’s Zoology and his Metaphysics », dans D. Devereux et P. Pellegrin (éd.), ''Biologie, logique et métaphysique chez Aristote'', Paris, CNRS Éditions, 1990, p. 7-35.</ref>. Cette intuition d’une « échelle de la nature » (''scala naturae''), structurée selon le degré de chaleur vitale et d’humidité (GA II, 1, 732b15), aura une fortune considérable, jusqu’à Lamarck et Darwin. Il faut cependant nuancer : parler d’« échelle » suggère une hiérarchie linéaire unique, ce que la recherche récente discute. Aristote constate plutôt des continuités multiples (entre plantes et animaux, entre animaux à sang et sans sang, entre modes de reproduction) et des gradations selon plusieurs paramètres (chaleur, humidité, complexité organique, mode de vie), sans construire d’axe unique de perfection. Et il faut, comme y insistent Pellegrin, Lennox et Connell, se garder de projeter sur Aristote des conceptions évolutionnistes qui lui sont étrangères : pour lui, les espèces sont éternelles ; le devenir n’affecte que les individus. La continuité qu’il observe est statique, non phylogénétique. Aristote soutient sans ambiguïté que les espèces sont éternelles : « la nature de ce genre [les vivants] ne peut être éternelle [individuellement], donc ce qui devient est éternel à la manière qui lui est possible. Numériquement ce n’est pas possible (...) ; selon la forme c’est possible » (GA II, 1, 731b31-732a1). C’est par la reproduction que chaque espèce participe à l’éternité. Le transformisme des espèces est incompatible avec les principes centraux de sa biologie, en particulier avec l’éternité des formes spécifiques : Aristote connaissait des modèles présocratiques de formation et de transformation, notamment chez Empédocle, mais il les rejette en raison de leur incompatibilité avec la stabilité des essences. Changer d’espèce, dans son cadre conceptuel, ce serait cesser d’être pour devenir autre chose. === Les ''Parties des animaux'' : la causalité dans le vivant === ==== Le livre I : enjeux méthodologiques et épistémologiques ==== Le livre I des ''Parties des animaux'' est singulier dans le corpus : il est moins un texte de zoologie qu’un ''prolégomène'' méthodologique à la science du vivant. Wolfgang Kullmann y voit un complément concret à la méthodologie abstraite des ''Seconds Analytiques''<ref>Wolfgang Kullmann, ''Aristoteles. Über die Teile der Lebewesen'', Berlin, Akademie Verlag, 2007, introduction.</ref>. Le livre aborde successivement onze points : la disposition des écrits, la distinction entre l’établissement des phénomènes (''phainomena'', ''hoti'') et la recherche des causes (''aitiai'', ''dihoti''), la priorité de la cause finale sur la cause efficiente, celle de l’être sur le devenir, celle de la forme sur la matière, celle de l’âme sur la matière, l’exclusion de la mathématique du domaine naturel, la nécessité hypothétique, la nature de l’''apodéixis'', la critique de la division dichotomique platonicienne, et enfin la légitimité de la zoologie face à l’astronomie. Ce dernier point mérite mention. En PA I, 5, Aristote justifie l’étude des humbles vivants contre une hiérarchie spontanée qui placerait l’astronomie au-dessus. Le passage est souvent cité : « S’il y a parmi les animaux qui n’ont rien pour charmer les sens, la nature, qui les a façonnés, offre néanmoins, pour qui sait remonter aux causes et est philosophe par nature, des plaisirs immenses dans leur étude. (...) Il faut s’approcher de l’étude de chaque animal sans dégoût, sachant qu’en chacun il y a quelque chose de naturel et de beau ». L’anecdote d’Héraclite invitant des étrangers hésitants à entrer dans sa cuisine, « car les dieux sont là aussi », vient illustrer cette dignité de l’humble. Tipton, dans ''Philosophical Biology in Aristotle’s Parts of Animals'', y voit l’une des marques de la philosophie biologique d’Aristote : un mode de contemplation qui se déploie dans la matière la plus quotidienne<ref>Jason A. Tipton, ''Philosophical Biology in Aristotle’s Parts of Animals'', Cham, Springer, 2014, chap. 1.</ref>. ==== Quatre causes et la place du final ==== Aristote établit que pour expliquer un être naturel, il faut faire intervenir quatre causes : matérielle (ce de quoi), formelle (ce que c’est), efficiente (ce par quoi le mouvement) et finale (ce en vue de quoi). Dans le vivant, la cause finale joue un rôle organisateur, mais elle ne supplante pas les autres. La cause finale et la cause formelle sont chez Aristote étroitement liées, parfois presque convertibles dans le cas du vivant : la fin d’un organe est sa fonction, et sa fonction est ce qui le constitue comme tel. La finalité ne se substitue donc pas à la matière ni au mouvement ; elle leur donne leur intelligibilité. Comme l’écrit Gilson en commentant PA I, 1 : « La cause finale, qui est la cause première de toute opération, constitue la nature de l’animal bien plus que ne fait sa matière. » Le raisonnement est clair. Si l’on ne considère qu’un fait, par exemple que les dents de devant des mammifères carnivores sont tranchantes alors que leurs molaires sont larges et plates, on doit pouvoir l’expliquer. L’explication par la cause matérielle est insuffisante : les mêmes éléments matériels (calcium, dentine, émail) auraient pu donner d’autres formes. L’explication par la cause efficiente, c’est-à-dire les processus de croissance qui produisent les dents, est nécessaire, mais elle ne dit pas pourquoi ''ce'' processus a lieu plutôt que tel autre. La cause finale, en revanche, l’explique : les dents tranchantes servent à couper, les molaires à broyer ; ces fonctions sont ce dont l’animal a besoin, étant donné son régime alimentaire et son mode de vie. La forme des dents est ''en vue de'' leur fonction nutritive (PA III, 1, 661b23-662a8)<ref>Sur la structure de l’explication téléologique dans ce passage, voir le commentaire de James G. Lennox, ''Aristotle : On the Parts of Animals I-IV'', Oxford, Clarendon Press, 2001, ad loc.</ref>. L’argument est plus profond qu’il n’y paraît. Il ne consiste pas à dire que la nature « voulait » que l’animal eût telles dents ; il consiste à dire qu’on ne peut comprendre la dent qu’en la rapportant à l’animal entier dont elle est la dent, et que cet entier, par sa forme et sa manière de vivre, ''requiert'' tels organes. La fin n’est pas un projet conscient de la nature ; c’est la totalité organisée qui détermine ses parties. Comme Gilson l’exprime avec netteté : « La nature ne fait pas des plantes ou des animaux avec des organes, elle fait des organes en produisant des animaux et des plantes. » ==== La critique du mécanisme : Empédocle et Démocrite ==== Aristote consacre des passages importants à la critique des philosophes qui prétendaient expliquer le vivant sans la cause finale. Empédocle, dans la doctrine que rapporte Aristote, expliquait la formation des organes par des rencontres fortuites de particules : ainsi les vertèbres seraient les morceaux d’un os primitivement continu, brisé par l’exiguïté de l’utérus et la contorsion du fœtus. Plus généralement, la doctrine empédocléenne des « rencontres » prétendait engendrer le vivant à partir de la pure nécessité matérielle. L’image fameuse des combinaisons monstrueuses, où têtes humaines et corps de bœufs surgissent d’abord pêle-mêle avant que ne se conservent seulement les assemblages capables de vivre, illustre cette doctrine. Cette logique, parfois rapprochée par les commentateurs modernes des théories darwiniennes, n’est pourtant pas une « sélection naturelle » au sens contemporain : elle décrit la simple survie des combinaisons viables au sein d’une production aveugle, sans transmission héréditaire ni adaptation graduelle<ref>Sur la doctrine empédocléenne et son interprétation par Aristote, voir David Sedley, ''Creationism and its Critics in Antiquity'', Berkeley, University of California Press, 2007, chap. 1.</ref>. Démocrite, dans la lecture qu’en propose Aristote, identifiait l’essence des animaux à leur configuration extérieure, sans recours à la finalité ; cette lecture est elle-même discutable, car les fragments démocritéens conservés sont trop pauvres pour qu’on puisse trancher, mais elle représente fidèlement ce qu’Aristote tient à combattre : un atomisme qui réduit le vivant à une figure géométrique. Aristote leur oppose trois objections, que Gilson met en lumière. Premièrement, les vivants ne sont pas des produits du hasard : ils proviennent de semences douées de propriétés formatives définies, dont les produits sont eux-mêmes déterminés. Deuxièmement, les parents préexistent aux enfants et prédéterminent leur développement futur ; un homme n’est pas engendré « par hasard », mais par un homme. Troisièmement, l’art imite la nature : si la production artisanale d’objets articulés requiert un ordre de production orienté vers une forme, à plus forte raison l’engendrement de touts vivants infiniment plus complexes implique un ordre comparable, sans que cet ordre soit nécessairement celui d’une délibération consciente. Aristote prend bien soin de souligner que la nature n’est pas un artisan qui calcule : elle produit en vue d’une fin sans réfléchir, sans choisir, sans se tromper. L’objection à Démocrite, plus subtile, vise sa réduction de l’animal à sa configuration. Aristote relève qu’« un corps mort a exactement la même configuration qu’un corps vivant, néanmoins ce n’est plus un homme ». La différence entre vivant et cadavre ne peut s’expliquer par la seule forme géométrique : il y manque ce principe interne d’organisation et de mouvement qu’Aristote nommera l’âme (''psychê''). Le cadavre garde tous les organes en place, et pourtant aucun ne fonctionne plus ; ce n’est donc pas la configuration spatiale qui définit le vivant, mais la capacité actuelle d’exercer les fonctions vitales. La biologie aristotélicienne se distingue ainsi du mécanisme par sa thèse fondamentale : ''la forme du vivant n’est pas réductible à sa configuration''. Cette thèse, que Gilson remarque avoir été constamment réinventée par les biologistes critiques du réductionnisme (Bichat, Bernard, Elsasser, Polanyi), constitue l’une des « constantes biophilosophiques » qui font la fortune contemporaine d’Aristote. ==== La nécessité hypothétique : la subordination de la matière à la fin ==== Une notion capitale, sans laquelle la téléologie aristotélicienne reste mal comprise, est celle de ''nécessité hypothétique'' (''ex hypotheseôs anankê''). Aristote distingue deux types de nécessité dans la nature : la nécessité absolue ou matérielle (le feu, par sa nature, monte ; cela serait vrai indépendamment de toute considération organique) et la nécessité hypothétique. Cette dernière s’énonce ainsi : ''si'' l’animal doit être tel et tel, ''alors'' il doit nécessairement avoir telle composition matérielle. L’os est dur parce que ''si'' l’animal doit pouvoir se tenir debout et résister à la pression, ''alors'' il faut un matériau de cette résistance. De même, la peau est imperméable parce que sans cela l’animal perdrait ses humeurs vitales ; les vaisseaux sont creux parce qu’ils doivent transporter le sang ; et ainsi de suite. Cette structure conditionnelle subordonne la matière à la fin, sans nier la nécessité de la matière. Aristote ne dit pas que la matière est sans rôle ; il dit que son rôle est ''au service'' de la forme. C’est ce que Mariska Leunissen a particulièrement développé dans ''Explanation and Teleology in Aristotle’s Science of Nature''<ref>Mariska Leunissen, ''Explanation and Teleology in Aristotle’s Science of Nature'', Cambridge, Cambridge University Press, 2010, en particulier chap. 3.</ref>. La nécessité hypothétique permet à Aristote d’intégrer la causalité matérielle et efficiente, c’est-à-dire les processus chimiques, mécaniques, thermiques qui se déroulent dans le corps, sans pour autant en faire le tout de l’explication. La biologie aristotélicienne n’est donc pas anti-mécaniste : elle est anti-réductionniste. Elle reconnaît la nécessité du mécanisme, mais le subordonne à une intelligibilité finale. Gilson exprime ce point avec une formule éclairante : « Le mécanisme exclut le finalisme, mais le finalisme n’exclut pas le mécanisme, au contraire il l’implique nécessairement. » Cette implication est nécessaire parce que toute fin requiert des moyens, et que les moyens, dans la nature, sont les structures et les processus matériels. ==== Quelle téléologie ? Le débat contemporain ==== La nature précise de la téléologie aristotélicienne fait l’objet, depuis quarante ans, d’un débat suivi. Plusieurs lectures s’affrontent. La lecture ''anthropocentrique'' attribue à Aristote l’idée que la nature est organisée pour le bien de l’homme. Elle s’appuie sur quelques passages, notamment de la ''Politique'' I, 8, 1256b15-22, où Aristote semble dire que les plantes existent en vue des animaux et les animaux en vue de l’homme. Cette lecture, dominante dans la tradition stoïcienne et chrétienne, a longtemps coloré la réception d’Aristote. La lecture ''cosmique'' étend la finalité à l’univers entier : tout le cosmos serait orienté vers une fin unique, qui pourrait être l’imitation, par chaque vivant, de l’éternité divine. Elle s’appuie sur des passages de la ''Métaphysique'' Lambda et de ''De anima'' II, 4, où Aristote explique que la reproduction est ce par quoi les vivants mortels participent à l’éternel et au divin. La lecture ''locale'', défendue notamment par Allan Gotthelf, James G. Lennox et Mariska Leunissen, et résumée par Pellegrin dans la formule selon laquelle « la téléologie aristotélicienne a comme horizon fondamental les espèces animales elles-mêmes », soutient que chaque espèce ou chaque organe a sa fin propre, sans qu’il y ait une finalité globale du vivant. Cette lecture est aujourd’hui largement partagée dans la recherche savante. Elle a l’avantage de coller au texte des traités biologiques eux-mêmes, où l’on voit Aristote expliquer chaque structure (la trompe de l’éléphant, les pattes des oiseaux, le poumon, le foie) en référence à la fonction ''de l’animal en question'', sans recours à une fin cosmique externe. Cette lecture locale a une conséquence importante : elle aristotélise la biologie sans la théologiser. Là où William Paley, dans sa ''Théologie naturelle'' (1802), faisait de l’horloger divin l’argument central de la finalité (ce que Darwin retournera contre lui), Aristote n’a pas besoin de Dieu pour comprendre que la patte du homard est faite pour pincer. Comme l’écrit Gilson, citant Cuénot : « les pinces du homard sont faites pour pincer », et c’est une « finalité de fait ». Le finalisme aristotélicien est immanent : la nature, mue du dedans vers un but qu’elle ignore mais qu’elle porte en elle, ne se trompe pas. « Avec elle, pas de prototypes ni d’essais, elle réussit du premier coup ou elle échoue définitivement. » ==== L’unité fonctionnelle de l’organisme ==== L’organisme est une totalité où chaque partie coopère à la vie de l’ensemble. Cette intuition systémique, particulièrement développée dans PA III, articule deux mouvements complémentaires. Du point de vue de la fin, on peut dire que les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie. Mais réciproquement, posséder des poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit posséder des voies aériennes (PA III, 6, 668b33-669a13). Le réseau des dépendances fonctionnelles est dense. Aristote distingue à ce propos plusieurs niveaux de fonction. Au niveau le plus bas, les éléments (terre, eau, air, feu) et leurs qualités primaires (chaud/froid, sec/humide) entrent en composition pour former les homéomères. Les homéomères sont ''pour'' les anhoméomères : leur composition est subordonnée aux fonctions des organes qu’ils constituent. Les anhoméomères ou organes sont à leur tour ''pour'' l’âme et les activités vitales : « les fonctions (''erga'') et les activités (''praxeis'') des vivants en dépendent » (PA II, 1, 646b13). Et le corps tout entier est ''pour'' l’âme : « le corps en un certain sens est en vue de l’âme, et ses parties en vue des fonctions auxquelles chacune est par nature destinée » (PA I, 5, 645b14-20). L’organe est conçu, étymologiquement et conceptuellement, comme ''organon'', c’est-à-dire instrument. Le corps vivant est un instrument de l’âme, et chacune de ses parties est un instrument du tout. Cette vision se reflète dans une formule centrale de PA IV, 12, 694b12-14 : « la nature adapte les organes à la fonction, et non la fonction aux organes ». Le principe oriente l’enquête naturelle vers la fonction comme principe explicatif premier, la matière n’étant intelligible que par et pour elle. Le cœur (''kardia'') occupe dans cette architecture une place privilégiée. Pour Aristote, contre Alcméon de Crotone, contre la tradition hippocratique tardive (notamment ''Sur la maladie sacrée'') et contre Platon (''Timée'' 73c-d), qui plaçaient déjà le centre de la vie ou de la sensation dans le cerveau, le cœur est l’organe principal du vivant : il apparaît le premier dans l’embryon, il est l’origine (''archê'') du système circulatoire, le siège de la chaleur vitale, le lieu où s’effectue la « cuisson » finale du sang, et c’est de lui que partent les mouvements liés au plaisir, à la douleur et à la sensation (PA III, 4, 666a11-13 ; ''De juventute'' 3)<ref>Sur le cardiocentrisme aristotélicien et son contexte médical, voir Friedrich Solmsen, « Greek Philosophy and the Discovery of the Nerves », ''Museum Helveticum'' 18, 1961, p. 150-167 ; et Philip van der Eijk, ''Medicine and Philosophy in Classical Antiquity'', Cambridge, Cambridge University Press, 2005, chap. 4.</ref>. Le cerveau, dans la physiologie d’Aristote, n’est pas le siège de la pensée ni de la sensation, mais une sorte d’organe de refroidissement qui contre-balance la chaleur du cœur. La thèse, longtemps reconduite par la tradition, est l’une des principales erreurs anatomiques d’Aristote ; mais elle s’inscrit dans un système physiologique cohérent, dont l’idée centrale, la régulation thermique comme fonction vitale, n’est pas, en elle-même, fausse. === La ''Génération des animaux'' : reproduction, embryogenèse, hérédité === ==== Pourquoi un traité distinct sur la génération ? ==== Si les ''Parties des animaux'' étudient l’animal adulte sous l’angle synchronique (''ce qu’il est''), la ''Génération des animaux'' l’étudie sous l’angle diachronique (''comment il vient à être''). Cette division reflète une thèse aristotélicienne explicite : l’être est antérieur au devenir, et la connaissance du tout adulte précède celle de la formation embryonnaire. C’est ce que Gilson souligne en évoquant la « préférence » d’Aristote pour décrire d’abord les animaux complètement formés et ne décrire qu’ensuite le processus de leur formation. La ''Génération des animaux'' est complexe et a fait l’objet de nombreuses discussions. Elle traite des modes de reproduction, de la formation de l’embryon, de l’hérédité, des monstruosités, et de la différence des sexes. Elle est aussi celle qui a soulevé les critiques modernes les plus vives, notamment féministes, en raison de la théorie aristotélicienne du rôle différencié du mâle et de la femelle. ==== Les modes de génération ==== Aristote distingue plusieurs modes de génération. La majorité des animaux sont engendrés par accouplement sexué entre un mâle et une femelle, distincts ou parfois réunis dans un même individu (cas qu’il observe chez certains coquillages). Il distingue ensuite les vivipares (qui engendrent des petits semblables aux parents adultes), les ovipares (à œufs achevés ou inachevés selon les espèces), et ceux qu’il appelle « ovipares en interne, vivipares en externe », équivalent fonctionnel de ce que la zoologie moderne nomme ovovivipares, qu’il identifie chez certains squales avec une finesse remarquable. D’autres animaux paraissent naître par génération spontanée à partir de la matière en putréfaction ou de la vase : c’est le cas, selon Aristote, de certains insectes, de coquillages comme les huîtres, et notamment des anguilles, chez lesquelles il constate qu’on ne peut observer ni organes reproducteurs ni œufs. Cette doctrine, qui paraît aujourd’hui curieuse, repose chez Aristote sur des observations réelles : on voit effectivement apparaître des larves d’insectes dans la viande qui se décompose ou des organismes inférieurs dans la vase, et il faudra attendre les expériences de Francesco Redi (1668) sur les viandes protégées de mouches, puis surtout celles de Louis Pasteur (1859-1864) avec ses ballons à col de cygne, pour la réfuter expérimentalement. Pour Aristote, la génération spontanée s’inscrit dans un cadre cohérent : la nature, quand elle ne peut produire un genre par engendrement à partir d’un parent, le produit néanmoins en activant la chaleur vitale (''thermon'') et le pneuma dans une matière préformée par putréfaction. Le processus est analogue, à ses yeux, à la fermentation ou à la coction. D’autres modes existent encore : reproduction par bourgeonnement chez certaines plantes ; cas particulier des œufs « du vent » (''hupênemia''), produits par certaines volailles femelles sans accouplement, qu’Aristote ne tient pas pour une véritable parthénogenèse mais pour des œufs imparfaits, incapables de se développer en raison de l’absence du principe formateur masculin ; cas enfin de certains insectes où la femelle dépose son matériau près d’un mâle qui agit sur lui directement, sans introduction de semence proprement dite. ==== Le rôle du mâle et de la femelle ==== Le cœur de la théorie aristotélicienne de la génération sexuée tient en une formule : le mâle apporte la ''forme'' et le ''principe du mouvement'', la femelle apporte la ''matière''. Le mâle contribue à la génération par sa semence (''sperma''), qui est un résidu de sang particulièrement « cuit » (concentré et raffiné par la chaleur vitale) ; la femelle contribue par les menstrues (''katamenia''), résidu de sang moins « cuit » parce que la femelle est, en moyenne, plus froide que le mâle. Cette doctrine de la « froideur » féminine s’inscrit dans le cadre de la physiologie humorale grecque, qui caractérise les vivants par leur degré de chaleur et d’humidité ; elle est donc moins une remarque morale qu’une thèse physiologique, fausse dans ses présupposés, mais cohérente dans son cadre. Le rôle du mâle est de ''mouvoir'' la matière fournie par la femelle, lui imprimer la forme spécifique de l’espèce. Cette théorie a deux dimensions qu’il faut distinguer. La première est ''physiologique'' : Aristote s’oppose à la « théorie des deux semences » (pangenèse) défendue par certains hippocratiques et par Démocrite, selon laquelle mâle et femelle contribuent tous deux par une semence prélevée sur l’ensemble des parties du corps. Aristote critique cette théorie avec des arguments empiriques précis : si le sperme provenait de chaque partie du corps, comment expliquer que des parents mutilés engendrent des enfants entiers ? Comment expliquer que les caractères acquis ne se transmettent pas ? Sa propre théorie, qui voit dans la semence un résidu nutritif transformé, est plus économique et fait place à un mécanisme génératif articulé. Sur ces points, sa critique de la pangenèse hippocratique a été jugée largement justifiée par l’histoire des sciences ; il est notable que la pangenèse provisoirement adoptée par Darwin (la théorie hypothétique des « gemmules ») ait elle-même été abandonnée pour des raisons proches de celles avancées par Aristote. La seconde dimension est ''métaphysique'' : pour Aristote, la séparation des sexes a une justification téléologique. Comme le résume GA II, 1, 732a4-9 : « Puisque la première cause motrice, à laquelle appartiennent la définition et la forme, est plus haute et plus divine que la matière, il est meilleur que le supérieur soit séparé de l’inférieur ; c’est pourquoi, partout où c’est possible et autant que c’est possible, le mâle est séparé de la femelle. » Le mâle est ''supérieur'' parce qu’il est principe actif ; la femelle est principe matériel. ==== La critique féministe et la réponse contemporaine ==== Cette dimension métaphysique a fait l’objet, depuis trente ans, d’une discussion intense. Sophia Connell, dans ''Aristotle on Female Animals'' (2016), a montré que la critique féministe s’est articulée autour de plusieurs niveaux<ref>Sophia M. Connell, ''Aristotle on Female Animals : A Study of the Generation of Animals'', Cambridge, Cambridge University Press, 2016.</ref>. Au niveau le plus immédiat, on a accusé Aristote de réduire la femelle à un simple substrat passif et de naturaliser une hiérarchie sociale. Au niveau plus subtil, on a relevé que sa théorie du « manque » féminin, selon laquelle la femelle serait un mâle qui n’a pas atteint son achèvement en raison d’un défaut de chaleur, fait reposer la différence des sexes sur un déficit, non sur une différence positive. La recherche contemporaine, sans absoudre Aristote, a nuancé ces accusations. Trois points méritent d’être retenus. Premièrement, la matière fournie par la femelle n’est pas, dans les textes aristotéliciens, un substrat inerte et passif : elle est elle-même un produit hautement spécialisé de la nutrition féminine, structurée pour devenir les organes de l’espèce concernée. Deuxièmement, dans certains modes de génération (œufs incubés, gestation interne, lactation), la femelle a un rôle actif au-delà de la simple fourniture de matière : elle assure la chaleur, le logement, la nourriture du futur petit pendant des périodes prolongées. Troisièmement, Aristote attribue à la femelle des pouvoirs causaux qu’il ne reconnaît pas explicitement comme tels : dans GA IV, 3, il explique la ressemblance d’un enfant à sa mère plutôt qu’à son père par la résistance victorieuse de la matière maternelle aux mouvements paternels, ce qui suppose, en réalité, que cette matière possède elle-même des capacités formatives<ref>Sur ce point, voir Devin Henry, « How Sexist Is Aristotle’s Developmental Biology ? », ''Phronesis'' 52, 2007, p. 251-269.</ref>. Cette analyse, particulièrement développée par Devin Henry, conduit à une lecture moins univoque de la théorie aristotélicienne. La hiérarchie qu’Aristote affirme entre mâle et femelle est réelle, mais elle ne se réduit pas à une opposition entre principe actif et matière inerte. Reste qu’il s’agit d’une hiérarchie, et que les présuppositions empiriques et sociales qui l’inspirent sont contestables, notamment l’idée que la femelle est plus froide que le mâle, qui repose sur des analogies non vérifiées. ==== L’épigenèse et le préformationnisme ==== La théorie aristotélicienne de l’embryogenèse est l’une de ses contributions les plus notables. Aristote la fonde sur l’observation directe d’œufs de poulet ouverts à différents stades d’incubation (HA VI, 3, 561a4-561b13). Il décrit ce qu’il voit : d’abord se forme le cœur, qui bat dès le troisième jour comme un point rouge ; puis progressivement les autres organes apparaissent, chacun à son tour, en commençant par les parties supérieures. Aristote reconnaît avec acuité que les yeux sont une excroissance du cerveau (GA II, 6). Cette observation lui permet de fonder ce qu’on a nommé, à partir de Harvey, la doctrine de l’''épigenèse'' : l’embryon n’est pas une miniature préformée qui ne ferait que croître, il se constitue par différenciation graduelle, parties après parties, à partir d’une matière initialement indifférenciée. L’opposition entre épigenèse et préformationnisme traverse l’histoire de la biologie occidentale. Au {{s-|XVIII}}, à mesure que les microscopistes (Swammerdam, Malpighi, Bonnet) crurent voir dans le germe les linéaments de l’organisme adulte, le préformationnisme connut une longue fortune. Charles Bonnet, dans sa ''Palingénésie philosophique'' (1769), soutient que l’embryon est entièrement préformé dès l’origine, et que tous les organismes futurs sont contenus emboîtés dans l’œuf premier (la doctrine de l’« emboîtement des germes »). Cette conception offre un avantage théologique : elle rend la création unique, instantanée, sans nouveauté ultérieure. La controverse, qui occupe encore l’Académie des sciences vers 1860, oppose les héritiers de Bonnet aux héritiers d’Aristote et de Harvey. Comme l’écrit Gilson, « M. Serres assimile la doctrine de l’évolution selon Bonnet à l’Ancien Testament de la biologie, et celle de l’épigénèse au Nouveau Testament de la biologie ». Ce qui est aujourd’hui largement admis, c’est l’idée générale d’une différenciation progressive de l’embryon ; les mécanismes aristotéliciens proprement dits, eux, sont faux. La biologie du développement contemporaine a remplacé la chaleur vitale et le ''pneuma'' par l’étude des réseaux de régulation génétique, des signaux cellulaires, des gradients morphogénétiques et des interactions entre cellules et milieu, dans un cadre conceptuel qui n’a plus rien d’aristotélicien, mais qui en partage l’intuition fondatrice : un embryon se construit, il n’est pas livré tout fait. Comment Aristote conçoit-il le mécanisme de cette différenciation progressive ? Sa réponse mêle observation et analogie. Le principe actif est la ''chaleur vitale'' (''thermon'') contenue dans la semence, qui « cuit » et façonne progressivement la matière menstruelle. L’analogie qu’Aristote propose est célèbre : la semence agit sur les menstrues comme la ''présure'' fait cailler le lait (GA II, 4, 739b22-740a4). De la même façon que la présure ne reste pas mêlée au lait mais en organise la transformation, la semence n’apporte pas matériellement quelque chose à l’embryon, mais imprime un ''mouvement'' (''kinêsis'') qui structure la matière maternelle. Aristote propose aussi une autre analogie, celle des marionnettes mécaniques : les premières impulsions données déclenchent une cascade de mouvements préprogrammés (GA II, 1, 734b9). Ces analogies, par leur précision technique, témoignent de l’effort d’Aristote pour penser la génération comme un processus ''intelligible'', sans recours au mystère ni à la divinité<ref>Sur les analogies aristotéliciennes du développement, voir Devin Henry, ''Aristotle on the Mechanism of Inheritance'', ''Journal of the History of Biology'' 39, 2006, p. 425-455.</ref>. Un point notable de la théorie embryologique d’Aristote est la place du ''pneuma'', souffle vital chaud présent dans la semence. En GA II, 3, 736b29, Aristote affirme que ce pneuma est « analogue à l’élément des astres », c’est-à-dire au cinquième corps céleste que la tradition postérieure appellera éther (''aithêr''), bien qu’Aristote lui-même n’emploie ce terme que rarement et préfère parler simplement du « premier corps » ou « premier élément ». Cette comparaison, dont Kullmann souligne l’importance, confère à la chaleur vitale une dignité ontologique particulière : elle n’est pas la chaleur ordinaire, mais une force formatrice apparentée au plus noble des principes naturels. Cette doctrine sera reprise et développée par toute la tradition stoïcienne et médicale, notamment par Galien, avant de connaître diverses fortunes dans la Renaissance et chez les iatromécaniciens du {{s-|XVII}}. ==== L’hérédité et la ressemblance ==== Pourquoi les enfants ressemblent-ils à leurs parents, et plus précisément, pourquoi parfois au père, parfois à la mère, parfois à un grand-parent, parfois à personne ? Aristote consacre à cette question un chapitre fameux (GA IV, 3, 767b15-768a14). Sa réponse fait jouer trois variables : le degré de cuisson de la semence (mieux cuite, elle imprime mieux la forme paternelle), la résistance de la matière menstruelle (plus elle résiste, plus l’enfant ressemble à la mère), et le « relâchement » des mouvements paternels, qui peut faire ressurgir une ressemblance grand-parentale. Cette explication, rudimentaire au regard de la génétique mendélienne, témoigne d’un effort réel pour penser scientifiquement un phénomène que d’autres cultures expliquaient par le mythe ou l’intervention divine. Elle pose les questions fondamentales de la biologie héréditaire (comment les caractères sont-ils transmis ? pourquoi varient-ils dans une certaine fourchette autour d’un type spécifique ?) et propose un cadre conceptuel rigoureux, même si les paramètres en sont, du point de vue moderne, faux. L’un des points les plus notables est la ''stabilité'' de l’espèce malgré les variations individuelles. Pour Aristote, les variations relèvent de la matière (qui résiste plus ou moins au mouvement formateur), tandis que la forme spécifique se maintient parce qu’elle est précisément ce qui définit l’espèce. Le « semblable engendre le semblable », principe que Linné citera encore, est ici fondé non sur une mystérieuse fixité, mais sur la primauté ontologique de la forme dans l’engendrement. === Le mouvement animal : ''De motu animalium'' et ''De incessu animalium'' === ==== La place de ces traités dans le projet biologique ==== Les deux petits traités consacrés au mouvement animal, ''De motu animalium'' (Le mouvement des animaux) et ''De incessu animalium'' (La marche des animaux), sont parmi les plus denses du corpus. Klaus Corcilius, dans le ''Cambridge Companion'', et la grande édition Corcilius/Primavesi (2018), suivie du commentaire collectif dirigé par Rapp et Primavesi (2020), ont récemment renouvelé la recherche sur ces textes<ref>Klaus Corcilius et Oliver Primavesi (éd.), ''Aristoteles. De motu animalium / Über die Bewegung der Lebewesen'', Hambourg, Meiner, 2018 ; Christof Rapp et Oliver Primavesi (éd.), ''Aristotle’s De motu animalium'', Oxford, Oxford University Press, 2020.</ref>. Ils achèvent et complètent les analyses de ''De anima'' III, 9-11, où Aristote pose les principes psychologiques du mouvement, en montrant comment ces principes s’incarnent concrètement dans les processus physiologiques des animaux. Le partage des tâches est clair : ''De anima'' identifie les facultés psychiques responsables du mouvement (désir, perception, imagination, intellect) ; le ''De motu animalium'' explique comment l’activation de ces facultés produit effectivement, dans le corps, le mouvement animal ; le ''De incessu animalium'' analyse les contraintes anatomiques et la mécanique du déplacement propres aux différents modes de locomotion. ==== Le principe du mouvement volontaire : désir et représentation ==== L’apport propre d’Aristote, dans ces traités, est de ''psychologiser'' l’explication du mouvement animal sans la ''spiritualiser'' abusivement. Tout mouvement animal, pour Aristote, est un mouvement vers un objet désiré, et l’objet désiré opère comme cause finale. Mais cette cause finale n’agit qu’à travers une représentation : l’animal doit ''percevoir'' ou ''imaginer'' l’objet désiré pour que le mouvement s’enclenche. L’analyse de ''De anima'' III, 10, 433b11-12, telle que Pellegrin la reprend dans ''Animals in the World'', distingue clairement les facteurs : « l’objet du désir » (a), sa « perception » par l’animal (b), le « désir » lui-même (c), « l’organe corporel par lequel le corps est mû » (d), et enfin « le mouvement de l’animal » (e). La chaîne articule donc cause finale (a), médiations cognitives (b et c), et mécanisme corporel (d) qui produit le mouvement effectif (e)<ref>Pierre Pellegrin, ''Animals in the World : Five Essays on Aristotle’s Biology'', traduit par Anthony Preus, Albany, SUNY Press, 2023.</ref>. Une thèse centrale, sur laquelle Aristote insiste, est que la pensée seule ne suffit pas à mettre l’animal en mouvement. Comme le souligne Pellegrin en commentant ''De anima'' III, 9 : « Connaître ce qui est juste, bon ou beau ne met pas un individu en mouvement : il faut ''désirer'' la chose qui est juste, bonne ou belle. » L’analyse cognitive d’une situation peut éclairer la décision, mais ne la produit pas. Ce point est lourd de conséquences : il marque une rupture avec la tradition socratique, pour laquelle la connaissance du bien suffirait à le faire vouloir. Aristote inaugure une analyse de l’agir qui fait place à la ''faiblesse de la volonté'' (''akrasia''), c’est-à-dire au cas où l’on agit contre ce que l’on sait être le mieux. ==== Le rôle du ''pneuma symphyton'' ==== Comment le désir, qui est une affection de l’âme, se traduit-il en mouvement corporel ? La réponse d’Aristote, particulièrement développée dans le ''De motu animalium'' chapitres 7-10, fait intervenir un organe spécifique : le ''pneuma symphyton'' (souffle inné, ou pneuma connaturel). Localisé dans la région du cœur, ce pneuma est un corps subtil, susceptible d’expansion et de contraction sous l’effet de la chaleur produite par l’affection désirante. Lorsque l’animal perçoit ou imagine un objet désirable, son cœur s’échauffe ; ce réchauffement se communique au pneuma, qui se dilate ou se contracte ; cette dilatation et cette contraction tirent ou poussent les tendons et les os, qui transmettent à leur tour le mouvement aux membres. Le ''pneuma symphyton'' sert ainsi de relais physiologique entre l’affection désirante et le mouvement corporel. Cette doctrine, dont Martha Nussbaum a montré l’importance dans son édition du ''De motu''<ref>Martha C. Nussbaum, ''Aristotle’s De Motu Animalium : Text with Translation, Commentary, and Interpretive Essays'', Princeton, Princeton University Press, 1978.</ref>, est la pièce manquante de la psychologie aristotélicienne du mouvement. Sans elle, le passage de l’âme au corps reste un mystère ; avec elle, il devient un processus physique articulé. On notera qu’Aristote, dans ce contexte, qualifie d’''organa'' (organes-instruments) les os et les tendons, qu’il classe ailleurs comme homéomères : signe de la souplesse conceptuelle dont il fait preuve quand il s’agit d’analyser des fonctions précises. ==== La nécessité d’un point d’appui externe ==== Un argument simple mais éclairant du ''De motu animalium'' (chapitre 2, 698b7-699a11) établit qu’un animal, pour se mouvoir, doit s’appuyer sur quelque chose d’immobile à lui. De même qu’on ne peut pousser un bateau depuis l’intérieur du bateau (l’effort serait absorbé par le bateau lui-même), un animal doit prendre appui sur le sol, l’eau ou l’air. C’est ce qui distingue le mouvement animal du mouvement des astres : ces derniers, mus par les sphères, ont un point d’appui dans la structure cosmique ; ceux-là doivent s’appuyer extérieurement à eux-mêmes. Cet argument a une portée plus large qu’il n’y paraît. Il fonde la possibilité même de l’étude mécanique du mouvement animal : étudier comment un animal marche, vole ou nage, c’est étudier comment il transmet une force interne (musculaire) à un milieu externe (sol, eau, air) qui lui résiste. La résistance n’est pas un obstacle au mouvement, c’est sa condition de possibilité. ==== Les modes de locomotion ==== Le ''De incessu animalium'' est, par anticipation, un traité de mécanique du mouvement animal. Aristote y établit des principes généraux qui frappent parfois encore par leur justesse. Les animaux sanguins terrestres pourvus de membres locomoteurs ne peuvent en avoir plus de quatre : la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité. Les vertébrés terrestres ne marchent jamais sur six pattes ; quand un quadrupède en a une cassée, il se tient sur trois ; les insectes, pour des raisons de constitution différente (animaux sans sang, plus petits, à structure segmentaire), peuvent en avoir six ou plus. L’analyse des oiseaux est développée. Aristote distingue les oiseaux de proie, qui ont de grandes ailes et un corps relativement réduit (parce que la matière nutritive disponible a été investie dans les ailes, instrument principal de leur mode de vie) ; les oiseaux aquatiques échassiers, qui ont de longues pattes (parce que leur mode de vie le requiert) et donc, par compensation, des plumes caudales moins développées. Le principe sous-jacent est exprimé en une formule lapidaire : « la nature adapte les organes à la fonction qu’ils ont à exercer, et non la fonction aux organes » (PA IV, 12, 694b12-14). Le principe oriente toute l’enquête : les pattes sont ''en vue de'' la marche, les ailes ''en vue de'' le vol, les nageoires ''en vue de'' la nage. Et c’est la fonction qui, dans chaque cas, dicte la structure. === La place du ''De anima'' dans le projet biologique === Le ''De anima'', traditionnellement classé parmi les œuvres « psychologiques », est étroitement lié au cycle biologique, même si son inclusion dans ce cycle reste débattue. C’est un point sur lequel insistent David Balme et plusieurs commentateurs récents : la psychologie aristotélicienne n’est pas une métaphysique de l’esprit, c’est l’étude des principes du vivant en tant que vivant. L’âme, dans la fameuse définition de ''De anima'' II, 1, est « la première entéléchie d’un corps naturel ayant la vie en puissance », ou encore « la première entéléchie d’un corps naturel organique ». Cette définition est étroitement biologique. Elle ne fait pas de l’âme une substance séparée, ni une force ajoutée au corps : elle en fait la ''forme'' du corps vivant, son principe d’organisation et d’activité. Vivre, pour un corps organique, c’est avoir telle structure et exercer telles fonctions. La comparaison qu’Aristote propose éclaire le propos : si la hache était un être naturel, sa forme (le « pouvoir-couper ») serait son âme ; si l’œil était un animal complet, la vue en serait l’âme. Aristote distingue trois niveaux fondamentaux de fonctions vitales, qui définissent autant de niveaux d’âme. La ''fonction nutritive'' (''threptikon'') ou végétative est commune à tous les vivants, plantes incluses : elle inclut la nutrition, la croissance et la reproduction. La ''fonction sensitive'' (''aisthêtikon'') est commune à tous les animaux : elle inclut la perception, et avec elle l’imagination (''phantasia''), la mémoire, le désir, et la locomotion qui en dépend. La ''fonction noétique'' (''dianoêtikon'') ou intellective n’appartient qu’à l’homme : elle inclut la pensée discursive et l’intellection des principes. Cette gradation n’est pas une hiérarchie d’âmes séparées, mais une structure d’inclusion : l’âme animale comprend la fonction nutritive ; l’âme humaine comprend les fonctions nutritive et sensitive. Comme Aristote le formule dans une comparaison célèbre, c’est comme dans la série des figures géométriques : le quadrilatère contient le triangle, mais le triangle existe aussi indépendamment. Cette structure biologique de la psychologie aristotélicienne explique pourquoi l’étude du vivant ne peut être séparée de l’étude de l’âme : comprendre une plante, c’est comprendre la fonction nutritive ; comprendre un animal, c’est comprendre la fonction sensitive ; comprendre un homme, c’est comprendre les trois fonctions, et la manière particulière dont la fonction noétique se conjugue, dans son cas, aux fonctions inférieures. L’activité humaine de penser dépend, dans son exercice ordinaire, des sens et de l’imagination : il n’y a pas pour Aristote de pensée sans image (''phantasma''), et le ''De anima'' insiste sur cette dépendance. Le statut exact de l’intellect, et notamment de l’''intellect agent'' (''nous poiêtikos'') évoqué dans le difficile chapitre III, 5, reste cependant l’un des problèmes les plus discutés du corpus : la question de savoir si cet intellect est séparable du corps, et en quel sens, a divisé la tradition aristotélicienne depuis Alexandre d’Aphrodise et les commentateurs grecs jusqu’aux interprétations contemporaines. Sur ce point précis, les frontières entre psychologie biologique et métaphysique deviennent moins nettes. === Conclusion : la fortune de la biologie aristotélicienne === La biologie d’Aristote a connu, comme l’écrit Gilson, une fortune singulière. Pendant des siècles, elle a été éclipsée par les œuvres « plus philosophiques » du corpus. Pendant les {{s2-|XIX|XX}}, elle a été tenue pour démodée, jugée à l’aune de la biologie expérimentale et évolutionniste. Et c’est seulement à partir des années 1960-1980, par la convergence de la philologie classique (Balme, Pellegrin) et de la philosophie analytique de la biologie (Lennox, Gotthelf, Charles, Henry, Connell, Leunissen), qu’elle a retrouvé sa place dans la philosophie naturelle. Le retournement témoigne d’une prise de conscience : ce qu’Aristote a réalisé n’est pas simplement une compilation de faits, c’est une ''philosophie de la biologie'', une réflexion sur les conditions de possibilité d’une connaissance scientifique du vivant. Cette réflexion articule des distinctions qui restent opératoires : l’enquête empirique préalable et l’explication causale ; l’individu et l’espèce ; la matière et la forme ; la cause efficiente et la cause finale ; la nécessité absolue et la nécessité hypothétique ; le tout et la partie ; la fonction et l’organe. Ces distinctions, comme l’a montré Gilson dans son essai, sont des « constantes biophilosophiques » : elles réapparaissent, sous d’autres noms, chez Bichat, Cuvier, Claude Bernard, Cuénot, Canguilhem, Elsasser, Polanyi, Monod. Le mot de « finalité » est aujourd’hui souvent remplacé par celui de « téléonomie », mais la question demeure : peut-on comprendre un vivant sans comprendre la fonction de ses parties ? La biologie contemporaine, fût-elle moléculaire, n’a pas cessé de la rencontrer. C’est en ce sens, et non en celui d’une zoologie historique, qu’Aristote reste une référence pour la philosophie de la biologie. Les espèces qu’il décrit ont parfois disparu ou ont été reclassées ; ses thèses physiologiques sur le cœur, le cerveau ou les menstrues sont obsolètes. Mais ses questions (qu’est-ce qu’un vivant ? qu’est-ce qu’une fonction ? qu’est-ce que l’unité d’un organisme ?) sont toujours posées. Et les outils conceptuels qu’il a forgés pour y répondre (entéléchie, nécessité hypothétique, division des causes, primauté de la forme) demeurent utiles, ne fût-ce qu’à titre de repères critiques, pour la philosophie de la biologie. == La philosophie première : la métaphysique == === Objet et divisions de la métaphysique === ==== La science de l'être en tant qu'être ==== La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22. Sur l'unité (et la possible disparité) du projet métaphysique aristotélicien, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction et chap. « La science recherchée » ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit.</ref>. Cette formulation distingue la métaphysique des sciences particulières qui étudient un aspect de l'être : la géométrie l'étudie en tant que continu, la biologie en tant que vivant. Seule la métaphysique considérerait l'être dans sa totalité. Comme le souligne Annick Jaulin, le terme « métaphysique » lui-même n'apparaît jamais dans les traités aristotéliciens : il s'agit d'un titre éditorial donné par Andronicos<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., Introduction.</ref>. Pellegrin recense quant à lui plusieurs définitions concurrentes de cette science chez Aristote : recherche des premiers principes et des premières causes, science de l'être en tant qu'être, science de la substance, science théologique<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Métaphysique », p. 136-137.</ref>. Cette science est dite « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle examine les principes communs à toutes les sciences, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8.</ref>. Elle est aussi qualifiée de « science théologique » car elle porte sur ce qu'il y a de plus divin, le Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10.</ref>. ==== La question de l'unité de la métaphysique ==== Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier (Dieu) ? Cette tension a donné lieu à plusieurs interprétations dans l'histoire de la philosophie<ref>Pour un état de la question, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit. ; Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', op. cit., chap. 1-2.</ref>. Une lecture, défendue notamment par Werner Jaeger, voit dans le corpus de la ''Métaphysique'' deux projets juxtaposés correspondant à deux périodes différentes de la pensée d'Aristote : une métaphysique ontologique générale, plus tardive, et une métaphysique théologique d'inspiration platonicienne, plus ancienne<ref>Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', op. cit. Cette lecture est cependant aujourd'hui largement contestée ; voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit.</ref>. Une autre lecture, défendue par Thomas d'Aquin et reprise par toute une tradition, soutient que l'unité est assurée par le fait que Dieu est principe de tout être<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium.</ref>. C'est ce que la tradition appellera l'« onto-théologie ». Une troisième lecture, plus récente, défendue notamment par Pierre Aubenque, considère que la synthèse entre ontologie et théologie est en fait impossible et que la ''Métaphysique'' aristotélicienne reste inachevée comme problème<ref>Pierre Aubenque, ''Le problème de l'être chez Aristote'', op. cit. Voir aussi Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 137.</ref>. Une quatrième lecture, présente notamment dans le travail d'Annick Jaulin, refuse de lire l'expression « substance séparée » au sens transcendant et soutient qu'Aristote, plutôt que d'opérer une rupture avec la physique, « réinscrit la substance immobile dans la tradition des penseurs de la nature »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. Le débat reste ouvert. ==== Les apories de la métaphysique ==== Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, c'est-à-dire les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers : Y a-t-il une science unique de toutes les causes ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées ? Les principes sont-ils universels ou particuliers ? En acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17.</ref> Cette méthode aporétique est caractéristique de la démarche aristotélicienne : « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27.</ref>. === La substance (livres Z-H) === ==== Qu'est-ce que la substance ? ==== Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2.</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux. Aristote élimine d'abord l'universel et le genre : ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16.</ref>. Cette exclusion vise notamment la théorie platonicienne des Idées. L'interprétation de cet examen, et la question de savoir lequel des trois candidats restants (matière, forme, composé) Aristote retient finalement comme substance première, fait l'objet de débats considérables dans la recherche contemporaine. Comme le résume Christof Rapp, « les controverses interprétatives concernant l'interprétation des livres pertinents s'étendent de la question de savoir jusqu'où s'étend le traitement de l{{'}}''ousia'' (seulement le livre Z, ZH ou même ZHΘ), à la question de la structuration interne du traité de l{{'}}''ousia'', en passant par les questions sur l'objectif précis et la finalité philosophique de ces livres, jusqu'à la question de la nature de l'''eidos'' (la forme) – qui est au cours du traité plusieurs fois désignée comme ''ousia'' – et enfin la question du rapport entre matière et forme et l'unité de l{{'}}''ousia'' qui y est liée »<ref>Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch'', op. cit., chap. IV.18 (traduction libre).</ref>. ==== La forme, candidat à la substantialité ==== Le substrat semble avoir des titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26.</ref>. C'est donc la forme (''morphê'', ''eidos'') qui apparaît, dans plusieurs passages des livres centraux, comme substance au sens propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28.</ref>. ==== Le composé de matière et de forme ==== La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27.</ref>. La forme demeure cependant première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33. Pour une discussion approfondie, voir Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La substance ».</ref>. === Puissance et acte (livre Θ) === ==== La distinction de la puissance et de l'acte ==== La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de répondre aux apories de Parménide et de Platon concernant le devenir. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17.</ref>. Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18.</ref>. ==== La priorité de l'acte sur la puissance ==== Aristote établit que l'acte est antérieur à la puissance en plusieurs sens : dans l'ordre de la définition (on définit la puissance par l'acte correspondant), dans l'ordre de la connaissance, dans l'ordre de l'essence et du temps<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3.</ref>. Plus profondément, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28.</ref>. Comme le souligne Annick Jaulin, cette primauté de l'acte sur la puissance n'est pas un simple point doctrinal mais structure l'ensemble de la philosophie première : « la primauté de l'acte sur la puissance permet de poser l'antériorité de la forme sur la matière », et elle « ouvre également la possibilité d'une interprétation positive du devenir »<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « La science recherchée ».</ref>. === L'Un et le Multiple (livres I-K) === ==== L'un se dit en plusieurs sens ==== Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14.</ref>. Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13.</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose. ==== La pluralité et le nombre ==== La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24.</ref>. Cette analyse fonde la possibilité des mathématiques et des sciences quantitatives. === Le Premier Moteur immobile (livre Λ) === ==== La démonstration de l'existence du Premier Moteur ==== Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5.</ref> La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4.</ref>. Il doit donc exister un premier moteur qui meut sans être mû. ==== La nature du Premier Moteur ==== Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4.</ref>. Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35.</ref>. ==== Les moteurs des sphères ==== Le mouvement des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14.</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres dans une hiérarchie, mais chacun meut directement sa sphère. Cette pluralité d'intelligences motrices a posé un problème théologique au Moyen Âge : la tradition péripatéticienne et la scolastique médiévale ont tenté de la concilier avec l'unité divine en faisant des moteurs des substances secondes subordonnées au Premier Moteur. La recherche contemporaine, notamment Annick Jaulin, propose une lecture moins théologique : il s'agirait pour Aristote de fournir une explication causale du mouvement astronomique, sans projet théologique transcendant<ref>Annick Jaulin, ''Aristote. La métaphysique'', op. cit., chap. « Les principes et les causes ».</ref>. === Critique de la théorie platonicienne des Idées (livres M-N) === ==== Les arguments contre les Idées séparées ==== Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, mais lui reproche d'avoir séparé ces formes des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8.</ref>. Cette séparation est, selon Aristote, inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles, ni à leur existence, ni à leur devenir<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9.</ref>. Impossible, car elle conduit à des apories comme l'argument du Troisième Homme<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8.</ref>. ==== Le statut des êtres mathématiques ==== Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31.</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés. Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17.</ref>. == La philosophie pratique : éthique, politique, rhétorique, poétique == === L'''Éthique à Nicomaque'' – La vie bonne === ==== Le souverain bien et le bonheur ==== L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26. Pour une introduction d'ensemble à l'éthique aristotélicienne, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014.</ref>. Comme le note Pellegrin, Aristote, dans le premier livre de l'''Éthique à Nicomaque'', « donne l'un des exemples les plus caractéristiques et les plus aboutis du traitement d'une notion léguée par la tradition »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Bonheur (eudaimonia) », p. 37.</ref> : il commence par exposer les opinions reçues sur le bonheur (plaisir, honneurs, richesse, vertu, contemplation), puis examine ce qu'il peut conserver de chacune. Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18.</ref>. L'interprétation de cette définition fait l'objet d'un débat important dans la recherche contemporaine, qui oppose une lecture « inclusiviste » à une lecture « dominante »<ref>Sur ce débat, voir Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit. ; Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. La question fait l'objet d'une discussion approfondie dans la littérature anglo-saxonne, notamment depuis les travaux de J.L. Ackrill et T.H. Irwin.</ref>. Selon la lecture inclusiviste, le bonheur consiste en l'exercice de toutes les vertus, morales et intellectuelles, dans une vie complète. Selon la lecture dominante, le bonheur s'identifie à l'activité de la vertu la plus haute, c'est-à-dire la contemplation, comme le suggère le livre X. Cette tension entre deux perspectives au sein même de l'''Éthique à Nicomaque'' (entre les premiers livres, qui semblent privilégier une vie pratique vertueuse, et le livre X, qui exalte la vie contemplative) reste l'objet d'interprétations divergentes. ==== Les vertus éthiques et la doctrine du juste milieu ==== Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2.</ref>. Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10.</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2.</ref>. Cette doctrine du juste milieu a connu une fortune durable dans la philosophie morale. Elle est aujourd'hui au centre du renouveau de l'éthique des vertus en philosophie morale contemporaine, à la suite des travaux d'Anscombe, MacIntyre et Nussbaum<ref>Voir les contributions à Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit.</ref>. ==== L'amitié ==== Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''). Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7.</ref>. Seule la dernière est véritablement amitié au sens plein, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15.</ref>. L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est, selon Aristote, un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4.</ref>. ==== La vie contemplative ==== Le livre X conclut l'éthique en affirmant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect serait la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18.</ref>. Aristote reconnaît que cette vie purement intellectuelle dépasse les forces humaines prises isolément, mais affirme que dans la mesure où il y a en nous quelque chose de divin, nous devons tendre vers cette vie<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34.</ref>. Comme le souligne Pellegrin, ce passage du livre X introduit la notion de « bonheur achevé » (''teleia eudaimonia'') et déclare que « le bonheur pratique, celui du citoyen vertueux, n'est bonheur "qu'à titre secondaire" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 39, citant ''Éthique à Nicomaque'', X, 8, 1178a9.</ref>. La cohérence entre cette thèse et l'analyse de l'''eudaimonia'' développée dans les premiers livres est l'une des questions les plus discutées de l'aristotélisme moral contemporain. === Les ''Politiques'' – La cité et les constitutions === ==== L'homme, animal politique ==== Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3. Pour une vue d'ensemble de la pensée politique aristotélicienne, voir Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013.</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et à la tradition cynique, qui prônait l'autarcie individuelle. L'homme ne peut, selon Aristote, ni vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4.</ref>. Il faut signaler ici que les ''Politiques'' contiennent également des thèses aujourd'hui rejetées : la justification de l'esclavage par nature (livre I) et la subordination des femmes ont fait l'objet de critiques nombreuses, déjà au {{XIXe siècle}} et plus encore dans la philosophie féministe contemporaine. Comme le note Larose, « certains des textes [d'Aristote] choqueront à juste titre le lecteur, en particulier ceux qui traitent du statut de la femme et de l'esclavage. Tout philosophe qu'il soit, Aristote est bien un homme de son temps »<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. ==== Les formes de constitution ==== Aristote distingue six formes de constitution selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou ''politeia'' (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie au sens péjoratif de démagogie<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10.</ref>. Comme le souligne Pellegrin, l'originalité d'Aristote ne réside pas dans la quête d'une constitution idéale unique, mais dans l'idée qu'« une constitution est dite droite si elle gouverne la cité en vue de "l'avantage commun" »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., article « Politique », p. 57.</ref>. Aucune constitution n'est absolument la meilleure en tout lieu et en tout temps : la meilleure constitution pour une cité donnée dépend des circonstances – étendue du territoire, richesses, mœurs des habitants. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon. ==== La constitution mixte et la classe moyenne ==== La constitution la plus stable, selon le livre IV, est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1.</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions<ref>Aristote rappelle aussi que « les bons législateurs sont sortis de la classe moyenne », citant l'exemple de Solon, Lycurgue et Charondas. Voir Daniel Larose, ''Aristote de A à Z'', op. cit., article « Constitution mixte ».</ref>. Cette théorie de la classe moyenne et de la constitution mixte a influencé la pensée politique occidentale, de Polybe à Montesquieu. La méthode aristotélicienne, comme le souligne Pellegrin, ne se contente pas d'observer la diversité des constitutions, mais « rend la diversité intelligible en en construisant un modèle théorique » à partir d'un nombre fini de paramètres<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 60.</ref>. ==== L'éducation ==== Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21.</ref>. Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13.</ref>. === La ''Rhétorique'' – L'art de persuader === ==== La rhétorique comme art ==== La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11.</ref>. Aristote prend ses distances avec la critique platonicienne de la rhétorique formulée dans le ''Gorgias''. Bien utilisée, la rhétorique est un art (''technê'') légitime. Elle sert à défendre la vérité et la justice, car « il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole »<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24.</ref>. ==== Les trois genres rhétoriques ==== Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29.</ref>. Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible. Le judiciaire porte sur le juste et l'injuste. L'épidictique porte sur le beau et le laid moral<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5.</ref>. ==== Les preuves rhétoriques : ethos, pathos, logos ==== Aristote distingue trois moyens de persuasion : l'''ethos'' (le caractère de l'orateur), le ''pathos'' (les émotions de l'auditoire), et le ''logos'' (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13.</ref>. L'''ethos'' persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le ''pathos'' persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie), leurs causes et leurs manifestations. Le ''logos'' persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5.</ref>. Cette analyse fonde la rhétorique comme discipline rationnelle et systématique. Elle constituera la base de l'enseignement rhétorique jusqu'à l'époque moderne et nourrit aujourd'hui des recherches actives en philosophie de l'argumentation et théorie de la communication. === La ''Poétique'' – La création artistique === ==== La ''mimêsis'' et la ''catharsis'' ==== La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5.</ref>. C'est pourquoi la poésie est, selon Aristote, plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier. La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28.</ref>. La doctrine de la ''catharsis'' est l'une des plus discutées de toute la philosophie ancienne. L'interprétation médicale (la tragédie « purge » les émotions excessives) a été défendue notamment par Jacob Bernays au {{XIXe siècle}} ; d'autres interprétations y voient plutôt une « clarification » morale ou cognitive des émotions<ref>Sur ces interprétations divergentes, voir Stephen Halliwell, ''Aristotle's Poetics'', Londres, Duckworth, 1986 ; Christof Rapp, « Katharsis der Emotionen », dans B. Seidensticker et M. Vöhler (éd.), ''Katharsiskonzeptionen vor Aristoteles'', Berlin, De Gruyter, 2007 ; Christof Rapp, « Aristoteles über das Wesen und die Wirkung der Tragödie », dans O. Höffe (éd.), ''Aristoteles. Poetik'', Berlin, Akademie Verlag, 2009. La question demeure ouverte dans la recherche contemporaine.</ref>. ==== La structure de la tragédie ==== Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères<ref>Aristote, ''Poétique'', 11, 1452a15-32.</ref>. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance. Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10.</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion. Comme le rappelle Pellegrin, la ''Poétique'' que nous connaissons est une œuvre incomplète : « nous ne possédons qu'une partie, celle qu'Aristote a consacrée à la tragédie, et en partie à l'épopée »<ref>Pierre Pellegrin, ''Dictionnaire Aristote'', op. cit., p. 109.</ref>. La partie consacrée à la comédie est perdue. Ces analyses ont profondément influencé la théorie littéraire occidentale, notamment à la Renaissance avec la redécouverte du traité, et nourrissent encore les débats en théorie littéraire et esthétique contemporaine. == Réception et postérité == L'œuvre d'Aristote a connu une transmission complexe et une réception multiforme dans l'histoire de la pensée. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, en cherchant souvent à les harmoniser avec le platonisme. Au IXe siècle, les philosophes et savants du monde arabo-musulman traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui sera lui-même reçu en Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin et transforment l'enseignement universitaire médiéval. Albert le Grand (1200-1280) et Thomas d'Aquin (1225-1274) intègrent largement Aristote dans la théologie chrétienne, montrant la possibilité d'une articulation entre la philosophie péripatéticienne et la foi. Le thomisme deviendra une philosophie de référence dans l'Église catholique. Cette domination scolastique provoquera, à la Renaissance et à l'époque moderne, des remises en cause variées. La science moderne, de Galilée à Newton, se construit en partie en réaction à la physique aristotélicienne, mais sans en constituer la simple négation : la recherche récente sur la philosophie naturelle de la Renaissance et la scolastique tardive décrit un tableau plus nuancé, fait à la fois de continuités, de relectures et d'oppositions<ref>Voir notamment, pour les débats sur la transition entre l'aristotélisme tardif et la science moderne, A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', op. cit. ; et l'entrée « Aristotle's Natural Philosophy » de la ''Stanford Encyclopedia of Philosophy''.</ref>. Au {{XXe siècle}} et au début du {{XXIe siècle}}, plusieurs domaines de la pensée aristotélicienne ont fait l'objet d'un regain d'attention universitaire. En philosophie morale, le renouveau de l'éthique des vertus (Anscombe, MacIntyre, Nussbaum) a remis au premier plan les analyses de l'''Éthique à Nicomaque''<ref>Voir Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', op. cit. ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', op. cit.</ref>. En philosophie de l'esprit, certains philosophes ont vu dans l'hylémorphisme aristotélicien une alternative aux apories du dualisme cartésien et du réductionnisme matérialiste. En métaphysique, la conception de la substance et des catégories nourrit les débats sur l'ontologie réaliste. En philosophie de la biologie, la téléologie et la conception de l'organisme comme totalité fonctionnelle font l'objet de relectures<ref>Voir notamment Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', op. cit. ; James G. Lennox, ''Aristotle's Philosophy of Biology'', op. cit. ; Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', op. cit.</ref>. Au-delà de ces actualisations, l'œuvre d'Aristote demeure un objet d'étude central de l'histoire de la philosophie. Comme le rappelle Daniel Larose, « il existe ainsi plusieurs "Aristote" selon les époques » : la pluralité des lectures (logicienne, physicienne, métaphysicienne, théologienne, éthicienne) reflète à la fois la richesse interne de son œuvre et la diversité des projets philosophiques qui s'en sont nourris<ref>Daniel Larose, ''Aristote de A à Z'', op. cit., Introduction.</ref>. La recherche universitaire actuelle aborde le corpus aristotélicien comme un ensemble cohérent sans pour autant le juger systématique au sens classique du terme. == Notes et références == {{Références|colonnes = 2}} == Bibliographie == === Éditions et traductions de référence === * Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014. * Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870. * Jonathan Barnes (éd.), ''The Complete Works of Aristotle. The Revised Oxford Translation'', Princeton, Princeton University Press, 1984. * Aristote, ''Catégories'', éd. et trad. R. Bodéüs, Paris, Les Belles Lettres, 2001. * Aristote, ''Topiques I-IV'', éd. et trad. J. Brunschwig, Paris, Les Belles Lettres, 1967 et 2007. * Aristote, ''Poétique'', éd. et trad. J. Hardy, Paris, Les Belles Lettres. * Aristote, ''De l'Âme'', éd. et trad. A. Jannone et E. Barbotin, Paris, Les Belles Lettres. * Aristote, ''Politique'', éd. et trad. J. Aubonnet, Paris, Les Belles Lettres, 1960 et suiv. === Synthèses générales === * Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962. * Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995. * Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923). * Daniel Larose, ''Aristote de A à Z'', Paris, PUF, « Que sais-je ? », 2021. * Pierre Pellegrin, ''Dictionnaire Aristote'', Paris, Ellipses, 2007. * Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990. * David Ross, ''Aristotle'', London, Methuen, 1923. === Études spécialisées par domaine === * Logique et épistémologie : Suzanne Husson (éd.), ''Interpréter le De Interpretatione'', Paris, Vrin, 2009 ; Jan Lukasiewicz, ''La syllogistique d'Aristote'', trad. fr., Paris, Vrin ; J. Brunschwig, ''Aristote: Topiques I-IV'', Paris, Les Belles Lettres, 1967 et 2007 ; L.A. Dorion, ''Les Réfutations Sophistiques d'Aristote'', Paris, Vrin, 1995. * Métaphysique : Vasilis Politis, ''Routledge Philosophy GuideBook to Aristotle and the Metaphysics'', Londres-New York, Routledge, 2004 ; Annick Jaulin, ''Aristote. La métaphysique'', Paris, PUF, 1999 ; Maddalena Bonelli (dir.), ''Physique et métaphysique chez Aristote'', Paris, Vrin ; Michel Narcy et Alonso Tordesillas (dir.), ''La « Métaphysique » d'Aristote. Perspectives contemporaines'', Paris, Vrin ; Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992. * Philosophie de la nature et biologie : Sophia M. Connell (éd.), ''The Cambridge Companion to Aristotle's Biology'', Cambridge, Cambridge University Press, 2021 ; James G. Lennox, ''Aristotle's Philosophy of Biology: Studies in the Origins of Life Science'', Cambridge, Cambridge University Press, 2001 ; Allan Gotthelf, ''Teleology, First Principles, and Scientific Method in Aristotle's Biology'', Oxford, Oxford University Press, 2012 ; Allan Gotthelf et James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987 ; A.C. Bowen et C. Wildberg (éd.), ''New Perspectives on Aristotle's De Caelo'', Leiden, Brill, 2009. * Éthique et politique : Ronald Polansky (éd.), ''The Cambridge Companion to Aristotle's Nicomachean Ethics'', Cambridge, Cambridge University Press, 2014 ; Gerard J. Hughes, ''Routledge Philosophy Guidebook to Aristotle on Ethics'', Londres, Routledge, 2001 ; Marguerite Deslauriers et Pierre Destrée (éd.), ''The Cambridge Companion to Aristotle's Politics'', Cambridge, Cambridge University Press, 2013 ; Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003. * Synthèses de référence en langue allemande et anglaise : Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012 ; Christof Rapp et Klaus Corcilius (dir.), ''Aristoteles-Handbuch. Leben – Werk – Wirkung'', Stuttgart, Metzler, 2011. ===L{{'}}''Organon''=== *Bronstein, David, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016. *Dorion, Louis-André, ''Les Réfutations Sophistiques d’Aristote'', Paris, Vrin, 1995. *Harari, Orna, ''Knowledge and Demonstration: Aristotle’s Posterior Analytics'', Dordrecht, Springer / Kluwer, 2004. *Husson, Suzanne (éd.), ''Interpréter le'' De Interpretatione, Paris, Vrin, 2009. *Lear, Jonathan, ''Aristotle and Logical Theory'', Cambridge, Cambridge University Press, 1980. *Mesquita, António Pedro, et Santos, Ricardo (éd.), ''New Essays on Aristotle’s Organon'', Abingdon-Oxon, Routledge, 2024 (contributions notamment de Crivelli, Pellegrin, Bronstein/Zuppolini, Fait). *Patterson, Richard, ''Aristotle’s Modal Logic: Essence and Entailment in the Organon'', Cambridge, Cambridge University Press, 1995. *Whitaker, C. W. A., ''Aristotle’s'' De Interpretatione: ''Contradiction and Dialectic'', Oxford, Clarendon Press, 1996. === Ressources en ligne === * ''Stanford Encyclopedia of Philosophy'', entrées : « Aristotle » ; « Aristotle's Categories » ; « Aristotle's Logic » ; « Aristotle's Metaphysics » ; « Aristotle's Ethics » ; « Aristotle's Political Philosophy » ; « Aristotle's Natural Philosophy » ; « Aristotle's Biology » ; « Aristotle's Aesthetics ». [https://plato.stanford.edu/] * ''Internet Encyclopedia of Philosophy'', entrée « Aristotle ». [https://iep.utm.edu/aristotle/] {{Autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Aristote}} 10psgpz364dz0p2rmhccmv1p8fim56m Dictionnaire de philosophie/Culture 0 83063 767892 752930 2026-06-17T04:47:07Z PandaMystique 119061 767892 wikitext text/x-wiki {{DicoPhilo|Culture}} La '''culture''' désigne l'ensemble des productions matérielles et symboliques par lesquelles l'humanité se différencie de la nature, se crée un monde propre et développe ses capacités. Ce concept, central en philosophie depuis l'Antiquité, trouve ses racines étymologiques dans le latin ''cultura'' (« cultiver la terre »), terme que Cicéron transpose à la sphère spirituelle en parlant de ''cultura animi'' (« culture de l'âme »)<ref>Cicéron, ''Tusculanes'', II, 13</ref>. La philosophie de la culture interroge fondamentalement le processus par lequel l'être humain s'arrache à la simple naturalité pour édifier un univers de significations, d'institutions et de pratiques qui constituent son monde propre. ==L'opposition classique nature/culture== ===Les fondements philosophiques de la distinction=== L'opposition entre nature et culture structure la pensée occidentale depuis ses origines. Aristote distingue déjà ce qui existe ''par nature'' (''physei'') de ce qui procède de l'''art'' ou de la ''technique'' (''technê''). Cette distinction s'approfondit avec la modernité. Le dualisme cartésien, en séparant la ''res extensa'' de la ''res cogitans'', établit une coupure ontologique entre le corps et l'esprit qui fonde l'opposition moderne entre nature et culture<ref>Descartes, ''Méditations métaphysiques'', Méditation VI, 1641</ref>. Comme le souligne Sari Lemable, « la scission cartésienne entre corps et esprit était formatrice pour l'idée d'un sujet conscient, autonome, indépendant, rationnel, objectif et universel »<ref>S. Lemable, « De l'anthropocène au Chthulucène », 2020, p. 156</ref>. La tradition des Lumières consacre cette opposition en faisant de la culture l'instrument de perfectionnement de l'humanité. Rousseau théorise cette tension dans son ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), où il oppose l'homme naturel, caractérisé par la pitié et l'amour de soi, à l'homme civil, produit de la société et de la culture. Kant prolonge cette réflexion en définissant la culture comme « la production de l'aptitude d'un être raisonnable à des fins quelconques en général (donc celles de sa liberté) »<ref>Kant, ''Critique de la faculté de juger'', § 83, 1790</ref>. Dans cette perspective hégélienne, la culture devient le moment de la formation (''Bildung'') par laquelle l'esprit se réalise progressivement dans l'histoire. ===La critique structuraliste : Lévi-Strauss et l'universalité de la prohibition de l'inceste=== Claude Lévi-Strauss apporte une contribution décisive à la problématisation de cette opposition dans ''Les structures élémentaires de la parenté'' (1949). Il cherche à identifier le critère permettant de distinguer la nature de la culture : « Partout où la règle se manifeste, nous savons avec certitude être à l'étage de la culture. Symétriquement, il est aisé de reconnaître dans l'universel le critère de la nature »<ref>C. Lévi-Strauss, ''Les structures élémentaires de la parenté'', PUF, 1949, p. 9-10</ref>. Or la prohibition de l'inceste constitue un phénomène paradoxal : elle est universelle (donc apparemment naturelle) tout en étant normative (donc culturelle). Lévi-Strauss en conclut que la prohibition de l'inceste marque le passage de la nature à la culture, constituant « le processus et le moment où s'accomplit le passage de la nature à la culture »<ref>C. Lévi-Strauss, ''Les structures élémentaires de la parenté'', PUF, 1949, p. 29</ref>. Cette approche structurale s'inscrit dans une démarche plus large visant à identifier les structures universelles de l'esprit humain sous la diversité des manifestations culturelles. Comme le souligne Marshall Sahlins, « la grande ambition de Lévi-Strauss fut de découvrir les lois universelles de l'esprit humain sous la diversité des cultures connues de l'ethnologie »<ref>M. Sahlins, « L'anthropologie de Lévi-Strauss », 2018</ref>. L'anthropologie structurale postule que « les formes de l'ordre culturel reflètent les lois sous-jacentes, générales, de l'esprit humain », approche qui culmine dans l'étude des mythologies amérindiennes des ''Mythologiques'' (1964-1971). ===La remise en question contemporaine de l'opposition=== La philosophie contemporaine, particulièrement face aux défis écologiques, remet profondément en question la pertinence de cette dichotomie. Philippe Descola, dans ''Par-delà nature et culture'' (2005), démontre que l'opposition entre nature et culture n'est pas un universel anthropologique mais une construction occidentale récente. Il propose une typologie de quatre ontologies – l'animisme, le totémisme, l'analogisme et le naturalisme – montrant que seul le naturalisme occidental établit une séparation radicale entre nature et culture<ref>P. Descola, ''Par-delà nature et culture'', Gallimard, 2005</ref>. Bruno Latour prolonge cette critique en développant le concept d'« hybrides » qui transcendent la distinction moderne entre nature et culture. Dans ''Nous n'avons jamais été modernes'' (1991), il montre que les objets technoscientifiques contemporains – qu'il nomme « quasi-objets » – ne peuvent être compris ni comme purement naturels ni comme purement culturels. Ils nécessitent une « écologie politique » reconnaissant l'entrelacement fondamental du naturel et du culturel<ref>B. Latour, ''Nous n'avons jamais été modernes'', La Découverte, 1991, p. 15-21</ref>. ==Le matérialisme historique : la culture comme production sociale== ===Marx et la conception matérialiste de la culture=== Karl Marx opère une transformation profonde de la conception philosophique de la culture en l'inscrivant dans les rapports de production matériels. Dans ''L'idéologie allemande'' (1845-1846), il énonce le principe fondamental du matérialisme historique : « Ce n'est pas la conscience qui détermine la vie, c'est la vie qui détermine la conscience »<ref>K. Marx et F. Engels, ''L'idéologie allemande'', Éditions sociales, 1976 [1845-1846], p. 44</ref>. La culture n'est pas une sphère autonome de l'esprit mais une « superstructure » déterminée en dernière instance par l'« infrastructure » économique, c'est-à-dire par les forces productives et les rapports de production. Cette perspective matérialiste implique que les productions culturelles – art, religion, philosophie, droit – expriment les intérêts de la classe dominante et contribuent à la reproduction des rapports sociaux de domination. Dans la célèbre formule du ''18 Brumaire de Louis Bonaparte'' (1852), Marx affirme : « Les hommes font leur propre histoire, mais ils ne la font pas arbitrairement, dans les conditions choisies par eux, mais dans des conditions directement données et héritées du passé »<ref>K. Marx, ''Le 18 Brumaire de Louis Bonaparte'', Éditions sociales, 1969 [1852], p. 15</ref>. Le matérialisme marxiste conserve néanmoins une place centrale pour la praxis, cette activité pratique par laquelle l'humanité transforme le monde et se transforme elle-même. La onzième thèse sur Feuerbach l'exprime de manière lapidaire : « Les philosophes n'ont fait qu'interpréter diversement le monde, ce qui importe, c'est de le transformer »<ref>K. Marx, ''Thèses sur Feuerbach'', thèse XI, 1845</ref>. Cette dimension praxéologique du marxisme sera particulièrement développée par Antonio Gramsci et l'École de Francfort. ===Gramsci et l'hégémonie culturelle=== Antonio Gramsci approfondit la réflexion marxiste sur la culture en élaborant le concept d'« hégémonie culturelle ». Dans les ''Quaderni del carcere'' (1929-1935), il théorise la domination non plus seulement comme coercition politique et économique, mais comme direction intellectuelle et morale. L'hégémonie désigne « le moment de direction politique et du niveau des idées qui crée, politiquement, un bloc historique de nature sociale »<ref>A. Gramsci, ''Quaderni del carcere'', Einaudi, 1975, Q. 10, § 12</ref>. Pour Gramsci, la « philosophie de la praxis » – terme qu'il utilise dans ses Cahiers pour désigner le marxisme – doit devenir une « culture de masse » capable de rivaliser avec l'hégémonie bourgeoise. Il écrit : « la philosophie de la praxis [...] tend [...] à maintenir les simples dans leur philosophie primitive du sens commun, mais au contraire à les conduire à une conception supérieure de la vie »<ref>A. Gramsci, ''Quaderni del carcere'', Einaudi, 1975, Q. 11, § 12</ref>. Cette transformation culturelle nécessite l'intervention des « intellectuels organiques », liés à leur classe d'origine et capables de produire une nouvelle vision du monde. L'apport gramscien se distingue du marxisme orthodoxe par sa reconnaissance de l'autonomie relative de la sphère culturelle. Comme le souligne la recherche contemporaine, « la détermination fondamentale de la philosophie de la praxis est [...] d'être une conception de masse, une culture de masse et de [une] masse qui opère unitairement »<ref>G. Vacca, « La filosofia della praxis di Antonio Gramsci », 2014, p. 3</ref>. L'hégémonie culturelle devient ainsi l'enjeu central de la lutte politique, nécessitant une réforme intellectuelle et morale de la société. ===L'École de Francfort et la critique de l'industrie culturelle=== Theodor W. Adorno et Max Horkheimer, dans ''La dialectique de la Raison'' (''Dialektik der Aufklärung'', 1947), développent une critique radicale de la culture sous le capitalisme avancé à travers le concept d'« industrie culturelle » (''Kulturindustrie''). Ce terme, forgé pour remplacer l'expression « culture de masse » jugée ambiguë, désigne le processus de rationalisation et de marchandisation de la production culturelle<ref>T.W. Adorno et M. Horkheimer, ''La Dialectique de la Raison'', Gallimard, 1974 [1947], p. 129-176</ref>. L'industrie culturelle soumet les œuvres d'art aux impératifs de productivité et de rentabilité du capitalisme. « Le terrain sur lequel la technique acquiert son pouvoir sur la société est le pouvoir de ceux qui la dominent économiquement », écrivent Adorno et Horkheimer. « De nos jours, la rationalité technique est la rationalité de la domination même. Elle est le caractère coercitif de la société aliénée »<ref>T.W. Adorno et M. Horkheimer, ''La Dialectique de la Raison'', Gallimard, 1974 [1947], p. 130</ref>. Cette standardisation produit une pseudo-individualité où les différences ne sont que superficielles, masquant une homogénéisation profonde. La critique adornienne s'étend particulièrement à la musique populaire et au jazz, analysés comme manifestations d'une régression culturelle. Dans ''Philosophie de la nouvelle musique'' (1949) et ses nombreux essais sur la musique, Adorno oppose l'art authentique, caractérisé par son autonomie et sa négativité critique, aux productions standardisées de l'industrie culturelle qui fonctionnent comme instruments d'adaptation sociale et de reproduction idéologique. Cette position, souvent jugée élitiste, témoigne néanmoins d'une inquiétude profonde face à la transformation de la culture en marchandise et à la neutralisation de son potentiel émancipateur. ==Les philosophies de la culture comme système symbolique== ===Cassirer et la philosophie des formes symboliques=== Ernst Cassirer élabore dans sa ''Philosophie des formes symboliques'' (''Philosophie der symbolischen Formen'', 1923-1929) une théorie systématique de la culture comme ensemble de productions symboliques. Inscrite dans la tradition néokantienne, sa philosophie étend la critique de la raison pure en une critique de la culture : « À côté de la pure fonction de connaissance, il s'agit d'appréhender les fonctions de la pensée linguistique, de la pensée mythico-religieuse et de l'intuition artistique de sorte qu'apparaisse clairement comment à l'intérieur de chacune d'elles une certaine configuration – configuration non pas tant du monde que configuration en monde – se réalise comme connexion objective de sens ou comme ensemble objectif de l'intuition »<ref>E. Cassirer, ''La philosophie des formes symboliques I. Le Langage'', Minuit, 1972 [1923], p. 20</ref>. Pour Cassirer, une « forme symbolique » désigne « cette énergie de l'esprit par laquelle un contenu de signification intelligible est accolé à un signe sensible concret et intrinsèquement adapté à ce signe »<ref>E. Cassirer, « Le concept de forme symbolique dans l'édification des sciences de l'esprit », dans ''Trois Essais sur le symbolique'', Cerf, 1997, p. 13</ref>. La culture humaine se déploie à travers différentes formes symboliques – le mythe, le langage, l'art, la religion, la science – qui constituent autant de modalités par lesquelles l'esprit organise l'expérience et construit un monde de significations. Le concept de « prégnance symbolique » (''symbolische Prägnanz'') est central dans cette philosophie. Il désigne « la façon dont un contenu de perception, en tant que vécu sensible, renferme en même temps un certain « sens » non intuitif qu'il amène à une représentation immédiate et concrète »<ref>E. Cassirer, ''La philosophie des formes symboliques III. La phénoménologie de la connaissance'', Minuit, 1972 [1929], p. 229</ref>. Cette notion permet de penser l'unité indissoluble du sensible et de l'intelligible dans toute expérience culturelle, dépassant ainsi l'alternative entre empirisme et idéalisme. La philosophie cassirerienne de la culture a une portée éthique et politique. Face à la montée du nazisme, Cassirer analyse dans ''Le mythe de l'État'' (1946) la résurgence des formes mythiques de pensée dans la vie politique moderne. Il montre comment les régimes totalitaires exploitent la puissance émotionnelle du mythe pour détruire les formes rationnelles de la culture. Cette analyse fait de la philosophie de la culture un instrument critique pour comprendre et combattre les pathologies politiques de la modernité. ===Hegel et la culture comme auto-déploiement de l'Esprit=== La philosophie hégélienne accorde à la culture (''Bildung'') une place centrale dans le processus par lequel l'Esprit (''Geist'') se réalise et parvient à la connaissance de soi. Dans la ''Phénoménologie de l'Esprit'' (1807), Hegel décrit la culture comme le mouvement par lequel la conscience individuelle s'arrache à l'immédiateté naturelle pour s'élever à l'universel. « La culture est l'aliénation de la substance naturelle », écrit-il, processus douloureux mais nécessaire par lequel l'esprit subjectif accède à l'objectivité<ref>Hegel, ''Phénoménologie de l'Esprit'', Aubier, 1991 [1807], t. II, p. 11-73</ref>. Dans les ''Principes de la philosophie du droit'' (1821), Hegel théorise l'« esprit objectif » comme la sphère où l'esprit se donne une réalité extérieure à travers les institutions sociales et politiques. La culture désigne alors l'ensemble des médiations – famille, société civile, État – par lesquelles l'individu s'approprie la substance éthique de son peuple. Comme l'explique Michael Rosen, « pour Hegel, l'esprit consiste en un processus et une structure de réflexion, d'autodifférenciation et de prise de conscience d'un tout articulé, dans les individus autonomes »<ref>M. Rosen, « Liberté, Esprit et Histoire », p. 3</ref>. Cette conception hégélienne influence profondément la pensée allemande du XIXe siècle. Le concept de ''Bildung'' devient central dans l'idéalisme allemand et le néohumanisme, désignant à la fois la formation individuelle et l'autocréation historique de l'humanité. La culture n'est pas une accumulation de connaissances mais un processus de transformation de soi par appropriation de l'universel. Cette perspective téléologique, selon laquelle la culture constitue le développement progressif de la liberté humaine, sera reprise et transformée par Marx dans sa conception matérialiste de l'histoire. ==Anthropologie philosophique et culture== ===Gehlen et l'homme comme être de culture par nécessité=== Arnold Gehlen développe dans ''L'Homme. Sa nature et sa position dans le monde'' (''Der Mensch'', 1940) une anthropologie philosophique qui fait de la culture non un ajout facultatif à la nature humaine mais sa condition de possibilité même. L'homme est défini comme un « être déficient » (''Mängelwesen''), caractérisé par son inachèvement biologique et son absence d'adaptation spécialisée à un milieu particulier<ref>A. Gehlen, ''L'Homme. Sa nature et sa position dans le monde'', Gallimard, 2021 [1940], p. 45-67</ref>. Cette déficience constitutive oblige l'être humain à compenser par l'action et la technique ses handicaps biologiques. « L'action et les transformations prévues du monde, dont la quintessence porte le nom de "culture", font partie de l'"essence" de l'être humain », écrit Gehlen<ref>A. Gehlen, ''Essais d'anthropologie philosophique'', Éditions de la MSH, 2010, p. 15</ref>. La culture n'est donc pas une dimension secondaire qui viendrait s'ajouter à une nature humaine préétablie, mais la modalité même de l'existence humaine. L'homme n'a pas de nature au sens où les animaux en ont une ; sa « nature » consiste précisément à créer une « seconde nature » culturelle. Cette anthropologie conduit Gehlen à élaborer une théorie des institutions comme structures stabilisatrices nécessaires face à la plasticité et à l'indétermination de la nature humaine. Les institutions culturelles – langage, famille, État, religion – permettent à l'homme de décharger sa conscience de la surcharge de stimuli et de possibilités qui résulterait de son ouverture biologique au monde. Cette théorie conservatrice des institutions sera vivement critiquée par l'École de Francfort, notamment par Adorno et Habermas, qui y voient une légitimation du conformisme social. ===L'humanisme et la culture chez Arendt=== Hannah Arendt développe dans ''La crise de la culture'' (1961) une réflexion sur le statut de la culture dans les sociétés modernes et totalitaires. Elle distingue la culture authentique, liée à la durabilité du monde commun et à la transmission intergénérationnelle, de l'industrie culturelle qui transforme les œuvres en objets de consommation éphémère. « La société de masse ne veut pas la culture mais le loisir (entertainment) », écrit-elle, soulignant la menace que fait peser sur la culture la logique de consommation<ref>H. Arendt, ''La crise de la culture'', Gallimard, 1972 [1961], p. 265</ref>. Dans sa préface à ''La crise de la culture'', Arendt diagnostique « la brèche entre le passé et le futur », cette perte de la tradition qui caractérise la modernité. La rupture de la tradition ne signifie pas simplement l'oubli du passé mais la perte de l'autorité que celui-ci exerçait sur le présent. « Longtemps, pour ce faire, on put recourir à la tradition. Or nous vivons, à l'âge moderne, l'usure de la tradition, la crise de la culture »<ref>H. Arendt, ''La crise de la culture'', Gallimard, 1972 [1961], p. 11</ref>. Cette analyse s'inscrit dans une réflexion plus large sur la condition humaine et la nécessité de préserver un monde commun contre les tendances destructrices du totalitarisme et de la société de consommation. La conception arendtienne de la culture est intimement liée à sa théorie de l'action politique. La culture constitue le monde commun, cet espace intermédiaire et durable entre les hommes, distinct de la sphère privée du travail et de la nécessité. Les œuvres culturelles ont pour fonction de stabiliser et d'humaniser le monde, de lui conférer une permanence qui transcende la mortalité individuelle. Cette vision humaniste de la culture comme édification d'un monde commun fonde une critique de la modernité qui ne renonce ni à la tradition ni à la possibilité d'un nouveau commencement. ==La sociologie critique de la culture== ===Bourdieu : capital culturel et reproduction sociale=== Pierre Bourdieu élabore une théorie sociologique de la culture qui met en évidence son rôle dans la reproduction des inégalités sociales. Dans ''La Reproduction'' (1970) et ''La Distinction'' (1979), il forge le concept de « capital culturel » pour désigner l'ensemble des ressources culturelles – connaissances, compétences, diplômes, pratiques – dont dispose un individu et qui lui confèrent un avantage dans la compétition sociale<ref>P. Bourdieu et J.-C. Passeron, ''La Reproduction'', Minuit, 1970, p. 38-45</ref>. Le capital culturel existe sous trois formes : une forme « incorporée » (l'habitus culturel, les dispositions acquises), une forme « objectivée » (les biens culturels possédés) et une forme « institutionnalisée » (les diplômes et titres scolaires)<ref>P. Bourdieu, « Les trois états du capital culturel », ''Actes de la recherche en sciences sociales'', n°30, 1979, p. 3-6</ref>. Cette triple articulation permet de comprendre comment la culture fonctionne comme un capital, c'est-à-dire comme une ressource accumulable, transmissible et convertible en d'autres formes de capital (économique, social). La théorie bourdieusienne démontre que l'école, loin de compenser les inégalités sociales, contribue à les reproduire en valorisant le capital culturel hérité des classes dominantes. Les enfants des milieux favorisés bénéficient d'un « capital culturel hérité » qui leur permet de réussir scolairement et d'accéder à des positions sociales élevées, perpétuant ainsi les hiérarchies sociales. Cette analyse dénaturalise les « dons » et les « talents » en montrant leur caractère socialement construit et inégalement distribué. Le concept d'« habitus », central dans la sociologie bourdieusienne, désigne le système de dispositions durables et transposables qui structure les pratiques et les représentations des individus. L'habitus culturel se forme à travers la socialisation familiale et scolaire, incorporant les schèmes de perception et d'appréciation propres à chaque classe sociale. Cette « violence symbolique » exercée par la culture légitime est d'autant plus efficace qu'elle est méconnue comme telle par les dominés eux-mêmes. ===Raymond Williams et le matérialisme culturel=== Raymond Williams développe dans ''Culture and Society'' (1958) et ''Marxism and Literature'' (1977) un « matérialisme culturel » qui refuse le réductionnisme économique du marxisme orthodoxe tout en maintenant une perspective matérialiste. Contre l'opposition base/superstructure, Williams affirme que « la production culturelle est elle-même une forme de production matérielle »<ref>R. Williams, ''Marxism and Literature'', Oxford University Press, 1977, p. 93-97</ref>. Le concept de « structure de sentiments » (''structure of feeling'') permet à Williams de saisir la dimension vécue et émergente de la culture, cette « expérience en solution » qui précède sa cristallisation en formes culturelles stabilisées. La culture n'est pas un ensemble de productions achevées mais un processus vivant, une « pratique signifiante » en constant devenir<ref>R. Williams, ''Culture and Materialism'', Verso, 2009 [1980], p. 47-51</ref>. Williams distingue trois niveaux dans l'analyse culturelle : la culture « résiduelle » (héritée du passé), la culture « dominante » (qui exprime les intérêts du pouvoir établi) et la culture « émergente » (porteuse de nouvelles significations et valeurs). Cette typologie dynamique permet de penser la culture non comme un bloc homogène mais comme un champ de tensions et de luttes entre différentes formations culturelles. Le matérialisme culturel de Williams a profondément influencé les Cultural Studies britanniques, offrant une alternative au structuralisme français et au fonctionnalisme américain. ==La culture à l'épreuve de la mondialisation== ===Le débat sur le multiculturalisme=== La fin du XXe siècle voit émerger un débat philosophique intense sur le multiculturalisme, particulièrement dans les sociétés libérales confrontées à la diversité culturelle accrue. Charles Taylor, dans « La politique de reconnaissance » (1992), défend l'idée que la reconnaissance publique des différences culturelles est une exigence de justice et de respect égal. Il critique le libéralisme procédural aveugle aux différences et plaide pour un « libéralisme 2 » capable d'accueillir les demandes de reconnaissance des minorités culturelles<ref>C. Taylor, ''Multiculturalisme. Différence et démocratie'', Aubier, 1994 [1992], p. 57-84</ref>. Will Kymlicka développe une théorie libérale du multiculturalisme qui justifie l'octroi de droits collectifs aux minorités culturelles dans certaines conditions. Dans ''Multicultural Citizenship'' (1995), il distingue les « minorités nationales » (peuples autochtones, nations incorporées) des « groupes ethniques » (issus de l'immigration) et propose des politiques différenciées adaptées à chaque situation<ref>W. Kymlicka, ''Multicultural Citizenship'', Oxford University Press, 1995, p. 10-33</ref>. Ces positions multiculturalistes sont critiquées de plusieurs côtés. Les républicains français, attachés au modèle universaliste, dénoncent la « communautarisation » de la société et la fragmentation du lien social. Des féministes comme Susan Moller Okin soulignent les tensions entre multiculturalisme et égalité des sexes, certaines pratiques culturelles minoritaires étant oppressives pour les femmes. Les marxistes reprochent au multiculturalisme de masquer les inégalités économiques derrière les différences culturelles. ===Mondialisation et uniformisation culturelle=== La mondialisation contemporaine pose de manière aiguë la question de l'uniformisation culturelle. L'hégémonie du modèle occidental, portée par l'industrie culturelle américaine et la diffusion mondiale des standards de consommation, menace la diversité culturelle. Cette « occidentalisation » du monde s'accompagne d'un impérialisme culturel qui détruit les cultures traditionnelles et impose les valeurs du capitalisme libéral. L'UNESCO a tenté de répondre à ce défi en adoptant en 2005 la Convention sur la protection et la promotion de la diversité des expressions culturelles. Ce texte reconnaît « la nature spécifique des biens et services culturels en tant que porteurs d'identité, de valeurs et de sens » et affirme « le droit souverain des États de conserver, d'adopter et de mettre en œuvre les politiques et mesures qu'ils jugent appropriées pour la protection et la promotion de la diversité des expressions culturelles »<ref>UNESCO, ''Convention sur la protection et la promotion de la diversité des expressions culturelles'', 2005, art. 2</ref>. Néanmoins, cette défense institutionnelle de la diversité culturelle se heurte aux forces économiques de la mondialisation. Les industries culturelles transnationales, la circulation mondiale des images et des sons via internet, l'hégémonie de l'anglais comme langue de communication internationale créent un espace culturel globalisé qui tend à l'homogénéisation. Face à ce processus, certains théorisent l'émergence d'une « culture monde » hybride qui brasse et recombine les éléments culturels de différentes provenances, tandis que d'autres dénoncent la perte irréparable des cultures locales et le triomphe d'un « soft power » occidental. ==Conclusion== La philosophie de la culture traverse toute l'histoire de la pensée occidentale, questionnant inlassablement le rapport de l'humanité à la nature, à la technique, aux institutions et aux productions symboliques. De l'opposition classique nature/culture, héritée de la modernité cartésienne, aux remises en question contemporaines portées par l'anthropologie structurale et la philosophie post-moderne, le concept de culture n'a cessé d'être problématisé et reconfiguré. Le matérialisme historique marxiste, en inscrivant la culture dans les rapports de production matériels, a révélé sa dimension politique et son rôle dans la reproduction ou la transformation des rapports sociaux. Les philosophies du symbole, de Cassirer à Ricœur, ont montré que la culture constitue le médium même par lequel l'humanité donne sens à son expérience et construit un monde habitable. L'anthropologie philosophique, de Gehlen à Arendt, a établi que la culture n'est pas un ornement superflu mais la condition d'existence de l'être humain, cet « être déficient » qui ne peut survivre qu'en créant une seconde nature artificielle. La sociologie critique, de Bourdieu à l'École de Francfort, a dévoilé les mécanismes par lesquels la culture fonctionne comme instrument de domination symbolique et de reproduction des inégalités sociales, tout en maintenant la possibilité d'une culture émancipatrice. Enfin, les débats contemporains sur le multiculturalisme et la mondialisation culturelle interrogent la possibilité de préserver la diversité culturelle à l'ère de l'uniformisation capitaliste et de l'hégémonie occidentale. Ces différentes approches, loin de s'exclure mutuellement, s'enrichissent et se complètent, témoignant de la complexité irréductible du phénomène culturel. À l'heure de la crise écologique globale, de la numérisation accélérée de toutes les sphères de l'existence et de l'intensification des migrations, la réflexion philosophique sur la culture demeure plus que jamais nécessaire pour penser les conditions d'une coexistence humaine qui respecte à la fois la diversité culturelle et la commune humanité de tous les peuples. ==Références== {{references|colonnes=2}} ==Bibliographie sélective== * '''Adorno, Theodor W. et Horkheimer, Max''', ''Dialectique de la Raison. Fragments philosophiques'', Paris, Gallimard, 1974 [1947]. * '''Arendt, Hannah''', ''La crise de la culture'', Paris, Gallimard, coll. « Folio Essais », 1972 [1961]. * '''Bourdieu, Pierre''', ''La Distinction. Critique sociale du jugement'', Paris, Minuit, 1979. * '''Bourdieu, Pierre et Passeron, Jean-Claude''', ''La Reproduction. Éléments pour une théorie du système d'enseignement'', Paris, Minuit, 1970. * '''Cassirer, Ernst''', ''La philosophie des formes symboliques'', 3 volumes, Paris, Minuit, 1972 [1923-1929]. * '''Descola, Philippe''', ''Par-delà nature et culture'', Paris, Gallimard, 2005. * '''Gehlen, Arnold''', ''L'Homme. Sa nature et sa position dans le monde'', Paris, Gallimard, 2021 [1940]. * '''Gramsci, Antonio''', ''Quaderni del carcere'', Turin, Einaudi, 1975 [1929-1935]. * '''Hegel, G.W.F.''', ''Phénoménologie de l'Esprit'', 2 volumes, Paris, Aubier, 1991 [1807]. * '''Kant, Immanuel''', ''Critique de la faculté de juger'', Paris, Vrin, 1993 [1790]. * '''Kymlicka, Will''', ''Multicultural Citizenship. A Liberal Theory of Minority Rights'', Oxford, Oxford University Press, 1995. * '''Latour, Bruno''', ''Nous n'avons jamais été modernes. Essai d'anthropologie symétrique'', Paris, La Découverte, 1991. * '''Lévi-Strauss, Claude''', ''Les structures élémentaires de la parenté'', Paris, PUF, 1949. * '''Marx, Karl''', ''L'idéologie allemande'', Paris, Éditions sociales, 1976 [1845-1846]. * '''Taylor, Charles''', ''Multiculturalisme. Différence et démocratie'', Paris, Aubier, 1994 [1992]. * '''Williams, Raymond''', ''Culture et matérialisme'', Paris, Les Prairies Ordinaires, 2009 [1980]. ==Voir aussi== * [[Civilisation]] * [[Nature humaine]] * [[Anthropologie philosophique]] * [[Matérialisme historique]] * [[Formes symboliques]] * [[Capital culturel]] * [[Multiculturalisme]] * [[Industrie culturelle]] {{Autocat}} mlg5r8n50vep5sufy79ipopl5cvlziv Dictionnaire de philosophie/Chine 0 83073 767899 753059 2026-06-17T04:53:49Z PandaMystique 119061 767899 wikitext text/x-wiki {{DicoPhilo|Introduction à la pensée chinoise}} == Spécificité de la pensée chinoise == La pensée chinoise constitue l'une des traditions intellectuelles les plus anciennes et continues de l'humanité, développée sur plus de deux millénaires et demi. Contrairement à la philosophie occidentale, qui s'est construite autour de la spéculation métaphysique, de la logique formelle et de la recherche de la vérité absolue<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 13-24</ref>, la pensée chinoise se caractérise par une orientation essentiellement pratique et politique, visant avant tout l'harmonie sociale et cosmique. Cette tradition ne reconnaît pas de coupure radicale entre l'homme et la nature, ni entre le corps et l'esprit. Elle refuse la spéculation abstraite au profit d'une sagesse pragmatique fondée sur l'observation des phénomènes naturels et sociaux<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 33-41</ref>. Comme le souligne Marcel Granet, « l'Homme et la Nature ne forment pas deux règnes séparés, mais une société unique »<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 251</ref>. Ce principe fondamental traverse toute l'histoire de la pensée chinoise et explique sa singularité par rapport aux traditions philosophiques occidentale et indienne. == Les fondements conceptuels == === Le Dao (道) : la Voie === Le concept de Dao représente la notion la plus fondamentale et la plus englobante de la pensée chinoise. Littéralement traduit par « voie » ou « chemin », le Dao désigne à la fois l'ordre naturel du cosmos, le principe régulateur de toute chose, et la méthode appropriée pour s'y conformer<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 89-103</ref>. Tous les grands courants de la pensée chinoise - confucianisme, taoïsme, bouddhisme - utilisent le terme Dao, bien qu'avec des acceptions différentes. Pour Confucius, le Dao désigne la voie morale et politique que doit suivre l'homme de bien ; pour les taoïstes, il représente le principe ineffable et spontané qui gouverne l'univers ; pour les bouddhistes chinois, il traduit la notion indienne de dharma<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 251-259</ref>. === Le Qi (氣) : souffle vital et principe d'animation === Le qi constitue le principe d'animation universelle dans la cosmologie chinoise. Ce terme désigne à la fois le souffle vital qui anime les êtres vivants et l'énergie primordiale dont est constituée toute réalité. Le qi n'est ni substance ni force au sens occidental, mais plutôt un principe de transformation continue qui se condense pour former les êtres et se disperse à leur mort<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 253-256</ref>. Cette conception implique qu'il n'existe aucune démarcation ontologique entre les êtres humains et le reste du monde. Comme l'écrit Zhuangzi : « L'homme doit la vie à une condensation de qi. Tant qu'il se condense, c'est la vie ; dès qu'il se disperse, c'est la mort »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 254</ref>. === Le Yin et le Yang (陰陽) : la dynamique des contraires === Le couple Yin-Yang représente le rythme fondamental qui anime le qi et structure toute la réalité. Le Yang évoque originellement le versant ensoleillé d'une colline, tandis que le Yin désigne son versant ombragé<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 101-136</ref>. Ces deux principes ne sont ni des forces ni des substances, mais des phases alternées d'un même processus dynamique. Contrairement à la logique occidentale des contraires qui s'excluent, le Yin et le Yang sont à la fois opposés et complémentaires. Chacun contient en germe son contraire, comme l'illustre le symbole du taiji (太極) où un point blanc apparaît dans la partie noire et vice versa. Cette conception de la complémentarité des opposés traverse toute la pensée chinoise et s'applique aussi bien à la cosmologie qu'à l'éthique et à la politique<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 264-271</ref>. == Les grands courants de pensée == === Le confucianisme : l'humanisme ritualiste === Le confucianisme, fondé par Kongzi (孔子, Confucius, 551-479 av. J.-C.), constitue le courant dominant de la pensée chinoise traditionnelle. Loin d'être une religion au sens occidental, le confucianisme est avant tout une éthique sociale et une philosophie politique centrée sur la culture de la vertu personnelle et l'harmonie sociale<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 61-87</ref>. Le concept central du confucianisme est le ren (仁), généralement traduit par « humanité », « bienveillance » ou « altruisme ». Confucius définit le ren comme la capacité à « aimer autrui » et à traiter les autres comme on souhaiterait être traité soi-même. Cette vertu cardinale s'accompagne du li (禮), le sens des rites et de l'étiquette, qui structure les relations sociales selon un ordre hiérarchique et harmonieux<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 73-80</ref>. Confucius insiste sur l'importance de l'éducation et de la culture personnelle. Son idéal est l'« homme de bien » (junzi, 君子), celui qui cultive sa vertu par l'étude des textes classiques et la pratique des rites. Il déclare dans les ''Entretiens'' : « Je transmets, sans rien créer de nouveau »<ref>''Entretiens de Confucius'', VII, 1</ref>, soulignant ainsi son respect de la tradition des anciens sages. Deux grands disciples de Confucius développeront des interprétations contrastées de sa pensée. Mencius (Mengzi, 孟子, 372-289 av. J.-C.) défend l'idée de la bonté naturelle de l'homme, affirmant que « la nature humaine est bonne » et que le mal résulte d'un manque de culture<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 167-193</ref>. À l'inverse, Xunzi (荀子, 313-238 av. J.-C.) soutient que « la nature de l'homme est mauvaise » et que seule l'éducation par les rites peut corriger ses penchants naturels<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 289-314</ref>. === Le taoïsme : le retour au naturel === Le taoïsme représente l'autre grand courant autochtone de la pensée chinoise. Il se présente souvent comme l'antithèse du confucianisme, privilégiant la spontanéité naturelle à l'artifice des conventions sociales. Les deux textes fondateurs du taoïsme sont le ''Daodejing'' (道德經, ''Classique de la Voie et de sa Vertu''), traditionnellement attribué à Laozi (老子), et le ''Zhuangzi'' (莊子), du nom de son auteur présumé (environ 369-286 av. J.-C.)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 119-160</ref>. Pour les taoïstes, le Dao est le principe ineffable et spontané qui précède toute distinction et toute nomination. Le ''Daodejing'' s'ouvre par cette déclaration célèbre : « Le Dao qui peut être énoncé n'est pas le Dao constant ; le nom qui peut être nommé n'est pas le nom constant »<ref>''Daodejing'', chapitre 1</ref>. Cette insistance sur l'ineffabilité du Dao reflète une méfiance profonde envers le langage et les conventions sociales. Le concept central du taoïsme est le wuwei (無為), littéralement « non-agir » ou « agir sans agir ». Il ne s'agit pas d'inaction pure, mais d'une action spontanée, sans calcul ni forcing, qui suit le cours naturel des choses. Comme le dit le ''Daodejing'' : « Le Sage accomplit de grandes choses sans les faire ; c'est pourquoi il peut accomplir de grandes choses »<ref>''Daodejing'', chapitre 63</ref>. Zhuangzi pousse cette logique plus loin en développant une philosophie du relativisme et de la liberté intérieure. Pour lui, toutes les distinctions conventionnelles - entre grand et petit, beau et laid, bien et mal - sont relatives et arbitraires. Le sage taoïste transcende ces oppositions en s'identifiant au Dao et en atteignant une parfaite liberté spirituelle<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 133-158</ref>. === Le légisme : l'école de la loi === Le légisme (fajia, 法家) représente un courant de pensée politique pragmatique et autoritaire qui s'est développé durant la période troublée des Royaumes combattants (Ve-IIIe siècle av. J.-C.). Les légistes rejettent l'idéalisme moral des confucéens et proposent une conception réaliste du pouvoir fondée sur trois piliers : la loi (fa, 法), la position de force (shi, 勢) et les techniques de contrôle (shu, 術)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 315-344</ref>. Le principal théoricien du légisme, Han Feizi (韓非子, mort en 233 av. J.-C.), développe une anthropologie pessimiste selon laquelle les hommes sont mus exclusivement par la recherche du profit et la crainte des châtiments. Il écrit : « C'est sur elles que repose toute l'efficacité du système des peines et des récompenses »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 330</ref>. Pour les légistes, la loi doit être claire, publique et appliquée de manière stricte et égalitaire, sans distinction de rang social. Cette position s'oppose radicalement à l'adage confucéen selon lequel « les rites ne descendent pas jusqu'aux gens du commun, les châtiments ne montent pas jusqu'aux grands dignitaires »<ref>''Liji'' (''Traité des Rites''), cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 323</ref>. Le légisme influença profondément la constitution de l'empire Qin (221-206 av. J.-C.) et, bien qu'officiellement rejeté sous les Han au profit du confucianisme, continua à informer les pratiques administratives de la Chine impériale<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 341-344</ref>. === Le bouddhisme : l'apport indien === Le bouddhisme, originaire d'Inde, commença à pénétrer en Chine vers le Ier siècle de notre ère et devint le troisième grand pilier de la pensée chinoise. Son assimilation ne fut ni immédiate ni sans heurts, car la pensée bouddhique présentait des différences radicales avec les conceptions chinoises traditionnelles<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 395-446</ref>. Le bouddhisme introduisit en Chine des concepts totalement étrangers à sa tradition : la réincarnation, le karma, la notion de souffrance universelle (dukkha), et surtout l'idée que le monde phénoménal est illusion (maya). Ces notions heurtaient la vision chinoise d'un cosmos ordonné et harmonieux où l'homme a pour vocation de participer à l'ordre universel. Cependant, au cours d'un long processus de « sinisation », le bouddhisme s'adapta aux catégories de pensée chinoises. L'école Tiantai (天台) et l'école Huayan (華嚴) développèrent des synthèses sophistiquées intégrant les concepts bouddhiques dans un cadre cosmologique chinois. L'école Chan (禪, zen en japonais) poussa cette assimilation encore plus loin en développant une pratique méditative centrée sur l'illumination subite plutôt que sur l'étude des écritures<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 502-524</ref>. Le bouddhisme enrichit considérablement la pensée chinoise en introduisant une dimension contemplative et métaphysique qui faisait relativement défaut aux traditions autochtones. Son influence fut déterminante dans l'élaboration du néoconfucianisme des Song (960-1279)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 552-588</ref>. == La conception chinoise de l'homme et du monde == === L'harmonie entre Ciel, Terre et Homme === La pensée chinoise repose sur l'idée fondamentale d'une continuité ontologique entre le Ciel (tian, 天), la Terre (di, 地) et l'Homme (ren, 人). Cette triade cosmique structure toute la vision chinoise du monde. L'homme n'est pas conçu comme un être à part, doté d'une âme immortelle qui le distinguerait radicalement de la nature, mais comme un élément intégré dans le processus cosmique<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 306-339</ref>. Le Ciel n'est pas un dieu personnel et créateur comme dans la tradition judéo-chrétienne, mais plutôt l'ordre naturel et moral de l'univers. La notion de « mandat céleste » (tianming, 天命) justifie l'autorité politique de l'empereur, considéré comme « Fils du Ciel » (tianzi, 天子), tant qu'il gouverne avec vertu et maintient l'harmonie entre les trois niveaux cosmiques<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 36-41</ref>. Cette conception implique que l'ordre politique et l'ordre cosmique sont interdépendants. Les catastrophes naturelles sont interprétées comme des signes du mécontentement du Ciel face à un mauvais gouvernement. Inversement, une bonne gouvernance se reflète dans l'harmonie de la nature<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 363-376</ref>. === La conception du temps et de l'espace === Contrairement à la conception linéaire du temps qui prédomine en Occident, notamment sous l'influence du christianisme, la pensée chinoise privilégie une vision cyclique du temps. Les saisons, les cycles lunaires et solaires, l'alternance du Yin et du Yang structurent une temporalité rythmique où les phénomènes se répètent selon des patterns réguliers<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 82-138</ref>. L'espace n'est pas conçu comme un contenant vide et homogène, mais comme un ensemble de positions qualifiées par leurs relations mutuelles et leurs correspondances avec les cycles temporels. Le système des Cinq Phases (wuxing, 五行) - Bois, Feu, Terre, Métal, Eau - associe à chaque direction cardinale (plus le centre) non seulement un élément, mais aussi une saison, une couleur, une saveur, un organe, une planète, etc.<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 271-282</ref> Cette vision corrélative du monde, où tout est en correspondance avec tout, caractérise la pensée cosmologique chinoise, particulièrement élaborée sous la dynastie Han (206 av. J.-C. - 220 ap. J.-C.). Elle implique que l'univers forme un réseau d'influences réciproques, où les actions humaines ont des répercussions cosmiques et vice versa<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 261-305</ref>. == L'éthique et la culture de soi == === L'idéal de sagesse === La pensée chinoise ne vise pas principalement la connaissance théorique ou la contemplation désintéressée de la vérité, mais la réalisation d'un idéal de sagesse pratique. Le sage (shengren, 聖人) n'est pas un philosophe spéculatif, mais un homme qui a atteint l'harmonie parfaite avec le Dao et peut, par sa simple présence, influencer bénéfiquement son environnement<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 145-162</ref>. Pour les confucéens, le sage est celui qui a perfectionné sa vertu morale par l'étude et la pratique des rites. Mencius affirme que « tout homme peut devenir Yao ou Shun » (deux empereurs légendaires), soulignant ainsi l'universalité du potentiel moral humain<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 183</ref>. Pour les taoïstes, le sage est celui qui a transcendé toutes les distinctions conventionnelles et vit en parfaite spontanéité, « comme un poisson dans le Dao », selon l'expression de Zhuangzi. Il ne cherche pas à transformer le monde selon un plan préconçu, mais suit le cours naturel des choses<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 146-153</ref>. === La culture de soi (xiushen, 修身) === La culture de soi constitue le fondement de toute éthique chinoise. Cette notion implique un travail constant sur soi-même pour développer ses vertus, maîtriser ses émotions et harmoniser son qi. Contrairement à la notion chrétienne d'ascèse, qui implique une mortification du corps, la culture chinoise vise l'épanouissement harmonieux de toutes les dimensions de la personne<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 85-87</ref>. Confucius déclare dans les ''Entretiens'' : « À quinze ans, je résolus d'apprendre ; à trente ans, je me tenais ferme ; à quarante ans, je n'avais plus de doutes ; à cinquante ans, je connaissais le mandat du Ciel ; à soixante ans, mon oreille était docile ; à soixante-dix ans, je pouvais suivre les désirs de mon cœur sans transgresser la règle »<ref>''Entretiens de Confucius'', II, 4</ref>. Cette progression illustre le processus graduel de la culture confucéenne. La culture de soi n'est pas une fin en soi, mais le fondement de l'ordre social et politique. Le ''Da Xue'' (''Grande Étude''), l'un des Quatre Livres du confucianisme, établit une chaîne causale : « Les anciens qui désiraient illustrer la vertu éclatante dans le monde commençaient par bien gouverner leur royaume. Ceux qui désiraient bien gouverner leur royaume commençaient par mettre de l'ordre dans leur famille. Ceux qui désiraient mettre de l'ordre dans leur famille commençaient par cultiver leur personne »<ref>''Da Xue'' (''Grande Étude'')</ref>. == L'héritage et la pertinence contemporaine == La pensée chinoise a exercé une influence déterminante sur toute l'Asie orientale, notamment au Japon, en Corée et au Vietnam. Malgré les bouleversements du XXe siècle - chute de l'Empire en 1911, mouvement du 4 mai 1919, arrivée du communisme en 1949, Révolution culturelle (1966-1976) - elle continue d'informer en profondeur les mentalités et les pratiques sociales en Chine contemporaine<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 665-687</ref>. Dans le contexte actuel de mondialisation, la pensée chinoise offre des ressources conceptuelles originales pour penser les questions contemporaines. Sa vision holistique de l'homme dans la nature peut contribuer à une réflexion écologique ; sa conception de l'harmonie sociale offre une alternative aux logiques conflictuelles ; son pragmatisme éthique peut enrichir nos débats moraux<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 7-23</ref>. Comprendre la pensée chinoise, c'est aussi reconnaître qu'il existe d'autres manières de penser le monde, l'homme et la société que celles héritées de la tradition philosophique occidentale. C'est ouvrir un dialogue interculturel qui enrichit notre propre réflexion en nous confrontant à des catégories de pensée radicalement différentes. Comme l'écrit François Jullien, la Chine constitue pour l'Occident « cet Autre fondamental sans la rencontre duquel l'Occident ne saurait devenir vraiment conscient des contours et des limites de son Moi culturel »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 11</ref>. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Ouvrages de référence essentiels === * '''CHENG, Anne''', ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, 696 p. * '''GRANET, Marcel''', ''La Pensée chinoise'', Paris, Albin Michel, coll. « Bibliothèque de l'Évolution de l'Humanité », 1934 [réédition 1968], 568 p. * '''JULLIEN, François''', ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, coll. « Bibliothèque des Idées », 2015, 288 p. === Textes classiques – Traductions françaises === ==== Confucianisme ==== * '''CONFUCIUS''', ''Entretiens de Confucius'' (''Lunyu''), traduit du chinois par Anne Cheng, Paris, Seuil, coll. « Points Sagesses », 1981 [réédition 2010], 153 p. * '''CONFUCIUS''', ''Les Entretiens de Confucius et ses disciples'', traduit du chinois par Jean Levi, Paris, Albin Michel, coll. « Spiritualités vivantes », 2016, 432 p. * '''CONFUCIUS''', ''Les Entretiens'', traduit du chinois par Pierre Ryckmans (Simon Leys), Paris, Gallimard, coll. « Connaissance de l'Orient », 1987, 184 p. * '''CONFUCIUS''', ''Entretiens avec ses disciples'', traduit du chinois par André Lévy, Paris, Flammarion, coll. « GF », 1994, 256 p. * '''CONFUCIUS''', ''Les Entretiens de Confucius'', traduit du chinois par Séraphin Couvreur, dans ''Les Quatre Livres'', Paris, Les Belles Lettres, 1895 [réédition 1956]. * '''MENCIUS''', ''Mencius'', traduit du chinois par André Lévy, Paris, You Feng, 2008. ==== Taoïsme ==== * '''LAOZI''', ''Dao De Jing : Le Livre de la voie et de la vertu'', traduit du chinois par J.J.L. Duyvendak, Paris, Librairie d'Amérique et d'Orient Adrien-Maisonneuve, 1953. * '''LAOZI''', ''Dao De Jing : Le Livre de la voie et de la vertu'', traduit du chinois par Claude Larre, Paris, Desclée de Brouwer, 2002. * '''LAOZI''', ''Tao Te King'', traduit du chinois par Léon Wieger, Paris, Les Belles Lettres, 1913. * '''LAOZI''', ''Tao Te King'', traduit du chinois par Stanislas Julien, Paris, 1842. * '''ZHUANGZI''', ''Œuvre complète'', traduit du chinois par Jean Lévi, Paris, Éditions de l'Encyclopédie des Nuisances, 2006. * '''ZHUANGZI''', ''Zhuangzi'', traduit et commenté par Jean-François Billeter, Paris, Allia, 2010. * '''LIEZI''', ''Le vrai classique du vide parfait'', traduit du chinois par Léon Wieger, Paris, Les Belles Lettres, 1913. ==== Légisme ==== * '''HAN FEIZI''', ''Han Fei Zi ou le Tao du Prince'', traduit du chinois par Jean Lévi, Paris, Seuil, 1999. ==== Autres textes classiques ==== * '''Le Huainan zi''', texte philosophique compilé sous la dynastie Han, diverses traductions partielles disponibles. * '''Da Xue''' (''Grande Étude'') et '''Zhongyong''' (''Invariable Milieu''), dans ''Les Quatre Livres'', traduit par Séraphin Couvreur, Paris, Les Belles Lettres, 1895. * '''ZHU XI''', ''L'invariable milieu commenté par section et par phrase'' (''Zhongyong zhangju''), traduit du chinois, Paris, Les Belles Lettres, coll. « Bibliothèque chinoise », 2020. === Études thématiques === ==== Ouvrages généraux ==== * '''CREEL, Herrlee Glessner''', ''La pensée chinoise'', traduit de l'anglais, Paris, Le Mail, 1990. * '''FONG Yeou-lan''' (Feng Youlan), ''Précis d'histoire de la philosophie chinoise'', traduit du chinois, Paris, Le Mail, 1985. * '''VANDERMEERSCH, Léon''', ''Études sinologiques'', Paris, Presses Universitaires de France, 1994. * '''PIMPANEAU, Jacques''', ''Chine, mythes et dieux'', Paris, Philippe Picquier, 1999. * '''VAN GULIK, Robert''', ''La vie sexuelle dans la Chine ancienne'', traduit de l'anglais, Paris, Gallimard, 1971. ==== François Jullien – Approche comparative ==== * '''JULLIEN, François''', ''Le détour et l'accès : stratégies du sens en Chine, en Grèce'', Paris, Grasset, 1995. * '''JULLIEN, François''', ''Fonder la morale : dialogue de Mencius avec un philosophe des Lumières'', Paris, Grasset, 1995. * '''JULLIEN, François''', ''Éloge de la fadeur : à partir de la pensée et de l'esthétique de la Chine'', Paris, Philippe Picquier, 1991. * '''JULLIEN, François''', ''Un sage est sans idée, ou l'autre de la philosophie'', Paris, Seuil, 1998. * '''JULLIEN, François''', ''Traité de l'efficacité'', Paris, Grasset, 1996. * '''JULLIEN, François''', ''La propension des choses : pour une histoire de l'efficacité en Chine'', Paris, Seuil, 1992. ==== Études spécialisées ==== * '''BILLETER, Jean-François''', ''Leçons sur Tchouang-tseu'', Paris, Allia, 2002. * '''BILLETER, Jean-François''', ''Études sur Tchouang-tseu'', Paris, Allia, 2004. * '''BILLETER, Jean-François''', ''Contre François Jullien'', Paris, Allia, 2006. * '''GUO, Qiyong''', ''The Spirit of Chinese Confucianism'', Berlin/Heidelberg, Springer, 2019. * '''GUO, Qiyong''', ''The Characteristics of Chinese Cultural Spirit'', Berlin/Heidelberg, Springer, 2019. * '''QI, Zhixiang''', ''The Spirit of Traditional Chinese Aesthetics'', Berlin/Heidelberg, Springer, 2019. * '''LI, Deshun''', ''The Construction of Value Philosophy in Contemporary China'', Berlin/Heidelberg, Springer, 2018. * '''VERMANDER, Benoît''', ''The Encounter of Chinese and Western Philosophies'', Leiden/Boston, Brill, 2020. * '''CAO, Feng''', ''Daoism in Early China: Huang-Lao Thought in Light of Excavated Texts'', Seattle, University of Washington Press, 2019. * '''JIN, Yuelin''', ''Tao, Nature and Man'', Beijing, Foreign Languages Press, 2002. === Ouvrages sur des aspects particuliers === * '''JAO, Tsung-i''', ''Space, Time, Myth, and Morals: A Selection of Jao Tsung-i's Studies on Cosmological Thought in Early China and Beyond'', Hong Kong, The Chinese University Press, 2016. * '''FRÖHLICH, Thomas''', ''Tang Junyi: Confucian Philosophy and the Challenge of Modernity'', Leiden/Boston, Brill, 2017. * '''MAKEHAM, John''' (éd.), ''New Confucianism: A Critical Examination'', New York, Palgrave Macmillan, 2003. === Dictionnaires et instruments de travail === * '''COUVREUR, Séraphin''', ''Dictionnaire classique de la langue chinoise'', Taichung (Taiwan), Kuangchi Press, 1890 [rééditions multiples]. * '''Grand Dictionnaire Ricci de la langue chinoise''', sous la direction d'Yves Raguin et Claude Larre, Paris/Taipei, Institut Ricci/Desclée de Brouwer, 2001, 7 volumes. * '''WIEGER, Léon''', ''Caractères chinois : étymologie, graphies, lexiques'', Taichung (Taiwan), Kuangchi Press, 1890 [rééditions multiples]. === Revues spécialisées === * ''Revue bibliographique de Sinologie / Review of Bibliography in Sinology'' (RBS), 1955-2003, disponible sur JSTOR. * ''T'oung Pao'' (« Archives concernant l'histoire, les langues, la géographie et l'ethnographie de l'Asie orientale »), Leiden, Brill, depuis 1890. * ''Journal of Chinese Philosophy'', depuis 1973. * ''Philosophy East and West'', University of Hawai'i Press, depuis 1951. === Collections éditoriales recommandées === * Collection « Bibliothèque chinoise », Paris, Les Belles Lettres * Collection « Connaissance de l'Orient », Paris, Gallimard * Collection « Points Sagesses », Paris, Seuil * Collection « Spiritualités vivantes », Paris, Albin Michel * ''Variétés sinologiques'', Shanghai puis Taipei, Mission catholique, 1892-1951 (puis continuation à Taiwan depuis les années 1970), 70 volumes === Ouvrages de vulgarisation accessible === * '''JAVARY, Cyrille J.-D.''', ''Cent mots pour comprendre les Chinois'', Paris, Albin Michel, 2008. * '''JAVARY, Cyrille J.-D.''', ''Le Discours de la Tortue : Découvrir la pensée chinoise au fil du Yi-Jing'', Paris, Albin Michel, 2003. {{autocat}} fatv8kuhh8mn2tkluflppkkiy2soemz 767917 767899 2026-06-17T05:45:37Z PandaMystique 119061 767917 wikitext text/x-wiki {{DicoPhilo|Brève présentation de quelques aspects de la pensée chinoise}} == Spécificité de la pensée chinoise == La pensée chinoise constitue l'une des traditions intellectuelles les plus anciennes et continues de l'humanité, développée sur plus de deux millénaires et demi. Contrairement à la philosophie occidentale, qui s'est construite autour de la spéculation métaphysique, de la logique formelle et de la recherche de la vérité absolue<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 13-24</ref>, la pensée chinoise se caractérise par une orientation essentiellement pratique et politique, visant avant tout l'harmonie sociale et cosmique. Cette tradition ne reconnaît pas de coupure radicale entre l'homme et la nature, ni entre le corps et l'esprit. Elle refuse la spéculation abstraite au profit d'une sagesse pragmatique fondée sur l'observation des phénomènes naturels et sociaux<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 33-41</ref>. Comme le souligne Marcel Granet, « l'Homme et la Nature ne forment pas deux règnes séparés, mais une société unique »<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 251</ref>. Ce principe fondamental traverse toute l'histoire de la pensée chinoise et explique sa singularité par rapport aux traditions philosophiques occidentale et indienne. == Les fondements conceptuels == === Le Dao (道) : la Voie === Le concept de Dao représente la notion la plus fondamentale et la plus englobante de la pensée chinoise. Littéralement traduit par « voie » ou « chemin », le Dao désigne à la fois l'ordre naturel du cosmos, le principe régulateur de toute chose, et la méthode appropriée pour s'y conformer<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 89-103</ref>. Tous les grands courants de la pensée chinoise - confucianisme, taoïsme, bouddhisme - utilisent le terme Dao, bien qu'avec des acceptions différentes. Pour Confucius, le Dao désigne la voie morale et politique que doit suivre l'homme de bien ; pour les taoïstes, il représente le principe ineffable et spontané qui gouverne l'univers ; pour les bouddhistes chinois, il traduit la notion indienne de dharma<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 251-259</ref>. === Le Qi (氣) : souffle vital et principe d'animation === Le qi constitue le principe d'animation universelle dans la cosmologie chinoise. Ce terme désigne à la fois le souffle vital qui anime les êtres vivants et l'énergie primordiale dont est constituée toute réalité. Le qi n'est ni substance ni force au sens occidental, mais plutôt un principe de transformation continue qui se condense pour former les êtres et se disperse à leur mort<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 253-256</ref>. Cette conception implique qu'il n'existe aucune démarcation ontologique entre les êtres humains et le reste du monde. Comme l'écrit Zhuangzi : « L'homme doit la vie à une condensation de qi. Tant qu'il se condense, c'est la vie ; dès qu'il se disperse, c'est la mort »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 254</ref>. === Le Yin et le Yang (陰陽) : la dynamique des contraires === Le couple Yin-Yang représente le rythme fondamental qui anime le qi et structure toute la réalité. Le Yang évoque originellement le versant ensoleillé d'une colline, tandis que le Yin désigne son versant ombragé<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 101-136</ref>. Ces deux principes ne sont ni des forces ni des substances, mais des phases alternées d'un même processus dynamique. Contrairement à la logique occidentale des contraires qui s'excluent, le Yin et le Yang sont à la fois opposés et complémentaires. Chacun contient en germe son contraire, comme l'illustre le symbole du taiji (太極) où un point blanc apparaît dans la partie noire et vice versa. Cette conception de la complémentarité des opposés traverse toute la pensée chinoise et s'applique aussi bien à la cosmologie qu'à l'éthique et à la politique<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 264-271</ref>. == Les grands courants de pensée == === Le confucianisme : l'humanisme ritualiste === Le confucianisme, fondé par Kongzi (孔子, Confucius, 551-479 av. J.-C.), constitue le courant dominant de la pensée chinoise traditionnelle. Loin d'être une religion au sens occidental, le confucianisme est avant tout une éthique sociale et une philosophie politique centrée sur la culture de la vertu personnelle et l'harmonie sociale<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 61-87</ref>. Le concept central du confucianisme est le ren (仁), généralement traduit par « humanité », « bienveillance » ou « altruisme ». Confucius définit le ren comme la capacité à « aimer autrui » et à traiter les autres comme on souhaiterait être traité soi-même. Cette vertu cardinale s'accompagne du li (禮), le sens des rites et de l'étiquette, qui structure les relations sociales selon un ordre hiérarchique et harmonieux<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 73-80</ref>. Confucius insiste sur l'importance de l'éducation et de la culture personnelle. Son idéal est l'« homme de bien » (junzi, 君子), celui qui cultive sa vertu par l'étude des textes classiques et la pratique des rites. Il déclare dans les ''Entretiens'' : « Je transmets, sans rien créer de nouveau »<ref>''Entretiens de Confucius'', VII, 1</ref>, soulignant ainsi son respect de la tradition des anciens sages. Deux grands disciples de Confucius développeront des interprétations contrastées de sa pensée. Mencius (Mengzi, 孟子, 372-289 av. J.-C.) défend l'idée de la bonté naturelle de l'homme, affirmant que « la nature humaine est bonne » et que le mal résulte d'un manque de culture<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 167-193</ref>. À l'inverse, Xunzi (荀子, 313-238 av. J.-C.) soutient que « la nature de l'homme est mauvaise » et que seule l'éducation par les rites peut corriger ses penchants naturels<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 289-314</ref>. === Le taoïsme : le retour au naturel === Le taoïsme représente l'autre grand courant autochtone de la pensée chinoise. Il se présente souvent comme l'antithèse du confucianisme, privilégiant la spontanéité naturelle à l'artifice des conventions sociales. Les deux textes fondateurs du taoïsme sont le ''Daodejing'' (道德經, ''Classique de la Voie et de sa Vertu''), traditionnellement attribué à Laozi (老子), et le ''Zhuangzi'' (莊子), du nom de son auteur présumé (environ 369-286 av. J.-C.)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 119-160</ref>. Pour les taoïstes, le Dao est le principe ineffable et spontané qui précède toute distinction et toute nomination. Le ''Daodejing'' s'ouvre par cette déclaration célèbre : « Le Dao qui peut être énoncé n'est pas le Dao constant ; le nom qui peut être nommé n'est pas le nom constant »<ref>''Daodejing'', chapitre 1</ref>. Cette insistance sur l'ineffabilité du Dao reflète une méfiance profonde envers le langage et les conventions sociales. Le concept central du taoïsme est le wuwei (無為), littéralement « non-agir » ou « agir sans agir ». Il ne s'agit pas d'inaction pure, mais d'une action spontanée, sans calcul ni forcing, qui suit le cours naturel des choses. Comme le dit le ''Daodejing'' : « Le Sage accomplit de grandes choses sans les faire ; c'est pourquoi il peut accomplir de grandes choses »<ref>''Daodejing'', chapitre 63</ref>. Zhuangzi pousse cette logique plus loin en développant une philosophie du relativisme et de la liberté intérieure. Pour lui, toutes les distinctions conventionnelles - entre grand et petit, beau et laid, bien et mal - sont relatives et arbitraires. Le sage taoïste transcende ces oppositions en s'identifiant au Dao et en atteignant une parfaite liberté spirituelle<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 133-158</ref>. === Le légisme : l'école de la loi === Le légisme (fajia, 法家) représente un courant de pensée politique pragmatique et autoritaire qui s'est développé durant la période troublée des Royaumes combattants (Ve-IIIe siècle av. J.-C.). Les légistes rejettent l'idéalisme moral des confucéens et proposent une conception réaliste du pouvoir fondée sur trois piliers : la loi (fa, 法), la position de force (shi, 勢) et les techniques de contrôle (shu, 術)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 315-344</ref>. Le principal théoricien du légisme, Han Feizi (韓非子, mort en 233 av. J.-C.), développe une anthropologie pessimiste selon laquelle les hommes sont mus exclusivement par la recherche du profit et la crainte des châtiments. Il écrit : « C'est sur elles que repose toute l'efficacité du système des peines et des récompenses »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 330</ref>. Pour les légistes, la loi doit être claire, publique et appliquée de manière stricte et égalitaire, sans distinction de rang social. Cette position s'oppose radicalement à l'adage confucéen selon lequel « les rites ne descendent pas jusqu'aux gens du commun, les châtiments ne montent pas jusqu'aux grands dignitaires »<ref>''Liji'' (''Traité des Rites''), cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 323</ref>. Le légisme influença profondément la constitution de l'empire Qin (221-206 av. J.-C.) et, bien qu'officiellement rejeté sous les Han au profit du confucianisme, continua à informer les pratiques administratives de la Chine impériale<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 341-344</ref>. === Le bouddhisme : l'apport indien === Le bouddhisme, originaire d'Inde, commença à pénétrer en Chine vers le Ier siècle de notre ère et devint le troisième grand pilier de la pensée chinoise. Son assimilation ne fut ni immédiate ni sans heurts, car la pensée bouddhique présentait des différences radicales avec les conceptions chinoises traditionnelles<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 395-446</ref>. Le bouddhisme introduisit en Chine des concepts totalement étrangers à sa tradition : la réincarnation, le karma, la notion de souffrance universelle (dukkha), et surtout l'idée que le monde phénoménal est illusion (maya). Ces notions heurtaient la vision chinoise d'un cosmos ordonné et harmonieux où l'homme a pour vocation de participer à l'ordre universel. Cependant, au cours d'un long processus de « sinisation », le bouddhisme s'adapta aux catégories de pensée chinoises. L'école Tiantai (天台) et l'école Huayan (華嚴) développèrent des synthèses sophistiquées intégrant les concepts bouddhiques dans un cadre cosmologique chinois. L'école Chan (禪, zen en japonais) poussa cette assimilation encore plus loin en développant une pratique méditative centrée sur l'illumination subite plutôt que sur l'étude des écritures<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 502-524</ref>. Le bouddhisme enrichit considérablement la pensée chinoise en introduisant une dimension contemplative et métaphysique qui faisait relativement défaut aux traditions autochtones. Son influence fut déterminante dans l'élaboration du néoconfucianisme des Song (960-1279)<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 552-588</ref>. == La conception chinoise de l'homme et du monde == === L'harmonie entre Ciel, Terre et Homme === La pensée chinoise repose sur l'idée fondamentale d'une continuité ontologique entre le Ciel (tian, 天), la Terre (di, 地) et l'Homme (ren, 人). Cette triade cosmique structure toute la vision chinoise du monde. L'homme n'est pas conçu comme un être à part, doté d'une âme immortelle qui le distinguerait radicalement de la nature, mais comme un élément intégré dans le processus cosmique<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 306-339</ref>. Le Ciel n'est pas un dieu personnel et créateur comme dans la tradition judéo-chrétienne, mais plutôt l'ordre naturel et moral de l'univers. La notion de « mandat céleste » (tianming, 天命) justifie l'autorité politique de l'empereur, considéré comme « Fils du Ciel » (tianzi, 天子), tant qu'il gouverne avec vertu et maintient l'harmonie entre les trois niveaux cosmiques<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 36-41</ref>. Cette conception implique que l'ordre politique et l'ordre cosmique sont interdépendants. Les catastrophes naturelles sont interprétées comme des signes du mécontentement du Ciel face à un mauvais gouvernement. Inversement, une bonne gouvernance se reflète dans l'harmonie de la nature<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 363-376</ref>. === La conception du temps et de l'espace === Contrairement à la conception linéaire du temps qui prédomine en Occident, notamment sous l'influence du christianisme, la pensée chinoise privilégie une vision cyclique du temps. Les saisons, les cycles lunaires et solaires, l'alternance du Yin et du Yang structurent une temporalité rythmique où les phénomènes se répètent selon des patterns réguliers<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 82-138</ref>. L'espace n'est pas conçu comme un contenant vide et homogène, mais comme un ensemble de positions qualifiées par leurs relations mutuelles et leurs correspondances avec les cycles temporels. Le système des Cinq Phases (wuxing, 五行) - Bois, Feu, Terre, Métal, Eau - associe à chaque direction cardinale (plus le centre) non seulement un élément, mais aussi une saison, une couleur, une saveur, un organe, une planète, etc.<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 271-282</ref> Cette vision corrélative du monde, où tout est en correspondance avec tout, caractérise la pensée cosmologique chinoise, particulièrement élaborée sous la dynastie Han (206 av. J.-C. - 220 ap. J.-C.). Elle implique que l'univers forme un réseau d'influences réciproques, où les actions humaines ont des répercussions cosmiques et vice versa<ref>Marcel Granet, ''La Pensée chinoise'', Paris, Albin Michel, 1934, p. 261-305</ref>. == L'éthique et la culture de soi == === L'idéal de sagesse === La pensée chinoise ne vise pas principalement la connaissance théorique ou la contemplation désintéressée de la vérité, mais la réalisation d'un idéal de sagesse pratique. Le sage (shengren, 聖人) n'est pas un philosophe spéculatif, mais un homme qui a atteint l'harmonie parfaite avec le Dao et peut, par sa simple présence, influencer bénéfiquement son environnement<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 145-162</ref>. Pour les confucéens, le sage est celui qui a perfectionné sa vertu morale par l'étude et la pratique des rites. Mencius affirme que « tout homme peut devenir Yao ou Shun » (deux empereurs légendaires), soulignant ainsi l'universalité du potentiel moral humain<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 183</ref>. Pour les taoïstes, le sage est celui qui a transcendé toutes les distinctions conventionnelles et vit en parfaite spontanéité, « comme un poisson dans le Dao », selon l'expression de Zhuangzi. Il ne cherche pas à transformer le monde selon un plan préconçu, mais suit le cours naturel des choses<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 146-153</ref>. === La culture de soi (xiushen, 修身) === La culture de soi constitue le fondement de toute éthique chinoise. Cette notion implique un travail constant sur soi-même pour développer ses vertus, maîtriser ses émotions et harmoniser son qi. Contrairement à la notion chrétienne d'ascèse, qui implique une mortification du corps, la culture chinoise vise l'épanouissement harmonieux de toutes les dimensions de la personne<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 85-87</ref>. Confucius déclare dans les ''Entretiens'' : « À quinze ans, je résolus d'apprendre ; à trente ans, je me tenais ferme ; à quarante ans, je n'avais plus de doutes ; à cinquante ans, je connaissais le mandat du Ciel ; à soixante ans, mon oreille était docile ; à soixante-dix ans, je pouvais suivre les désirs de mon cœur sans transgresser la règle »<ref>''Entretiens de Confucius'', II, 4</ref>. Cette progression illustre le processus graduel de la culture confucéenne. La culture de soi n'est pas une fin en soi, mais le fondement de l'ordre social et politique. Le ''Da Xue'' (''Grande Étude''), l'un des Quatre Livres du confucianisme, établit une chaîne causale : « Les anciens qui désiraient illustrer la vertu éclatante dans le monde commençaient par bien gouverner leur royaume. Ceux qui désiraient bien gouverner leur royaume commençaient par mettre de l'ordre dans leur famille. Ceux qui désiraient mettre de l'ordre dans leur famille commençaient par cultiver leur personne »<ref>''Da Xue'' (''Grande Étude'')</ref>. == L'héritage et la pertinence contemporaine == La pensée chinoise a exercé une influence déterminante sur toute l'Asie orientale, notamment au Japon, en Corée et au Vietnam. Malgré les bouleversements du XXe siècle - chute de l'Empire en 1911, mouvement du 4 mai 1919, arrivée du communisme en 1949, Révolution culturelle (1966-1976) - elle continue d'informer en profondeur les mentalités et les pratiques sociales en Chine contemporaine<ref>Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 665-687</ref>. Dans le contexte actuel de mondialisation, la pensée chinoise offre des ressources conceptuelles originales pour penser les questions contemporaines. Sa vision holistique de l'homme dans la nature peut contribuer à une réflexion écologique ; sa conception de l'harmonie sociale offre une alternative aux logiques conflictuelles ; son pragmatisme éthique peut enrichir nos débats moraux<ref>François Jullien, ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, 2015, p. 7-23</ref>. Comprendre la pensée chinoise, c'est aussi reconnaître qu'il existe d'autres manières de penser le monde, l'homme et la société que celles héritées de la tradition philosophique occidentale. C'est ouvrir un dialogue interculturel qui enrichit notre propre réflexion en nous confrontant à des catégories de pensée radicalement différentes. Comme l'écrit François Jullien, la Chine constitue pour l'Occident « cet Autre fondamental sans la rencontre duquel l'Occident ne saurait devenir vraiment conscient des contours et des limites de son Moi culturel »<ref>Cité dans Anne Cheng, ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, p. 11</ref>. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Ouvrages de référence essentiels === * '''CHENG, Anne''', ''Histoire de la pensée chinoise'', Paris, Éditions du Seuil, 1997, 696 p. * '''GRANET, Marcel''', ''La Pensée chinoise'', Paris, Albin Michel, coll. « Bibliothèque de l'Évolution de l'Humanité », 1934 [réédition 1968], 568 p. * '''JULLIEN, François''', ''De l'Être au Vivre : lexique euro-chinois de la pensée'', Paris, Gallimard, coll. « Bibliothèque des Idées », 2015, 288 p. === Textes classiques – Traductions françaises === ==== Confucianisme ==== * '''CONFUCIUS''', ''Entretiens de Confucius'' (''Lunyu''), traduit du chinois par Anne Cheng, Paris, Seuil, coll. « Points Sagesses », 1981 [réédition 2010], 153 p. * '''CONFUCIUS''', ''Les Entretiens de Confucius et ses disciples'', traduit du chinois par Jean Levi, Paris, Albin Michel, coll. « Spiritualités vivantes », 2016, 432 p. * '''CONFUCIUS''', ''Les Entretiens'', traduit du chinois par Pierre Ryckmans (Simon Leys), Paris, Gallimard, coll. « Connaissance de l'Orient », 1987, 184 p. * '''CONFUCIUS''', ''Entretiens avec ses disciples'', traduit du chinois par André Lévy, Paris, Flammarion, coll. « GF », 1994, 256 p. * '''CONFUCIUS''', ''Les Entretiens de Confucius'', traduit du chinois par Séraphin Couvreur, dans ''Les Quatre Livres'', Paris, Les Belles Lettres, 1895 [réédition 1956]. * '''MENCIUS''', ''Mencius'', traduit du chinois par André Lévy, Paris, You Feng, 2008. ==== Taoïsme ==== * '''LAOZI''', ''Dao De Jing : Le Livre de la voie et de la vertu'', traduit du chinois par J.J.L. Duyvendak, Paris, Librairie d'Amérique et d'Orient Adrien-Maisonneuve, 1953. * '''LAOZI''', ''Dao De Jing : Le Livre de la voie et de la vertu'', traduit du chinois par Claude Larre, Paris, Desclée de Brouwer, 2002. * '''LAOZI''', ''Tao Te King'', traduit du chinois par Léon Wieger, Paris, Les Belles Lettres, 1913. * '''LAOZI''', ''Tao Te King'', traduit du chinois par Stanislas Julien, Paris, 1842. * '''ZHUANGZI''', ''Œuvre complète'', traduit du chinois par Jean Lévi, Paris, Éditions de l'Encyclopédie des Nuisances, 2006. * '''ZHUANGZI''', ''Zhuangzi'', traduit et commenté par Jean-François Billeter, Paris, Allia, 2010. * '''LIEZI''', ''Le vrai classique du vide parfait'', traduit du chinois par Léon Wieger, Paris, Les Belles Lettres, 1913. ==== Légisme ==== * '''HAN FEIZI''', ''Han Fei Zi ou le Tao du Prince'', traduit du chinois par Jean Lévi, Paris, Seuil, 1999. ==== Autres textes classiques ==== * '''Le Huainan zi''', texte philosophique compilé sous la dynastie Han, diverses traductions partielles disponibles. * '''Da Xue''' (''Grande Étude'') et '''Zhongyong''' (''Invariable Milieu''), dans ''Les Quatre Livres'', traduit par Séraphin Couvreur, Paris, Les Belles Lettres, 1895. * '''ZHU XI''', ''L'invariable milieu commenté par section et par phrase'' (''Zhongyong zhangju''), traduit du chinois, Paris, Les Belles Lettres, coll. « Bibliothèque chinoise », 2020. === Études thématiques === ==== Ouvrages généraux ==== * '''CREEL, Herrlee Glessner''', ''La pensée chinoise'', traduit de l'anglais, Paris, Le Mail, 1990. * '''FONG Yeou-lan''' (Feng Youlan), ''Précis d'histoire de la philosophie chinoise'', traduit du chinois, Paris, Le Mail, 1985. * '''VANDERMEERSCH, Léon''', ''Études sinologiques'', Paris, Presses Universitaires de France, 1994. * '''PIMPANEAU, Jacques''', ''Chine, mythes et dieux'', Paris, Philippe Picquier, 1999. * '''VAN GULIK, Robert''', ''La vie sexuelle dans la Chine ancienne'', traduit de l'anglais, Paris, Gallimard, 1971. ==== François Jullien – Approche comparative ==== * '''JULLIEN, François''', ''Le détour et l'accès : stratégies du sens en Chine, en Grèce'', Paris, Grasset, 1995. * '''JULLIEN, François''', ''Fonder la morale : dialogue de Mencius avec un philosophe des Lumières'', Paris, Grasset, 1995. * '''JULLIEN, François''', ''Éloge de la fadeur : à partir de la pensée et de l'esthétique de la Chine'', Paris, Philippe Picquier, 1991. * '''JULLIEN, François''', ''Un sage est sans idée, ou l'autre de la philosophie'', Paris, Seuil, 1998. * '''JULLIEN, François''', ''Traité de l'efficacité'', Paris, Grasset, 1996. * '''JULLIEN, François''', ''La propension des choses : pour une histoire de l'efficacité en Chine'', Paris, Seuil, 1992. ==== Études spécialisées ==== * '''BILLETER, Jean-François''', ''Leçons sur Tchouang-tseu'', Paris, Allia, 2002. * '''BILLETER, Jean-François''', ''Études sur Tchouang-tseu'', Paris, Allia, 2004. * '''BILLETER, Jean-François''', ''Contre François Jullien'', Paris, Allia, 2006. * '''GUO, Qiyong''', ''The Spirit of Chinese Confucianism'', Berlin/Heidelberg, Springer, 2019. * '''GUO, Qiyong''', ''The Characteristics of Chinese Cultural Spirit'', Berlin/Heidelberg, Springer, 2019. * '''QI, Zhixiang''', ''The Spirit of Traditional Chinese Aesthetics'', Berlin/Heidelberg, Springer, 2019. * '''LI, Deshun''', ''The Construction of Value Philosophy in Contemporary China'', Berlin/Heidelberg, Springer, 2018. * '''VERMANDER, Benoît''', ''The Encounter of Chinese and Western Philosophies'', Leiden/Boston, Brill, 2020. * '''CAO, Feng''', ''Daoism in Early China: Huang-Lao Thought in Light of Excavated Texts'', Seattle, University of Washington Press, 2019. * '''JIN, Yuelin''', ''Tao, Nature and Man'', Beijing, Foreign Languages Press, 2002. === Ouvrages sur des aspects particuliers === * '''JAO, Tsung-i''', ''Space, Time, Myth, and Morals: A Selection of Jao Tsung-i's Studies on Cosmological Thought in Early China and Beyond'', Hong Kong, The Chinese University Press, 2016. * '''FRÖHLICH, Thomas''', ''Tang Junyi: Confucian Philosophy and the Challenge of Modernity'', Leiden/Boston, Brill, 2017. * '''MAKEHAM, John''' (éd.), ''New Confucianism: A Critical Examination'', New York, Palgrave Macmillan, 2003. === Dictionnaires et instruments de travail === * '''COUVREUR, Séraphin''', ''Dictionnaire classique de la langue chinoise'', Taichung (Taiwan), Kuangchi Press, 1890 [rééditions multiples]. * '''Grand Dictionnaire Ricci de la langue chinoise''', sous la direction d'Yves Raguin et Claude Larre, Paris/Taipei, Institut Ricci/Desclée de Brouwer, 2001, 7 volumes. * '''WIEGER, Léon''', ''Caractères chinois : étymologie, graphies, lexiques'', Taichung (Taiwan), Kuangchi Press, 1890 [rééditions multiples]. === Revues spécialisées === * ''Revue bibliographique de Sinologie / Review of Bibliography in Sinology'' (RBS), 1955-2003, disponible sur JSTOR. * ''T'oung Pao'' (« Archives concernant l'histoire, les langues, la géographie et l'ethnographie de l'Asie orientale »), Leiden, Brill, depuis 1890. * ''Journal of Chinese Philosophy'', depuis 1973. * ''Philosophy East and West'', University of Hawai'i Press, depuis 1951. === Collections éditoriales recommandées === * Collection « Bibliothèque chinoise », Paris, Les Belles Lettres * Collection « Connaissance de l'Orient », Paris, Gallimard * Collection « Points Sagesses », Paris, Seuil * Collection « Spiritualités vivantes », Paris, Albin Michel * ''Variétés sinologiques'', Shanghai puis Taipei, Mission catholique, 1892-1951 (puis continuation à Taiwan depuis les années 1970), 70 volumes === Ouvrages de vulgarisation accessible === * '''JAVARY, Cyrille J.-D.''', ''Cent mots pour comprendre les Chinois'', Paris, Albin Michel, 2008. * '''JAVARY, Cyrille J.-D.''', ''Le Discours de la Tortue : Découvrir la pensée chinoise au fil du Yi-Jing'', Paris, Albin Michel, 2003. {{autocat}} 4g93cs96dllnog2u3s2un8xada1y087 Dictionnaire de philosophie/Concept 0 83088 767898 767093 2026-06-17T04:52:55Z PandaMystique 119061 767898 wikitext text/x-wiki {{DicoPhilo|Concept}} Le concept figure parmi les notions centrales de la philosophie. Il désigne généralement une représentation mentale abstraite et générale, une unité de pensée qui permet d'appréhender le réel dans sa dimension universelle. Depuis l'Antiquité grecque jusqu'aux débats contemporains, la question de la nature du concept, de son origine, de son rapport aux objets singuliers et au langage, n'a cessé de traverser la réflexion philosophique, donnant lieu à des positions métaphysiques, épistémologiques et logiques diverses. == Origines et définitions == === L'héritage grec === La notion de concept trouve ses racines dans la philosophie grecque antique, même si le terme lui-même n'apparaît que tardivement dans l'histoire de la pensée occidentale. Chez Platon (428/427-348/347 av. J.-C.), les Idées ou Formes (''eidos'') constituent des réalités intelligibles, éternelles et immuables, dont les choses sensibles ne sont que des copies imparfaites<ref>Platon, ''La République'', livres VI-VII, trad. G. Leroux, Paris, Flammarion, coll. « GF », 2002, p. 312-345</ref>. L'Idée du Beau, du Juste ou du Lit possède une existence propre, indépendante des beaux objets, des actions justes ou des lits particuliers que nous rencontrons dans l'expérience sensible. Cette conception suppose une séparation ontologique entre le monde intelligible et le monde sensible. Aristote (384-322 av. J.-C.) critique cette séparation platonicienne et propose une théorie alternative de l'universel. Pour le Stagirite, la forme (''morphê'') ou l'essence (''ousia'') n'existe pas séparément des substances individuelles, mais réside en elles comme principe d'intelligibilité<ref>Aristote, ''Métaphysique'', Z, 7-9, trad. J. Tricot, Paris, Vrin, 1974, p. 371-398</ref>. L'universel est certes pensé par l'intellect agent (''nous poiêtikos''), mais il s'abstrait à partir des données sensibles particulières. Cette position, qualifiée de réalisme modéré, affirme que l'universel existe dans les choses (''in rebus''), tandis que le concept existe dans l'esprit comme résultat d'une abstraction. === La querelle médiévale des universaux === Au Moyen Âge, la question du statut des universaux devient l'un des débats majeurs de la philosophie scolastique<ref>Alain de Libera, ''La Querelle des universaux. De Platon à la fin du Moyen Âge'', Paris, Seuil, 1996, p. 15-89</ref>. Trois positions principales s'affrontent : le réalisme, le nominalisme et le conceptualisme. Le réalisme médiéval, défendu notamment par Guillaume de Champeaux (vers 1070-1121), soutient que les universaux possèdent une réalité substantielle, existant avant les choses particulières (''ante res''). Cette thèse s'inscrit dans la tradition platonicienne et augustinienne, faisant des universaux des idées dans l'esprit divin<ref>Étienne Gilson, ''La Philosophie au Moyen Âge'', Paris, Payot, 1986, p. 259-267</ref>. Le nominalisme, illustré par Guillaume d'Ockham (vers 1285-1347), nie toute réalité aux universaux en dehors de l'esprit qui les conçoit. Selon Ockham, seuls existent les individus singuliers ; les termes universels ne sont que des noms (''nomina'') ou des signes conventionnels permettant de désigner plusieurs individus présentant des ressemblances<ref>Guillaume d'Ockham, ''Somme de logique'', I, 14-17, trad. J. Biard, Mauvezin, Trans-Europ-Repress, 1988, p. 59-78</ref>. Le concept n'est qu'un signe mental (''signum mentale''), un acte de pensée sans correspondant ontologique universel. Le conceptualisme, défendu par Pierre Abélard (1079-1142), adopte une position intermédiaire : les universaux n'existent ni comme substances séparées ni comme pures dénominations, mais comme concepts dans l'intellect, fondés sur les ressemblances réelles entre les choses singulières<ref>Pierre Abélard, ''Logica ingredientibus'', dans ''Philosophical Writings'', éd. P. V. Spade, Indianapolis, Hackett, 1995, p. 26-56</ref>. == La modernité et le tournant subjectiviste == === Descartes et l'idée claire et distincte === René Descartes (1596-1650) inaugure une nouvelle approche du concept en le pensant d'abord comme idée présente dans l'esprit. Dans les ''Méditations métaphysiques'', Descartes distingue trois types d'idées : innées, adventices et factices<ref>René Descartes, ''Méditations métaphysiques'', III, dans ''Œuvres'', éd. C. Adam et P. Tannery, Paris, Vrin, 1996, t. IX, p. 29-41</ref>. Les idées innées, telles celles de Dieu, de l'âme ou des vérités mathématiques, sont présentes en nous indépendamment de l'expérience sensible. Le critère de vérité réside dans la clarté et la distinction de ces idées. Une idée claire est celle qui se présente immédiatement à l'esprit attentif ; une idée distincte est celle qui n'est pas confondue avec d'autres. Cette théorie cartésienne fait du concept une réalité mentale dont la validité dépend de sa transparence à la conscience. Elle ouvre la voie à l'idéalisme moderne en plaçant la représentation au centre de la réflexion épistémologique. === L'empirisme britannique et la critique du concept === Les philosophes empiristes britanniques remettent en cause la doctrine des idées innées et proposent une genèse empirique du concept. John Locke (1632-1704) affirme que l'esprit à la naissance est une ''tabula rasa'', une page blanche sur laquelle l'expérience inscrit progressivement ses contenus<ref>John Locke, ''Essai sur l'entendement humain'', livre II, chap. 1, trad. J.-M. Vienne, Paris, Vrin, 2001, p. 109-118</ref>. Les idées simples proviennent de la sensation ou de la réflexion ; les idées complexes résultent de la combinaison, de la comparaison ou de l'abstraction opérées par l'entendement sur les idées simples. George Berkeley (1685-1753) radicalise l'empirisme en contestant l'existence des idées abstraites générales. Pour l'évêque de Cloyne, toute idée est particulière et déterminée ; ce qui donne l'apparence d'universalité, c'est l'usage que nous faisons de certaines idées particulières comme signes représentant d'autres idées semblables<ref>George Berkeley, ''Traité des principes de la connaissance humaine'', Introduction, § 6-20, trad. D. Berlioz, Paris, Flammarion, 1991, p. 69-83</ref>. David Hume (1711-1776) pousse plus loin encore la critique empiriste. Il distingue les impressions, données immédiates et vivaces de la sensation, et les idées, copies affaiblies des impressions dans la mémoire et l'imagination<ref>David Hume, ''Enquête sur l'entendement humain'', section II, trad. A. Leroy, Paris, Flammarion, 1983, p. 67-73</ref>. Les idées générales ne sont que des collections d'idées particulières associées à un même terme par habitude. Hume sape ainsi les fondements métaphysiques du concept en le réduisant à un mécanisme psychologique d'association. === Kant et la révolution copernicienne === Emmanuel Kant (1724-1804) opère une véritable révolution dans la compréhension du concept. Dans la ''Critique de la raison pure'', il distingue deux sources de la connaissance : la sensibilité, faculté réceptive qui reçoit les données de l'intuition, et l'entendement, faculté spontanée qui produit les concepts<ref>Emmanuel Kant, ''Critique de la raison pure'', « Esthétique transcendantale » et « Analytique transcendantale », trad. A. Tremesaygues et B. Pacaud, Paris, PUF, coll. « Quadrige », 2012, p. 55-225</ref>. Kant établit une distinction fondamentale entre intuitions et concepts. Les intuitions sont des représentations singulières et immédiates ; les concepts sont des représentations générales et médiates. « Les pensées sans contenu sont vides, les intuitions sans concepts sont aveugles. »<ref>Kant, ''Critique de la raison pure'', A 51/B 75, op. cit., p. 77</ref> La connaissance résulte de la synthèse de l'intuition sensible et du concept intellectuel. Kant distingue en outre les concepts empiriques, formés par abstraction à partir de l'expérience, les concepts purs ou catégories, structures a priori de l'entendement (substance, causalité, unité, etc.), et les idées de la raison (âme, monde, Dieu), qui dépassent toute expérience possible<ref>Kant, ''Critique de la raison pure'', « Dialectique transcendantale », op. cit., p. 279-470</ref>. Les catégories constituent les conditions de possibilité de l'expérience : sans elles, aucun objet ne pourrait être pensé. == L'idéalisme allemand et le concept spéculatif == === Hegel et le devenir du concept === Georg Wilhelm Friedrich Hegel (1770-1831) confère au concept (''Begriff'') une portée métaphysique inédite. Pour lui, le concept n'est pas une simple représentation subjective, mais le mouvement même par lequel la réalité se structure et se comprend elle-même<ref>G.W.F. Hegel, ''Science de la logique'', livre III : « La Doctrine du concept », trad. P.-J. Labarrière et G. Jarczyk, Paris, Aubier, 1981, p. 17-89</ref>. Le concept hégélien est le déploiement dialectique de l'Idée absolue à travers les moments de l'universel, du particulier et du singulier. Dans la ''Phénoménologie de l'esprit'', Hegel montre comment la conscience s'élève progressivement de la certitude sensible immédiate jusqu'au savoir absolu, en passant par diverses figures de l'expérience<ref>G.W.F. Hegel, ''Phénoménologie de l'esprit'', trad. J. Hyppolite, Paris, Aubier, 1941, t. I, p. 85-171</ref>. Le concept n'est pas donné d'emblée, mais se constitue dans un processus historique et logique. Il est vie, mouvement, négativité : il nie les déterminations immédiates pour les dépasser dans une synthèse supérieure. L'originalité de Hegel consiste à identifier le rationnel et le réel : « Ce qui est rationnel est effectif, et ce qui est effectif est rationnel. »<ref>Hegel, ''Principes de la philosophie du droit'', Préface, trad. J.-F. Kervégan, Paris, PUF, 2013, p. 105</ref> Le concept n'est pas un instrument extérieur à la réalité pour la penser, mais la structure même de cette réalité en tant qu'elle est esprit (''Geist''). == L'analyse logique du concept == === Frege et la distinction sens/référence === Gottlob Frege (1848-1925), fondateur de la logique moderne, introduit une distinction capitale entre le sens (''Sinn'') et la référence (''Bedeutung'') des expressions linguistiques<ref>Gottlob Frege, « Über Sinn und Bedeutung » (1892), dans ''Écrits logiques et philosophiques'', trad. Cl. Imbert, Paris, Seuil, 1971, p. 102-126</ref>. Deux expressions peuvent avoir la même référence (désigner le même objet) tout en ayant des sens différents : ainsi, « l'étoile du matin » et « l'étoile du soir » désignent toutes deux la planète Vénus, mais leur mode de donation diffère. Pour Frege, les concepts (''Begriffe'') sont des fonctions insaturées dont les valeurs sont des valeurs de vérité<ref>Frege, « Funktion und Begriff » (1891), dans ''Écrits logiques et philosophiques'', op. cit., p. 80-101</ref>. Un concept est une fonction qui, pour un objet donné en argument, donne le Vrai ou le Faux. Par exemple, le concept « être un nombre premier » appliqué à 7 donne le Vrai, appliqué à 6 donne le Faux. Cette conception logiciste fait du concept une entité objective, ni psychologique ni linguistique, mais purement logique, appartenant au « troisième royaume » distinct du monde physique et du monde mental<ref>Frege, « Der Gedanke » (1918), dans ''Écrits logiques et philosophiques'', op. cit., p. 170-195</ref>. Frege établit également une distinction fondamentale entre objets et concepts : alors que les objets sont saturés, complets en eux-mêmes, les concepts sont insaturés, incomplets, nécessitant d'être complétés par un objet. Cette distinction grammaticale et logique a des conséquences ontologiques : un concept ne peut jamais être objet, et réciproquement. Frege en déduit son célèbre paradoxe : « Le concept cheval n'est pas un concept », car en le nommant ainsi, on en fait un objet<ref>Frege, « Über Begriff und Gegenstand » (1892), dans ''Écrits logiques et philosophiques'', op. cit., p. 127-141</ref>. === Russell, Carnap et l'empirisme logique === Bertrand Russell (1872-1970) développe une théorie des descriptions définies qui vise à éliminer les difficultés liées aux termes ne désignant rien<ref>Bertrand Russell, « On Denoting » (1905), dans ''Logic and Knowledge'', éd. R.C. Marsh, Londres, Routledge, 1956, p. 41-56</ref>. Une description définie comme « le roi de France actuel » n'est pas un véritable nom propre, mais une expression quantifiée analysable logiquement. Russell cherche ainsi à purifier le langage de ses ambiguïtés en le reconstruisant sur des bases logiques rigoureuses. Les philosophes du Cercle de Vienne, notamment Rudolf Carnap (1891-1970), radicalisent cette approche en proposant un critère empiriste de signification : un énoncé est doué de sens si et seulement s'il est vérifiable empiriquement ou s'il est analytique (vrai en vertu de la signification des termes)<ref>Rudolf Carnap, « Überwindung der Metaphysik durch logische Analyse der Sprache » (1932), dans ''Erkenntnis'', 2, 1932, p. 219-241 ; trad. fr. « Le Dépassement de la métaphysique par l'analyse logique du langage », dans A. Soulez (dir.), ''Manifeste du Cercle de Vienne'', Paris, PUF, 1985, p. 153-179</ref>. Les concepts métaphysiques traditionnels, ne satisfaisant pas à ce critère, sont déclarés dénués de sens. Cette position, dite « vérificationnisme », vise à éliminer les pseudo-problèmes philosophiques résultant d'un mauvais usage du langage. Willard Van Orman Quine (1908-2000) remet en cause la distinction entre énoncés analytiques et synthétiques, et avec elle l'idée même qu'il existerait des significations conceptuelles pures, indépendantes de l'expérience<ref>W.V.O. Quine, « Two Dogmas of Empiricism » (1951), dans ''From a Logical Point of View'', Cambridge, Harvard University Press, 1980, p. 20-46 ; trad. fr. « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', Paris, Vrin, 2003, p. 87-112</ref>. Pour Quine, nos théories scientifiques forment un réseau holistique confronté globalement à l'expérience : aucun énoncé n'est à l'abri de la révision, y compris les lois logiques. == Philosophie continentale : Husserl, Heidegger, Deleuze == === Husserl et la phénoménologie === Edmund Husserl (1859-1938) inaugure la phénoménologie comme méthode d'analyse de la conscience et de ses vécus intentionnels. La réduction phénoménologique ou ''épochè'' consiste à mettre entre parenthèses la thèse de l'existence du monde (la croyance naturelle en la réalité objective) pour se concentrer sur les phénomènes tels qu'ils apparaissent à la conscience<ref>Edmund Husserl, ''Idées directrices pour une phénoménologie'', § 31-32, trad. P. Ricœur, Paris, Gallimard, coll. « Tel », 1950, p. 98-107</ref>. Husserl introduit la distinction entre noèse et noème. La noèse désigne l'acte intentionnel de la conscience (percevoir, juger, imaginer, désirer, etc.), tandis que le noème est le corrélat intentionnel de cet acte, c'est-à-dire l'objet tel qu'il est visé par la conscience<ref>Husserl, ''Idées directrices pour une phénoménologie'', § 88-96, op. cit., p. 301-335</ref>. Le noème n'est ni l'objet réel transcendant ni une simple représentation psychologique : c'est le sens objectif de l'acte, la manière dont l'objet se donne à la conscience. Le concept, dans cette perspective, relève de la structure noématique : il est le sens idéal saisi dans l'intuition eidétique. Husserl développe également une théorie de la variation eidétique : en imaginant librement des variations d'un objet (par exemple, différentes tables), la conscience peut saisir l'essence invariante (l'eidos), ce sans quoi l'objet ne serait pas ce qu'il est<ref>Husserl, ''Expérience et jugement'', § 87, trad. D. Souche-Dagues, Paris, PUF, 1970, p. 411-423</ref>. Cette méthode permet d'accéder aux concepts essentiels sans recourir à l'abstraction empirique. === Heidegger et la destruction de la métaphysique === Martin Heidegger (1889-1976) entreprend une ''Destruktion'' (déconstruction) de l'histoire de l'ontologie pour retrouver la question de l'être, oubliée depuis Platon. Dans ''Être et Temps'', Heidegger critique la conception traditionnelle du concept (''Begriff'') comme saisie (''greifen'') objectivante qui fige l'être dans la présence<ref>Martin Heidegger, ''Sein und Zeit'' (1927), § 2-7, trad. F. Vezin, Paris, Gallimard, 1986, p. 35-67</ref>. Le penser authentique ne relève pas de la logique conceptuelle, mais d'un laisser-être qui laisse l'étant se manifester dans sa vérité (''alètheia''). Heidegger distingue le concept (''Begriff''), qui appartient au registre de l'étant et de la métaphysique, et la pensée (''Denken''), qui se tient dans la proximité de l'être. Le concept, instrument de la science moderne, opère par représentation et calcul, tandis que la pensée méditative (''besinnliches Denken'') écoute l'appel de l'être<ref>Heidegger, « La Question de la technique » (1954), dans ''Essais et conférences'', trad. A. Préau, Paris, Gallimard, coll. « Tel », 1958, p. 9-48</ref>. === Deleuze et Guattari : créer des concepts === Gilles Deleuze (1925-1995) et Félix Guattari (1930-1992) proposent une conception originale de la philosophie comme activité créatrice de concepts. Dans ''Qu'est-ce que la philosophie ?'', ils définissent le concept comme un ensemble de composantes inséparables qui trace un plan d'immanence<ref>Gilles Deleuze et Félix Guattari, ''Qu'est-ce que la philosophie ?'', Paris, Minuit, 1991, p. 21-36</ref>. Le concept n'est ni une généralité abstraite ni une simple opinion (''doxa''), mais une singularité qui découpe une zone de consistance dans le chaos de l'expérience. Contrairement à la tradition qui voit dans le concept un universel, Deleuze et Guattari affirment son caractère événementiel et créateur. Les concepts ne préexistent pas, ils sont inventés : le ''cogito'' de Descartes, la ''monade'' de Leibniz, la ''volonté de puissance'' de Nietzsche sont autant de créations conceptuelles qui ouvrent de nouvelles possibilités de penser<ref>Deleuze et Guattari, ''Qu'est-ce que la philosophie ?'', op. cit., p. 11-20</ref>. La philosophie n'est pas la contemplation, la réflexion ou la communication, mais la création de concepts. == Le concept dans les sciences == === Épistémologie : concepts scientifiques et paradigmes === L'épistémologie contemporaine s'est penchée sur la nature et le rôle des concepts dans la connaissance scientifique. Pierre Duhem (1861-1916) et Alexandre Koyré (1892-1964) ont montré que les théories scientifiques ne procèdent pas par induction à partir de l'expérience brute, mais mettent en œuvre des cadres conceptuels qui orientent l'observation et l'expérimentation<ref>Alexandre Koyré, ''Études galiléennes'', Paris, Hermann, 1939, rééd. 1966, p. 5-48</ref>. Gaston Bachelard (1884-1962) introduit la notion d'« obstacle épistémologique » : les concepts de sens commun et les premières conceptualisations scientifiques constituent souvent des obstacles qu'il faut surmonter pour accéder à une connaissance rationnelle<ref>Gaston Bachelard, ''La Formation de l'esprit scientifique'', Paris, Vrin, 1938, p. 13-22</ref>. La science progresse par « ruptures » conceptuelles, en substituant à un concept usé un concept rectifié. Bachelard parle ainsi de « philosophie du non » pour désigner cette dialectique de la conceptualisation scientifique. Thomas Kuhn (1922-1996) radicalise cette approche avec sa théorie des paradigmes. Un paradigme scientifique est une matrice disciplinaire comprenant des lois, des théories, des applications et des instruments, mais aussi un réseau de concepts partagés par une communauté scientifique<ref>Thomas Kuhn, ''The Structure of Scientific Revolutions'', Chicago, University of Chicago Press, 1962, 2e éd. 1970, p. 10-22 ; trad. fr. ''La Structure des révolutions scientifiques'', Paris, Flammarion, 1983</ref>. Lors d'une révolution scientifique, le changement de paradigme entraîne une reconfiguration conceptuelle telle que les termes utilisés avant et après la révolution n'ont plus le même sens : c'est le phénomène d'« incommensurabilité ». === Sciences cognitives et psychologie du concept === La psychologie cognitive étudie empiriquement la formation, l'organisation et l'utilisation des concepts par l'esprit humain. Eleanor Rosch a montré que les concepts naturels ne fonctionnent pas selon le modèle classique de la définition par conditions nécessaires et suffisantes, mais selon une structure de prototypes<ref>Eleanor Rosch, « Natural Categories », ''Cognitive Psychology'', 4(3), 1973, p. 328-350</ref>. Un prototype est l'exemplaire le plus typique d'une catégorie : par exemple, le rouge-gorge est un prototype de la catégorie « oiseau » plus que le manchot. L'appartenance à une catégorie est graduelle plutôt que binaire. Les sciences cognitives contemporaines, intégrant linguistique, intelligence artificielle, neurosciences et philosophie de l'esprit, explorent la nature computationnelle ou connexionniste des concepts. Selon Jerry Fodor, les concepts sont des symboles mentaux (« langage de la pensée » ou ''mentalais'') qui obéissent à une syntaxe combinatoire<ref>Jerry Fodor, ''The Language of Thought'', Cambridge, Harvard University Press, 1975, p. 1-33</ref>. D'autres, comme Lawrence Barsalou, défendent une approche incarnée (''embodied''), selon laquelle les concepts sont enracinés dans les systèmes sensori-moteurs<ref>Lawrence Barsalou, « Grounded Cognition », ''Annual Review of Psychology'', 59, 2008, p. 617-645</ref>. == Débats contemporains == === Conceptualisme et non-conceptualisme === Un débat actuel en philosophie de l'esprit porte sur la question de savoir si toute expérience est conceptuellement structurée ou s'il existe des contenus non-conceptuels. Les conceptualistes, comme John McDowell, soutiennent que l'expérience perceptive est toujours déjà articulée conceptuellement : voir un rouge déterminé, c'est mobiliser le concept de rouge<ref>John McDowell, ''Mind and World'', Cambridge, Harvard University Press, 1994, p. 3-23 ; trad. fr. ''L'Esprit et le monde'', Paris, Vrin, 2007</ref>. Les non-conceptualistes, comme Christopher Peacocke, affirment au contraire que le contenu de l'expérience perceptive dépasse ce que les concepts du sujet peuvent articuler : un nourrisson ou un animal perçoit des couleurs sans posséder les concepts correspondants<ref>Christopher Peacocke, « Does Perception Have a Nonconceptual Content? », ''The Journal of Philosophy'', 98(5), 2001, p. 239-264</ref>. === Concepts et langage naturel === La philosophie du langage contemporaine s'interroge sur le rapport entre concepts et signification linguistique. Pour certains, comme Michael Dummett, le sens d'un terme linguistique réside dans les conditions de son usage correct, conditions qu'on peut identifier aux règles constitutives d'un concept<ref>Michael Dummett, ''The Logical Basis of Metaphysics'', Cambridge, Harvard University Press, 1991, p. 19-41</ref>. Pour d'autres, comme Hilary Putnam, la signification ne réside pas « dans la tête » : le concept d'eau, par exemple, n'est pas fixé par une description que le locuteur pourrait fournir, mais par la nature réelle de l'eau (H₂O), déterminée par la science<ref>Hilary Putnam, « The Meaning of 'Meaning' », dans ''Mind, Language and Reality. Philosophical Papers, vol. 2'', Cambridge, Cambridge University Press, 1975, p. 215-271</ref>. C'est la thèse de l'« externalisme sémantique ». === Philosophie féministe et analyse conceptuelle === La philosophie féministe a entrepris une critique des concepts philosophiques traditionnels en montrant qu'ils véhiculent souvent des présupposés androcentristes. Des auteures comme Sally Haslanger analysent les concepts sociaux comme « genre » et « race » en montrant qu'ils ne décrivent pas des essences naturelles, mais des catégories construites socialement et historiquement<ref>Sally Haslanger, « Gender and Race: (What) Are They? (What) Do We Want Them to Be? », ''Noûs'', 34(1), 2000, p. 31-55</ref>. Cette approche renouvelle la question de la nature des concepts en mettant l'accent sur leur dimension politique et normative. == Conclusion == La notion de concept traverse toute l'histoire de la philosophie, des Idées platoniciennes aux créations conceptuelles de Deleuze et Guattari, en passant par les catégories kantiennes, l'analyse logique frégéenne et les structures noématiques husserliennes. Le concept est à la fois ce qui permet la pensée de l'universel, ce qui structure notre expérience du monde, ce qui fonde la communication intersubjective, et ce qui évolue avec l'histoire des sciences et des cultures. Les débats contemporains attestent de la vitalité de cette notion, qu'il s'agisse d'en préciser la nature logique, cognitive ou linguistique, d'en critiquer les usages idéologiques, ou d'en explorer les variations culturelles. Loin d'être une question réglée, la philosophie du concept demeure un chantier ouvert où se rencontrent métaphysique, épistémologie, logique, philosophie de l'esprit et philosophie du langage. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == * Aristote, ''Métaphysique'', trad. J. Tricot, Paris, Vrin, 1974 * Gaston Bachelard, ''La Formation de l'esprit scientifique'', Paris, Vrin, 1938 * George Berkeley, ''Traité des principes de la connaissance humaine'', trad. D. Berlioz, Paris, Flammarion, 1991 * René Descartes, ''Méditations métaphysiques'', Paris, Vrin, 1996 * Gilles Deleuze et Félix Guattari, ''Qu'est-ce que la philosophie ?'', Paris, Minuit, 1991 * Gottlob Frege, ''Écrits logiques et philosophiques'', trad. Cl. Imbert, Paris, Seuil, 1971 * G.W.F. Hegel, ''Science de la logique'', trad. P.-J. Labarrière et G. Jarczyk, Paris, Aubier, 1981 * Edmund Husserl, ''Idées directrices pour une phénoménologie'', trad. P. Ricœur, Paris, Gallimard, 1950 * Emmanuel Kant, ''Critique de la raison pure'', trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 2012 * Alain de Libera, ''La Querelle des universaux'', Paris, Seuil, 1996 * John Locke, ''Essai sur l'entendement humain'', trad. J.-M. Vienne, Paris, Vrin, 2001 * Guillaume d'Ockham, ''Somme de logique'', trad. J. Biard, Mauvezin, Trans-Europ-Repress, 1988 * Platon, ''La République'', trad. G. Leroux, Paris, Flammarion, 2002 == Voir aussi == === Articles connexes === * [[Abstraction]] * [[Catégorie]] * [[Essence]] * [[Idée]] * [[Intentionnalité]] * [[Langage]] * [[Logique]] * [[Noème]] * [[Phénoménologie]] * [[Universel]] === Liens externes === * [https://plato.stanford.edu/entries/concepts/ Concepts], Stanford Encyclopedia of Philosophy * [https://iep.utm.edu/con-anal/ Conceptual Analysis], Internet Encyclopedia of Philosophy {{autocat}} [[Catégorie:Épistémologie]] [[Catégorie:Logique]] [[Catégorie:Philosophie de l'esprit]] [[Catégorie:Philosophie du langage]] j1sxo2pjyudarb5ajs16gl2mo46cr62 Dictionnaire de philosophie/Courage 0 83112 767893 766694 2026-06-17T04:48:09Z PandaMystique 119061 767893 wikitext text/x-wiki {{DicoPhilo|Courage}} Le '''courage''' constitue l'une des vertus fondamentales de la philosophie morale, traversant les traditions occidentales et non-occidentales. Concept polysémique, il désigne généralement la disposition à affronter la peur, le danger ou l'adversité de manière appropriée, guidé par la raison plutôt que par l'impulsion. == Définitions et approches conceptuelles == Dans la tradition philosophique, le courage se présente moins comme l'absence de peur que comme sa maîtrise rationnelle. Il ne s'agit pas d'une témérité aveugle, mais d'une vertu qui trouve le juste milieu entre la lâcheté et l'audace excessive<ref>Aristote, ''Éthique à Nicomaque'', livre III, chapitres 6-9, trad. J. Tricot, Paris, Vrin, 1990, p. 131-152</ref>. Le courage implique trois dimensions essentielles : la confrontation à un danger réel, la conscience du risque encouru, et une motivation conforme au bien ou au noble. La philosophie antique distingue différentes formes de courage. Le courage physique face aux dangers corporels, le courage moral dans la défense de principes justes, et le courage intellectuel dans la recherche de la vérité malgré l'opposition<ref>Platon, ''Lachès'', 192c, in ''Œuvres complètes'', tome I, trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950, p. 298</ref>. Cette typologie montre que le courage ne se limite pas au champ de bataille, mais s'étend à tous les domaines de l'existence humaine. == La pensée grecque : Platon et Aristote == === Platon et le dialogue du ''Lachès'' === Le ''Lachès'' de Platon constitue la première investigation systématique du courage dans la philosophie occidentale<ref>Emlyn-Jones, Chris, « Dramatic structure and cultural context in Plato's Laches », ''Classical Quarterly'', vol. 49, n° 1, 1999, p. 123-138</ref>. Le dialogue met en scène Socrate interrogeant deux généraux athéniens, Lachès et Nicias, sur la nature du courage. Lachès propose initialement une définition simple : le courage consiste à « tenir son poste face au danger »<ref>Platon, ''Lachès'', 190e, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903</ref>. Socrate démontre l'insuffisance de cette définition en montrant qu'elle exclut d'autres formes de courage, comme la retraite stratégique des cavaliers scythes. Une seconde tentative définit le courage comme « une endurance de l'âme »<ref>Platon, ''Lachès'', 192c, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903</ref>. Mais Socrate objecte que l'endurance insensée ne saurait être vertueuse. Nicias propose alors que le courage est « la science de ce qui est à craindre et à espérer »<ref>Platon, ''Lachès'', 194e-195a, trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950, p. 304-305</ref>. Cette définition intellectualiste rapproche le courage de la sagesse, suggérant que seule la connaissance du bien et du mal permet d'affronter correctement les dangers. Le dialogue se termine en aporie, sans définition satisfaisante, illustrant la complexité du concept. Dans la ''République'', Platon attribue le courage à la classe des gardiens de la cité, le situant ainsi dans une anthropologie et une politique plus vastes<ref>Platon, ''République'', livre IV, 429a-430c, trad. G. Leroux, Paris, GF-Flammarion, 2002, p. 271-273</ref>. Le courage devient la vertu propre du ''thumos'', la partie irascible de l'âme, intermédiaire entre la raison et les désirs. Il consiste à préserver les opinions justes sur ce qui est véritablement à craindre, opinions enseignées par l'éducation et maintenues malgré les plaisirs, les peines et les craintes. === Aristote et la doctrine du juste milieu === Pour Aristote, le courage (''andreia'') occupe une place centrale parmi les vertus morales. Dans l'''Éthique à Nicomaque'', il le définit comme une disposition médiane concernant les sentiments de peur et de confiance<ref>Aristote, ''Éthique à Nicomaque'', III, 6-9, 1115a6-1117b22, éd. I. Bywater, Oxford, Clarendon Press, ''Oxford Classical Texts'', 1894</ref>. L'homme courageux craint ce qu'il faut craindre, pour le motif approprié, de la manière et au moment convenables. Aristote distingue le véritable courage de cinq formes apparentées mais imparfaites. Le courage civique, motivé par l'honneur et la crainte du déshonneur plutôt que par le noble lui-même<ref>Aristote, ''Éthique à Nicomaque'', 1116a15-35, trad. R. Bodéüs, Paris, GF-Flammarion, 2004, p. 179-181</ref>. Le courage de l'expérience, propre aux soldats professionnels qui connaissent les dangers mais peuvent fuir face à une menace supérieure. Le courage passionnel, né de la colère ou d'autres émotions mais dépourvu de choix délibéré. Le courage de l'ignorance, caractérisé par une confiance excessive due à la méconnaissance du danger. Enfin, le courage sanguin, fondé sur un tempérament optimiste plutôt que sur un jugement rationnel<ref>Aristote, ''Éthique à Nicomaque'', 1116b3-1117a28, éd. I. Bywater, Oxford, Clarendon Press, 1894</ref>. Le véritable courage aristotélicien possède trois caractéristiques essentielles. Il s'exerce principalement face à la mort au combat, considérée comme le danger suprême et le plus noble. Il vise le beau (''to kalon'') comme fin, non la récompense ou l'évitement de la honte. Il procède d'une disposition stable acquise par l'habitude et non d'une réaction ponctuelle<ref>Aristote, ''Éthique à Nicomaque'', 1115b11-13, trad. J. Tricot, Paris, Vrin, 1990, p. 136</ref>. Cette dernière dimension souligne que le courage n'est pas inné mais cultivé par l'éducation et la répétition d'actes appropriés. Aristote insiste sur la dimension affective du courage. L'homme courageux ne supprime pas la peur, mais l'éprouve de façon mesurée et appropriée<ref>Broadie, Sarah et Christopher Rowe, ''Aristotle: Nicomachean Ethics: Translation, Introduction, Commentary'', Oxford, Oxford University Press, 2002, p. 315-340</ref>. Il prend plaisir, ou du moins ne souffre pas excessivement, à agir courageusement. Cette conception témoigne d'une psychologie morale sophistiquée où vertu et émotion ne s'opposent pas mais s'harmonisent. == Le stoïcisme et le courage comme force d'âme == La philosophie stoïcienne, développée par Zénon, Chrysippe, puis par Sénèque, Épictète et Marc Aurèle, place le courage au rang des quatre vertus cardinales, avec la sagesse, la justice et la tempérance. Le courage stoïcien (''andreia'' ou ''fortitudo'') dépasse la simple bravoure militaire pour devenir une force d'âme universelle<ref>Sénèque, ''De constantia sapientis'', V, 4, in ''Dialogues'', tome IV, trad. R. Waltz, Paris, Les Belles Lettres, Collection des Universités de France, 1927, p. 56-57</ref>. Pour les Stoïciens, le courage consiste essentiellement à maintenir son jugement et ses principes face aux circonstances adverses, qu'il s'agisse de dangers physiques, de souffrances ou d'injustices. Sénèque écrit que le sage ne peut rien perdre puisqu'il possède tout en lui-même de façon sûre, content de la vertu qui n'a nul besoin de la fortune<ref>Sénèque, ''De constantia sapientis'', V, 4, Paris, Les Belles Lettres, 1927, p. 56-57</ref>. Le courage devient ainsi inséparable de l'acceptation rationnelle du destin (''amor fati''), comprise non comme résignation passive mais comme affirmation joyeuse de ce qui est nécessaire. Marc Aurèle, dans ses ''Pensées pour moi-même'', développe l'idée du courage comme acceptation de notre condition mortelle et de l'ordre cosmique<ref>Marc Aurèle, ''Pensées'', VII, 33, trad. P. Hadot, Paris, Les Belles Lettres, 1998, p. 124</ref>. Le courage stoïcien implique donc une double dimension : résistance active face à ce qui dépend de nous, acceptation sereine de ce qui ne dépend pas de nous. La conception stoïcienne influence profondément la notion de courage moral, distinct du courage physique. Il s'agit de maintenir ses convictions morales malgré les pressions sociales, les menaces ou les tentations. Cette forme de courage requiert une vigilance constante et une discipline de l'esprit, ce que les Stoïciens nomment ''prohairesis'' – la capacité de choix moral fondée sur la raison<ref>Épictète, ''Manuel'', I, 1, trad. É. Bréhier, in ''Les Stoïciens'', Paris, Gallimard, Bibliothèque de la Pléiade, 1962, p. 1109</ref>. == Perspectives médiévales : Thomas d'Aquin == La pensée chrétienne médiévale intègre le courage dans un cadre théologique tout en préservant l'héritage aristotélicien. Thomas d'Aquin, dans la ''Somme théologique'', définit le courage (''fortitudo'') comme une vertu morale qui affermit l'âme face aux dangers mortels<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 123-140, trad. française sous la dir. d'A.-M. Roguet, Paris, Cerf, 1985, vol. 3, p. 221-370</ref>. Pour Thomas, le courage possède deux actes principaux : attaquer (''aggredere'') et endurer (''sustinere''). L'endurance constitue l'acte principal car elle exige plus de force d'âme face à un danger présent et inévitable<ref>Thomas d'Aquin, ''Summa Theologiae'', IIa-IIae, q. 123, a. 6, Latin text available in: ''Sancti Thomae Aquinatis Opera Omnia'', Leonine Commission, Rome, 1888-1906</ref>. Le courage perfectionne ainsi l'appétit irascible, cette puissance de l'âme qui nous porte à surmonter les obstacles au bien difficile. Thomas distingue également le courage comme vertu générale, qui soutient toutes les autres vertus dans leurs difficultés, et le courage comme vertu spéciale, concernant les dangers de mort. Il identifie plusieurs vertus annexes ou parties potentielles de la fortitude : la magnificence (qui affronte les grandes dépenses), la magnanimité (qui vise les grandes choses), la patience (qui supporte les maux présents), et la persévérance (qui maintient l'effort dans le temps)<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 128-138, Paris, Cerf, 1985, vol. 3, p. 287-350</ref>. La synthèse thomiste enrichit la conception aristotélicienne en l'inscrivant dans une vision chrétienne de l'existence. Le martyre devient la forme suprême du courage, l'acceptation de la mort pour témoigner de la vérité divine<ref>DeYoung, Rebecca, « Power Made Perfect in Weakness: Aquinas's Transformation of the Virtue of Courage », dans Astell, Ann W. et Bonnie Honecker (dir.), ''Heroic Virtue, Komplementaritaet und Transgression'', Paderborn, Wilhelm Fink Verlag, 2010, p. 133-148</ref>. Cette dimension religieuse élargit considérablement le champ du courage au-delà du contexte militaire pour englober toute situation où l'intégrité morale et spirituelle est en jeu. == Modernité : Kant et l'éthique du devoir == Immanuel Kant, tout en ne faisant pas du courage une catégorie centrale de son éthique, lui reconnaît une place importante. Dans la ''Critique de la raison pratique'' et la ''Métaphysique des mœurs'', Kant distingue les vertus naturelles, comme le courage, des véritables vertus morales fondées sur le devoir<ref>Kant, Immanuel, ''Fondements de la métaphysique des mœurs'', trad. V. Delbos, rév. A. Philonenko, Paris, Vrin, 1980, Ak IV, 393-394, p. 87-91</ref>. Pour Kant, le courage possède une valeur morale seulement lorsqu'il est motivé par le devoir et non par l'inclination, l'intérêt ou la recherche de l'honneur. Un acte courageux n'a de véritable valeur morale que s'il procède du respect pour la loi morale universelle<ref>Kant, Immanuel, ''Critique de la raison pratique'', trad. F. Picavet, Paris, PUF, Quadrige, 1943, Ak V, 81-86, p. 88-92</ref>. Cependant, Kant reconnaît que le courage, comme d'autres qualités naturelles, peut faciliter l'accomplissement du devoir. Cette conception kantienne du courage soulève une tension importante dans l'éthique déontologique. Si seule l'intention compte pour la moralité, le courage en tant que disposition de caractère semble secondaire. Pourtant, l'expérience morale montre que le courage est souvent nécessaire pour agir selon le devoir, particulièrement lorsque celui-ci exige d'affronter des dangers ou de résister aux pressions sociales. == Existentialisme : courage et authenticité == Les philosophes existentialistes du XXe siècle, notamment Jean-Paul Sartre et Albert Camus, redéfinissent le courage dans le contexte de l'absurde et de la liberté humaine. Pour Sartre, le courage consiste à assumer pleinement sa liberté et sa responsabilité face à un monde dépourvu de sens transcendant<ref>Sartre, Jean-Paul, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946, rééd. Gallimard, Folio, 1996, p. 37-42</ref>. Cette conception du courage existentialiste se manifeste dans ce que Sartre nomme « l'authenticité » – le refus de la mauvaise foi et l'acceptation angoissante de notre condition d'êtres libres. Le courage devient alors la capacité à créer ses propres valeurs et à assumer les conséquences de ses choix sans se réfugier dans des excuses ou des déterminismes factices. Camus, dans ''Le Mythe de Sisyphe'', développe une vision du courage face à l'absurde. Le courage ne consiste pas à nier l'absurdité de l'existence ni à se suicider face à elle, mais à se révolter lucidement contre cette absurdité tout en continuant à vivre pleinement<ref>Camus, Albert, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942, rééd. Folio Essais, 1972, p. 165-168</ref>. Il écrit : « Il faut imaginer Sisyphe heureux », suggérant que le courage ultime réside dans l'affirmation de la vie malgré son caractère répétitif et apparemment dénué de sens. Nietzsche, précurseur de l'existentialisme, avait déjà développé une conception du courage liée à l'''amor fati'' – l'amour du destin. Le courage nietzschéen consiste à dire « oui » à la vie dans sa totalité, y compris à ses aspects les plus difficiles et les plus douloureux<ref>Nietzsche, Friedrich, ''Le Gai Savoir'', §276, trad. P. Klossowski, Paris, Gallimard, Folio Essais, 1967, p. 219-220</ref>. Cette acceptation n'est pas passive mais constitue au contraire l'expression d'une force vitale affirmative qui transfigure la nécessité en liberté créatrice. == Pensées africaines du courage == Les philosophies africaines offrent des perspectives distinctes et enrichissantes sur le courage, souvent ancrées dans des conceptions communautaires de la personne et dans des systèmes de valeurs holistiques où le courage s'articule avec d'autres vertus fondamentales. === Ubuntu et courage relationnel === Dans les philosophies bantoues d'Afrique australe et orientale, le courage (''umoya'' en zoulou) s'inscrit dans le cadre de l'ubuntu – principe selon lequel « une personne est une personne à travers les autres personnes » (''umuntu ngumuntu ngabantu'')<ref>Ramose, Mogobe B., ''African Philosophy through Ubuntu'', Harare, Mond Books, 1999, p. 49-66</ref>. Le courage n'est donc pas conçu comme une vertu purement individuelle mais comme une qualité relationnelle et communautaire. Cette conception communautaire du courage implique que l'acte courageux vise toujours le bien de la communauté et renforce les liens sociaux. Un guerrier zoulou ou xhosa fait preuve de courage non pour sa gloire personnelle mais pour protéger et honorer sa communauté. Le courage se manifeste également dans la capacité à maintenir l'harmonie sociale face aux conflits, à pardonner les offenses dans l'intérêt de la réconciliation communautaire<ref>Tutu, Desmond, ''No Future Without Forgiveness'', Londres, Rider, 1999, p. 31-35</ref>. L'exemple de Nelson Mandela illustre parfaitement cette dimension communautaire et réconciliatrice du courage africain. Son courage ne s'est pas seulement manifesté dans sa résistance à l'oppression et dans sa volonté de combattre l'injustice, mais également et surtout dans sa capacité à tendre la main à ses anciens geôliers et à privilégier la réconciliation nationale plutôt que la vengeance<ref>Mandela, Nelson, ''Long Walk to Freedom: The Autobiography of Nelson Mandela'', Boston, Little, Brown and Company, 1994, p. 544-566</ref>. Cette forme de courage requiert une force d'âme exceptionnelle car elle implique de transcender la douleur personnelle pour le bien commun. === Le courage dans la philosophie yoruba === La philosophie yoruba du Nigeria offre une analyse particulièrement riche du courage. Le terme yoruba ''igboya'' désigne littéralement « avoir un cœur fort » et implique non seulement la bravoure physique mais aussi la force morale et la capacité à prendre des initiatives<ref>Gbadegesin, Segun, ''African Philosophy: Traditional Yoruba Philosophy and Contemporary African Realities'', New York, Peter Lang, 1991, p. 73-91</ref>. Dans la cosmologie yoruba, le courage est lié au concept d'''ori'' – la « tête intérieure » qui représente le destin personnel et la conscience de soi. Un ''ori'' bien développé confère à la personne la capacité de discerner les situations dangereuses et d'y réagir de manière appropriée. Le courage ne consiste donc pas à ignorer le danger mais à l'affronter avec sagesse et détermination, guidé par un ''ori'' fort. La tradition yoruba reconnaît également que le courage doit être tempéré par d'autres vertus, notamment la patience (''suuru'') et la sagesse (''ogbon''). Cette conception holiste rappelle que le courage isolé des autres vertus peut conduire à la témérité et à la destruction. === Courage et résistance en Afrique contemporaine === Les philosophies africaines contemporaines ont développé une réflexion importante sur le courage politique et la résistance à l'oppression. Des penseurs comme Steve Biko en Afrique du Sud ont articulé une conception du courage liée à la conscience de soi et à la résistance à la domination psychologique<ref>Biko, Steve, ''I Write What I Like: A Selection of his Writings'', éd. Aelred Stubbs, Londres, Bowerdean Press, 1978, p. 29-33</ref>. La philosophie de la conscience noire (Black Consciousness) développée par Biko insiste sur le fait que le premier acte de courage pour les opprimés consiste à rejeter l'image dégradée que le système oppressif leur impose et à affirmer leur dignité et leur humanité pleine. Ce courage psychologique et existentiel précède et rend possible le courage physique de la résistance politique. Frantz Fanon, psychiatre et philosophe martiniquais dont la pensée a profondément influencé l'Afrique, analyse le courage nécessaire pour se libérer de l'aliénation coloniale<ref>Fanon, Frantz, ''Les Damnés de la terre'', Paris, François Maspero, 1961, rééd. La Découverte, 2002, p. 41-47</ref>. Pour Fanon, le courage révolutionnaire implique non seulement l'affrontement physique avec le système colonial mais aussi une transformation intérieure qui permet au colonisé de se réapproprier son humanité et son histoire. == Philosophies asiatiques et courage == === Confucianisme et vertu du courage === Dans la tradition confucéenne, le courage (''yong'' en chinois, 勇) occupe une place importante parmi les vertus cardinales mais doit toujours être subordonné à la rectitude morale (''yi'', 義) et à l'humanité (''ren'', 仁). Confucius déclare : « L'homme de bien considère la rectitude comme essentielle. L'homme de bien qui possède le courage mais manque de rectitude cause des troubles ; l'homme de peu qui possède le courage mais manque de rectitude devient un brigand »<ref>Confucius, ''Entretiens'' (''Lunyu''), XVII, 23, trad. A. Cheng, Paris, Seuil, Points Sagesses, 1981, p. 186-187</ref>. Mencius développe cette perspective en distinguant entre différentes formes de courage. Le courage inférieur, purement physique, se manifeste dans les combats et les conflits violents. Le courage supérieur consiste à préserver son cœur-esprit (''xin'', 心) intègre face aux tentations, aux pressions sociales et aux adversités<ref>Mencius, ''Œuvres complètes'', II A, 2, trad. A. Lévy, Paris, Éditions You-Feng, 2008, p. 55-59</ref>. Cette forme de courage moral requiert une cultivation intérieure constante et une pratique de l'auto-examen. La conception confucéenne du courage implique également une dimension collective. Le courage se manifeste dans la capacité à remplir ses devoirs filiaux, sociaux et politiques malgré les obstacles. Un fils fait preuve de courage en servant ses parents âgés avec dévouement, un ministre en conseillant sincèrement son souverain même au risque de sa propre sécurité, un lettré en maintenant son intégrité intellectuelle face aux pressions politiques. === Courage et non-violence === Certaines traditions philosophiques et religieuses, notamment le bouddhisme et le jaïnisme, proposent des conceptions du courage qui valorisent la non-violence (''ahimsa''). Dans le bouddhisme, le courage (''virya'' en sanskrit) constitue l'une des six perfections (''paramitas'') et désigne l'effort persévérant dans la pratique spirituelle<ref>Śāntideva, ''Bodhicaryāvatāra'' (''La Marche vers l'Éveil''), chapitre VII, trad. G. Driessens, Paris, Seuil, Points Sagesses, 2007, p. 143-167</ref>. Cette forme de courage spirituel implique la capacité à affronter ses propres illusions, attachements et peurs sans recourir à la violence. Elle requiert une force d'âme considérable pour rester non-violent face à l'agression, pour cultiver la compassion envers tous les êtres y compris ses ennemis, et pour persévérer dans la pratique méditative malgré les difficultés et les doutes. Mahatma Gandhi, s'inspirant de ces traditions, développe la conception du courage dans la non-violence active (''satyagraha''). Pour Gandhi, la non-violence n'est pas passivité ou lâcheté mais requiert un courage supérieur à celui de la violence. Il faut plus de courage pour subir les coups sans riposter que pour rendre coup pour coup<ref>Gandhi, Mohandas K., ''Hind Swaraj or Indian Home Rule'', Ahmedabad, Navajivan Publishing House, 1909, rééd. 1938, p. 88-91</ref>. Ce courage non-violent s'est illustré dans les luttes de décolonisation et les mouvements pour les droits civiques, notamment en Afrique du Sud et aux États-Unis. == Enjeux contemporains == === Courage civique et démocratie === Les démocraties contemporaines font face à la question du courage civique – la capacité des citoyens à s'engager dans les affaires publiques, à défendre leurs convictions, et à résister aux injustices malgré les risques personnels. Hannah Arendt analyse comment la peur et l'isolement sous les régimes totalitaires détruisent le courage civique nécessaire à l'action politique<ref>Arendt, Hannah, ''Les Origines du totalitarisme'', trad. J.-L. Bourget, R. Davreu et P. Lévy, Paris, Gallimard, Quarto, 1951, rééd. 2002, p. 628-651</ref>. Le courage civique contemporain se manifeste dans diverses formes : la dénonciation des abus de pouvoir, la participation aux mouvements sociaux pour la justice, la défense des minorités opprimées, et la résistance pacifique à l'autoritarisme. Ces formes de courage requièrent souvent de sacrifier son confort, sa carrière, voire sa sécurité pour des principes moraux et politiques. === Courage et vulnérabilité === Des philosophes contemporains, notamment dans les courants féministes, remettent en question les conceptions traditionnelles du courage qui valorisent l'autonomie, l'invulnérabilité et la maîtrise de soi. Ils proposent des conceptions alternatives qui reconnaissent la vulnérabilité humaine comme condition de possibilité du courage plutôt que comme son opposé. Dans cette perspective, le courage ne consiste pas à nier sa vulnérabilité mais à l'accepter et à agir malgré elle. Cela inclut le courage de demander de l'aide, d'admettre ses limites, et de reconnaître son interdépendance avec les autres. Cette conception élargie du courage résonne avec les philosophies africaines communautaires qui insistent sur la dimension relationnelle de toutes les vertus. === Courage écologique === Face à la crise climatique et environnementale, une nouvelle forme de courage émerge : le courage écologique. Il s'agit de la capacité à affronter la vérité souvent anxiogène de la dégradation environnementale, à modifier ses habitudes de vie malgré les pressions sociales et économiques, et à s'engager dans l'action collective pour la protection de l'environnement malgré l'incertitude des résultats. Ce courage écologique implique également une dimension intergénérationnelle – la volonté d'accepter des sacrifices présents pour le bien-être des générations futures. Il requiert de surmonter non seulement la peur mais aussi le déni, l'indifférence et le fatalisme face à l'ampleur des défis environnementaux. == Conclusion == Le courage demeure une vertu fondamentale dont la compréhension s'est enrichie et complexifiée au cours de l'histoire de la philosophie. Des conceptions grecques centrées sur le champ de bataille aux perspectives contemporaines englobant les dimensions civique, morale, écologique et relationnelle, le courage apparaît comme une disposition multiforme essentielle à la vie humaine épanouie. Les philosophies non-occidentales, particulièrement africaines et asiatiques, offrent des perspectives complémentaires qui soulignent les dimensions communautaires, spirituelles et cosmologiques du courage. Elles rappellent que le courage ne se limite pas à l'héroïsme individuel mais s'inscrit dans des réseaux de relations sociales et dans des visions du monde qui dépassent l'individualisme occidental. La réflexion philosophique sur le courage reste d'une actualité brûlante dans un monde confronté à de multiples crises – politiques, sociales, environnementales et existentielles. Comprendre la nature du courage, ses diverses formes, et les conditions de son développement constitue un enjeu crucial pour l'éthique et la philosophie politique contemporaines. Le courage, loin d'être une vertu archaïque réservée aux guerriers et aux héros, apparaît comme une disposition nécessaire à tout être humain qui aspire à vivre avec dignité, authenticité et engagement dans le monde. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == === Sources antiques === * Platon, ''Lachès'', in ''Œuvres complètes'', tome I, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903 ; trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950. * Platon, ''République'', livres III-IV, éd. J. Burnet ; trad. G. Leroux, Paris, GF-Flammarion, 2002. * Aristote, ''Éthique à Nicomaque'', livre III, chapitres 6-9, éd. I. Bywater, Oxford, Clarendon Press, ''Oxford Classical Texts'', 1894 ; trad. J. Tricot, Paris, Vrin, 1990 ; trad. R. Bodéüs, Paris, GF-Flammarion, 2004. * Sénèque, ''De constantia sapientis'', in ''Dialogues'', tome IV, trad. R. Waltz, Paris, Les Belles Lettres, Collection des Universités de France, 1927. * Épictète, ''Manuel'', trad. É. Bréhier, in ''Les Stoïciens'', Paris, Gallimard, Bibliothèque de la Pléiade, 1962. * Marc Aurèle, ''Pensées'', trad. P. Hadot, Paris, Les Belles Lettres, 1998. === Sources médiévales === * Thomas d'Aquin, ''Somme théologique'', IIa-IIae, questions 123-140, trad. française sous la dir. d'A.-M. Roguet, Paris, Cerf, 1985, vol. 3. * Thomas d'Aquin, ''Summa Theologiae'', texte latin dans ''Sancti Thomae Aquinatis Opera Omnia'', Commission Léonine, Rome, 1888-1906. === Sources modernes et contemporaines === * Kant, Immanuel, ''Fondements de la métaphysique des mœurs'', trad. V. Delbos, rév. A. Philonenko, Paris, Vrin, 1980. * Kant, Immanuel, ''Critique de la raison pratique'', trad. F. Picavet, Paris, PUF, Quadrige, 1943. * Nietzsche, Friedrich, ''Le Gai Savoir'', trad. P. Klossowski, Paris, Gallimard, Folio Essais, 1967. * Sartre, Jean-Paul, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946 ; rééd. Gallimard, Folio, 1996. * Camus, Albert, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942 ; rééd. Folio Essais, 1972. * Arendt, Hannah, ''Les Origines du totalitarisme'', trad. J.-L. Bourget, R. Davreu et P. Lévy, Paris, Gallimard, Quarto, 1951 ; rééd. 2002. === Philosophies non-occidentales === * Confucius, ''Entretiens'' (''Lunyu''), trad. A. Cheng, Paris, Seuil, Points Sagesses, 1981. * Mencius, ''Œuvres complètes'', trad. A. Lévy, Paris, Éditions You-Feng, 2008. * Śāntideva, ''Bodhicaryāvatāra'' (''La Marche vers l'Éveil''), trad. G. Driessens, Paris, Seuil, Points Sagesses, 2007. * Gandhi, Mohandas K., ''Hind Swaraj or Indian Home Rule'', Ahmedabad, Navajivan Publishing House, 1909 ; rééd. 1938. * Ramose, Mogobe B., ''African Philosophy through Ubuntu'', Harare, Mond Books, 1999. * Gbadegesin, Segun, ''African Philosophy: Traditional Yoruba Philosophy and Contemporary African Realities'', New York, Peter Lang, 1991. * Biko, Steve, ''I Write What I Like: A Selection of his Writings'', éd. Aelred Stubbs, Londres, Bowerdean Press, 1978. * Fanon, Frantz, ''Les Damnés de la terre'', Paris, François Maspero, 1961 ; rééd. La Découverte, 2002. * Tutu, Desmond, ''No Future Without Forgiveness'', Londres, Rider, 1999. * Mandela, Nelson, ''Long Walk to Freedom: The Autobiography of Nelson Mandela'', Boston, Little, Brown and Company, 1994. === Études contemporaines === * Broadie, Sarah et Christopher Rowe, ''Aristotle: Nicomachean Ethics: Translation, Introduction, Commentary'', Oxford, Oxford University Press, 2002. * Emlyn-Jones, Chris, « Dramatic structure and cultural context in Plato's Laches », ''Classical Quarterly'', vol. 49, n° 1, 1999, p. 123-138. * DeYoung, Rebecca, « Power Made Perfect in Weakness: Aquinas's Transformation of the Virtue of Courage », dans Astell, Ann W. et Bonnie Honecker (dir.), ''Heroic Virtue, Komplementaritaet und Transgression'', Paderborn, Wilhelm Fink Verlag, 2010, p. 133-148. {{Autocat}} ihm5uccdpl43g9r50qsa2rna7803rz8 Dictionnaire de philosophie/Convention 0 83114 767894 753614 2026-06-17T04:48:48Z PandaMystique 119061 767894 wikitext text/x-wiki {{DicoPhilo|Convention}} La '''convention''' est un concept qui désigne un accord implicite ou explicite entre des personnes ou au sein d'une communauté, servant à réguler les comportements, à faciliter la communication et à organiser la vie sociale. Loin d'être un simple arrangement pratique, la convention soulève des questions importantes sur la nature de la normativité, la distinction entre ce qui est naturel et ce qui est institué, ainsi que sur les rapports entre l'individu et le collectif. == Définition et enjeux == Une convention peut se définir comme une règle ou un usage admis par un groupe, reposant sur un accord tacite ou formulé. Elle se distingue de ce qui est imposé par la nature des choses : une convention n'est ni nécessaire logiquement, ni déterminée causalement par des faits naturels. Elle procède d'un choix collectif, qu'il soit délibéré ou progressivement sédimenté par l'usage. Le concept de convention interroge la frontière entre nature (''phusis'') et institution (''nomos'' ou ''thesis''). Dans le contexte grec antique, cette opposition structure le débat sophistique : les conventions humaines, changeantes selon les époques et les lieux, s'opposent aux lois naturelles, universelles et immuables. Cette tension traverse toute l'histoire de la philosophie, de Platon à nos jours. Les conventions se manifestent dans de multiples domaines : le langage, le droit, la morale, l'art, les pratiques sociales et politiques. Elles permettent la coordination des actions individuelles, l'établissement d'attentes partagées et la stabilisation des interactions sociales. Sans conventions, la communication et la coopération seraient impossibles ou extrêmement coûteuses. == Le langage comme convention : de Platon aux philosophies analytiques == === La théorie platonicienne et aristotélicienne === Dans le ''Cratyle'', Platon examine si les noms des choses sont donnés par nature (''phusei'') ou par convention (''thesei''). Hermogène défend la thèse conventionnaliste : les mots n'ont aucun lien naturel avec ce qu'ils désignent, leur signification résulte d'un accord arbitraire entre les locuteurs<ref>Platon, ''Cratyle'', 384d-385e, trad. L. Méridier, Paris, Les Belles Lettres, 1931, p. 52-54</ref>. Cratyle, à l'inverse, soutient que les noms reflètent l'essence des choses. Socrate explore ces deux positions sans trancher définitivement, mais suggère que si les noms étaient purement conventionnels, toute communication stable serait compromise. Aristote, dans le ''De interpretatione'', affirme explicitement que les mots sont des symboles conventionnels (''kata sunthêkên'') : « Les sons émis par la voix sont les symboles des états de l'âme, et les mots écrits les symboles des mots émis par la voix. [...] Ce sont là des symboles conventionnels »<ref>Aristote, ''De l'interprétation'', 16a3-8, trad. J. Tricot, Paris, Vrin, 1959, p. 77-78</ref>. Pour Aristote, la convention linguistique ne signifie pas l'arbitraire total : elle suppose un usage stabilisé au sein d'une communauté de locuteurs. === Les théories modernes : de Hobbes à Rousseau === Thomas Hobbes, dans le ''Léviathan'', inscrit les conventions dans sa théorie politique. Le langage lui-même est conventionnel : les mots sont des « marques » arbitraires que nous assignons aux choses pour nous en souvenir et pour communiquer<ref>Hobbes, Thomas, ''Léviathan'', I, 4, trad. F. Tricaud, Paris, Sirey, 1971, p. 25-27</ref>. Cette conventionnalité du langage s'articule à la conception hobbesienne du contrat social : l'ordre politique, comme le langage, repose sur un accord qui institue des règles communes permettant de sortir de l'état de nature. Jean-Jacques Rousseau, dans le ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' et l'''Essai sur l'origine des langues'', pose un problème crucial : comment les conventions linguistiques ont-elles pu émerger alors qu'elles semblent présupposer la capacité de communiquer qu'elles doivent précisément rendre possible ? Rousseau affirme que « la parole paraît avoir été fort nécessaire pour établir l'usage de la parole »<ref>Rousseau, Jean-Jacques, ''Discours sur l'origine de l'inégalité'', II, in ''Œuvres complètes'', vol. III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964, p. 147</ref>. Il suggère que les premières langues furent dictées non par les besoins pratiques mais par les passions : « Ce n'est ni la faim, ni la soif, mais l'amour, la haine, la pitié, la colère, qui leur ont arraché les premières voix »<ref>Rousseau, Jean-Jacques, ''Essai sur l'origine des langues'', chap. II, Paris, Flammarion, 1993, p. 59</ref>. === Le conventionnalisme contemporain : Quine et Davidson === Au XXe siècle, Willard Van Orman Quine bouleverse la conception des conventions linguistiques et scientifiques. Dans « Deux dogmes de l'empirisme », Quine rejette la distinction entre vérités analytiques (vraies par convention) et vérités synthétiques (vraies en vertu des faits)<ref>Quine, Willard Van Orman, « Two Dogmas of Empiricism », in ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953, p. 20-46</ref>. Selon lui, aucune proposition n'est vraie par pure convention : même les vérités logiques et mathématiques s'inscrivent dans un réseau holistique de croyances confronté dans son ensemble à l'expérience. Quine défend un holisme sémantique : « l'unité de signification empirique est la science dans sa globalité »<ref>Quine, W. V. O., ''Word and Object'', Cambridge (Mass.), MIT Press, 1960, p. 42</ref>. Les significations des expressions linguistiques ne sont pas déterminées isolément par des conventions stipulatives, mais par leur rôle dans la théorie globale que nous acceptons. Donald Davidson prolonge cette perspective en affirmant qu'« une phrase (et donc un mot) n'a de sens que dans le contexte d'un (tout) langage »<ref>Davidson, Donald, « Truth and Meaning », ''Synthese'', vol. 17, n° 3, 1967, p. 304-323</ref>. Ce holisme sémantique a des conséquences importantes pour la notion de convention : si les significations sont interdépendantes et si aucune proposition n'est immunisée contre la révision, alors les conventions linguistiques ne sont pas de simples stipulations arbitraires, mais des éléments d'un système global en constante évolution. == Conventions sociales et normativité == === Émile Durkheim et le fait social === Dans ''Les Règles de la méthode sociologique'', Émile Durkheim définit le fait social comme « toute manière de faire, fixée ou non, susceptible d'exercer sur l'individu une contrainte extérieure »<ref>Durkheim, Émile, ''Les Règles de la méthode sociologique'', Paris, Presses Universitaires de France, 1895, p. 14</ref>. Les conventions sociales constituent un type particulier de faits sociaux : elles ne sont pas nécessairement codifiées en lois, mais exercent néanmoins une force normative sur les individus. Pour Durkheim, les normes et conventions sociales préexistent à l'individu et s'imposent à lui comme des réalités objectives. Elles ne résultent pas d'un accord délibéré entre individus rationnels, mais émergent de la vie collective et de la solidarité sociale. Cette perspective holiste s'oppose aux conceptions contractualistes qui voient dans les conventions le résultat d'accords volontaires entre agents autonomes. === La philosophie du droit : Hart et la règle de reconnaissance === H.L.A. Hart, dans ''Le Concept de droit'' (1961), développe une théorie positiviste sophistiquée qui accorde une place centrale aux conventions sociales. Hart distingue deux types de règles juridiques : les règles primaires, qui imposent des obligations, et les règles secondaires, qui concernent la reconnaissance, la modification et l'application des règles primaires<ref>Hart, H.L.A., ''The Concept of Law'', Oxford, Clarendon Press, 1961, p. 79-99</ref>. La « règle de reconnaissance » est une convention sociale qui permet d'identifier les règles juridiques valides dans un système donné. Elle n'est pas elle-même une règle juridique valide au sens où elle ne dérive d'aucune autre règle supérieure ; elle constitue plutôt une pratique convergente des officiels du système juridique (juges, législateurs, administrateurs). Hart insiste sur la distinction entre le « point de vue interne » (celui de l'acteur qui reconnaît la normativité de la règle) et le « point de vue externe » (celui de l'observateur qui constate l'existence d'une régularité comportementale)<ref>Hart, H.L.A., op. cit., p. 88-91</ref>. Cette analyse montre que les conventions juridiques ne sont pas de simples régularités comportementales : elles comportent une dimension normative essentielle, reconnue par les participants eux-mêmes. Les conventions constituent ainsi un mode spécifique de normativité, irréductible à la fois à la contrainte physique et à l'obligation morale. == Perspectives africaines et non-occidentales == === Ubuntu et conventions communautaires === La philosophie africaine, notamment à travers le concept d'ubuntu (« une personne est une personne à travers d'autres personnes »), offre une perspective distinctive sur les conventions sociales. Contrairement aux approches individualistes dominantes en philosophie occidentale, l'ubuntu souligne la primauté ontologique de la communauté sur l'individu<ref>Ramose, Mogobe, ''African Philosophy Through Ubuntu'', Harare, Mond Books, 1999, p. 49-66</ref>. Dans cette perspective, les conventions ne sont pas des accords négociés entre individus préalablement constitués, mais des structures constitutives de la personnalité elle-même. Ifeanyi Menkiti affirme qu'en Afrique, « la communauté définit la personne comme personne, et non l'inverse »<ref>Menkiti, Ifeanyi, « Person and Community in African Traditional Thought », in Richard Wright (ed.), ''African Philosophy: An Introduction'', Lanham, University Press of America, 1984, p. 171-181</ref>. Les conventions sociales, loin d'être des contraintes externes, sont intériorisées comme des éléments constitutifs de l'identité personnelle. Cette conception communautarienne des conventions se manifeste dans le droit coutumier africain, où les règles émergent des pratiques collectives et sont validées par le consensus communautaire plutôt que par l'autorité d'un législateur central. Le principe du ''kgosi ke kgosi ka batho'' (le chef est chef grâce au peuple) illustre cette logique : l'autorité politique elle-même est fondée sur une convention sociale, un accord tacite de la communauté<ref>Wiredu, Kwasi, « Democracy and Consensus in African Traditional Politics », in Kwasi Wiredu (ed.), ''A Companion to African Philosophy'', Oxford, Blackwell, 2004, p. 435-442</ref>. === Confucianisme et conventions rituelles (li) === La philosophie confucéenne accorde une importance centrale aux conventions rituelles (''li''), qui structurent les relations sociales et politiques. Pour Confucius et ses successeurs, les rites ne sont pas de simples formalités arbitraires, mais des dispositifs qui harmonisent les relations humaines et alignent l'ordre social sur l'ordre cosmique<ref>Ames, Roger et Rosemont, Henry, ''The Analects of Confucius: A Philosophical Translation'', New York, Ballantine Books, 1998, p. 45-53</ref>. Les ''li'' englobent les cérémonies religieuses, les règles de bienséance, les protocoles politiques et les conventions sociales. Ils ne sont pas perçus comme des contraintes externes imposées à des individus autonomes, mais comme des expressions de la nature humaine correctement cultivée. Suivre les conventions rituelles, c'est actualiser son humanité (''ren'') dans des formes concrètes d'interaction sociale. Xunzi, philosophe confucéen du IIIe siècle avant notre ère, soutient que les conventions rituelles sont des créations humaines destinées à canaliser les désirs et les émotions, prévenant ainsi le chaos social<ref>Knoblock, John, ''Xunzi: A Translation and Study of the Complete Works'', Stanford, Stanford University Press, 1988-1994, vol. III, p. 18-24</ref>. Cette position, qui reconnaît explicitement le caractère artificiel des conventions tout en insistant sur leur nécessité, offre une alternative intéressante aux oppositions simples entre nature et convention. == Convention et conventionnalisme dans les sciences == === Poincaré et le conventionnalisme géométrique === Henri Poincaré, mathématicien et philosophe des sciences, défend une forme de conventionnalisme concernant les axiomes de la géométrie. Dans ''La Science et l'Hypothèse'' (1902), il soutient que les axiomes géométriques ne sont ni des vérités a priori synthétiques (comme le pensait Kant), ni des vérités empiriques déduites de l'expérience, mais des conventions commodes que nous adoptons pour organiser notre expérience spatiale<ref>Poincaré, Henri, ''La Science et l'Hypothèse'', Paris, Flammarion, 1902, p. 49-73</ref>. Pour Poincaré, choisir entre la géométrie euclidienne et les géométries non-euclidiennes n'est pas une question de vérité, mais de commodité : nous sélectionnons le système géométrique qui simplifie le plus nos lois physiques. Ce conventionnalisme modéré reconnaît que certains choix théoriques ne sont pas déterminés par les faits eux-mêmes, mais relèvent d'une décision méthodologique guidée par des critères pragmatiques. === Carnap et la tolérance logique === Rudolf Carnap, figure majeure du Cercle de Vienne, radicalise le conventionnalisme en l'étendant à la logique elle-même. Dans ''La Syntaxe logique du langage'' (1934), Carnap énonce son célèbre principe de tolérance : « En logique, il n'y a pas de morale. Chacun est libre d'édifier sa propre logique, c'est-à-dire sa propre forme de langage, comme il l'entend. Tout ce qu'on exige de lui, s'il veut en discuter avec nous, c'est qu'il fixe clairement ses méthodes »<ref>Carnap, Rudolf, ''The Logical Syntax of Language'', trad. A. Smeaton, Londres, Routledge & Kegan Paul, 1937, p. 51-52</ref>. Cette position implique que les règles logiques elles-mêmes sont conventionnelles : il n'existe pas de logique "vraie" en soi, mais seulement des systèmes formels plus ou moins adaptés à certains objectifs. Le choix d'un cadre linguistique (avec ses règles logiques et syntaxiques) est une décision pragmatique, non une découverte de vérités préexistantes. Cette conception a profondément influencé la philosophie analytique et la métaphilosophie contemporaine. == Art, symboles et conventions esthétiques == === Goodman et les systèmes symboliques === Nelson Goodman, dans ''Langages de l'art'' (1968), développe une théorie sémiotique de l'art qui accorde un rôle central aux conventions. Pour Goodman, comprendre une œuvre d'art, c'est maîtriser les conventions du système symbolique dans lequel elle s'inscrit : « Comprendre une œuvre comme symbolique, c'est l'inclure dans un langage ou un système symbolique. La syntaxe du système détermine l'identité de ses signes, sa sémantique fixe leur référence »<ref>Goodman, Nelson, ''Languages of Art'', Indianapolis, Hackett Publishing, 1976, p. 143</ref>. Les conventions artistiques régissent les modes de référence (dénotation, exemplification, expression), les critères d'identité des œuvres, et les normes d'interprétation. Par exemple, dans la peinture occidentale classique, la convention de la perspective linéaire structure notre perception de l'espace représenté ; dans la notation musicale occidentale, des conventions complexes déterminent comment un texte musical doit être interprété en sons. Goodman insiste sur le fait que ces conventions ne sont pas arbitraires au sens où elles pourraient être librement choisies par un individu isolé : elles sont ancrées dans des pratiques collectives, transmises par l'apprentissage et la participation à une tradition artistique. L'art, comme le langage, est un fait social gouverné par des conventions qui rendent possibles la création, la communication et l'appréciation esthétiques. === Symbolisme et conventions culturelles === Le mouvement symboliste, qui se développe en Europe à la fin du XIXe siècle, illustre la tension entre conventions et innovation artistique. Les symbolistes, réagissant contre le naturalisme et le réalisme, cherchent à évoquer des idées et des émotions à travers des symboles suggestifs plutôt que des représentations directes<ref>Moréas, Jean, « Le Symbolisme », manifeste publié dans ''Le Figaro'', 18 septembre 1886</ref>. Paradoxalement, cette recherche d'une expression individuelle et subjective s'appuie sur des conventions partagées : les symboles (la couleur, les formes, les motifs) n'acquièrent leur pouvoir évocateur que parce qu'ils sont reconnus et interprétés au sein d'une communauté culturelle. En Afrique, l'art traditionnel utilise des symboles et des conventions iconographiques qui codifient des significations cosmologiques, sociales et religieuses. Les masques, les sculptures, les textiles et les pagnes wax portent des messages complexes, intelligibles pour les membres de la communauté qui en connaissent les codes<ref>Constantine Petridis (ed.), ''The Language of Beauty in African Art'', Chicago, Art Institute of Chicago, 2022, p. 15-32</ref>. Ces conventions artistiques ne sont pas de simples ornements, mais des langages visuels qui participent à la transmission et à la perpétuation des valeurs culturelles. == Problèmes philosophiques contemporains == === Convention et arbitraire === Un débat persistant concerne le degré d'arbitraire des conventions. Certaines conventions semblent parfaitement arbitraires (conduire à droite ou à gauche), tandis que d'autres paraissent motivées par des considérations naturelles ou pratiques. Le linguiste Ferdinand de Saussure affirme l'arbitraire du signe linguistique : il n'existe aucun lien naturel entre le signifiant (la suite de sons) et le signifié (le concept)<ref>Saussure, Ferdinand de, ''Cours de linguistique générale'', Paris, Payot, 1916, p. 100-102</ref>. Cependant, des phénomènes comme l'iconicité (où la forme du signe ressemble à ce qu'il désigne) et les contraintes phonétiques universelles suggèrent que l'arbitraire n'est pas absolu. Cette question a des implications importantes : si les conventions sont totalement arbitraires, alors elles pourraient être modifiées à volonté ; si elles sont partiellement motivées, certaines sont peut-être plus « naturelles » ou « rationnelles » que d'autres. Cette tension traverse les débats sur la réforme linguistique, l'ingénierie sociale et la justice des institutions. === Convention et normativité === Les conventions posent un problème philosophique majeur : comment des accords arbitraires peuvent-ils engendrer des obligations ? Si une convention n'est qu'une régularité comportementale, pourquoi devrais-je la respecter ? La réponse classique invoque l'intérêt mutuel : nous avons tous intérêt à coordonner nos comportements selon des règles communes, même arbitraires. Mais cette explication utilitariste ne rend pas compte du sentiment d'obligation que nous éprouvons face aux conventions établies. David Lewis, dans ''Convention: A Philosophical Study'' (1969), propose une analyse sophistiquée des conventions comme solutions d'équilibre dans des jeux de coordination<ref>Lewis, David, ''Convention: A Philosophical Study'', Cambridge (Mass.), Harvard University Press, 1969, p. 42-68</ref>. Une convention émerge lorsque : (1) chacun se conforme à une régularité R dans des situations de coordination ; (2) chacun s'attend à ce que les autres se conforment à R ; (3) chacun préfère se conformer à R si les autres le font également ; (4) il existe une alternative à R ; (5) ces faits sont de connaissance commune. Cette analyse formelle permet de comprendre comment les conventions s'auto-entretiennent sans nécessiter une autorité externe pour les imposer. === Convention et universalité === La multiplicité des conventions à travers les cultures pose la question de l'universalité des normes. Si les pratiques morales, juridiques et linguistiques varient selon les sociétés, peut-on encore parler de vérités morales universelles ou de droits humains fondamentaux ? Le relativisme culturel s'appuie sur la diversité des conventions pour contester l'existence de normes objectives ; l'universalisme moral cherche, au contraire, à identifier des principes qui transcendent les conventions particulières. Cette tension est particulièrement vive dans les débats de philosophie politique contemporaine. Les défenseurs des droits humains universels, comme ceux consacrés par la Déclaration universelle de 1948, s'opposent aux critiques qui y voient une imposition de conventions occidentales à des cultures non-occidentales. Les philosophies africaines et asiatiques insistent sur la nécessité de reconnaître des conceptions alternatives de la personne, de la communauté et de la justice, enracinées dans leurs propres conventions culturelles. == Conclusion == La notion de convention, loin d'être un simple concept technique, touche au cœur des questions philosophiques fondamentales : la nature du langage et de la signification, le fondement de la normativité sociale et juridique, la relation entre individu et collectif, la tension entre l'universel et le particulier. De Platon à Quine, de Confucius à Durkheim, de l'ubuntu africain au conventionnalisme scientifique, les philosophies du monde entier ont exploré les multiples facettes de cette notion. Les conventions ne sont ni de pures constructions arbitraires ni des reflets immédiats de la nature : elles constituent une modalité spécifique de l'institution humaine, ancrée dans les pratiques collectives et porteuse d'une normativité irréductible. Comprendre les conventions, c'est saisir comment les êtres humains créent ensemble les structures symboliques, sociales et politiques qui rendent possible leur coexistence. L'étude philosophique des conventions invite à une forme d'étonnement socratique : ce qui nous paraît évident et naturel (parler telle langue, respecter telles règles de politesse, organiser telle institution) s'avère être le produit contingent d'accords humains, toujours susceptibles d'être interrogés, critiqués et transformés. Mais cet étonnement ne conduit pas nécessairement au relativisme ou au nihilisme : il peut aussi ouvrir la voie à une compréhension plus profonde de la créativité normative humaine et des possibilités d'émancipation qu'elle recèle. == Notes et références == {{references|colonnes=2}} == Bibliographie == * Aristote, ''De l'interprétation'', trad. J. Tricot, Paris, Vrin, 1959 * Carnap, Rudolf, ''The Logical Syntax of Language'', trad. A. Smeaton, Londres, Routledge & Kegan Paul, 1937 * Davidson, Donald, « Truth and Meaning », ''Synthese'', vol. 17, n° 3, 1967, p. 304-323 * Durkheim, Émile, ''Les Règles de la méthode sociologique'', Paris, Presses Universitaires de France, 1895 * Goodman, Nelson, ''Languages of Art'', Indianapolis, Hackett Publishing, 1976 * Hart, H.L.A., ''The Concept of Law'', Oxford, Clarendon Press, 1961 * Hobbes, Thomas, ''Léviathan'', trad. F. Tricaud, Paris, Sirey, 1971 * Lewis, David, ''Convention: A Philosophical Study'', Cambridge (Mass.), Harvard University Press, 1969 * Menkiti, Ifeanyi, « Person and Community in African Traditional Thought », in Richard Wright (ed.), ''African Philosophy: An Introduction'', Lanham, University Press of America, 1984 * Platon, ''Cratyle'', trad. L. Méridier, Paris, Les Belles Lettres, 1931 * Poincaré, Henri, ''La Science et l'Hypothèse'', Paris, Flammarion, 1902 * Quine, Willard Van Orman, « Two Dogmas of Empiricism », in ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953 * Ramose, Mogobe, ''African Philosophy Through Ubuntu'', Harare, Mond Books, 1999 * Rousseau, Jean-Jacques, ''Discours sur l'origine de l'inégalité'', in ''Œuvres complètes'', vol. III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964 * Rousseau, Jean-Jacques, ''Essai sur l'origine des langues'', Paris, Flammarion, 1993 * Saussure, Ferdinand de, ''Cours de linguistique générale'', Paris, Payot, 1916 * Wiredu, Kwasi (ed.), ''A Companion to African Philosophy'', Oxford, Blackwell, 2004 {{Autocat}} 901xn5mpu0j4qqnlvihg5ogte150y75 Dictionnaire de philosophie/État de nature 0 83126 767903 753908 2026-06-17T04:59:53Z PandaMystique 119061 767903 wikitext text/x-wiki {{DicoPhilo|État de nature}} L’expression d’« état de nature » désigne, dans la philosophie politique moderne, la condition hypothétique de l’être humain avant l’instauration de tout pouvoir politique institué, de toute loi positive et de toute organisation juridique stable. Elle s’oppose à l’[[État civil|état civil]] ou « état de société », où l’existence humaine est réglée par des institutions politiques, des lois et des droits positifs. L’« état de nature » n’est presque jamais, chez les philosophes, la description historique d’une période réellement attestée de l’humanité. Il s’agit d’une construction théorique, souvent fictionnelle, destinée à mettre en lumière ce qui fonde la légitimité du pouvoir politique, la nature des droits des individus et les raisons qui rendent nécessaire la sortie de la condition naturelle pour entrer dans un ordre civil. Chez les auteurs modernes, le concept d’état de nature est donc indissociable des théories du [[contrat social]] et du [[droit naturel]].<ref>Voir par exemple Richard Tuck, ''Natural Rights Theories: Their Origin and Development'', Cambridge, Cambridge University Press, 1979, p. 58-84, sur le rôle fondateur de l’état de nature dans le jusnaturalisme moderne.</ref> Dans ce cadre général, l’état de nature a reçu des interprétations très différentes. Chez Hobbes, il est pensé comme un état de guerre de tous contre tous, où la peur de la mort violente rend la vie humaine précaire.<ref>Thomas Hobbes, ''Léviathan : traité de la matière, de la forme et du pouvoir de la république ecclésiastique et civile'', première partie, chap. XIII, trad. François Tricaud, Paris, Sirey, 1971, p. 122-125.</ref> Chez Locke, il est au contraire un état de liberté et d’égalité régulé par la loi naturelle, mais entaché d’« inconvénients » qui justifient l’institution d’un pouvoir politique.<ref>John Locke, ''Traité du gouvernement civil'', chap. II, trad. David Mazel, éd. Simone Goyard-Fabre, Paris, GF Flammarion, 1992, p. 17-20.</ref> Chez Rousseau, il devient une hypothèse anthropologique construite pour critiquer les inégalités sociales et politiques.<ref>Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', dans ''Discours sur l’inégalité suivi de Discours sur les sciences et les arts'', éd. Blaise Bachofen et Bruno Bernardi, Paris, GF Flammarion, 2008, introduction, p. 7-34.</ref> Spinoza et Kant, chacun à leur manière, réélaborent enfin la notion pour repenser le passage du [[droit naturel]] au [[droit]] politique et au [[droit international]].<ref>Immanuel Kant, ''Doctrine du droit'', dans ''La Métaphysique des mœurs'', trad. Alexis Philonenko, Paris, Vrin, 1971, § 41-42, p. 124-130 ; Baruch Spinoza, ''Traité politique'', chap. II-III, trad. Charles Ramond, Paris, PUF, coll. « Quadrige », 2005, p. 76-101.</ref> == 1. Définition et statut conceptuel de l’état de nature == L’état de nature est d’abord défini par une opposition structurante à l’« état civil ». Dire que les hommes se trouvent en état de nature signifie qu’ils n’ont pas encore institué d’[[État]] au sens moderne, c’est-à-dire une autorité politique dotée d’un pouvoir souverain, capable d’édicter des lois obligatoires pour tous, d’exercer un monopole légitime de la coercition et d’assurer la sécurité des personnes et des biens. Dans l’état de nature, il n’existe ni tribunaux, ni police, ni administration : chacun ne dépend que de sa propre force, de sa prudence et de sa capacité à s’allier ou à se défendre. Toutefois, cette absence d’institutions ne signifie pas nécessairement absence de norme. Selon les auteurs, l’état de nature se voit régi par des « lois de nature » (Hobbes, Locke), par un droit naturel compris comme puissance (Spinoza), ou par des principes de raison qui commandent de sortir de cette condition (Kant). La question décisive devient alors la suivante : les lois ou droits de nature suffisent-ils à garantir la sécurité et la justice, ou exigent-ils la médiation d’un pouvoir politique institué ? Il faut ajouter que, pour la plupart des modernes, l’état de nature est une construction hypothétique. Hobbes lui-même ne suppose pas qu’il ait existé comme état historique universel ; il s’agit plutôt d’un modèle idéal-typique qui déduit, à partir de certains traits de la nature humaine (désirs, passions, rationalité limitée, souci de soi), ce qui résulterait de la coexistence d’individus sans pouvoir commun.<ref>Thomas Hobbes, ''Léviathan'', op. cit., chap. XIII, p. 120-123 ; voir aussi Quentin Skinner, ''Reason and Rhetoric in the Philosophy of Hobbes'', Cambridge, Cambridge University Press, 1996, p. 287-306.</ref> Locke, de son côté, admet que des « états de nature » peuvent subsister localement, dans certaines régions du monde ou dans les relations internationales, mais il s’agit alors de configurations partielles plutôt que d’un stade historique global de l’humanité.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. II, § 14, p. 25-26.</ref> Ainsi, l’état de nature n’est pas un « âge d’or » perdu, ni un simple passé révolu ; c’est un dispositif de pensée. Il sert à dégager les droits que l’homme possède en tant qu’être raisonnable avant toute convention, et à montrer pourquoi ces droits exigent, ou non, la création d’un pouvoir politique et la conclusion d’un contrat social. == 2. Genèse historique : droit naturel, guerres civiles et expansion européenne == Le thème de l’état de nature s’inscrit dans la grande tradition moderne du [[droit naturel]], inaugurée, au XVII{{e}} siècle, par Hugo Grotius et Samuel Pufendorf. Grotius, dans son ''De jure belli ac pacis'' (1625), ne décrit pas encore un « état de nature » au sens fort, mais il cherche à fonder, dans la raison humaine, un droit valable « même si Dieu n’existait pas », ce qui inaugure une conception laïcisée du droit naturel.<ref>Hugo Grotius, ''Le droit de la guerre et de la paix'', livre I, chap. I, § 10, trad. Jean Barbeyrac, Paris, PUF, coll. « Léviathan », 1999, p. 88-90.</ref> Samuel Pufendorf radicalise ce projet dans ''De jure naturae et gentium'' (1672). Il décrit un état de nature caractérisé par l’absence d’autorités établies, où les hommes, bien que naturellement sociables, vivent sans organisation politique et sont exposés à l’insécurité. L’état de nature, chez lui, n’est pas identique à la guerre, mais il est un état précaire où la paix n’est pas suffisamment garantie, ce qui impose la création d’un corps politique stable.<ref>Samuel von Pufendorf, ''Du droit de la nature et des gens'', livre II, chap. II, trad. Jean-Louis Thireau, Paris, Vrin, 1993, p. 97-118.</ref> La réflexion sur l’état de nature prend une importance décisive chez Hobbes, Locke et Rousseau dans un contexte marqué par les guerres de religion, la guerre civile anglaise et l’expansion coloniale européenne. La confrontation avec les sociétés amérindiennes, décrites comme « sans gouvernement » ou « sauvages », fournit aux Européens un matériau empirique ambigu : tantôt on y voit une confirmation d’un état de nature violent (Hobbes), tantôt l’image d’une forme de vie simple et relativement pacifique (Rousseau, certains voyageurs).<ref>Anthony Pagden, ''The Fall of Natural Man: The American Indian and the Origins of Comparative Ethnology'', Cambridge, Cambridge University Press, 1982, p. 15-46.</ref> L’état de nature devient ainsi un outil pour repenser la légitimité de l’État : s’il n’existe ni droit divin, ni hiérarchie naturelle des conditions sociales, qu’est-ce qui peut bien autoriser un homme à commander à d’autres ? La réponse contractuelle consiste à dire : l’autorité naît d’un accord libre des individus sortant de l’état de nature pour instituer un pouvoir commun. La manière dont cet accord est décrit – abandon total de droits chez Hobbes, délégation conditionnelle chez Locke, association d’égal à égal chez Rousseau – dépend directement de la conception de l’état de nature que chaque auteur adopte. == 3. Hobbes : l’état de nature comme guerre de tous contre tous == Chez Thomas Hobbes (1588-1679), l’état de nature est défini à partir d’une anthropologie pessimiste : les hommes sont naturellement égaux par leurs forces et leurs facultés, ils désirent tous des biens limités et chacun craint la mort violente. Cette égalité alimente la rivalité, la méfiance et la recherche de prééminence, de sorte que, tant qu’aucun pouvoir commun ne s’impose, « les hommes vivent sans un pouvoir commun qui les tienne en respect » et se trouvent dans une condition qui équivaut à une guerre « de chacun contre chacun » (''bellum omnium contra omnes'').<ref>Thomas Hobbes, ''Léviathan'', op. cit., chap. XIII, p. 122-125.</ref> Hobbes insiste sur le caractère total de cette guerre : elle ne se réduit pas à des combats permanents, mais décrit un état de méfiance et d’hostilité tel que chacun est prêt à user de la violence à tout moment. Dans cette condition, il n’y a ni industrie durable, ni commerce sûr, ni arts, ni science stable, ni « société » au sens plein, mais une peur constante, et la vie humaine y est exposée à la menace permanente de la mort violente.<ref>Pasquale Pasquino, « Thomas Hobbes : la condition naturelle de l’humanité », ''Revue française de science politique'', vol. 44, n{{o}} 2, 1994, p. 197-215.</ref> L’état de nature n’est cependant pas un chaos sans règle. Hobbes distingue le « droit de nature », qui est la liberté pour chacun d’user de sa puissance comme il l’entend pour se conserver, et les « lois de nature », qui sont des préceptes de raison enjoignant de rechercher la paix quand elle est possible, de renoncer à une part de son droit pour sortir de la guerre, de tenir ses engagements, etc.<ref>Thomas Hobbes, ''Léviathan'', op. cit., chap. XIV-XV, p. 126-143.</ref> Mais ces lois de nature ne sont obligatoires que « en conscience » : tant qu’il n’existe pas de pouvoir souverain pour les faire respecter, chacun reste juge de ce qui est nécessaire à sa conservation et peut toujours revenir à l’usage violent de son droit de nature. C’est pourquoi la sortie de l’état de nature prend, chez Hobbes, la forme d’une double décision rationnelle : les hommes conviennent, par contrat, de transférer leur droit de se gouverner eux-mêmes à un tiers (ou à une assemblée) qui devient souverain, et promettent de se conformer à ses lois. Le souverain n’est pas lui-même partie au contrat : il est institué par l’accord des sujets, et sa puissance doit être absolue, faute de quoi la société risque de retomber dans la guerre civile.<ref>Noël Malcolm, ''Aspects of Hobbes'', Oxford, Clarendon Press, 2002, chap. 10, p. 432-457.</ref> L’état civil n’annule pas tout trait de l’état de nature, mais il en neutralise la violence par la peur de la sanction souveraine. Enfin, Hobbes généralise cette opposition à l’échelle des relations internationales : entre États souverains, il n’existe pas d’autorité supérieure ; ils se trouvent donc, les uns à l’égard des autres, dans un état de nature, c’est-à-dire dans une situation d’hostilité latente, parfois ouverte, même si des accords et des traités peuvent ponctuellement limiter cette violence.<ref>Thomas Hobbes, ''Léviathan'', op. cit., chap. XXX, p. 382-389.</ref> == 4. Locke : l’état de nature comme liberté régie par la loi naturelle == John Locke (1632-1704) reprend le langage de l’état de nature, mais en le transformant profondément. Dans le ''Second traité du gouvernement civil'' (1690), l’état de nature est défini comme un « état de parfaite liberté » où les hommes peuvent disposer d’eux-mêmes et de leurs biens sans dépendre de la volonté d’autrui, et comme un état d’égalité où nul n’a, par nature, autorité sur un autre.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. II, § 4-6, p. 18-21.</ref> Cet état de parfaite liberté n’est pas pour autant un état de licence. Il est régi par une loi de nature, que Locke identifie à la raison, et qui prescrit à chacun de conserver sa propre vie, mais aussi celle d’autrui ; nul n’a le droit d’attenter à la vie, à la liberté ou aux biens d’un autre. Dans l’état de nature, chacun est autorisé à punir celui qui enfreint cette loi, de manière proportionnée, afin de réparer le tort et d’empêcher de futures violations.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. II, § 6-11, p. 20-26.</ref> Locke se distingue de Hobbes en séparant nettement l’état de nature et l’état de guerre. L’état de nature est un état de paix possible, où des relations de coopération (famille, échanges, promesses) peuvent exister, tandis que l’état de guerre apparaît seulement lorsqu’un individu use de violence injuste, en s’attaquant à la vie ou aux biens d’un autre.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. III, § 16-21, p. 27-32.</ref> Pourquoi alors quitter l’état de nature ? Parce que, malgré la loi de nature, cette condition comporte de graves « inconvénients » : chacun étant à la fois juge et exécuteur dans sa propre cause, les conflits risquent de dégénérer en spirale de représailles. Il n’existe ni juge impartial, ni force commune pour faire respecter les décisions. De plus, la propriété, que Locke fonde sur le travail, reste vulnérable à la convoitise d’autrui.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. V, § 25-51, p. 73-99.</ref> L’institution d’un pouvoir politique vise donc à garantir la protection des droits naturels – la vie, la liberté, la propriété – en confiant à un gouvernement la fonction de juger et de punir selon des lois publiques. Cependant, l’état civil ne dissout pas les droits naturels : ceux-ci préexistent à l’État et en limitent la légitimité. Si le gouvernement abuse de sa puissance, viole les droits des citoyens ou pervertit la fin pour laquelle il a été institué, le peuple recouvre le droit de résister et, en dernière instance, de se révolter.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. XIX, § 222-243, p. 274-298.</ref> De plus, Locke note que l’état de nature subsiste là où il n’existe pas de pouvoir commun, par exemple dans les relations entre États souverains. == 5. Rousseau : l’état de nature comme hypothèse critique de la société == Jean-Jacques Rousseau (1712-1778) reprend le vocabulaire de l’état de nature pour mieux le détourner. Dans le ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'' (1755), il ne prétend pas retracer historiquement les premiers temps de l’humanité ; il affirme au contraire que ces débuts nous sont inaccessibles et que toute description en est nécessairement hypothétique. L’état de nature est chez lui une fiction méthodique, destinée à dépouiller l’homme de tout ce qu’il doit à la société, à la culture et à la technique, afin de dégager ce qu’il y a de proprement naturel en lui.<ref>Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', op. cit., préface, p. 41-50.</ref> Rousseau s’oppose ainsi au jusnaturalisme classique, qui attribuait à la « nature humaine » des qualités déjà socialisées (raison développée, langage, passions complexes). Il propose de remonter en deçà de ces acquisitions, vers un homme solitaire, robuste, peu sujet à la réflexion, mû principalement par l’amour de soi (souci de sa propre conservation) et par la pitié (répugnance naturelle à voir souffrir ses semblables). Dans cet état, les hommes se croisent rarement ; ils connaissent peu de besoins artificiels, ne dépendent pas les uns des autres, et l’inégalité y est « à peine sensible » et sans effets sociaux durables.<ref>Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', op. cit., première partie, p. 89-115.</ref> L’état de nature, chez Rousseau, est donc relativement paisible et non guerrier. La violence et la domination apparaissent avec le développement de la société : appropriation des terres, division du travail, naissance de la propriété privée, formation de corps politiques inégaux. Le célèbre passage où Rousseau imagine le premier homme ayant enclos un terrain et déclaré « ceci est à moi » marque, dans le ''Discours'', le moment fictif où l’inégalité institutionnelle commence.<ref>Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', op. cit., seconde partie, p. 141-143.</ref> L’état civil n’est pas simplement un remède aux maux de la nature : il est aussi le lieu où ces maux se constituent. Cette analyse négative de la société ne conduit pas Rousseau à prôner un retour à l’état de nature, qu’il juge impossible et absurde. Elle nourrit plutôt une critique des institutions existantes et prépare la réflexion du ''Contrat social'', où il s’agit de concevoir une forme d’association politique qui permette à chacun d’obéir à la loi tout en ne dépendant que de lui-même, en tant que citoyen.<ref>Jean-Jacques Rousseau, ''Du contrat social'', livre I, chap. VI-VIII, éd. Bruno Bernardi, Paris, GF Flammarion, 2002, p. 69-88.</ref> La fiction de l’état de nature devient alors le point de départ d’une reconstruction normative : montrer comment les hommes pourraient instituer un ordre politique où la liberté et l’égalité, perdues dans l’histoire réelle, seraient retrouvées sous une forme nouvelle. == 6. Autres élaborations modernes : Pufendorf, Spinoza, Kant == === 6.1. Pufendorf : un état de nature précaire mais non guerrier === Samuel von Pufendorf (1632-1694), dans ''De jure naturae et gentium'', occupe une position intermédiaire entre Hobbes et Locke. Il admet que l’état de nature est un état d’égalité où nul n’a autorité naturelle sur autrui, mais il insiste sur la « sociabilité » (''socialitas'') comme inclination fondamentale de l’homme.<ref>Samuel von Pufendorf, ''Du droit de la nature et des gens'', op. cit., livre II, chap. III, p. 119-134.</ref> L’état de nature n’est pas pour lui un état de guerre permanente, mais un état de vulnérabilité, où l’absence d’autorité rend l’observation du droit naturel incertaine et les conflits difficiles à régler. Pufendorf en conclut que, bien que la société ne soit pas « naturelle » au sens strict, les hommes ont le devoir moral de sortir de l’état de nature et de fonder un corps politique afin de stabiliser les droits et d’assurer la coopération. La notion d’état de nature sert ainsi à justifier l’État comme condition d’effectivité du droit naturel. === 6.2. Spinoza : continuité entre état de nature et état civil === Chez Spinoza (1632-1677), la distinction entre ''status naturalis'' et ''status civilis'' est centrale, mais elle prend un sens particulier. Dans le ''Traité théologico-politique'' et le ''Traité politique'', Spinoza définit le droit de nature comme la puissance même de l’individu : chacun a par nature le droit de faire tout ce que sa puissance lui permet. L’état de nature est alors la situation où cette puissance individuelle n’est pas encore coordonnée par une institution commune ; chacun y décide, selon son avantage propre, de ce qui est bon ou mauvais.<ref>Baruch Spinoza, ''Traité politique'', op. cit., chap. II, § 4-9, p. 80-88.</ref> Cependant, Spinoza insiste sur le fait que l’état civil ne supprime pas le droit naturel, mais le transforme. Dans l’État bien constitué, le droit de nature n’est plus celui de l’individu isolé, mais celui de la multitude coordonnée « comme par une seule âme » ; le droit de l’État est ainsi le droit naturel même, déterminé par la puissance commune.<ref>Baruch Spinoza, ''Traité politique'', op. cit., chap. III, § 1-3, p. 92-96.</ref> La frontière entre état de nature et état civil est moins une rupture qu’un changement de forme de la puissance. Même dans l’État, certains droits – par exemple la liberté de penser – demeurent inaliénables et ne peuvent être transférés au souverain.<ref>Baruch Spinoza, ''Traité théologico-politique'', chap. XX, trad. Jacqueline Lagrée, Paris, Vrin, 1999, p. 292-305.</ref> L’état de nature conserve ainsi, chez Spinoza, une fonction critique : il rappelle que toute norme juridique repose ultimement sur des rapports de puissance et que le droit ne consiste pas en un ensemble de règles au-dessus de la nature, mais en une modalité de la puissance naturelle elle-même. === 6.3. Kant : l’état de nature comme état d’injustice à dépasser === Immanuel Kant (1724-1804), dans la ''Doctrine du droit'' (première partie de la ''Métaphysique des mœurs'', 1797), reprend la terminologie de l’état de nature, mais en lui conférant un sens strictement juridique. L’« état de nature » n’est pas chez lui un état primitif de barbarie : c’est toute situation où les rapports entre individus ne sont pas régis par des lois publiques et un pouvoir commun. Un tel état est, par définition, un « état d’injustice », non parce que les hommes y seraient nécessairement mauvais, mais parce que le droit de chacun n’y est pas objectivement garanti.<ref>Immanuel Kant, ''Doctrine du droit'', op. cit., § 42-44, p. 130-140.</ref> Kant en tire une thèse célèbre : « sortir de l’état de nature est un devoir ». La raison pratique commande que les hommes instituent un ordre civil où ce qui est « mien » et « tien » soit déterminé selon des lois publiques, sous l’autorité d’un pouvoir législatif commun. De ce point de vue, l’état de nature n’est qu’un état de droit « provisoire », toujours susceptible de devenir injuste, tandis que l’état civil est un état de droit « péremptoire », véritablement contraignant pour tous.<ref>Immanuel Kant, ''Doctrine du droit'', op. cit., § 47, p. 145-148.</ref> Kant étend cette analyse aux relations internationales : entre États souverains, il existe aussi un état de nature, puisque aucun pouvoir supérieur ne peut trancher les conflits ; cet état est lui-même un état d’injustice. D’où l’idée d’un « état juridique cosmopolitique » à atteindre, non pas sous la forme d’un État mondial, mais d’une fédération de peuples engagés vers la paix perpétuelle.<ref>Immanuel Kant, ''Vers la paix perpétuelle'', trad. Alexis Philonenko, Paris, Vrin, 1991, deuxième section, p. 73-104.</ref> == 7. Fonctions philosophiques et enjeux critiques de l’état de nature == On peut dégager plusieurs grandes fonctions philosophiques du concept d’état de nature. Il joue d’abord un rôle de fondation : en décrivant ce que seraient les rapports humains sans institutions, les philosophes cherchent à dégager les conditions de possibilité de toute vie sociale stable et à justifier la nécessité d’un pouvoir politique. Chez Hobbes et Kant, c’est la violence ou l’injustice de l’état de nature qui fonde la légitimité du passage à l’état civil. Chez Locke et Pufendorf, ce sont les inconvénients et l’insécurité de la condition naturelle qui rendent souhaitable et raisonnable l’institution de l’État.<ref>Brian Tierney, ''The Idea of Natural Rights: Studies on Natural Rights, Natural Law, and Church Law, 1150-1625'', Grand Rapids, Eerdmans, 1997, p. 291-326.</ref> L’état de nature remplit ensuite une fonction normative : il sert à définir les droits que les individus possèdent indépendamment de tout pouvoir constitué. Chez Locke, les droits naturels à la vie, à la liberté et à la propriété précèdent l’État et en limitent l’autorité ; l’état civil n’est légitime que s’il protège plus efficacement ces droits que l’état de nature.<ref>John Locke, ''Traité du gouvernement civil'', op. cit., chap. IX, § 123-131, p. 179-188.</ref> Chez Rousseau, à l’inverse, l’état de nature sert à montrer que de nombreuses inégalités tenues pour naturelles ne le sont pas, et que l’ordre social actuel est historiquement produit et donc susceptible d’être transformé.<ref>Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', op. cit., seconde partie, p. 135-165.</ref> Enfin, l’état de nature a une fonction critique. Les anthropologues contemporains, à commencer par Marshall Sahlins, ont montré que la vision hobbesienne de la vie « sauvage » comme brutale et misérable projette sur les sociétés de chasseurs-cueilleurs des catégories issues de la société marchande moderne. Dans ''Stone Age Economics'', Sahlins soutient que bien des sociétés de chasseurs-cueilleurs peuvent être qualifiées d’« sociétés d’abondance originelle », où les besoins sont relativement limités et la coopération plus stable qu’on ne le croit, ce qui remet en cause l’idée d’un état de nature intrinsèquement misérable.<ref>Marshall Sahlins, ''Stone Age Economics'', Chicago, Aldine–Atherton, 1972, chap. 1 : « The Original Affluent Society », p. 1-39.</ref> De même, les historiens des idées ont insisté sur le caractère construit et contextuel des récits de l’état de nature. Des études comme celles de Quentin Skinner ou de Pasquale Pasquino ont montré que la description hobbesienne de l’état de nature est largement informée par l’expérience de la guerre civile anglaise et par les conflits religieux de son temps.<ref>Quentin Skinner, ''Visions of Politics'', vol. 3 : ''Hobbes and Civil Science'', Cambridge, Cambridge University Press, 2002, chap. 4, p. 241-272 ; Pasquale Pasquino, art. cité, p. 197-215.</ref> Loin d’être une représentation neutre de ce que serait l’homme « en soi », l’état de nature cristallise des choix théoriques et politiques : la manière dont on imagine les hommes sans État prépare et justifie la manière dont on conçoit l’État lui-même. Ces critiques n’abolissent pas l’intérêt du concept, mais invitent à le traiter comme une construction argumentative plutôt que comme un fait. Elles conduisent certains auteurs contemporains (par exemple Rawls, avec la « position originelle ») à remplacer l’image de l’état de nature par d’autres dispositifs hypothétiques, jugés plus transparents quant à leurs présupposés et moins chargés de connotations historiques ou ethnocentriques.<ref>John Rawls, ''Théorie de la justice'', trad. Catherine Audard, Paris, Seuil, 1987, § 20-30, p. 143-214.</ref> == 8. Conclusion == L’état de nature est un concept-charnière de la philosophie politique moderne. Qu’il soit pensé comme guerre généralisée (Hobbes), comme liberté égale régie par la loi de nature (Locke), comme hypothèse anthropologique critique (Rousseau), comme puissance naturelle (Spinoza) ou comme état d’injustice à dépasser (Kant), il permet de poser, sous des formes différentes, les mêmes questions fondamentales : qu’est-ce qui fonde la légitimité de l’État ? Quels droits les individus possèdent-ils indépendamment de toute institution ? Pourquoi et à quelles conditions est-il rationnel et juste de renoncer à l’indépendance naturelle pour entrer dans un ordre civil ? En ce sens, l’état de nature n’est pas seulement une fiction du passé, mais un instrument toujours disponible pour interroger les rapports entre liberté individuelle, violence, droit et souveraineté. == Notes et références == {{references|colonnes=2}} == Bibliographie == ; Textes classiques : Thomas Hobbes, ''Léviathan : traité de la matière, de la forme et du pouvoir de la république ecclésiastique et civile'', trad. et notes par François Tricaud, Paris, Sirey, 1971. : John Locke, ''Traité du gouvernement civil'', trad. David Mazel, éd. et introduction de Simone Goyard-Fabre, Paris, GF Flammarion, 1992. : Jean-Jacques Rousseau, ''Discours sur l’origine et les fondements de l’inégalité parmi les hommes'', éd. Blaise Bachofen et Bruno Bernardi, Paris, GF Flammarion, 2008. : Samuel von Pufendorf, ''Du droit de la nature et des gens'', trad. Jean-Louis Thireau, Paris, Vrin, 1993. : Baruch Spinoza, ''Traité politique'', trad. Charles Ramond, Paris, PUF, coll. « Quadrige », 2005. : Immanuel Kant, ''Doctrine du droit'', dans ''La Métaphysique des mœurs'', trad. Alexis Philonenko, Paris, Vrin, 1971. ; Études et commentaires : Marshall Sahlins, ''Stone Age Economics'', Chicago, Aldine–Atherton, 1972. : Quentin Skinner, ''Reason and Rhetoric in the Philosophy of Hobbes'', Cambridge, Cambridge University Press, 1996. : Quentin Skinner, ''Visions of Politics'', vol. 3 : ''Hobbes and Civil Science'', Cambridge, Cambridge University Press, 2002. : Pasquale Pasquino, « Thomas Hobbes : la condition naturelle de l’humanité », ''Revue française de science politique'', vol. 44, n{{o}} 2, 1994, p. 197-215. : Brian Tierney, ''The Idea of Natural Rights: Studies on Natural Rights, Natural Law, and Church Law, 1150-1625'', Grand Rapids, Eerdmans, 1997. : Anthony Pagden, ''The Fall of Natural Man: The American Indian and the Origins of Comparative Ethnology'', Cambridge, Cambridge University Press, 1982. : John Rawls, ''Théorie de la justice'', trad. Catherine Audard, Paris, Seuil, 1987. {{autocat}} ecnh8p1tnz5hsproz2qmq7w4gcu7wuw Dictionnaire de philosophie/Consensus 0 83127 767896 753915 2026-06-17T04:50:49Z PandaMystique 119061 767896 wikitext text/x-wiki {{DicoPhilo|Consensus}} {{Wiktionnaire|consensus}} Le '''consensus''' désigne, en un sens général, l’accord d’un ensemble de personnes autour d’une position commune : une décision, une norme, une croyance, un diagnostic. Le terme vient du latin ''consensus'' (''cum'' + ''sentire'') qui signifie « sentir ensemble », « être d’accord ». En philosophie, il ne désigne pas simplement le fait que « tout le monde pense la même chose », mais un type particulier d’accord, dont il faut analyser les conditions, la valeur et les limites : consensus conscient ou implicite, rationnel ou produit de la contrainte, provisoire ou présenté comme définitif. Le consensus est ainsi au croisement de plusieurs domaines : philosophie politique (légitimité des institutions, démocratie), sociologie (intégration sociale, « conscience collective »), théorie de la connaissance (consensus scientifique, vérité), théorie critique (hégémonie, domination symbolique). Les débats contemporains opposent grossièrement deux grandes orientations : une approche qui voit dans le consensus l’horizon souhaitable de la raison publique et du dialogue, et une approche critique qui souligne le risque d’un « consensus imposé » masquant les conflits sociaux réels. == Sens courant et distinctions conceptuelles == Dans l’usage ordinaire, le mot « consensus » est souvent confondu avec d’autres notions proches qu’il importe de distinguer. L’''unanimité'' désigne une convergence totale : tous sont d’accord, sans exception. Le consensus, lui, peut être moins strict : il suffit que chacun accepte une position commune, même si certains conservent des réserves ou des désaccords secondaires. On parle parfois de « consensus pragmatique » quand l’accord porte surtout sur la nécessité de décider et d’avancer, plus que sur la pleine adhésion à la proposition adoptée. Le '''consentement''' renvoie plutôt à l’acte individuel par lequel un sujet approuve ou accepte quelque chose (un contrat, une intervention médicale). Le consensus est un résultat collectif : il suppose une certaine convergence, explicite ou tacite, des consentements individuels. Enfin, le consensus se distingue du simple ''conformisme'' : dans ce dernier cas, les individus se contentent de suivre ce que « tout le monde fait ou dit », par imitation ou peur de la sanction, sans examen critique. Un consensus digne de ce nom suppose au moins un minimum de discussion, de délibération et de raisons partagées, même si, en pratique, la frontière entre consensus réfléchi et alignement conformiste peut être très floue. Cette ambiguïté nourrit les critiques : parler de « consensus » peut servir à légitimer une position dominante comme si elle était le fruit d’un accord libre et rationnel, alors qu’elle résulte parfois de rapports de force, d’inégalités sociales ou d’une véritable « fabrication » de l’opinion. == Consensus et contrat social == L’idée de consensus occupe une place centrale dans les théories modernes du ''contrat social''. À partir du XVII<sup>e</sup> siècle, la légitimité de l’ordre politique n’est plus fondée sur un ordre naturel ou religieux, mais sur un accord des gouvernés. Chez [[Thomas Hobbes]], la paix civile résulte d’un ''pacte'' par lequel les individus abandonnent leur droit de se gouverner eux-mêmes au profit d’un souverain absolu, afin d’échapper à la « guerre de tous contre tous ».<ref>{{Ouvrage|lang=fr|prénom=Thomas|nom=Hobbes|titre=Le Léviathan|traducteur=François Tricaud|lieu=Paris|éditeur=GF-Flammarion|année=2000|pages=143-168|chapitre=II, chap. 17-18, « De la cause, de la génération et de la définition de l’État »}}</ref> Il y a bien un accord, mais celui-ci est motivé par la peur et organisé de manière telle qu’aucun désaccord ultérieur ne puisse justifier la résistance au souverain. On est donc loin d’un consensus permanent, continuellement révisable par la délibération publique. [[John Locke]] conserve la référence au consentement comme fondement de l’autorité politique, mais insiste sur le caractère limité du pouvoir politique et sur le droit de résistance en cas de violation des droits naturels (propriété, liberté, vie).<ref>{{Ouvrage|lang=fr|prénom=John|nom=Locke|titre=Deux Traités du gouvernement|traducteur=Jacques de Monnerot|lieu=Paris|éditeur=Vrin|année=1994|pages=175-214|passage=Deuxième traité, chap. VIII, « De l’origine des sociétés politiques »}}</ref> Le consensus visé est moins un accord ponctuel qu’une approbation continue des gouvernés, qui peut se retirer si le gouvernement trahit la confiance accordée. [[Jean-Jacques Rousseau]] radicalise la question en introduisant la distinction entre ''volonté générale'' et ''volonté de tous''. La volonté générale n’est pas la simple addition des opinions individuelles ; elle exprime ce qui est conforme à l’intérêt commun. On peut dès lors avoir un consensus d’opinions (tout le monde pense la même chose) qui n’exprime pas l’intérêt général, et, inversement, une loi conforme à la volonté générale que certains contestent.<ref>{{Ouvrage|lang=fr|prénom=Jean-Jacques|nom=Rousseau|titre=Du contrat social|éditeur=GF-Flammarion|lieu=Paris|année=2012|pages=69-92|passage=livre II, chap. 3-4, « Si la volonté générale peut errer »}}</ref> Rousseau met ainsi en garde contre une identification naïve entre accord majoritaire et légitimité : un consensus apparent peut être le résultat de factions, de clientélisme, de manipulation. Dans ces théories, le consensus n’est donc pas seulement un état de fait sociologique, mais un critère de légitimité : un pouvoir ''juste'' doit pouvoir être rattaché, d’une manière ou d’une autre, à un accord des gouvernés. Toute la difficulté est alors de savoir comment distinguer un consensus authentique d’un accord obtenu sous la contrainte, l’ignorance ou l’illusion. == Consensus social et intégration : Durkheim et le fonctionnalisme == Avec [[Émile Durkheim]], la question du consensus se déplace vers la sociologie. Durkheim cherche à comprendre ce qui fait tenir ensemble une société. Dans ''De la division du travail social'', il distingue deux formes de solidarité : la solidarité ''mécanique'' et la solidarité ''organique''.<ref>{{Ouvrage|lang=fr|prénom=Émile|nom=Durkheim|titre=De la division du travail social|éditeur=PUF|collection=Quadrige|lieu=Paris|année=2013|pages=73-90|passage=Livre I, chap. II, « Solidarité mécanique ou par similitudes »}}</ref> Dans les sociétés à solidarité mécanique, la cohésion repose sur une ''conscience collective'' forte : un ensemble de croyances et de valeurs partagées qui s’imposent à chacun. Le consensus y est massif, mais il est aussi rigide : la déviance est sévèrement sanctionnée, souvent de manière ''répressive''. Dans les sociétés modernes, à solidarité organique, la division du travail se développe, les individus se différencient, la conscience collective perd de son emprise directe. Le consensus ne disparaît pas, mais il se reconfigure : il porte davantage sur quelques principes généraux (droit, morale, institutions centrales), tandis que les formes de vie particulières se diversifient. Durkheim ne voit pas dans le consensus une simple façade idéologique ; il y voit une condition réelle de la cohésion sociale. Mais sa perspective ouvre aussi la voie à une interrogation critique : qui produit ce consensus, par quelles institutions (école, Église, médias, droit) et au bénéfice de qui ? Les sociologies fonctionnalistes ultérieures, comme celle de [[Talcott Parsons]], insistent sur le rôle intégrateur des « valeurs communes », au risque parfois de naturaliser un ordre social qui reste traversé par la conflictualité et les intérêts de classe. C’est précisément ce que soulignera la tradition marxiste. Avec [[Antonio Gramsci]], le consensus cesse d’être purement « moral » ou « culturel » : il devient une dimension de la ''domination''. La classe dominante ne se maintient pas seulement par la force ; elle obtient aussi un '''consentement''' actif des groupes subalternes, en façonnant les représentations, les valeurs et les attentes au moyen de l’école, de la presse, des Églises, des institutions culturelles. C’est ce que Gramsci appelle ''hégémonie''.<ref>{{Ouvrage|lang=fr|prénom=Antonio|nom=Gramsci|titre=Cahiers de prison|traducteur=Gérard Bouchet|éditeur=Gallimard|collection=Bibliothèque de philosophie|lieu=Paris|année=1996|pages=251-275|passage=« Notes sur Machiavel, sur la politique et sur le prince moderne »}}</ref> Le consensus social n’est alors jamais neutre : il est traversé par les rapports de force, par les stratégies des classes dominantes visant à présenter leurs intérêts particuliers comme universels. == Consensus démocratique et pluralisme libéral : Rawls == Le libéralisme politique contemporain prend acte d’un fait majeur : les sociétés modernes sont pluralistes, traversées par des doctrines religieuses, morales et philosophiques incompatibles. L’enjeu n’est plus de faire disparaître le désaccord, mais de savoir s’il est possible de dégager un ''consensus politique'' minimal, suffisant pour stabiliser les institutions démocratiques. [[John Rawls]] propose à cet égard l’idée de « consensus par recoupement » (''overlapping consensus''). Dans ''Libéralisme politique'', il soutient que des citoyens porteurs de convictions très différentes peuvent néanmoins s’accorder sur une même conception politique de la justice, pour des raisons qui restent internes à leurs doctrines respectives.<ref>{{Ouvrage|lang=fr|prénom=John|nom=Rawls|titre=Libéralisme politique|traducteur=Catherine Audard|éditeur=PUF|lieu=Paris|année=1995|pages=182-223|passage=Leçon IV, « Le consensus par recoupement »}}</ref> Le consensus visé est donc ''spécifique'' : il porte sur un ensemble limité de principes politiques (libertés fondamentales, égalité des droits, priorité du juste sur le bien), et non sur une conception exhaustive de la vie bonne. Il ne suppose pas que les désaccords moraux ou religieux disparaissent ; il exige seulement que les citoyens acceptent, pour les questions de justice fondamentale, de faire appel à des ''raisons publiques'' accessibles à tous. Rawls oppose ce consensus à un simple ''modus vivendi'' : un compromis fragile entre groupes d’intérêts, qui tiendrait seulement tant que le rapport de forces reste inchangé. Le consensus par recoupement, lui, est censé être ''stable pour les bonnes raisons'', parce qu’il s’enracine dans les convictions profondes des citoyens. Reste à savoir si un tel consensus est véritablement atteignable dans des sociétés traversées par des inégalités économiques et symboliques : l’égalité formelle des voix n’efface pas la disproportion réelle des moyens d’influence. == Consensus communicationnel et rationalité : Habermas == La pensée de [[Jürgen Habermas]] occupe une place centrale dans les théories contemporaines du consensus. Dans ''Théorie de l’agir communicationnel'', il propose de reconcevoir la rationalité non plus à partir du sujet isolé, mais à partir de l’''interaction linguistique'' orientée vers l’''entente'' (''Verständigung'').<ref>{{Ouvrage|lang=fr|prénom=Jürgen|nom=Habermas|titre=Théorie de l’agir communicationnel, t. 1. Rationalité de l’action et rationalisation de la société|traducteur=Jean-Marc Ferry|éditeur=Fayard|lieu=Paris|année=1987|pages=73-114}}</ref> Habermas distingue l’agir ''communicationnel'', où les acteurs cherchent un accord sur la base de raisons, de l’agir ''stratégique'', où chacun tente de manipuler les autres pour atteindre ses propres fins. Dans la communication ordinaire, nous présupposons déjà certaines normes : que chacun dise ce qu’il croit vrai, qu’il soit sincère, qu’il respecte la possibilité de répondre et de contester. Ces présupposés renvoient à l’idée d’une ''situation de parole idéale'' : un cadre dans lequel tous les participants auraient un accès égal à la parole, pourraient remettre en cause n’importe quelle affirmation, et ne subiraient aucune contrainte autre que celle « du meilleur argument ». Sur cette base, Habermas développe une ''éthique de la discussion'' : une norme morale n’est valable que si elle peut faire l’objet d’un accord rationnel entre tous les concernés, dans un discours pratique où chacun peut faire valoir ses intérêts et ses arguments.<ref>{{Ouvrage|lang=fr|prénom=Jürgen|nom=Habermas|titre=Morale et communication|traducteur=Christian Bouchindhomme|éditeur=Cerf|collection=Humanités|lieu=Paris|année=1986|pages=87-126}}</ref> Le consensus n’est pas ici un simple fait (tout le monde est d’accord), mais un ''idéal régulateur'': il oriente la critique des institutions existantes, des procédures de décision, des rapports de pouvoir qui perturbent les conditions du dialogue. Cette conception a un aspect émancipateur évident : elle fournit un critère pour juger des procédures démocratiques (transparentes ou opaques, inclusives ou excluantes). Mais elle soulève aussi des difficultés : les inégalités sociales réelles (de temps, d’éducation, de ressources économiques, d’accès aux médias) rendent illusoire l’idée d’une situation de parole réellement symétrique. Habermas reconnaît ces limites empiriques, mais maintient qu’un certain ''noyau normatif'' de la communication (l’exigence de justifier, de répondre, de faire droit au point de vue d’autrui) reste irréductible. == Critiques du modèle consensualiste == Plusieurs courants contemporains contestent le primat du consensus comme idéal politique ou éthique. === Hégémonie et consentement : Gramsci === On l’a vu, [[Antonio Gramsci]] interprète le consensus comme l’un des instruments fondamentaux de la domination. L’hégémonie ne consiste pas à imposer des idées par la seule propagande ; elle suppose un travail patient d’organisation, d’éducation, de diffusion de visions du monde qui rendent ''évidentes'' les positions de la classe dominante, comme si elles allaient de soi.<ref>{{Ouvrage|lang=fr|prénom=Antonio|nom=Gramsci|titre=Textes|sous-titre=Culture et littérature|traducteur=André Tosel|éditeur=Éditions sociales|lieu=Paris|année=1975|pages=141-161}}</ref> Le consensus n’est alors jamais neutre : il exprime une ''direction morale et intellectuelle'' assurée par certains groupes sur l’ensemble de la société. Parler de « consensus national » peut servir à disqualifier comme « extrémistes » ou « irréalistes » les forces qui contestent la domination existante. À l’inverse, une stratégie d’émancipation passe par la construction d’une ''contre-hégémonie'', capable de disputer à la classe dominante le monopole de la définition du « bon sens ». === L’illusion du consensus : Mouffe, Arendt, Rancière === Dans le sillage de cette critique, plusieurs auteurs insistent sur l’importance du ''conflit'' en politique. [[Chantal Mouffe]] parle ainsi d’''illusion du consensus'' pour désigner les projets qui visent à dépasser le clivage entre gauche et droite et à réduire la démocratie à une simple gestion technique des affaires publiques. Selon elle, une démocratie vivante suppose des oppositions réelles entre projets, des affrontements symboliques entre « adversaires » ; vouloir effacer ces lignes de conflit revient à produire une forme de ''post-politique'' qui interdit l’expression des antagonismes sociaux.<ref>{{Ouvrage|lang=fr|prénom=Chantal|nom=Mouffe|titre=L’illusion du consensus|traducteur=Pauline Colonna d’Istria|éditeur=Albin Michel|lieu=Paris|année=2016|pages=17-60}}</ref> Dans une veine proche, [[Hannah Arendt]] souligne que la politique naît de la ''pluralité'' humaine : du fait que nous ne voyons jamais le monde depuis le même point de vue. Un espace public véritable n’est pas un lieu où l’on recherche à tout prix l’accord, mais un lieu où l’on ''apparaît'' devant les autres, où l’on discute, où l’on prend le risque d’être contredit. Un consensus trop vite proclamé risque de signifier que la parole a été étouffée avant même de pouvoir se déployer.<ref>{{Ouvrage|lang=fr|prénom=Hannah|nom=Arendt|titre=Qu’est-ce que la politique ?|traducteur=Sylvie Courtine-Denamy|éditeur=Points Seuil|lieu=Paris|année=1995|pages=71-95}}</ref> [[Jacques Rancière]] va plus loin en opposant ''police'' et ''politique''. La « police » désigne l’ordre qui distribue les places, les fonctions, les temps de parole ; la « politique » surgit lorsqu’un groupe qui n’était pas compté comme interlocuteur légitime se met à parler et à revendiquer sa part. Du point de vue de l’ordre établi, ce surgissement apparaît comme un trouble, un ''dissensus''. Vouloir « faire consensus » à tout prix peut alors signifier : ramener ce trouble dans les formes acceptables de l’ordre existant.<ref>{{Ouvrage|lang=fr|prénom=Jacques|nom=Rancière|titre=La Mésentente. Politique et philosophie|éditeur=Galilée|lieu=Paris|année=1995|pages=27-52}}</ref> === Consensus, opinion publique et domination symbolique : Bourdieu === Enfin, la sociologie de [[Pierre Bourdieu]] apporte une critique précise de la notion d’''opinion publique'' comme consensus mesurable. Dans un article célèbre, il affirme que « l’opinion publique n’existe pas » au sens d’un ensemble cohérent, homogène et stable de jugements partagés par tous.<ref>{{Article|lang=fr|prénom=Pierre|nom=Bourdieu|titre=L’opinion publique n’existe pas|périodique=Les Temps modernes|année=1973|volume=29|numéro=318|pages=1292-1309}}</ref> Les sondages supposent que tout le monde peut avoir une opinion sur tout, que toutes les opinions se valent, et qu’il existe un accord minimal sur les questions qui méritent d’être posées. Or ces présupposés sont eux-mêmes le résultat de rapports de pouvoir. Pour Bourdieu, ce qu’on appelle « consensus » est souvent un effet de ''doxa'', c’est-à-dire de croyances tacitement admises, intériorisées au point de n’être plus perçues comme des croyances, mais comme « la réalité même ». L’illusion du consensus cache la structure de domination qui distribue inégalement les ressources symboliques : le langage légitime, les catégories de pensée légitimes, le temps et les lieux où il est possible de se faire entendre. == Consensus scientifique et vérité == Dans les discours contemporains, on invoque fréquemment le ''consensus scientifique'' pour défendre certaines thèses (sur le climat, les vaccins, l’évolution, etc.). La question philosophique est alors double : en quel sens peut-on parler de consensus dans la science, et quel lien ce consensus entretient-il avec la vérité ? [[Thomas Kuhn]] a montré, dans ''La Structure des révolutions scientifiques'', que la science « normale » se développe en régime de ''consensus paradigmatique'' : les membres d’une même communauté scientifique partagent des exemples, des théories, des méthodes qui définissent un ''paradigme''. Tant que ce paradigme fonctionne, la recherche consiste à résoudre des énigmes à l’intérieur du cadre admis ; le consensus est alors très fort.<ref>{{Ouvrage|lang=fr|prénom=Thomas S.|nom=Kuhn|titre=La Structure des révolutions scientifiques|traducteur=Laure Meyer|éditeur=Flammarion|collection=Champs|lieu=Paris|année=1983|pages=37-76}}</ref> Ce consensus peut cependant être remis en cause en période de crise, lorsque s’accumulent les anomalies que le paradigme ne parvient plus à intégrer. Les épistémologies sociales contemporaines insistent, de leur côté, sur le fait que la connaissance scientifique est un produit collectif. Pour [[Helen Longino]], l’objectivité ne réside pas dans la neutralité supposée de l’individu, mais dans la possibilité de soumettre les hypothèses à une ''critique intersubjective'' dans des forums ouverts, où différents points de vue peuvent s’exprimer.<ref>{{Ouvrage|lang=en|prénom=Helen|nom=Longino|titre=Science as Social Knowledge. Values and Objectivity in Scientific Inquiry|éditeur=Princeton University Press|lieu=Princeton|année=1990|pages=62-89}}</ref> Le consensus scientifique acceptable n’est pas celui qui résulte d’une exclusion des voix minoritaires, mais celui qui se stabilise après un examen public suffisamment rigoureux. Cependant, la revendication de « pluralisme scientifique » peut aussi servir à relativiser n’importe quel résultat pour des motifs idéologiques, en mettant artificiellement sur le même plan des théories massivement confirmées et des positions marginales soutenues par des groupes intéressés. Le problème n’est donc pas de choisir entre consensus ou dissensus, mais de construire des institutions qui permettent d’articuler confrontation critique et stabilisation provisoire des accords. == Bilan philosophique == L’examen de la notion de consensus montre qu’elle est profondément ambivalente. D’un côté, sans un minimum de consensus, aucune société ne peut fonctionner : il faut bien des accords, au moins présupposés, sur le sens des mots, la valeur des promesses, la validité des procédures, la dignité des personnes. De ce point de vue, la critique purement négative du consensus conduit à une impasse : un monde sans aucun accord serait un monde sans langage commun, sans droit, sans institutions stables. De l’autre côté, le consensus ne peut être tenu pour l’horizon indiscutable de la raison politique ou morale. Les analyses de Gramsci, de Bourdieu, de Mouffe, de Rancière, mais aussi, indirectement, de Durkheim lui-même, montrent que les « accords » sont toujours situés : ils cristallisent des rapports de force, les effets de la socialisation, le poids des institutions. Il existe des consensus oppressifs, des consensus de façade, des consensus produits par la peur, la fatigue, ou l’absence d’alternative visible. On peut alors esquisser une ''critique du consensus'' qui ne soit pas une apologie du chaos. Une telle critique invite à se demander, chaque fois que l’on invoque le consensus : * Qui parle au nom du consensus ? Qui est inclus ou exclu du cercle de ceux qui comptent ? * Quelles conditions sociales, économiques et symboliques rendent possible ou impossible une participation réelle à la délibération ? * Quelles sont les voix réduites au silence, les questions impossibles à poser, les intérêts présentés comme « naturels » ou « évidents » ? Au terme de ce parcours, le consensus apparaît moins comme une valeur en soi que comme un ''problème'' : il doit être justifié, interrogé, reconstruit. L’exigence démocratique peut alors se formuler ainsi : non pas abolir tout consensus, mais faire en sorte que les accords collectifs soient le résultat de procédures aussi inclusives que possible, toujours révisables, et constamment exposées à la critique des dominés. C’est à cette condition que le mot « consensus » pourra désigner autre chose qu’un masque respectable apposé sur des rapports de force. == Notes et références == {{references|colonnes=2}} == Bibliographie == * ARENDT Hannah, ''Qu’est-ce que la politique ?'', trad. Sylvie Courtine-Denamy, Paris, Seuil, coll. « Points Essais », 1995. * BOURDIEU Pierre, « L’opinion publique n’existe pas », ''Les Temps modernes'', n° 318, janvier 1973, repris dans ''Questions de sociologie'', Paris, Minuit, 1980. * DURKHEIM Émile, ''De la division du travail social'', Paris, PUF, coll. « Quadrige », 2013 (1<sup>re</sup> éd. 1893). * GRAMSCI Antonio, ''Cahiers de prison'', trad. Gérard Bouchet, Paris, Gallimard, coll. « Bibliothèque de philosophie », 1996. * HABERMAS Jürgen, ''Théorie de l’agir communicationnel, t. 1. Rationalité de l’action et rationalisation de la société'', trad. Jean-Marc Ferry, Paris, Fayard, 1987. * HABERMAS Jürgen, ''Morale et communication'', trad. Christian Bouchindhomme, Paris, Cerf, coll. « Humanités », 1986. * KUHN Thomas S., ''La Structure des révolutions scientifiques'', trad. Laure Meyer, Paris, Flammarion, coll. « Champs », 1983. * LONGINO Helen, ''Science as Social Knowledge. Values and Objectivity in Scientific Inquiry'', Princeton, Princeton University Press, 1990. * MOUFFE Chantal, ''L’illusion du consensus'', trad. Pauline Colonna d’Istria, Paris, Albin Michel, 2016. * RAWLS John, ''Libéralisme politique'', trad. Catherine Audard, Paris, PUF, 1995. * RANCIÈRE Jacques, ''La Mésentente. Politique et philosophie'', Paris, Galilée, 1995. * ROUSSEAU Jean-Jacques, ''Du contrat social'', Paris, GF-Flammarion, 2012. == Articles connexes == * {{Page|Accord}} * {{Page|Contrat social}} * {{Page|Démocratie délibérative}} * {{Page|Dissensus}} * {{Page|Hégémonie}} * {{Page|Opinion publique}} * {{Page|Raison publique}} * {{Page|Vérité}} {{autocat}} 1zs5x31to8b79mr6p7d6379qkdkkrw4 Dictionnaire de philosophie/Empédocle 0 83144 767905 764915 2026-06-17T05:02:39Z PandaMystique 119061 /* Notes et références */ 767905 wikitext text/x-wiki {{DicoPhilo|Empédocle}} == I. Biographie et contexte historique == Empédocle naît à Agrigente (en grec Akragas, en latin Agrigentum, l'actuelle Agrigento) vers 492-490 av. J.-C.<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 51-52 ; Apollodore, ''Chronologie'' (''FGrHist'' 244 F 33)</ref>. Les dates exactes de sa naissance et de sa mort demeurent incertaines, les témoignages anciens divergeant sur ces questions fondamentales. La datation communément admise place sa naissance autour de 492-490 av. J.-C., se fondant sur le témoignage d'Aristote rapporté par Simplicius, selon lequel Empédocle naquit peu après Anaxagore, lui-même né vers 500 av. J.-C.<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', 25, 19 (éd. Diels, ''CAG'' IX) ; Aristote, ''Métaphysique'', I, 3, 984a11</ref>. Cette datation s'accorde avec la victoire olympique remportée par son grand-père, également nommé Empédocle, lors de la 71{{e}} olympiade (496-495 av. J.-C.)<ref>Diogène Laërce, VIII, 51 ; Ératosthène cité par Apollodore</ref>, événement qui permet d'ancrer la famille d'Empédocle dans le temps avec une relative certitude. La cité d'Agrigente, fondée vers 580 av. J.-C. par des colons venus de Géla, eux-mêmes descendants de Rhodiens et de Crétois, constituait à l'époque d'Empédocle l'une des plus riches et des plus puissantes colonies grecques de Sicile, rivalisant avec Syracuse en splendeur et en influence<ref>Thucydide, ''Histoire de la guerre du Péloponnèse'', VI, 4, 1-4 ; Pindare, ''Pythiques'', XII, 1-2</ref>. Située sur la côte méridionale de la Sicile, entre deux fleuves, l'Hypsos et l'Akragas, la ville s'élevait sur une colline qui lui servait d'acropole naturelle. Pindare la qualifiait de « la plus belle des cités mortelles »<ref>Pindare, ''Pythiques'', XII, 2</ref>, témoignage de l'éclat qu'elle avait acquis au cours du V{{e}} siècle av. J.-C. La fertilité exceptionnelle du territoire environnant, produisant céréales, huile d'olive et vin en abondance, ainsi que l'élevage florissant, avaient contribué à l'enrichissement rapide de la cité. Selon certaines estimations rapportées par Diodore de Sicile, la population atteignait deux cent mille habitants, dont vingt mille citoyens à part entière<ref>Diodore de Sicile, ''Bibliothèque historique'', XIII, 84, 3 (ces chiffres sont considérés comme exagérés par les historiens modernes)</ref>. Empédocle appartient à une famille aristocratique d'Agrigente, dont la richesse et la notoriété sont solidement établies. Son grand-père paternel, Empédocle, s'était illustré dans les courses de chevaux, remportant la victoire dans l'épreuve du quadrige aux Jeux olympiques de 496 av. J.-C.<ref>Diogène Laërce, VIII, 51 ; Ératosthène cité par Apollodore</ref>. Cette victoire, qui conférait un prestige considérable à toute la famille, témoigne de la fortune dont disposaient les Emménides – le clan auquel appartenait Empédocle<ref>Héraclide du Pont, ''Des maladies'' (''περὶ νόσων''), cité par Diogène Laërce, VIII, 57</ref>. Son père, Méton, joua vraisemblablement un rôle important dans la vie politique agrigentine, participant probablement au renversement du tyran Thrasydée en 472-471 av. J.-C. et à l'établissement d'un gouvernement démocratique<ref>Diogène Laërce, VIII, 63-64 ; Timée de Tauroménion, ''Histoires de Sicile'', livres XI-XII (''FGrHist'' 566 F 93-94)</ref>. Le contexte politique dans lequel grandit Empédocle se caractérise par une succession de bouleversements majeurs. Après une période de domination du tyran Phalaris (vers 570-554 av. J.-C.), qui s'était rendu célèbre par sa cruauté légendaire, Agrigente connut une phase de gouvernement oligarchique dominé par une « Assemblée des Mille », institution aristocratique regroupant les citoyens les plus fortunés. En 488 av. J.-C., Théron, membre de la famille des Emménides, s'empara du pouvoir et instaura une tyrannie qui dura jusqu'à sa mort en 472 av. J.-C.<ref>Diodore de Sicile, XI, 48-53 ; Hérodote, VII, 165-166</ref>. Le règne de Théron fut généralement considéré comme éclairé, les sources littéraires grecques louant sa sagesse et sa modération<ref>Pindare, ''Olympiques'', II et III</ref>. Allié de Gélon, tyran de Syracuse, Théron contribua de manière décisive à la victoire des Grecs de Sicile sur les Carthaginois à la bataille d'Himère en 480 av. J.-C., victoire qui assura la sécurité et la prospérité d'Agrigente pour plusieurs décennies<ref>Hérodote, VII, 165-167 ; Diodore de Sicile, XI, 20-24</ref>. À la mort de Théron, son fils Thrasydée (en grec Thrasydaios) lui succéda. Contrairement à son père, Thrasydée se montra violent, despotique et incompétent<ref>Diogène Laërce, VIII, 66 ; Timée, ''Histoires'', livre XIV (''FGrHist'' 566 F 94)</ref>. Déjà gouverneur d'Himère sous l'autorité de son père, il s'était attiré la haine des populations locales par sa brutalité. Devenu maître d'Agrigente, il engagea inconsidérément une guerre contre Hiéron I{{er}} de Syracuse, guerre qui se solda par une défaite sanglante<ref>Diodore de Sicile, XI, 53, 1-5</ref>. Profitant de ce désastre militaire, les Agrigentins se soulevèrent et chassèrent Thrasydée en 472-471 av. J.-C. Le tyran déchu s'enfuit en Grèce continentale, fut arrêté à Mégare et exécuté publiquement<ref>Diogène Laërce, VIII, 66 ; Polyen, ''Stratagèmes'', V, 6</ref>. C'est dans ce contexte de bouleversement politique et d'instauration d'un régime démocratique qu'Empédocle, alors âgé d'une vingtaine d'années, fit son entrée dans la vie publique. L'environnement intellectuel et culturel dans lequel se forma Empédocle était d'une richesse exceptionnelle. Agrigente attirait poètes, dramaturges et penseurs venus de toute la Grèce. Pindare, le plus célèbre poète lyrique de son temps, séjourna à Agrigente et y composa plusieurs odes en l'honneur de Théron<ref>Pindare, ''Olympiques'', II et III ; ''Pythiques'', VI</ref>. Eschyle, le grand tragique athénien, se rendit également en Sicile et mourut à Géla vers 456 av. J.-C.<ref>Vie anonyme d'Eschyle</ref>. Plus importante encore fut l'influence des courants philosophiques qui circulaient en Grande-Grèce et en Sicile au début du V{{e}} siècle av. J.-C. Bien qu'il soit chronologiquement improbable qu'Empédocle ait personnellement rencontré Xénophane de Colophon, il connut indubitablement son œuvre, qui critiquait vigoureusement l'anthropomorphisme religieux traditionnel<ref>Xénophane, fragments 11-16 (DK 21 B 11-16)</ref>. L'influence de Parménide d'Élée sur Empédocle fut considérable tant sur le plan stylistique que conceptuel : le poème de Parménide, avec sa distinction entre la voie de la vérité et la voie de l'opinion, fournit à Empédocle un modèle formel et un cadre problématique<ref>Théophraste cité par Diogène Laërce, VIII, 55-56</ref>. Les liens d'Empédocle avec le pythagorisme sont complexes et controversés. Selon Timée de Tauroménion, historien sicilien du IV{{e}}-III{{e}} siècle av. J.-C., Empédocle fut disciple de Pythagore, mais en fut exclu pour plagiat (logoklopia), accusé d'avoir divulgué publiquement des enseignements tenus secrets par l'école pythagoricienne<ref>Timée cité par Diogène Laërce, VIII, 54-55</ref>. Cependant, l'anachronisme chronologique rend impossible une telle filiation directe : Pythagore mourut vers 495 av. J.-C., année même où naquit probablement Empédocle. Il est néanmoins indubitable qu'Empédocle connut la doctrine pythagoricienne, soit par contact avec des pythagoriciens établis en Sicile et en Grande-Grèce, soit par la lecture d'écrits pythagoriciens, soit encore par transmission orale. L'interdiction de consommer des fèves, la croyance en la transmigration des âmes (métempsychose), le végétarisme strict et l'importance accordée aux nombres et aux proportions dans l'explication du cosmos témoignent d'une imprégnation pythagoricienne profonde, même si Empédocle reformula ces doctrines de manière originale<ref>Empédocle, fragments 117, 128, 136, 137, 139 (DK 31 B 117, 128, 136, 137, 139)</ref>. Sur la vie personnelle et l'activité politique d'Empédocle, nos informations proviennent principalement de Diogène Laërce et de Timée. Empédocle refusa la royauté ou la tyrannie qui lui furent offertes, préférant soutenir le parti démocratique et œuvrer en faveur du peuple<ref>Diogène Laërce, VIII, 63-66 ; Aristote cité par Diogène Laërce, VIII, 63</ref>. Plusieurs anecdotes illustrent son engagement politique égalitaire. Lors d'un banquet offert par un magistrat, Empédocle s'indigna qu'un convive fût désigné comme « roi du festin » avec pouvoir d'imposer aux autres invités des humiliations. Le lendemain, il fit citer en justice l'hôte et le « roi », les fit condamner et exécuter, y voyant une atteinte à l'égalité des citoyens<ref>Diogène Laërce, VIII, 64 ; Timée, ''Histoires'', livre XI (''FGrHist'' 566 F 93)</ref>. De même, lorsque le médecin Acron demanda au conseil l'autorisation d'ériger un monument à son père sur l'acropole, Empédocle s'opposa vigoureusement à ce privilège, prononçant un discours où il tourna en dérision cette prétention aristocratique en jouant sur les mots<ref>Diogène Laërce, VIII, 65</ref>. Plus tard, Empédocle fit dissoudre l'Assemblée des Mille, institution oligarchique qui limitait les droits politiques à un millier de citoyens fortunés, trois ans après sa fondation, démontrant ainsi qu'il appartenait certes à la classe des riches mais qu'il soutenait fermement les principes démocratiques<ref>Diogène Laërce, VIII, 66 ; Timée, ''Histoires'', livres XI-XII (''FGrHist'' 566 F 93-94)</ref>. Parallèlement à son action politique, Empédocle exerça la médecine et acquit une réputation de thaumaturge. On lui attribue des guérisons miraculeuses, notamment celle d'une femme nommée Panthéia, que les autres médecins avaient abandonnée, la croyant morte<ref>Héraclide du Pont, ''Des maladies'', cité par Diogène Laërce, VIII, 60-61, 67-69</ref>. Il aurait également délivré Sélinonte d'une épidémie de peste en faisant détourner le cours de deux rivières voisines pour assainir les eaux stagnantes responsables des miasmes pestilentiels<ref>Diogène Laërce, VIII, 70</ref>. À Agrigente, il aurait maîtrisé les vents étésiens qui menaçaient les récoltes en faisant fabriquer des outres en peau d'âne pour les capturer, exploit qui lui valut le surnom de « dompteur de vents » (kôlysanemas)<ref>Timée cité par Diogène Laërce, VIII, 60</ref>. Ces récits, qui mêlent histoire et légende, témoignent de l'aura extraordinaire dont Empédocle fut entouré de son vivant. L'apparence d'Empédocle frappait les contemporains. Il se présentait vêtu d'une robe de pourpre, ceint d'une ceinture d'or, chaussé de sandales de bronze, couronné de lauriers et portant les bandelettes sacrées delphiques<ref>Diogène Laërce, VIII, 73 ; Favorinus, ''Histoires diverses''</ref>. Cette mise en scène théâtrale, qui le distinguait de manière notable des autres citoyens, correspondait à la représentation qu'il donnait de lui-même dans ses poèmes, où il se présentait comme un dieu immortel circulant parmi les mortels<ref>Empédocle, fragment 112, 4-5 (DK 31 B 112)</ref>. Cette attitude fut diversement interprétée : certains y virent de l'arrogance et de la vanité, d'autres l'expression d'une authentique conscience de sa mission spirituelle<ref>Timée cité par Diogène Laërce, VIII, 66-67</ref>. Les circonstances et la date de la mort d'Empédocle demeurent entourées de mystère. Selon Aristote, il serait mort à l'âge de soixante ans, donc vers 432-430 av. J.-C.<ref>Aristote cité par Diogène Laërce, VIII, 52</ref>, mais d'autres sources lui prêtent un âge bien plus avancé, jusqu'à cent neuf ans<ref>Apollodore cité par Diogène Laërce, VIII, 52</ref>. Quant aux circonstances de sa mort, la légende la plus célèbre, rapportée par Héraclide du Pont et amplement diffusée dans l'Antiquité, raconte qu'Empédocle se serait jeté dans le cratère de l'Etna pour faire croire à son apothéose et convaincre ses disciples de sa divinité ; le volcan aurait cependant rejeté l'une de ses sandales de bronze, révélant ainsi la supercherie<ref>Héraclide du Pont cité par Diogène Laërce, VIII, 67-70 ; Horace, ''Art poétique'', 464-466</ref>. Timée de Tauroménion, historien plus soucieux d'exactitude, conteste vigoureusement cette version, affirmant qu'Empédocle quitta la Sicile pour le Péloponnèse et n'y revint jamais, de sorte que les modalités de sa mort demeurèrent inconnues<ref>Timée cité par Diogène Laërce, VIII, 71-72</ref>. D'autres traditions mentionnent qu'il serait mort d'une chute de char en se rendant à Messine, ou qu'il se serait pendu, ou encore qu'il se serait noyé<ref>Diogène Laërce, VIII, 73-74</ref>. L'incertitude même qui entoure sa fin contribua à renforcer le caractère quasi mythique du personnage, dont la figure hanta l'imaginaire occidental jusqu'à inspirer Hölderlin, Nietzsche et Matthew Arnold<ref>Hölderlin, ''La mort d'Empédocle'' (1798-1800) ; Nietzsche, ''Esquisses d'un drame d'Empédocle'' (fragments posthumes, 1870-1871) ; Matthew Arnold, ''Empedocles on Etna'' (1852)</ref>. == II. Les sources et la tradition textuelle == Notre connaissance de la pensée d'Empédocle repose sur une tradition textuelle d'une complexité remarquable, qui combine l'absence tragique de manuscrits directs continus, la richesse d'une tradition indirecte remontant à l'Antiquité, et l'excitation suscitée par des découvertes papyrologiques récentes. Cette situation impose une démarche philologique et herméneutique particulièrement rigoureuse, laquelle doit tenir compte à la fois de la fragmentation matérielle des sources et des déformations interprétatives qui se sont accumulées au fil des siècles<ref>Kingsley, Peter. ''Ancient Philosophy, Mystery, and Magic: Empedocles and Pythagorean Tradition''. Oxford University Press, 1995, p. 3-4</ref>. === L'absence de tradition directe et la dépendance à l'égard des citations === Contrairement aux œuvres de Platon, d'Aristote ou même d'Épicure, dont des manuscrits médiévaux ont assuré la transmission continue, aucun manuscrit complet des poèmes d'Empédocle ne nous est parvenu. La totalité de notre information textuelle provient de citations, de paraphrases et d'allusions préservées dans les écrits d'auteurs postérieurs, notamment chez les philosophes, les doxographes, les commentateurs néoplatoniciens et les Pères de l'Église<ref>Martin, Alain et Primavesi, Oliver. ''L'Empédocle de Strasbourg (P. Strasb. gr. Inv. 1665-1666). Introduction, édition et commentaire''. Walter de Gruyter, 1999, p. 3-5</ref>. Cette condition fragmentaire n'est nullement propre à Empédocle elle caractérise l'ensemble des présocratiques mais elle revêt une acuité particulière dans son cas, compte tenu de l'ampleur probable de son œuvre originale. Les sources principales de la tradition indirecte sont dispersées sur près d'un millénaire. Parmi les auteurs les plus anciens, Aristote (384-322 av. J.-C.) et son disciple Théophraste (vers 371-vers 287 av. J.-C.) occupent une place prépondérante. Aristote cite et discute Empédocle à de nombreuses reprises dans ses traités, notamment dans la ''Métaphysique'', le ''De Caelo'', le ''De Generatione et Corruptione'', et les ''Meteorologica''<ref>Aristote, ''Métaphysique'', I, 3, 984a ''De Generatione et Corruptione'', I, 1, 314a-315a</ref>. Théophraste, qui composa des monographies sur les physiciens antérieurs, aujourd'hui perdues mais abondamment utilisées par la tradition doxographique ultérieure, constitue une source d'information cruciale, bien que médiatisée<ref>Diels, Hermann. ''Doxographi Graeci''. Berlin, 1879</ref>. Cependant, comme l'a magistralement démontré Harold Cherniss dans son ouvrage fondateur ''Aristotle's Criticism of Presocratic Philosophy'' (1935), Aristote et Théophraste n'étaient nullement des témoins neutres ils interprétaient et réinterprétaient Empédocle à travers leurs propres cadres conceptuels, imposant souvent des schémas téléologiques qui faisaient de l'histoire philosophique une marche nécessaire vers le système aristotélicien<ref>Cherniss, Harold F. ''Aristotle's Criticism of Presocratic Philosophy''. Baltimore, 1935</ref>. La tradition doxographique, inaugurée par Théophraste et systématisée par des compilateurs ultérieurs tels qu'Aetius (I{{er}}-II{{e}} siècles apr. J.-C.), a transmis des résumés schématiques et souvent simplificateurs des doctrines empédocléennes. Le pseudo-Plutarque, dont les ''Placita Philosophorum'' dérivent d'Aetius, Stobée (V{{e}} siècle apr. J.-C.) et Hippolyte de Rome (vers 170-235 apr. J.-C.) dans sa ''Réfutation de toutes les hérésies'' constituent des relais essentiels, bien que leur fidélité aux formulations originales demeure sujette à caution<ref>Mansfeld, Jaap et Runia, David T. ''Aëtiana: The Method and Intellectual Context of a Doxographer''. Leiden, 1997</ref>. Les commentateurs néoplatoniciens, notamment Simplicius (VI{{e}} siècle apr. J.-C.) dans ses vastes commentaires sur Aristote, ont préservé de précieuses citations littérales d'Empédocle, souvent absentes des autres sources<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', notamment 157.25-158.1, 160.1-26 éd. Diels</ref>. Simplicius, mû par un souci de conservation des textes anciens face à la fermeture des écoles philosophiques païennes par Justinien en 529, a eu le mérite d'insérer dans ses commentaires de longues citations textuelles, qui constituent aujourd'hui nos sources les plus étendues pour plusieurs fragments majeurs. Plutarque (vers 46-vers 125 apr. J.-C.), dans ses ''Œuvres morales'', Sextus Empiricus (fin II{{e}}-début III{{e}} siècle apr. J.-C.), et Clément d'Alexandrie (vers 150-vers 215 apr. J.-C.) fournissent également des citations importantes, bien que souvent décontextualisées et adaptées à leurs propres finalités polémiques ou apologétiques<ref>Bollack, Jean. ''Empédocle. Les Origines''. Paris, Minuit, 1965-1969, vol. I, p. 15-28</ref>. Cette médiation par des autorités postérieures, aux agendas philosophiques, théologiques ou polémiques distincts, impose une vigilance herméneutique constante. Comme Peter Kingsley l'a souligné, le véritable obstacle à une intelligence correcte d'Empédocle ne réside pas tant dans la fragmentation matérielle que dans les distorsions interprétatives que la tradition a accumulées<ref>Kingsley, Peter. ''Ancient Philosophy, Mystery, and Magic'', p. 4-5</ref>. L'historien de la philosophie doit, autant que possible, dépouiller les citations de leurs gangues doxographiques pour tenter d'accéder au sens originel. === Les éditions modernes et l'établissement du corpus === L'entreprise moderne d'édition critique des fragments d'Empédocle commence véritablement au XIX{{e}} siècle, époque où la philologie classique atteint sa maturité scientifique. L'édition pionnière de Friedrich Wilhelm Sturz, ''Empedocles Agrigentinus'' (Leipzig, 1805), rassemble pour la première fois de manière systématique les fragments épars dans la tradition antique et médiévale, accompagnés d'une étude sur la vie et la philosophie du penseur d'Agrigente<ref>Sturz, Friedrich Wilhelm. ''Empedocles Agrigentinus''. Leipzig, 1805</ref>. Simon Karsten, dans ses ''Philosophorum Graecorum Veterum... Operum Reliquiae'' (Amsterdam, 1838), propose une édition plus ambitieuse, qui distingue déjà avec une certaine netteté les fragments attribuables aux ''Katharmoi'' des fragments du poème physique<ref>Karsten, Simon. ''Philosophorum Graecorum Veterum... Operum Reliquiae'', vol. II. Amsterdam, 1838</ref>. L'édition véritablement fondatrice demeure celle de Hermann Stein, ''Empedoclis Agrigentini Fragmenta'' (Bonn, 1852), qui établit des critères rigoureux de sélection et d'authentification des fragments, et dont la numérotation a longtemps fait autorité<ref>Stein, Hermann. ''Empedoclis Agrigentini Fragmenta''. Bonn, 1852</ref>. Cependant, c'est l'édition monumentale de Hermann Diels, d'abord publiée dans les ''Poetarum Philosophorum Fragmenta'' (Berlin, 1901), puis intégrée et considérablement développée dans ''Die Fragmente der Vorsokratiker'' (première édition 1903), qui est devenue la référence incontournable et qui a imposé le système de numérotation standard, universellement utilisé par les chercheurs<ref>Diels, Hermann. ''Die Fragmente der Vorsokratiker''. Berlin, 1903</ref>. La cinquième édition, remaniée par Walther Kranz (Berlin, 1934-1937), puis la sixième édition (1952), désormais connue sous le sigle « Diels-Kranz » ou « DK », constituent encore aujourd'hui la base de référence pour tout travail sur les présocratiques, bien que leurs limites et leurs présupposés interprétatifs soient désormais largement reconnus<ref>Diels, Hermann et Kranz, Walther. ''Die Fragmente der Vorsokratiker''. 6{{e}} éd. Berlin, 1952</ref>. Dans le système Diels-Kranz, chaque philosophe présocratique se voit attribuer un numéro Empédocle porte le numéro 31. Les témoignages indirects sur sa vie et sa doctrine sont classés sous la lettre A, suivie d'un numéro (31 A 1, 31 A 2, etc.). Les fragments littéraux, c'est-à-dire les citations textuelles considérées comme authentiques, sont classés sous la lettre B (31 B 1, 31 B 2, etc.). Une troisième catégorie, la lettre C, rassemble les imitations et les textes qui prennent Empédocle pour modèle<ref>Numérotation Diels-Kranz, dans ''Die Fragmente der Vorsokratiker''</ref>. Ce système, bien qu'imparfait et parfois arbitraire dans ses distinctions, a permis d'unifier les références et demeure l'instrument de travail indispensable. Les éditions ultérieures du XX{{e}} siècle ont apporté des améliorations significatives, tant sur le plan de l'établissement du texte que sur celui de l'interprétation. L'édition monumentale de Jean Bollack, ''Empédocle. Les Origines'' (Paris, Minuit, 1965-1969, 3 volumes), propose une reconstruction audacieuse et systématique du poème physique, en intégrant non seulement les fragments littéraux mais aussi les résumés doxographiques, dans une tentative de reconstituer l'architecture d'ensemble de l'œuvre<ref>Bollack, Jean. ''Empédocle. Les Origines. Introduction, édition et commentaire''. Paris, Minuit, 1965-1969, 3 vol.</ref>. Bollack numérote les unités textuelles de 1 à 699, dans un cadre ouvert qui accueille fragments, paraphrases et contextes citants. Cette entreprise, aussi admirable soit-elle par son ampleur et sa rigueur philologique, n'a pas supplanté le système Diels-Kranz, trop solidement ancré dans les habitudes scientifiques. L'édition de Brad Inwood, ''The Poem of Empedocles'' (Toronto, 1992, édition révisée 2001), offre un texte grec accompagné d'une traduction anglaise et d'un riche apparat de témoignages indirects<ref>Inwood, Brad. ''The Poem of Empedocles''. Toronto, University of Toronto Press, 1992 éd. rév. 2001</ref>. L'édition de M. R. Wright, ''Empedocles: The Extant Fragments'' (New Haven, Yale University Press, 1981), remarquable par son commentaire détaillé et ses notes philologiques, demeure un outil précieux<ref>Wright, M. R. ''Empedocles: The Extant Fragments''. New Haven, Yale University Press, 1981</ref>. Plus récemment, André Laks et Glenn W. Most ont proposé une refonte complète du corpus présocratique dans leur vaste entreprise éditoriale ''Early Greek Philosophy'' (Cambridge, Mass., Harvard University Press, 2016, Loeb Classical Library vol. 528), où Empédocle occupe le chapitre 22 du volume V, partie II<ref>Laks, André et Most, Glenn W. ''Early Greek Philosophy'', vol. V, part II. Cambridge (Mass.), Harvard University Press, 2016 (Loeb 528) traduction française ''Les Débuts de la philosophie''. Paris, Fayard, 2016, p. 659-819</ref>. Rompant avec la division traditionnelle en A et B, Laks et Most classent les textes en trois catégories P (informations concernant la Personne, la vie, le caractère et les dits du philosophe), D (Doctrine, fragments littéraux et témoignages sur le contenu de l'œuvre), R (histoire de la Réception de la doctrine dans l'Antiquité). Ce nouveau système, bien que novateur et fondé sur des critères méthodologiques explicites, n'a pas encore détrôné la numérotation Diels-Kranz, qui conserve sa primauté dans la pratique scientifique courante. === La découverte du papyrus de Strasbourg et son importance === L'événement le plus marquant dans l'histoire récente des études empédocléennes fut incontestablement l'identification et la publication, en 1999, du papyrus de Strasbourg, qui bouleversa notre compréhension de la tradition textuelle et apporta des vers jusqu'alors inconnus<ref>Martin, Alain et Primavesi, Oliver. ''L'Empédocle de Strasbourg (P. Strasb. gr. Inv. 1665-1666). Introduction, édition et commentaire''. Berlin, Walter de Gruyter, 1999</ref>. L'histoire de cette découverte mérite d'être contée, car elle illustre les aléas de la transmission des textes antiques et les hasards heureux de la recherche papyrologique. En novembre 1904, l'archéologue allemand Otto Rubensohn fouillait le site d'Akhmîm, l'antique Panopolis, en Haute-Égypte, lieu réputé pour avoir été un centre intellectuel et littéraire aux premiers siècles de notre ère. Il découvrit un objet funéraire singulier une bande ornementale, vraisemblablement destinée à orner une momie, constituée de feuilles de cuivre doré collées sur des morceaux de papyrus pliés<ref>Martin et Primavesi, 1999, p. 1-3</ref>. Rubensohn extrait les bribes de papyrus et les emporta en Europe. En 1905, la Bibliothèque nationale et universitaire de Strasbourg fit l'acquisition de ce manuscrit fragmentaire. Pendant près d'un siècle, le papyrus demeura inexploité, enfoui dans les collections strasbourgeoises, attendant qu'un regard expert s'y intéressât<ref>Martin et Primavesi, 1999, p. 3-4</ref>. C'est en 1994 qu'Alain Martin, papyrologue de l'Université libre de Bruxelles, identifia le papyrus comme contenant des vers d'Empédocle. Collaborant avec Oliver Primavesi, philologue de l'Université de Munich, spécialiste d'Empédocle et de Parménide, Martin entreprit une reconstitution minutieuse des fragments. Le travail, d'une complexité extrême, exigeait de déplier virtuellement les morceaux, de reconstituer l'ordre des colonnes, d'identifier les correspondances entre les divers ensembles désignés par les lettres a à k, et de déterminer leur place dans l'œuvre empédocléenne<ref>Martin et Primavesi, 1999, p. 5-15</ref>. En 1999, les deux chercheurs publièrent ''L'Empédocle de Strasbourg'', ouvrage qui fit date dans le domaine de la papyrologie et de l'histoire de la philosophie antique. Le papyrus, daté paléographiquement de la fin du I{{er}} siècle apr. J.-C., constitue le seul témoignage de transmission directe d'un texte d'Empédocle, par opposition aux citations indirectes chez les auteurs postérieurs<ref>Martin et Primavesi, 1999, p. 15-20</ref>. Il s'agit d'un manuscrit de qualité, copié professionnellement, comme en témoigne la présence d'une indication stichométrique en marge de la colonne a la lettre Γ (gamma), qui signale que le copiste a déjà transcrit 300 lignes<ref>Martin et Primavesi, 1999, p. 18</ref>. Cette indication suggère que le papyrus provient d'un centre de copie professionnel, et non d'une copie privée ou scolaire. Le fait que le manuscrit ait été trouvé dans un contexte funéraire soulève des questions fascinantes sur les usages rituels ou symboliques auxquels les textes philosophiques pouvaient être soumis dans l'Égypte gréco-romaine<ref>Carlig, Nathan. « Des papyri grecs en contexte funéraire le cas de l'Empédocle de Strasbourg ». ''Philosophie antique'', 10, 2010, p. 93-111</ref>. Le papyrus apporte des vers inconnus et, surtout, atteste la coexistence, au sein d'un même rouleau, de développements cosmologiques et de récits daïmonologiques à la première personne. Il fournit ainsi un argument très puissant en faveur d'une articulation étroite entre ces deux registres, sans pour autant lever définitivement le débat sur l'unité ou la dualité des poèmes empédocléens.<ref>Alain Martin et Oliver Primavesi, ''L'Empédocle de Strasbourg. (P. Strasb. gr. inv. 1665–1666)'', Berlin / New York, de Gruyter, 1999.</ref> En particulier, le papyrus montre que le célèbre fragment sur le « démon » exilé des dieux (B 115 Diels-Kranz) et le récit des expériences de réincarnation (B 117 Diels-Kranz) s'inséraient dans un contexte qui contenait également des développements cosmologiques sur la séparation et la recombinaison des éléments. Cette découverte a largement conforté l'hypothèse, avancée dès 1987 par Catherine Rowett (alors Osborne), selon laquelle une partie au moins de ces fragments provenait d'un seul et même poème, désigné sous divers titres par les sources antiques.<ref>Catherine Osborne, « Empedocles Recycled », ''Classical Quarterly'', 37, 1987, p. 24-50.</ref> === La découverte récente du papyrus du Caire === L'histoire ne s'arrête pas là. En 2023, Nathan Carlig, chercheur en papyrologie à l'Université de Liège, découvrit dans les collections de l'Institut français d'archéologie orientale (IFAO) du Caire un fragment de papyrus contenant les restes de trente vers inédits du philosophe présocratique<ref>Carlig, Nathan. Annonce de la découverte, présentée lors de la journée d'études « De Strasbourg au Caire la redécouverte d'Empédocle », Université de Liège, 13 février 2023</ref>. Ce fragment, désormais connu sous le nom d'« Empédocle du Caire », complète l'« Empédocle de Strasbourg ». Daté également de la fin du I{{er}} siècle apr. J.-C., il provient vraisemblablement de la même région d'Égypte, sinon du même manuscrit ou d'une copie apparentée. La publication complète de cette nouvelle découverte, attendue avec impatience par la communauté scientifique, promet d'éclairer davantage la doctrine empédocléenne et de relancer les débats interprétatifs sur des questions encore irrésolues. === Les problèmes herméneutiques posés par la tradition fragmentaire === La fragmentation matérielle et la médiation doxographique imposent des défis herméneutiques considérables. Premièrement, l'ordre originel des fragments demeure largement inconnu. Les éditeurs modernes, de Diels à Bollack, ont proposé des reconstructions hypothétiques de la structure des poèmes, mais ces reconstructions demeurent conjecturales, fondées sur des critères thématiques, stylistiques ou logiques qui ne garantissent nullement la fidélité à l'ordre de composition originel<ref>Bollack, 1965-1969, vol. I, p. 97-124</ref>. Deuxièmement, la décontextualisation des fragments rend souvent difficile la compréhension de leur sens précis. Un vers cité isolément peut prendre des significations divergentes selon le contexte argumentatif dans lequel il s'insérait. Troisièmement, les citations elles-mêmes ne sont pas toujours textuellement fiables les copistes médiévaux ont introduit des corruptions, et les auteurs anciens citaient parfois de mémoire ou adaptaient les vers à leurs propres besoins rhétoriques<ref>Wright, M. R. ''Empedocles: The Extant Fragments'', p. 1-5</ref>. À ces difficultés matérielles s'ajoutent les biais interprétatifs de la tradition. Aristote, source majeure de notre information, lit Empédocle à travers le prisme de sa propre téléologie et de sa théorie des quatre causes. Les doxographes schématisent et simplifient, réduisant souvent la richesse de la pensée empédocléenne à des formules commodes mais réductrices. Les néoplatoniciens, tels Simplicius ou Proclus, projettent sur Empédocle leurs propres catégories métaphysiques, voyant dans le Sphairos une préfiguration de l'Un plotinien ou dans les daimones des âmes platoniciennes déchues<ref>Kingsley, 1995, p. 3-7</ref>. Les Pères de l'Église, en quête de précurseurs de la doctrine chrétienne ou, au contraire, d'hérésiarques à réfuter, instrumentalisent Empédocle à des fins apologétiques. Face à ces obstacles, l'historien de la philosophie doit adopter une méthode critique rigoureuse. Il convient, autant que possible, de croiser les témoignages, de comparer les versions divergentes d'un même fragment, de tenir compte du contexte citant, et de demeurer conscient des agendas philosophiques ou théologiques des sources. La découverte des papyrus égyptiens, en fournissant un accès direct, quoique fragmentaire, au texte empédocléen, offre un contrepoids salutaire aux déformations de la tradition indirecte. Néanmoins, même ces papyrus ne nous livrent pas Empédocle dans sa pureté originelle ils nous donnent des copies tardives, réalisées plusieurs siècles après la composition, dans un milieu culturel éloigné de la Sicile du V{{e}} siècle av. J.-C. En définitive, notre connaissance d'Empédocle demeure irrémédiablement médiatisée, fragmentaire et problématique. Mais cette condition ne condamne nullement l'entreprise herméneutique à l'échec au contraire, elle l'oblige à une vigilance accrue, à une rigueur philologique maximale, et à une humilité épistémologique qui reconnaît les limites de notre savoir. Les progrès accomplis au cours du dernier siècle, grâce aux découvertes papyrologiques et aux réévaluations critiques de la tradition doxographique, ont considérablement enrichi notre compréhension d'Empédocle. Les décennies à venir, avec la publication de l'« Empédocle du Caire » et la poursuite des recherches papyrologiques, promettent d'apporter de nouvelles lumières sur l'une des figures les plus fascinantes et les plus énigmatiques de la pensée antique. == III. Les quatre racines et la composition du monde == La théorie des quatre racines constitue la contribution la plus célèbre et la plus durable d'Empédocle à l'histoire de la pensée occidentale. En postulant l'existence de quatre principes matériels fondamentaux — le feu, l'air, l'eau et la terre — dont les combinaisons variables engendrent toutes les substances du monde sensible, l'Acragentin élabora un système à la fois simple et puissant qui marqua la physique et la médecine pendant plus de deux millénaires<ref>Aristote, ''Métaphysique'', I, 3, 984a8-11 ; Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 76</ref>. Cette doctrine représente une tentative ingénieuse de réconcilier les positions apparemment inconciliables de Parménide d'Élée et d'Héraclite d'Éphèse : elle sauvegarde à la fois l'immuabilité de l'être proclamée par le premier et la réalité du devenir observée par le second. === Le problème philosophique hérité de Parménide === Pour saisir pleinement l'originalité de la solution empédocléenne, il convient de rappeler l'aporie dans laquelle la philosophie éléate avait plongé la réflexion sur la nature. Parménide avait démontré, dans son poème fondateur ''Sur la nature'', que l'être est nécessairement un, éternel, immuable et homogène. Tout devenir, toute génération, toute corruption, toute pluralité ne peuvent être, selon lui, que des illusions et erreurs des sens<ref>Parménide, fragment 8 DK ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 145.1-146.25</ref>. La rigueur de l'argumentation parménidéenne s'impose à l'esprit : rien ne peut naître de ce qui n'est pas, car le non-être est impensable et indicible ; rien ne peut périr en se résolvant dans le non-être, pour la même raison. Dès lors, affirmer que quelque chose commence d'exister ou cesse d'exister équivaut à dire que l'être provient du non-être ou retourne au non-être — deux propositions contradictoires et absurdes<ref>Parménide, fragment 8, versets 6-9 DK</ref>. Cependant, cette conclusion métaphysique se heurte violemment au témoignage immédiat et constant des sens. Les choses naissent, croissent, se transforment, dépérissent et meurent sous nos yeux. Le monde sensible est le théâtre d'un perpétuel devenir. Comment concilier l'évidence rationnelle de l'immuabilité de l'être avec l'évidence empirique du changement universel ? Telle était la question pressante à laquelle les penseurs postérieurs à Parménide durent se confronter. Empédocle, comme Anaxagore son contemporain, s'efforça de résoudre ce dilemme en dissociant le niveau des principes élémentaires, éternels et immuables, du niveau des composés, transitoires et changeants<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314a6-15</ref>. === La doctrine des quatre racines === Empédocle n'emploie pas le terme d'éléments (''stoikheia'') — terme technique qui ne fut introduit qu'ultérieurement dans le vocabulaire philosophique. Il désigne les quatre principes matériels sous le nom pittoresque de ''rhizômata'', c'est-à-dire « racines » de toutes choses, empruntant une image botanique qui suggère à la fois la permanence, la fécondité et le rôle fondateur<ref>Empédocle, fragment 6 DK</ref>. Ce choix terminologique n'est nullement fortuit : il s'inscrit dans la tradition pythagoricienne, où le terme ''rhiza'' désignait les principes premiers dont dérivent toutes choses, de même que les nombres dérivent de l'unité et de la dyade<ref>Jean Bollack, ''Empédocle. Les Origines'', Paris, Éditions de Minuit, 1965, vol. I, p. 155-158</ref>. Empédocle identifie ces quatre racines en recourant à une nomenclature théologique : Zeus pour le feu, Héra pour l'air, Aidôneus (c'est-à-dire Hadès) pour la terre, et Nestis pour l'eau<ref>Empédocle, fragment 6 DK ; Aétius, I, 3, 20</ref>. L'emploi de noms divins pour désigner les éléments n'est pas une simple ornementation poétique : il exprime la conviction que les racines possèdent une dignité ontologique supérieure, qu'elles sont douées d'une forme de vie et de pensée, qu'elles sont, en un sens, divines<ref>Peter Kingsley, ''Ancient Philosophy, Mystery, and Magic'', Oxford University Press, 1995, p. 48-52</ref>. L'identification précise de chaque divinité à chaque élément a donné lieu à des divergences entre les traditions doxographiques. La version la plus anciennement attestée, conservée par Diogène Laërce et Aétius, attribue le feu à Zeus le lumineux, l'air à Héra vivifiante, la terre à Aidôneus, et l'eau à Nestis, divinité aquatique sicilienne dont les larmes engendrent la source des mortels<ref>Diogène Laërce, VIII, 76 ; Aétius, I, 3, 20</ref>. D'autres traditions doxographiques, notamment celle conservée par Stobée, proposent des correspondances différentes, attribuant à Héra la terre et à Aidôneus l'air<ref>Stobée, ''Éclogues'', I, 10, 11b</ref>. Ces divergences secondaires reflètent les difficultés d'interprétation du texte original d'Empédocle. L'essentiel du système demeure : les quatre racines sont coéternelles, équivalentes en dignité ontologique, irréductibles les unes aux autres, et elles constituent les briques élémentaires dont tous les corps composés sont formés. Aristote, dans sa ''Métaphysique'', reconnaît à Empédocle le mérite d'avoir été le premier à distinguer clairement quatre éléments de nature matérielle, là où ses prédécesseurs ioniens n'en avaient retenu qu'un seul : l'eau pour Thalès, l'air pour Anaximène, le feu pour Héraclite, ou une substance indéterminée (''apeiron'') pour Anaximandre<ref>Aristote, ''Métaphysique'', I, 3, 984a8-11</ref>. Cependant, le Stagirite ajoute une critique importante : Empédocle, bien qu'il pose quatre éléments, ne les utilise pas vraiment comme s'ils étaient quatre, mais plutôt comme s'ils étaient deux — le feu d'une part, et ses contraires (terre, eau, air) d'autre part<ref>Aristote, ''Métaphysique'', I, 4, 985a31-33</ref>. Cette observation suggère que, dans certains passages du poème, Empédocle privilégie une opposition binaire entre le chaud (feu) et le froid (les trois autres éléments), opposition qui joue un rôle déterminant dans la cosmogonie et la formation des êtres vivants. Néanmoins, la structure quaternaire demeure fondamentale et constitue l'architecture conceptuelle du système. === L'immuabilité des racines et l'explication du changement === Les quatre racines possèdent, selon Empédocle, les attributs que Parménide avait réservés à l'être unique : elles sont inengendrées et impérissables, elles ne croissent ni ne décroissent en quantité, elles demeurent qualitativement identiques à elles-mêmes à travers tous les changements du cosmos<ref>Empédocle, fragments 8, 11, 12, 17 DK</ref>. Ainsi, Empédocle sauvegarde le principe éléate de l'immuabilité de l'être, mais en le distribuant sur quatre substances distinctes au lieu de le concentrer sur un être unique et monolithique. Cette pluralisation de l'être parménidien constitue la clé de voûte de la solution empédocléenne au problème du devenir. Comment, dès lors, expliquer le changement, la naissance et la mort des êtres particuliers ? Empédocle répond par une théorie du mélange (''mixis'', ''krasis'') et de la séparation (''dialysis'', ''diakrisis'') des éléments. Ce que le langage ordinaire nomme « naissance » n'est qu'un assemblage, une union, une combinaison de parcelles des quatre racines ; ce que l'on nomme « mort » n'est que la dissolution, la désagrégation de cet assemblage, le retour des parcelles élémentaires à leur état dispersé<ref>Empédocle, fragment 8 DK</ref>. Rien ne naît véritablement au sens strict, rien ne périt véritablement : il y a seulement mélange et séparation de choses qui existent toujours. Les mots « naissance » et « mort » sont donc, à strictement parler, impropres et mensongers — ils relèvent de la convention humaine plutôt que de la vérité philosophique<ref>Empédocle, fragment 9 DK</ref>. Empédocle lui-même déclare qu'il se conforme à l'usage linguistique établi, tout en sachant que celui-ci ne correspond pas à la réalité ontologique profonde. Cette théorie du mélange et de la séparation permet de rendre compte de l'infinie diversité des êtres du monde sensible. Selon les proportions dans lesquelles les quatre racines se combinent, selon la configuration géométrique de leurs assemblages, naissent des substances aux propriétés extrêmement variées. Empédocle compare ce processus à l'art du peintre, qui, à partir de quatre couleurs fondamentales — le blanc, le noir, le jaune et le rouge — produit une infinité de nuances et représente tous les êtres visibles<ref>Empédocle, fragment 23 DK</ref>. De même, les quatre racines, par leurs combinaisons innombrables, engendrent les arbres, les hommes, les femmes, les bêtes sauvages, les oiseaux, les poissons, et même les dieux qui vivent longtemps<ref>Empédocle, fragment 21 DK</ref>. === Les propriétés des quatre racines === Chaque racine possède des propriétés spécifiques qui la distinguent des trois autres. Le feu se caractérise par la chaleur, la légèreté, la luminosité et le mouvement ascendant. L'air, quoique moins bien défini dans les fragments conservés, semble associé au souffle vital, à la respiration, et à l'intermédiaire entre le feu et l'eau. L'eau se signale par la froideur, l'humidité, la fluidité et la tendance à descendre. La terre se définit par la sécheresse, la densité, la stabilité et la pesanteur<ref>Aétius, I, 3, 20 ; Aristote, ''De la génération et de la corruption'', II, 3, 330b19</ref>. Ces propriétés ne sont pas adventices : elles appartiennent essentiellement à chaque élément et expliquent son comportement dans les processus cosmiques et biologiques. Aristote, dans son traité ''De la génération et de la corruption'', critique Empédocle pour n'avoir pas expliqué de manière satisfaisante comment les propriétés sensibles des corps composés dérivent des propriétés des éléments simples<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314b7-26</ref>. Selon le Stagirite, Empédocle se contente d'affirmer que les os, par exemple, sont composés de deux parts d'eau, de deux parts de terre et de quatre parts de feu, sans préciser le mécanisme par lequel cette proportion numérique détermine la dureté, la blancheur et les autres propriétés de l'os<ref>Aristote, ''Des parties des animaux'', I, 1, 642a18-24</ref>. Cette critique aristotélicienne, pour fondée qu'elle soit sur le plan de la rigueur explicative, ne doit pas occulter l'audace et la fécondité de l'intuition empédocléenne : l'idée que les propriétés macroscopiques des corps résultent de la proportion et de l'arrangement de leurs constituants microscopiques anticipe, dans une certaine mesure, les conceptions modernes de la chimie et de la physique des matériaux. === Le mélange et ses degrés === Empédocle distingue plusieurs types ou degrés de mélange entre les éléments. Le mélange peut être plus ou moins intime, plus ou moins homogène. Dans certains cas, les parcelles élémentaires demeurent simplement juxtaposées, sans interpénétration véritable. Dans d'autres cas, le mélange atteint un degré de finesse tel que les parcelles de chaque élément se trouvent entremêlées de manière extrêmement serrée, donnant naissance à des substances d'apparence homogène<ref>Aristote, ''De la génération et de la corruption'', I, 10, 327b22-328a5</ref>. Le sang constitue l'exemple paradigmatique d'un mélange équilibré et harmonieux des quatre racines en proportions à peu près égales<ref>Empédocle, fragment 98 DK ; Aristote, ''Des parties des animaux'', II, 2, 647b31-648a2</ref>. La perfection de ce mélange explique pourquoi le sang, et en particulier le sang qui entoure le cœur, est le siège de la pensée (''phronêsis'') chez l'homme<ref>Empédocle, fragment 105 DK</ref>. Cette doctrine sera reprise et développée par la médecine ultérieure. Inversement, les déséquilibres dans les proportions élémentaires expliquent les différences de tempérament, d'intelligence et de capacités entre les individus : ceux dont le mélange sanguin est harmonieux sont les plus intelligents, tandis que ceux dont le mélange est défectueux, où un élément domine excessivement les autres, sont obtus, paresseux ou impulsifs<ref>Théophraste, cité par Aétius, IV, 5, 12</ref>. Cette doctrine des mélanges élémentaires fonde la physiologie, la médecine et la psychologie empédocléennes. Elle annonce, de loin, la théorie des quatre humeurs (sang, phlegme, bile jaune, bile noire) qui dominera la médecine antique et médiévale, bien que cette théorie humorale ne se soit pleinement constituée qu'avec Hippocrate et Galien<ref>Galien, ''De elementis ex Hippocratis sententia''</ref>. L'influence d'Empédocle sur l'école médicale de Sicile et d'Italie du Sud fut considérable : Galien le reconnaît comme une figure fondatrice de la pensée médicale occidentale, même s'il n'utilise pas l'expression « fondateur » dans le passage de Diogène Laërce<ref>Galien, cité par les historiens modernes de la médecine antique</ref>. === La critique aristotélicienne et la postérité de la doctrine === Aristote, tout en reconnaissant l'apport décisif d'Empédocle à la physique, formule plusieurs objections contre la théorie des quatre éléments. Premièrement, il reproche à Empédocle de ne pas avoir clairement distingué la cause matérielle (les quatre racines) de la cause efficiente (Amour et Haine), distinction qui est essentielle pour une explication scientifique rigoureuse<ref>Aristote, ''Métaphysique'', I, 4, 985a21-29</ref>. Deuxièmement, il critique l'apparente incohérence de la théorie : dans certaines phases du cycle cosmique, c'est l'Amour qui unit toutes choses dans l'unité du Sphairos, mais c'est la Haine qui sépare et isole chaque élément — le feu se rassemblant avec le feu, la terre avec la terre — ce qui produit également une forme d'union<ref>Aristote, ''Métaphysique'', I, 4, 985a23-29</ref>. Troisièmement, Aristote juge insuffisant le recours à deux principes moteurs seulement pour rendre compte de la variété des mouvements observés dans la nature<ref>Aristote, ''Physique'', VIII, 1, 252a7-14</ref>. Malgré ces critiques, Aristote lui-même adopta, en la réinterprétant profondément, la doctrine des quatre éléments. Il leur attribua des lieux naturels et des mouvements naturels (vers le haut pour le feu et l'air, vers le bas pour l'eau et la terre), et surtout il les redéfinit non plus comme des substances ultimes mais comme des composés de matière première et de couples de qualités contraires (chaud-froid, sec-humide)<ref>Aristote, ''De la génération et de la corruption'', II, 1-4</ref>. Cette transformation conceptuelle permit d'intégrer la théorie empédocléenne dans le cadre de l'hylémorphisme aristotélicien, assurant ainsi sa survie et sa diffusion pendant des siècles. La postérité de la doctrine empédocléenne des quatre éléments fut immense. Elle s'imposa comme le cadre conceptuel fondamental de la physique, de la cosmologie, de la médecine, de l'alchimie et de l'astrologie jusqu'à la révolution scientifique du XVII{{e}} siècle. Galien, Avicenne, Averroès, Albert le Grand, Thomas d'Aquin acceptèrent tous, avec des nuances diverses, la théorie des quatre éléments comme une vérité établie<ref>David C. Lindberg, ''The Beginnings of Western Science'', University of Chicago Press, 1992, p. 50-65</ref>. Ce n'est qu'avec Boyle, Lavoisier et la chimie moderne que cette théorie fut définitivement abandonnée, remplacée par la conception des éléments chimiques définis par leurs propriétés atomiques. Mais l'idée empédocléenne fondamentale — selon laquelle la diversité du monde sensible résulte de combinaisons variables d'un petit nombre de constituants élémentaires — survit, transfigurée, dans la chimie et la physique contemporaines. Elle demeure une intuition profonde sur la structure de la matière. == IV. L'Amour et la Haine : forces cosmiques primordiales == Au cœur de la cosmologie d'Empédocle se trouve un antagonisme fondamental, plus vaste encore que celui des quatre racines : le combat éternel entre deux forces universelles, l'Amour (''philia'', ''erôs'') et la Haine (''neikos'').<ref>Empédocle, fragments 16, 17, 30 DK ; Aristote, ''Métaphysique'', I, 4, 985a21-29</ref> Empédocle affirme avec force que l'Amour et la Haine existent depuis l'éternité : « Car elles ont été auparavant, elles seront plus tard, et je ne crois pas qu'aucune des deux manque jamais dans le temps infini ».<ref>Empédocle, fragment 16 DK</ref> Si les quatre racines constituent l'infrastructure matérielle du cosmos, c'est l'Amour et la Haine qui en animent le devenir, qui organisent leurs rapports, qui produisent l'alternance infinie des phases d'union et de séparation. Ces deux forces ne sont nullement des principes abstraits ou immatériels ; elles sont, au contraire, du même statut ontologique que les quatre éléments, de véritables composantes de l'être, quoique de nature qualitativement distincte.<ref>Théophraste, rapporté par Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 55-56</ref> Empédocle qualifie l'Amour par plusieurs noms divins qui en soulignent l'essence : ''philia'' (amitié), ''erôs'' (amour), ''Aphrodite'' (Vénus), ''Harmonia'' (harmonie).<ref>Empédocle, fragments 17, 19, 20, 96 DK</ref> La Haine, elle, est désignée sous les noms de ''neikos'', ''Eris'' (discorde), et figurée comme une force de séparation centrifuge.<ref>Empédocle, fragments 16, 30, 35 DK</ref> Ces noms divins n'ont rien d'ornemental poétique ; ils expriment la conviction empédocléenne que les forces cosmiques fondamentales possèdent une nature divine, une puissance créatrice incomparable.<ref>Jean Bollack, ''Empédocle. Les Origines'', Minuit, Paris, 1965-1969, t. I, p. 98-110</ref> === La nature dialectique du cosmique === L'Amour et la Haine ne se déploient pas simultanément et avec la même intensité en tous lieux et en tous temps. Au contraire, elles entrent dans une alternance cyclique réglée par une ''ananké'' (nécessité) suprême, scellée par un « vaste serment » (''horkos'').<ref>Empédocle, fragment 30 DK ; voir aussi Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 76-77</ref> Cette Nécessité, cette loi inviolable garantit le déroulement éternel du cycle cosmique et, par conséquent, l'éternité du devenir lui-même. C'est une caractéristique remarquable du système empédocléen que le devenir ne soit jamais sujet à l'annihilation : il est au contraire assuré par un décret cosmique que l'alternance entre union et séparation ne connaîtra jamais de terme.<ref>Empédocle, fragment 16 DK ; Aristote, ''Physique'', VIII, 1, 250b15-22</ref> L'Amour se caractérise principalement par sa fonction unificatrice. Chaque fois qu'il prédomine, il attire vers lui l'ensemble des racines élémentaires, cherchant à les fusionner en une totalité homogène. Empédocle le célèbre en des termes sublimes : « Contemple-le par l'esprit et non avec des yeux hébétés. C'est lui qu'on regarde comme incorporé dans les membres des mortels, c'est grâce à lui qu'ils aiment et accomplissent les œuvres de l'union, lui donnant alors le nom de Joie et celui d'Aphrodite ; mais il circule aussi dans tout l'univers ».<ref>Empédocle, fragment 17 DK</ref> L'Amour « est égal en longueur et en largeur »,<ref>Empédocle, fragment 17 DK, vers 20</ref> manifestant sa présence intime en chaque lieu du cosmos. Lorsqu'il se retire, c'est-à-dire lorsque l'Amour recule devant l'assaut de la Haine, le chaos menace l'ordre établi.<ref>Empédocle, fragment 35 DK</ref> La Haine, inversement, opère par séparation et désagrégation. Elle est qualifiée comme la force sinistre, distincte de toute autre réalité, « de poids égal partout ».<ref>Empédocle, fragment 17 DK, vers 18</ref> Là où l'Amour cherche à unir les dissemblables — ce qui constitue sa fonction cruciale, puisqu'elle agit précisément en favorisant les unions entre éléments naturellement séparés —, la Haine « sépare et isole », attirant chaque racine vers ce qui lui ressemble. Empédocle souligne cette ségrégation : « Dans la Haine, ils sont tous isolés et défigurés, mais l'Amour les réunit par un désir réciproque ».<ref>Empédocle, fragment 21 DK</ref> C'est une ségrégation progressive qui culmine, à l'extrême, en une complète stratification cosmique où les quatre racines forment quatre sphères concentriques immuables. === Le Sphairos : le moment d'harmonie absolue === Le plus haut accomplissement de l'Amour se manifeste dans le Sphairos (Sphère), moment cosmique où l'union est si totale, si intégrale, que le cosmos devient une unité sphérique indivisible, parfaite dans toutes ses dimensions.<ref>Empédocle, fragments 27, 28, 29 DK</ref> En cet instant propice, Empédocle dépeint un univers transfiguré : « Alors ne se discernent pas les membres rapides du Soleil, ni la puissance velue de la terre, ni la mer — mais au sein de la stable harmonie, reposait le Sphairos, immobile ».<ref>Empédocle, fragment 27 DK</ref> Les trois mondes distincts du cosmos actuel s'abolissent dans une fusion si complète que les réalités élémentaires qui les composent perdent leurs individualités. Ce moment cosmique possède une qualité divine insigne. Empédocle le décrit comme un état de béatitude absolue, sans souffrance, sans conflit, sans le poids du devenir.<ref>Empédocle, fragment 27 DK</ref> Aucune distinction n'existe au sein du Sphairos : Empédocle le précise ainsi : « Pour tous les côtés il était égal, infiniment vaste, se forma le Sphairos. Il était arrondi ».<ref>Empédocle, fragment 28 DK</ref> Le Sphairos ne possède pas de différenciation interne. Cette caractérisation s'inspire du Parménide du poète éléate, dont Empédocle emprunte le modèle d'un être unique, indivisé et complet ; cependant, Empédocle le pluralise en reconnaissant que l'univers en bloc possède ces attributs.<ref>Peter Kingsley, ''Ancient Philosophy, Mystery, and Magic. Empedocles and Pythagorean Tradition'', Clarendon Press, Oxford, 1995, p. 50-60</ref> === Le cycle cosmique et ses phases === Selon le témoignage d'Aristote et les fragments conservés, le cosmos traverse quatre phases discernables : '''La première phase''' est celle du Sphairos intact, où l'Amour domine sans partage et la Haine reste reléguée aux extrêmes limites.<ref>Empédocle, fragment 35 DK</ref> Cette phase ne peut produire aucune réalité composite distincte puisque la complète uniformité interdit la génération.<ref>Empédocle, fragment 26 DK</ref> '''La deuxième phase''' s'inaugure quand la Haine commence à pénétrer le Sphairos, l'imprègne peu à peu, déclenchant le devenir. C'est dans cette phase que naît notre monde, celui des êtres multiples, des créatures composées, du devenir incessant. Empédocle en décrit le commencement : « Quand la Haine se fut retirée à l'extrémité du tourbillon, et qu'au centre fut venue résider l'Amitié, dès lors toutes choses se réunirent pour former un seul ensemble, mais ce n'est pas d'un seul coup ».<ref>Empédocle, fragment 35 DK</ref> L'Amour réagit immédiatement à l'assaut de la Haine, tentant de maintenir certaines unions et de créer de nouveaux équilibres.<ref>Empédocle, fragments 20, 21, 26 DK</ref> C'est le cosmos du devenir perpétuel, caractérisé par une lutte entre les deux forces antagonistes.<ref>Empédocle, fragment 26 DK</ref> '''La troisième phase''' intervient quand la Haine atteint sa plénitude de puissance. Elle a achevé la séparation complète des quatre racines, repoussant l'Amour aux extrêmes limites du cosmos. À ce stade extrême, les quatre éléments forment quatre sphères concentriques isolées les unes des autres, incapables de toute interaction.<ref>Aristote, ''De la génération et de la corruption'', II, 3, 330a25-30</ref> C'est un moment de parfaite séparation, aussi extrême dans son opposition que le Sphairos l'était dans son union. '''La quatrième phase''' voit l'Amour reprendre son offensive. Graduellement, avec lenteur et constance, il commence à réunir les quatre racines éparses, à former d'abord des composés simples, puis de plus en plus complexes, jusqu'à éventuellement reconstituer le Sphairos. Empédocle souligne que ce retour s'accomplit avec mesure : « De ce qui s'unit ainsi naissent les innombrables races des êtres mortels ; mais en face de ce qui était associé, beaucoup reste isolé ».<ref>Empédocle, fragment 35 DK</ref> Et le cycle recommence, sans fin. === L'héritage philosophique et théorique === Aristote reconnaît, non sans une certaine perplexité, que l'introduction de deux forces motrices distinctes constitue un progrès considérable par rapport à la physique ionienne.<ref>Aristote, ''Métaphysique'', I, 4, 985a21-29</ref> Cependant, il adresse à Empédocle plusieurs critiques majeures. Premièrement, l'Amour et la Haine sont présentés à la fois comme des causes efficientes (elles produisent du mouvement) et comme des causes matérielles (elles composent l'être), distinction que le Stagirite juge intolérable.<ref>Aristote, ''Métaphysique'', I, 4, 985a25-29</ref> Deuxièmement, Aristote note une asymétrie troublante : la Haine est parfaitement destructrice, tandis que l'Amour ne cesse d'opérer même dans la séparation, puisque la Haine elle-même unit ce qui est semblable. Dès lors, comment affirmer qu'elle soit réellement démiurgique au sens plein ?<ref>Aristote, ''Physique'', II, 8, 198b34-199a2</ref> Ces critiques aristotéliciens, bien que sévères, méconnaissent la subtilité du système empédocléen. Chez Empédocle, en effet, la distinction entre cause matérielle et cause efficiente n'existe pas encore au sens aristotélicien. Les deux forces sont matérielles et motrices en même temps parce que, dans la conception empédocléenne, la matière elle-même est vivante, douée d'une forme d'intentionnalité. L'Amour et la Haine ne sont pas des principes transcendants qui agiraient du dehors sur une matière passive ; ils sont immanents au cosmos, en constituent les fibres mêmes.<ref>Jean Bollack, ''Empédocle. Les Origines'', Minuit, Paris, 1965-1969, t. I, p. 110-115</ref> L'influence de cette conception des forces cosmiques s'étendra bien au-delà de l'Antiquité. Schopenhauer reconnaîtra en Empédocle un précurseur majeur de sa propre métaphysique du Vouloir, où une impulsion universelle, tantôt attractive, tantôt répulsive, anime le cosmos entier.<ref>Arthur Schopenhauer, ''Le Monde comme volonté et représentation'', Livre II, Supplément (trad. Auguste Burdeau), Félix Alcan, Paris, 1890</ref> Freud mentionnera explicitement Empédocle comme source d'inspiration pour sa théorie des pulsions érotiques (Éros) et des pulsions de mort (Thanatos), montrant comment ces deux forces antagonistes et complémentaires gouvernent tous les phénomènes de la vie.<ref>Sigmund Freud, ''Au-delà du principe du plaisir'' (trad. française), Payot, Paris, 1920, p. 36-40</ref> C'est ainsi que le penseur d'Agrigente, philosophe présocratique dont l'œuvre ne nous est connue que par fragments, a jeté les bases conceptuelles pour toute une tradition occidentale de pensée organique et dynamique, résolument contraire à tout réductionnisme mécaniste. == V. La perception et la théorie de la connaissance == La théorie de la connaissance d'Empédocle repose sur un principe simple mais d'une profondeur remarquable : '''le semblable connaît le semblable''' (''homoion gignôskei homoion'')<ref>Empédocle, fragment 109 DK Théophraste chez Aetius IV, 9, 15</ref>. Ce principe, fondamental à toute sa physique, établit une consubstantialité entre l'organe percevant et l'objet perçu, une intrinsèque affinité qui rend possible la connaissance en supprimant temporairement la distance qui sépare le sujet de l'objet. Contrairement aux penseurs qui l'ont précédé, notamment Parménide et Héraclite, Empédocle construit une théorie unifiée de la perception qui englobe l'ensemble des modalités sensorielles et qui s'articule à la cosmologie des quatre racines et à l'action de l'Amour et de la Haine<ref>Théophraste, ''De la sensation'', I sq., cité dans Diogène Laërce, VIII, 55-56</ref>. === Les organes des sens et la théorie des pores === Empédocle imagine que tous les corps, aussi bien externes qu'internes, possèdent des pores (''póroi'') de dimensions variables, et que ces pores se correspondent en vertu d'affinités élémentaires. La sensation est produite par l'entrée de particules minuscules, appelées ''effleuves'' ou ''aporrhóiai'', qui se détachent de tous les corps et pénètrent dans ces pores<ref>Empédocle, fragments 89, 92 DK Aetius IV, 13, 4-5</ref>. Cette théorie des effleuves explique pourquoi certaines sensations sont possibles tandis que d'autres ne le sont pas : les pores de l'œil ne peuvent admettre que les effleuves de la lumière, tandis que les pores de l'oreille ne reçoivent que les effleuves du bruit. Chaque sens dispose ainsi d'une spécificité structurelle qui le limite à la perception des objets pour lesquels ses pores présentent la bonne configuration<ref>Empédocle, fragment 86 DK Théophraste chez Plutarque, ''De la vertu morale'', 446e</ref>. Cette doctrine des pores révèle une compréhension remarquablement sophistiquée de la sélectivité sensorielle. Empédocle l'explicite en affirmant que ''il n'est pas possible qu'un sens juge des objets d'un autre, car les pores de quelques-uns d'entre eux sont trop larges, et ceux des autres trop étroits pour l'objet sensible''<ref>Empédocle, fragment 86 DK</ref>. La vue, l'ouïe, l'odorat, le goût et le toucher ne se concurrencent ni ne se remplacent les uns les autres ; ils forment plutôt un ensemble de canaux distincts, chacun spécialisé dans l'interception de certaines catégories d'effleuves. Empédocle recommande même à son disciple Pausanias d'accorder confiance à tous les sens de manière équitable : ''Va, examine de toutes façons comment chaque chose se manifeste / Mais n'accorde pas plus de confiance à la vue qu'à l'ouïe''<ref>Empédocle, fragment 3 DK</ref>. === La vision : la lumière émanée du feu intérieur === Pour la vision, Empédocle propose une théorie originale où l'acte de voir résulte de la rencontre entre le feu interne à l'œil et le feu externe provenant des objets. L'œil est composé de quatre éléments, mais le feu y prédomine. Il est entouré d'eau, de terre et d'air qui forment une enveloppe protectrice. Le feu intérieur s'écoule à travers cette enveloppe comme la lumière traverse une lanterne, rencontrant le feu externe du monde, et cette union produit la vision<ref>Théophraste chez Aetius IV, 14, 1-2 Empédocle, fragment 84 DK</ref>. La couleur des yeux détermine les conditions de visibilité : les yeux riches en feu voient mieux la nuit, car ils compensent le manque de lumière externe, tandis que les yeux riches en eau voient mieux le jour<ref>Empédocle, fragment 91 DK</ref>. Cette doctrine anticipe certains éléments de la théorie moderne de la vision, bien que ses fondements soient radicalement différents. === L'audition et l'analogie de la cloche === Pour l'ouïe, Empédocle la compare à une cloche. Le son est produit par le choc de l'air extérieur mû par la voix sur le cartilage suspendu à l'intérieur de l'oreille, cartilage qui tinte comme le battant d'une cloche<ref>Empédocle, fragment 93 DK Aetius IV, 16, 1</ref>. L'audition est donc essentiellement un phénomène de résonance : l'air intérieur de l'oreille entre en vibration sympathique avec l'air extérieur qui porte le son. C'est une parfaite illustration du principe du semblable connaissant le semblable : l'air intérieur reconnaît l'air extérieur en entrant en harmonie vibrante avec lui<ref>Théophraste chez Diogène Laërce, VIII, 55</ref>. === L'olfaction et la respiration === L'odorat s'accomplit par la respiration, ce qui explique pourquoi ceux qui sentent le mieux possèdent les mouvements respiratoires les plus violents<ref>Empédocle, fragment 102 DK</ref>. Le chien de chasse qui suit une trace cherche les particules que l'animal a laissées en se déplaçant, des parcelles de matière qui pénètrent les narines du chasseur au rythme de sa respiration<ref>Empédocle, fragment 101 DK</ref>. Ainsi, l'odeur porte en elle les éléments constituants de la chose odorante et entre en contact avec les éléments semblables présents dans l'organe olfactif du percevant. === La théorie unifiée de la sensation === Ces modalités sensorielles distinctes convergent en une théorie générale selon laquelle ''la sensation naît de l'adaptation aux pores''<ref>Théophraste, ''De la sensation'', 1 sq.</ref>. Plutôt que de considérer chaque sens comme un mécanisme entièrement distinct, Empédocle les intègre tous dans un schéma unifié : en chaque lieu du corps, existent des pores ; dans chaque corps du monde environnant, se dégagent des effleuves ; quand les dimensions des pores correspondent aux dimensions des effleuves, la sensation a lieu. Cette correspondance n'est jamais fortuite : elle repose sur une affinité élémentaire profonde. La sensation est ainsi une forme d'union, une communion temporaire entre ce qui perçoit et ce qui est perçu<ref>Empédocle, fragment 90 DK : « Ainsi le doux se saisit du doux, l'amer se précipite vers l'amer, / L'acide va vers l'acide et le chaud s'unit au chaud »</ref>. === La respiration et la physiologie === L'explication empédocléenne de la respiration, illustrée par la célèbre analogie de la clepsydre, révèle la profondeur de sa pensée physiologique<ref>Empédocle, fragment 100 DK</ref>. La clepsydre, ce récipient antique destiné à verser des liquides, possède une imbouchure supérieure et un fond percé de nombreux petits trous formant un crible. Quand on la plonge vide dans l'eau en tenant l'imbouchure fermée, l'eau n'y pénètre pas, car l'air interne repousse le liquide. Dès qu'on retire la main de l'imbouchure, l'eau s'y précipite. De même, dans l'organisme vivant, le sang et l'air effectuent une danse alternative : quand le sang se retire des capillaires, l'air y pénètre ; quand le sang y retourne, l'air en sort. Ce mécanisme explique la respiration pulmonaire : l'air externe s'engouffre dans les poumons en empruntant les trachées et bronches pour occuper l'espace évacué par le sang qui reflue vers le cœur<ref>Empédocle, fragment 100 DK</ref>. Cette conception du poumon comme siège d'échanges régulés entre deux fluides incompressibles constitue une intuition physiologique remarquable, même si les détails anatomiques ne pouvaient être correctement établis à l'époque. === Le sang, siège de la pensée === La cognition elle-même, pour Empédocle, s'inscrit dans ce cadre physiologique. Le sang, particulièrement le sang circulant autour du cœur, constitue le siège de la pense (''nous''). Ceci découle de sa composition unique : le sang contient les quatre racines élémentaires en proportions à peu près égales, ce qui en fait le mélange le plus harmonieux et le plus intelligent<ref>Empédocle, fragment 105 DK : « Car le sang qui entoure le cœur est la Pensée chez l'espèce humaine »</ref>. La qualité de la pensée dépend directement de la qualité du mélange sanguin : ''Tous ceux chez lesquels le mélange est égal, ou peu pres, et chez qui les éléments ne sont ni de trop grands intervalles, ni trop petits, ni trop grands, sont les plus intelligents''<ref>Empédocle, fragment 107 DK Théophraste chez Aetius IV, 5, 12</ref>. À l'inverse, ceux dont le mélange sanguin est déséquilibré, où un élément prédomine excessivement, sont obtus, paresseux ou impulsifs<ref>Théophraste chez Aetius IV, 5, 12</ref>. Cette doctrine établit une continuité remarquable entre la sensation et la pensée. Comme le rapporte Théophraste, ''la pense naît de ce qui est semblable, l'ignorance de ce qui est dissemblable, si bien que la pense est la même chose, ou peu s'en faut, que la sensation''<ref>Théophraste, ''De la sensation'', 1 sq., cité par Aetius IV, 9, 11</ref>. La cognition n'est donc pas une faculté transcendantale détachée de la sensation elle en constitue l'achèvement et l'approfondissement. Penser, c'est continuer à percevoir, mais de manière plus stable et plus intègre. === Le principe gnoséologique et ses implications === Le principe ''le semblable connaît le semblable'' possède des implications gnoséologiques profondes. Il signifie que le sujet percevant ne peut connaître que ce dont il partage la nature. L'homme, composé des quatre racines élémentaires, ne peut connaître le monde extérieur que parce que ce monde est fait des mêmes racines : ''Nous voyons la terre par la terre, l'eau par l'eau, / L'air divin par l'air et le feu destructeur par le feu''<ref>Empédocle, fragment 87 DK</ref>. Cette doctrine implique une consubstantialité fondamentale entre le connaissant et le connu, une osmose perpétuelle entre l'intérieur et l'extérieur. L'Amour, en unissant les semblables, crée le condition même de la connaissance. C'est pourquoi la sensation est toujours accompagnée d'une forme de plaisir : ''Le plaisir est procuré au semblable par le semblable dans l'addition de ce qui lui fait défaut''<ref>Empédocle, fragment 95 DK</ref>. Empédocle reconnaît aussi que la connaissance comporte un élément irréductiblement limité. Les pouvoirs répandus dans les membres des hommes sont circonscrits ; nous ne voyons pendant notre existence qu'une brève part de la vie<ref>Empédocle, fragment 2 DK</ref>. Néanmoins, celui qui s'applique avec rigueur et qui cultive son intelligence peut accéder à une compréhension plus vaste. L'apprentissage consiste à se rapprocher progressivement de la totalité des choses, même si cette totalité demeure définitivement inaccessible à un mortel individuel. C'est peut-être pourquoi Empédocle valorise tellement la transmigration des âmes : en vivant successivement sous différentes formes, en parcourant les règnes animal, végétal et humain, l'âme accumule une connaissance pancosmique, une intelligence qui embrasse les vicissitudes de tous les êtres<ref>Empédocle, fragment 117 DK</ref>. === La critique aristotélicienne et l'héritage ultérieur === Aristote, malgré son admiration pour l'ingéniosité d'Empédocle, formule plusieurs critiques contre sa théorie de la perception. Il reproche notamment à l'Acragentin l'absence de clarté quant aux mécanismes précis par lesquels les effleuves pénètrent les pores, ainsi que l'incohérence apparente de maintenir que la sensation résulte à la fois d'une ressemblance (le semblable connaît le semblable) et de contacts physiques (les effleuves pénétrant les pores)<ref>Aristote, ''De la sensation'', II, 437b10-438a5</ref>. Néanmoins, la théorie empédocléenne de la perception exerça une influence considérable sur la philosophie ultérieure. Platon s'inspira de certains éléments de cette théorie lorsqu'il élabora sa propre doctrine de la vision dans le ''Timée''<ref>Platon, ''Timée'', 45b-c Laks et Most, 2016, p. 703-704</ref>. Plus tardivement, les stoïciens intégreront la théorie empédocléenne des effleuves dans leur propre pneumatologie. La conception empédocléenne selon laquelle la matière elle-même possède une forme d'intention et que les contacts sensoriels unissent essentiellement le percevant et le perçu allait exercer une fascination durable sur les alchimistes médiévaux et la Naturphilosophie romantique. == VI. La génération des êtres vivants et la physiologie == La théorie empédocléenne de la génération des êtres vivants représente l'une des contributions les plus audacieuses de la pensée présocratique à la biologie et à la physiologie. Fondée sur les principes du mélange et de la séparation des quatre racines élémentaires, auxquels s'ajoutent l'action de l'Amour et de la Haine, cette théorie s'efforce de rendre compte de l'infinie variété des vivants, de la simplicité des végétaux à la complexité des animaux et des humains<ref>Empédocle, fragments 20, 21, 26, 62, 63 DK Aetius, V, 19, 5 Aristote, ''De partibus animalium'', I, 1, 642a17</ref>. === Les phases de la zoogenèse === Selon le témoignage d'Aétius et de plusieurs auteurs anciens, Empédocle décrit la genèse des êtres vivants comme une succession de phases où se reconfigurent les combinaisons des quatre racines sous l'action de l'Amour et de la Haine.<ref>Aétius, V, 19, 4 = Empédocle, 31 B 57 DK.</ref> La recherche moderne a souvent rapproché ce schéma d'un modèle « évolutif », mais il ne s'agit pas d'une théorie de l'évolution au sens biologique contemporain : Empédocle ne parle ni d'ascendance commune, ni de transmission héréditaire de caractères, ni d'adaptation graduelle à un milieu. Il met en scène des configurations successives du vivant dans le cadre d'un cycle cosmique gouverné par des forces cosmiques. La première phase est caractérisée par l'apparition de membres et d'organes isolés, entièrement désagrégés, errant solitairement sur la terre sans cohésion organique : « Sur la terre naquirent de nombreuses têtes privées de cou, / Et des bras erraient séparés du tronc, sans épaules, / Et des yeux allaient ici et là privés de front. »<ref>Empédocle, 31 B 57 DK.</ref> Ces membres épars constituent le résidu de la désagrégation progressive du Sphairos sous l'action croissante de la Haine. La deuxième phase voit ces membres commencer à se rencontrer et à s'assembler de façon aléatoire et chaotique. C'est le moment où naissent les monstres terrifiants, créatures hybrides dépourvues de toute harmonie : « Des êtres aux pieds tournés, aux mains innombrables, / De nombreuses créatures naquirent avec un visage et une poitrine des deux côtés, / Des bovins à figure humaine naquirent et inversement, / Des enfants d'hommes avec des têtes bovines. »<ref>Empédocle, 31 B 61 DK.</ref> Empédocle ne précise pas systématiquement le destin de ces êtres, mais la tradition doxographique indique que ces unions chaotiques étaient le plus souvent stériles ou non viables.<ref>Aristote, ''Physique'', II, 8, 198b-199b.</ref> Dans une troisième phase, l'entrée décisive de l'Amour dans le processus permet la constitution d'organismes plus complets, dotés de proportions plus harmonieuses : « Tirant des formes indistinctes de la terre, / Mais ayant également une part d'humidité et de feu. »<ref>Empédocle, 31 B 62 DK.</ref> Ces créatures « ne montraient pas encore un corps charmant doué de membres / Ni la voix, ni les organes propres aux hommes » : elles demeurent des ébauches, où la Haine continue de maintenir les formes dans une incomplétude essentielle, tandis que l'Amour commence déjà à créer des liaisons stables. La quatrième phase correspond au régime de la génération « normale », sexuelle, où les individus nés par reproduction se transmettent la vie selon les lois de la procréation. C'est le monde que nous habitons, où la génération procède de l'accouplement du mâle et de la femelle et où la transmission héréditaire assure la continuité des lignées.<ref>Aétius, V, 19, 5.</ref> === Les monstres et la sélection naturelle === La vision empédocléenne du monde vivant primordial est l'un de ses aspects les plus étonnants et les plus débattus. Les êtres « convenablement constitués », possédant une harmonie suffisante entre leurs parties et une réelle aptitude à vivre, survivent et se multiplient, tandis que les monstres inaptes, les hybrides dysharmoniques, les créatures défectueuses disparaissent et ne se reproduisent pas.<ref>Aristote, ''Physique'', II, 8, 198b-199b.</ref> C'est ce motif, transmis notamment par Aristote, qui a conduit plusieurs historiens à rapprocher Empédocle d'une sorte de préhistoire de la sélection naturelle. Depuis le XIX{{e}} siècle, certains commentateurs, à la suite de Zeller, n'ont pas hésité à présenter Empédocle comme « le plus ancien précurseur de Darwin ».<ref>Eduard Zeller, ''Die Philosophie der Griechen in ihrer geschichtlichen Entwicklung'', Leipzig, 1844-1852.</ref> Une telle assimilation, bien qu'instructive par certains côtés, demeure pourtant superficielle. Empédocle n'élabore ni une théorie mécaniste de la variation aléatoire, ni un modèle d'adaptation graduelle à un environnement changeant. Chez lui, la disparition des monstres reflète, au niveau biologique, le triomphe progressif de l'Amour sur la Haine plutôt qu'une optimisation statistique des formes de vie. On peut dire, avec prudence, que la notion empédocléenne d'une succession de formes plus ou moins harmonieuses fournit un précédent antique que la pensée transformiste moderne a pu reconnaître rétrospectivement comme un « analogue » lointain, sans qu'il y ait pour autant continuité doctrinale avec les théories darwiniennes. === La physiologie humaine et le rôle du sang === Empédocle accorde une attention particulière à la composition et aux fonctions du corps humain. Selon le témoignage d'Aetius, le corps humain est formé « du mélange en parties à peu près égales des quatre éléments »<ref>Aetius, V, 22, 1 ap. Diogène Laërce, VIII, 76</ref>. Plus précisément, Empédocle fournit des proportions exactes pour différents tissus : « Les chairs naissent du mélange en parties égales des quatre éléments, les nerfs de feu et de terre unis au double d'eau, les ongles viennent aux vivants des nerfs qui se refroidissent au contact de l'air, les os sont formés d'un mélange de deux parties d'eau et de terre et de quatre de feu »<ref>Empédocle, fragment 96 DK Aetius, V, 22, 1</ref>. Cette présentation numérique témoigne de l'effort empédocléen pour donner une explication rationnelle et quantifiable de la structure des corps organisés. Le rôle du sang revêt, dans cette physiologie, une importance exceptionnelle. Le sang, particulièrement celui qui circule autour du cœur, constitue le siège de la pensée, du sentiment et de la vie intellectuelle : « Tous ceux chez lesquels le mélange est égal, ou à peu près, et chez qui les éléments ne sont ni de trop grands intervalles, ni trop petits, ni trop grands, sont les plus intelligents »<ref>Empédocle, fragment 107 DK Théophraste chez Aetius, IV, 5, 12</ref>. Car « le sang qui entoure le cœur est la Pensée chez l'espèce humaine »<ref>Empédocle, fragment 105 DK</ref>. Cette doctrine établit une continuité remarquable entre le physique et le mental, entre le matériel et le cognitif, en affirmant que l'intelligence et la pensée sont le produit direct de la qualité et de la proportion du mélange sanguin<ref>Théophraste chez Aetius, IV, 5, 12</ref>. Inversement, ceux dont le mélange sanguin est déséquilibré, où un ou plusieurs éléments prédominent excessivement, possèdent une capacité intellectuelle diminuée. Les différences individuelles de talent, de capacité, de tempérament résultent directement des variations dans la composition élémentaire du sang et des autres humeurs du corps<ref>Théophraste chez Aetius, IV, 5, 12</ref>. Cette théorie préfigure la physiognomonie et la théorie des tempéraments qui dominèrent la médecine ancienne et médiévale. === La respiration et la clepsydre === L'explication empédocléenne de la respiration, illustrée par la célèbre analogie de la clepsydre, constitue un chef-d'œuvre de pédagogie scientifique et une préfiguration géniale des mécanismes ventilatoires modernes<ref>Empédocle, fragment 100 DK</ref>. Une clepsydre est un récipient destiné à verser des liquides, possédant une embouchure supérieure et un fond percé de nombreux petits trous. Quand on la plonge vide dans l'eau en tenant l'embouchure fermée, l'eau n'y pénètre pas, car l'air intérieur repousse le liquide. Dès qu'on retire la main de l'embouchure, l'eau s'y précipite. De même, dans le corps vivant, le sang et l'air effectuent une danse alternative : quand le sang se retire des capillaires cutanés, l'air y pénètre ; quand le sang y retourne, l'air en sort<ref>Empédocle, fragment 100 DK</ref>. Ce mécanisme explique la respiration pulmonaire et cutanée. L'air externe s'engouffre dans les poumons en empruntant les trachées et bronches pour occuper l'espace évacué par le sang qui reflue vers le cœur. À l'inverse, quand le sang se retire du cœur pour irriguer la périphérie, l'air sortant des poumons est expulsé par les narines<ref>Théophraste chez Aetius, IV, 22, 1</ref>. Ce cycle d'inspiration et d'expiration se reproduit à chaque battement cardiaque. Empédocle conçoit donc la respiration non comme un simple phénomène d'échange gazeux, mais comme une oscillation volumétrique et une compénétration harmonieuse du blood et de l'air<ref>Empédocle, fragment 100 DK</ref>. === La génération, le sexe et l'hérédité === Empédocle s'intéresse également aux questions de la détermination du sexe à la conception. Selon Aristote, qui rapporte sa doctrine, Empédocle pensait que « les germes qui entrent dans un utérus chaud deviennent mâles, ceux qui pénètrent dans un utérus froid deviennent femelles, ce froid et cette chaleur proviendraient du flux menstruel, suivant qu'il est plus froid ou plus chaud »<ref>Aristote, ''De generatione animalium'', IV, 1, 764a1 ; Aetius, V, 7, 1</ref>. Cette théorie thermique du sexe, quoique erronée dans ses mécanismes, témoigne d'une certaine reconnaissance du rôle des conditions intrautérines dans la différenciation sexuelle<ref>Aristote, ''De generatione animalium'', II, 8, 747a24</ref>. Sur la question de l'hérédité et de la ressemblance entre parents et enfants, Empédocle propose une théorie sophistiquée combinant des facteurs physiologiques et même psychologiques. Si « la chaleur est la même dans les semences des parents, il naît un mâle qui ressemble à son père ; si le froid est identique, il naît une femme qui ressemble à sa mère »<ref>Aetius, V, 7, 1 ; Aristote, ''De generatione animalium'', II, 8, 747a24</ref>. De plus, Empédocle affirme, de manière remarquable, que « la conformation du fœtus est soumise pendant la gestation à l'imagination de la mère : souvent, en effet, les femmes se prennent d'amour pour des statues ou des tableaux et ont ensuite des enfants qui ressemblent à ces objets »<ref>Aetius, V, 7, 1 ; Censorinus, 6, 6</ref>. Cette docrine, quoique basée sur des principes physiologiquement inacceptables pour nous, révèle une préoccupation pour le rôle de la vie émotionnelle et imaginative dans la transmission des caractères héréditaires. === La naissance, le cœur et la mort === Empédocle affirme, contrairement à d'autres penseurs, que « le cœur se forme avant toutes choses, parce qu'il contient la part essentielle de la vie de l'homme »<ref>Aetius, V, 24, 2 ; Censorinus, 7, 5</ref>. Cette affirmation manifeste une intuition remarquable du rôle central du cœur dans la vie physiologique. Au moment de la naissance, l'animal inspire pour la première fois quand le liquide amniotique est évacué et que l'air extérieur entre dans le vide créé par ce départ : « La chaleur interne, tendant à partir au-dehors, chasse l'air et il y a expiration ; lorsqu'elle cède à la pression de l'air et permet à celui-ci de rentrer, il y a une nouvelle inspiration »<ref>Théophraste chez Aetius, IV, 22, 1</ref>. Quant à la mort, Empédocle la conçoit non comme une anéantissement, mais comme une séparation des éléments : « La mort provient de la séparation de l'élément igné, de l'élément aérien, de l'élément humide et de l'élément terrestre, dont le mélange constitue l'homme »<ref>Aetius, V, 25, 4 ; Empédocle, fragment 98 DK</ref>. Le sommeil, état moins extrême que la mort, « provient d'un léger refroidissement de la chaleur du sang »<ref>Aetius, V, 24, 2</ref>, tandis que la mort résulte d'un « refroidissement complet »<ref>Aetius, V, 25, 4</ref>. Cette physiologie du repos et de la mort envisage ces états comme des variations quantitatives de la calorification plutôt que comme des changements qualitatifs radicaux. === La critique aristotélicienne === Aristote, tout en reconnaissant l'ingéniosité de certaines explications empédocléennes, les soumet à une critique serrée. Il reproche notamment à Empédocle de n'avoir pas clairement distingué entre les causes matérielles (les éléments) et les causes formelles ou organisant le tout<ref>Aristote, ''De partibus animalium'', I, 1, 642a17-31</ref>. Selon le Stagirite, Empédocle confond l'explication matérielle avec l'explication par la cause efficiente et par la cause finale. Les os ne sont pas des os simplement parce qu'ils contiennent deux parties d'eau, deux parties de terre et quatre parties de feu ; cette proportion matérielle ne suffit pas à expliquer la forme osseuse, sa densité caractéristique, sa résistance à la fracture, son rôle dans le squelette<ref>Aristote, ''Des parties des animaux'', I, 1, 642a17-31</ref>. Néanmoins, la physiologie empédocléenne, malgré ses lacunes et ses erreurs, constitue un apport durable à la pensée biologique occidentale. Son influence sur l'école médicale de Sicile et d'Italie du Sud fut considérable. Galien reconnaît explicitement Empédocle comme le fondateur de cette école médicale<ref>Galien cité dans Diogène Laërce, VIII, 75</ref>. Les théories des quatre humeurs, des tempéraments corporels, et de la prédominance du cœur dans la vie mentale et physique trouveront leurs racines dans le système empédocléen, qui sera progressivement raffiné et systématisé par les générations ultérieures de médecins et de philosophes. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Éditions critiques des fragments === ==== Éditions de référence ==== Hermann '''Diels''' et Walther '''Kranz''', ''Die Fragmente der Vorsokratiker'', Berlin, Weidmann, 1re éd. 1903, 6e éd. 1951-1952, 3 vol. Nombreuses rééditions. Cette édition, abrégée DK ou D.-K., constitue la référence classique pour la numérotation des fragments présocratiques. Empédocle y figure sous le numéro 31. Friedrich Wilhelm '''Sturz''', ''Empedocles Agrigentinus. De vita et philosophia ejus exposuit carminum reliquias ex antiquis scriptoribus collegit, recensuit, illustravit, praefationem et indices adjecit'', Leipzig, 1805. Première édition moderne des fragments. Simon '''Karsten''', ''Empedoclis Agrigentini carminum reliquiae'', Amsterdam, 1838. Édition avec commentaire philologique détaillé. ==== Éditions récentes avec les découvertes papyrologiques ==== Alain '''Martin''' et Oliver '''Primavesi''', ''L'Empédocle de Strasbourg P. Strasb. gr. Inv. 1665-1666. Introduction, édition et commentaire'', Strasbourg-Berlin-New York, Bibliothèque nationale et universitaire de Strasbourg - De Gruyter, 1999, xi-396 p. Édition princeps du papyrus de Strasbourg contenant environ 74 vers nouveaux ou partiellement nouveaux d'Empédocle, découvert dans les collections de la Bibliothèque nationale et universitaire de Strasbourg. Cette publication a profondément renouvelé les études empédocléennes. Oliver '''Primavesi''', ''Empedokles Physika I. Eine Rekonstruktion des zentralen Gedankengangs'', Berlin-New York, De Gruyter, Archiv für Papyrusforschung und verwandte Gebiete, Beiheft 22, 2008, 84 p. Reconstruction de la structure du poème ''Sur la Nature'' à partir du papyrus de Strasbourg. Nathan '''Carlig''', découverte récente d'un nouveau fragment de papyrus au Caire P. Fouad inv. 218 contenant une trentaine de vers inédits d'Empédocle, encore en cours d'édition. Publication annoncée. ==== Éditions avec traduction ==== André '''Laks''' et Glenn W. '''Most''' dir., ''Early Greek Philosophy'', 9 vol., Cambridge Mass.-Londres, Harvard University Press, Loeb Classical Library 524-532, 2016. Édition et traduction anglaise de l'ensemble des philosophes présocratiques, avec bibliographie mise à jour. Empédocle figure dans le volume V. Brad '''Inwood''', ''The Poem of Empedocles. A Text and Translation with an Introduction'', Toronto, University of Toronto Press, Phoenix Supplementary Volumes, 1re éd. 1992, éd. révisée 2001. Édition du texte grec avec traduction anglaise en vers et introduction substantielle. Inwood défend la thèse d'un poème unique contre la division traditionnelle en deux œuvres. M. R. '''Wright''', ''Empedocles the Extant Fragments'', New Haven-Londres, Yale University Press, 1re éd. 1981, 2e éd. avec bibliographie mise à jour, Bristol, Bristol Classical Press, 1995, 368 p. Édition du texte grec avec traduction anglaise, introduction et commentaire détaillé. Daniel W. '''Graham''', ''The Texts of Early Greek Philosophy. The Complete Fragments and Selected Testimonies of the Major Presocratics'', Cambridge, Cambridge University Press, 2010, 2 vol. Édition et traduction anglaise accessible des principaux présocratiques. === Éditions et études en français === ==== Éditions de Jean Bollack ==== Jean '''Bollack''', ''Empédocle'', Paris, Les Éditions de Minuit, collection « Le sens commun », 1965-1969, 3 vol. puis Paris, Gallimard, collection « Tel » n° 201-203, 1992, 3 vol. Réédition de l'ouvrage fondamental de Bollack : * Tome I : ''Introduction à l'ancienne physique'', 420 p. * Tome II : ''Les Origines. Édition et traduction des fragments et des témoignages'' * Tome III : ''Les Origines. Commentaires 1 et 2'' Jean '''Bollack''', ''Les Purifications. Un projet de paix universelle'', Paris, Éditions du Seuil, collection « L'ordre philosophique », 2003, 176 p. Réédition Paris, Points, collection « Points Essais », 2003. Édition, traduction et commentaire des fragments des ''Catharmes'' Purifications, intégrant les découvertes du papyrus de Strasbourg. ==== Autres traductions françaises ==== Jean '''Zafiropulo''', ''Empédocle d'Agrigente'', Paris, Les Belles Lettres, 1953. Traduction avec introduction et notes. Jean '''Voilquin''', ''Les Penseurs grecs avant Socrate. De Thalès de Milet à Prodicos'', Paris, Garnier-Flammarion, 1941, 2e éd. 1964. Traduction des principaux fragments présocratiques. Yves '''Battistini''', ''Trois contemporains Héraclite, Parménide, Empédocle'', traduction nouvelle et intégrale avec notices, Paris, Gallimard, 1955. Jean '''Brun''', ''Empédocle ou le Philosophe de l'Amour et de la Haine'', Paris, Éditions Seghers, collection « Philosophes de tous les temps », 1966. Présentation, choix de textes, traduction et bibliographie. ==== Études françaises récentes ==== Marwan '''Rashed''', ''La Jeune Fille et la Sphère. Études sur Empédocle'', Paris, Presses de l'Université Paris-Sorbonne, collection « Philosophies », 2017, 300 p. Réédition Sorbonne Université Presses, 2023. Étude conjuguant philologie et philosophie, proposant une nouvelle interprétation du cycle cosmique et mettant en lumière la présence cachée de Perséphone dans le poème. L'ouvrage exploite des sources manuscrites byzantines découvertes par l'auteur.<ref>web:f> Jean '''Bollack''', « Voir la Haine. Sur les nouveaux fragments d'Empédocle », ''Methodos'', 1, 2001, p. 173-185. André '''Laks''', « À propos de l'édition du nouvel Empédocle de Strasbourg par A. Martin et O. Primavesi », ''Methexis'', 14, 2001, p. 117-125. Compte rendu critique de l'édition du papyrus de Strasbourg. Xavier '''Gheerbrant''', « Traduire Empédocle, entre poésie et philosophie comparaison de dix traductions en cinq langues 1838-2016 », dans ''La traduction épistémique entre poésie et prose'', Arras, Artois Presses Université, 2020, p. 87-142. === Études en italien === Ettore '''Bignone''', ''Empedocle. Studio critico, traduzione e commento delle testimonianze e dei frammenti'', Turin, 1916. Réédition Rome, 1963. Étude critique monumentale avec traduction italienne et commentaire détaillé. === Études en allemand === Walther '''Kranz''', ''Empedokles. Antike Gestalt und romantische Neuschöpfung'', Zurich, Artemis Verlag, 1949. Étude sur Empédocle et sa réception romantique. Ulrich von '''Wilamowitz-Moellendorff''', « Die Katharmoi des Empedokles », ''Sitzungsberichte der Preussischen Akademie der Wissenschaften'', Philosophisch-historische Klasse, Berlin, 1929, p. 626-661. Réédition dans ''Kleine Schriften'', vol. I, Berlin, 1935, p. 473-521. Étude fondamentale sur les ''Purifications''. === Études en anglais === ==== Monographies ==== Clara Elizabeth '''Millerd''', ''On the Interpretation of Empedocles'', Chicago, University of Chicago Press, 1908. Première grande étude américaine. Peter '''Kingsley''', ''Ancient Philosophy, Mystery, and Magic Empedocles and Pythagorean Tradition'', Oxford, Clarendon Press, 1995. Traduction française par Grégoire Lacaze : ''Empédocle et la tradition pythagoricienne. Philosophie ancienne, mystère et magie'', Paris, Les Belles Lettres, collection « Vérité des mythes », 2010. Étude renouvelant l'approche d'Empédocle en le replaçant dans son contexte originel, où philosophie, mystères et magie sont étroitement liés.<ref>webef> Catherine '''Osborne''', ''Rethinking Early Greek Philosophy Hippolytus of Rome and the Presocratics'', Ithaca New York, Cornell University Press, 1987. Analyse de la réception d'Empédocle chez Hippolyte de Rome. ==== Articles et contributions ==== Denis '''O'Brien''', « Empedocles Revisited », ''Ancient Philosophy'', 15, 1995, p. 403-470. Réexamen critique de l'interprétation du cycle cosmique. Denis '''O'Brien''', « Hermann Diels on the Presocratics Empedocles' Double Destruction of the Cosmos Aetius II, 4, 8 », ''Phronesis'', 45, 2000, p. 1-18. Catherine '''Osborne''', « Empedocles Recycled », ''The Classical Quarterly'', 37, 1987, p. 24-50. Sur l'unité ou la dualité des poèmes d'Empédocle. Catherine '''Osborne''', « Rummaging in the Recycling Bins of Upper Egypt A Discussion of A. Martin and O. Primavesi, ''L'Empédocle de Strasbourg'' », ''Oxford Studies in Ancient Philosophy'', 18, 2000, p. 329-356. Compte rendu critique de l'édition du papyrus de Strasbourg. Oliver '''Primavesi''', « Empedocles Cosmic Cycle and the Pythagorean Tetractys », ''Rhizomata'', 4/1, 2016, p. 5-29. Analyse du cycle cosmique en relation avec la tétractys pythagoricienne. Oliver '''Primavesi''', « La Daimonologia della fisica empedoclea », ''Aevum Antiquum'', n. s. 1, 2001, sous presse. Sur la démonologie dans la physique d'Empédocle. Simon '''Trépanier''', « Empedocles on the Origin of Plants P. Strasb. gr. Inv. 1665-1666, Sections d, b and f », dans M. R. '''Wright''' dir., ''Reason and Necessity. Essays on Plato's Timaeus'', Londres, 2000. Reconstruction d'une section du papyrus de Strasbourg. Simon '''Trépanier''', « Empedocles on the Ultimate Symmetry of the World », ''Oxford Studies in Ancient Philosophy'', 24, 2003. Sur la structure symétrique du cosmos empédocléen. === Histoires de la philosophie et ouvrages généraux === ==== Ouvrages classiques ==== Hermann '''Ritter''', ''Histoire de la philosophie'', 1re partie, t. I, trad. par C.-J. Tissot, Paris, Ladrange, 1835. L'une des premières histoires de la philosophie à consacrer une étude détaillée à Empédocle. Eduard '''Zeller''', ''Die Philosophie der Griechen in ihrer geschichtlichen Entwicklung'', 1re partie, 2e section, 1re éd. 1855, 6e éd. complétée par Wilhelm Nestlé, Leipzig, 1920. Traduction française par E. Boutroux : ''La Philosophie des Grecs considérée dans son développement historique'', t. II, Paris, Hachette, 1882. Synthèse classique et toujours utile sur Empédocle. Theodor '''Gomperz''', ''Griechische Denker. Eine Geschichte der antiken Philosophie'', vol. I, 1re éd. 1895, 3e éd. Leipzig, 1911. Traduction française par Auguste Reymond : ''Les Penseurs de la Grèce. Histoire de la philosophie antique'', t. I, Lausanne-Paris, Payot, 1904. Empédocle y est présenté comme un précurseur de la chimie moderne. John '''Burnet''', ''Early Greek Philosophy'', 1re éd. 1892, 4e éd. Londres, A. & C. Black, 1930. Traduction française par Auguste Reymond : ''L'Aurore de la philosophie grecque'', Paris, Payot, 1919. Ouvrage fondamental sur la philosophie présocratique.<ref>webef> ==== Synthèses récentes ==== G. S. '''Kirk''' et J. E. '''Raven''', ''The Presocratic Philosophers. A Critical History with a Selection of Texts'', Cambridge, Cambridge University Press, 1957. Réédition révisée avec Malcolm '''Schofield''' : ''The Presocratic Philosophers'', 2e éd. 1983. Ouvrage de référence en langue anglaise sur les présocratiques. W. K. C. '''Guthrie''', ''A History of Greek Philosophy'', vol. II : ''The Presocratic Tradition from Parmenides to Democritus'', Cambridge, Cambridge University Press, 1965. Étude approfondie d'Empédocle dans son contexte historique. Patricia '''Curd''' et Daniel W. '''Graham''' dir., ''The Oxford Handbook of Presocratic Philosophy'', Oxford, Oxford University Press, 2008. Recueil d'articles par les meilleurs spécialistes, avec plusieurs contributions sur Empédocle. === Études thématiques === ==== Cosmologie et physique ==== Denis '''O'Brien''', ''Empedocles' Cosmic Cycle. A Reconstruction from the Fragments and Secondary Sources'', Cambridge, Cambridge University Press, Cambridge Classical Studies, 1969, 470 p. Reconstruction du cycle cosmique à partir des fragments et des témoignages. Friedrich '''Solmsen''', « Love and Strife in Empedocles' Cosmology », ''Phronesis'', 10, 1965, p. 109-148. Oliver '''Primavesi''', « Empedocles On the Ultimate Symmetry of the World », dans Patricia '''Curd''' et Daniel W. '''Graham''' dir., ''The Oxford Handbook of Presocratic Philosophy'', Oxford, 2008, p. 250-277. ==== Biologie et zoogonie ==== M. R. '''Sulzberger''', « La Physique d'Empédocle », dans ''Mélanges Bidez'', Bruxelles, 1934. W. K. C. '''Guthrie''', ''In the Beginning Some Greek Views on the Origins of Life and the Early State of Man'', Ithaca, Cornell University Press, 1957. Walter '''Spoerri''', ''Späthellenistische Berichte über Welt, Kultur und Götter. Untersuchungen zu Diodor von Sizilien'', Bâle, F. Reinhardt, 1959. Sur la réception d'Empédocle dans les théories de l'origine de la vie. ==== Théorie de la connaissance ==== John I. '''Beare''', ''Greek Theories of Elementary Cognition from Alcmaeon to Aristotle'', Oxford, Clarendon Press, 1906. G. M. '''Stratton''', ''Theophrastus and the Greek Physiological Psychology before Aristotle'', Londres-New York, George Allen & Unwin - The Macmillan Company, 1917. ==== Religion, pythagorisme et orphisme ==== Joseph '''Bidez''', ''La Biographie d'Empédocle'', Gand, Université de Gand, 1894. Étude fondamentale sur la vie d'Empédocle et les traditions biographiques. Erwin '''Rohde''', ''Psyche. Seelencult und Unsterblichkeitsglaube der Griechen'', 1re éd. Fribourg-en-Brisgau, 1894, 2e éd. révisée en 2 vol. 1898. Traduction française par Auguste Reymond : ''Psyché. Le culte de l'âme chez les Grecs et leur croyance à l'immortalité'', Paris, Payot, 1928. Réimpressions 1952, 1999. Ouvrage classique sur la religion grecque, avec d'importants développements sur Empédocle. Marcel '''Detienne''', ''La Notion de daïmôn dans le pythagorisme ancien. De la pensée religieuse à la pensée philosophique'', Paris, Les Belles Lettres, 1963. Étude sur la démonologie pythagoricienne et empédocléenne. Walter '''Burkert''', ''Weisheit und Wissenschaft. Studien zu Pythagoras, Philolaos und Platon'', Nuremberg, Hans Carl, 1962. Traduction anglaise révisée par Edwin L. Minar Jr. : ''Lore and Science in Ancient Pythagoreanism'', Cambridge Mass., Harvard University Press, 1972. Étude fondamentale sur le pythagorisme et ses rapports avec Empédocle. Christoph '''Riedweg''', « Orphisches bei Empedokles », ''Antike und Abendland'', 41, 1995, p. 34-59. Sur les éléments orphiques chez Empédocle. André '''Laks''' et Glenn W. '''Most''' dir., ''Studies on the Derveni Papyrus'', Oxford, Clarendon Press, 1997. Recueil d'études sur le papyrus de Derveni, avec des implications pour la compréhension d'Empédocle. ==== Sacrifice et végétarisme ==== Johannes '''Haussleiter''', ''Der Vegetarismus in der Antike'', Religionsgeschichtliche Versuche und Vorarbeiten 24, Berlin, Töpelmann, 1935. Marcel '''Detienne''', « La cuisine de Pythagore », ''Archives de Sociologie des Religions'', 29, 1970, p. 141-162. Dirk '''Obbink''', « The Origin of Greek Sacrifice Theophrastus on Religion and Cultural History », dans William W. '''Fortenbaugh''' et Robert W. '''Sharples''' dir., ''Theophrastean Studies'', New Brunswick, Transaction Publishers, Rutgers Studies in Classical Humanities 3, 1988, p. 272-295. Jean-François '''Balaud''', « Parenté du vivant et végétarisme radical », dans Barbara '''Cassin''' et Jean-Louis '''Labarrière''' dir., ''L'Animal dans l'Antiquité'', Paris, Vrin, 1997, p. 31-53. John '''Rundin''', « The Vegetarianism of Empedocles in Its Historical Context », ''The Ancient World'', 29, 1998, p. 19-36. ==== Métempsychose ==== E. R. '''Dodds''', ''The Greeks and the Irrational'', Berkeley, University of California Press, 1951. Traduction française par Michel Gibson : ''Les Grecs et l'irrationnel'', Paris, Aubier, 1965. Avec un chapitre important sur Empédocle et la métempsychose. R. S. '''Bluck''', « Transmigration and Recollection before Plato », dans ''Plato's Meno'', Cambridge, Cambridge University Press, 1961. ==== Poétique et rhétorique ==== B. A. van '''Groningen''', « Empédocle, poète », ''Mnemosyne'', 4e série, 24, 1971, p. 169-188. Antonio '''Traglia''', ''Studi sulla lingua di Empedocle'', Bari, Adriatica, 1952. Étude linguistique et stylistique. === Réception et influence === ==== Antiquité ==== A. O. '''Lovejoy''' et George '''Boas''', ''Primitivism and Related Ideas in Antiquity'', Baltimore, Johns Hopkins Press, 1935. Réédition New York, Octagon Books, 1965. Sur l'idée de l'âge d'or et sa réception. Thomas '''Cole''', ''Democritus and the Sources of Greek Anthropology'', Cleveland, Western Reserve University, 1967. Sur l'influence d'Empédocle dans l'anthropologie grecque. J. P. '''Hershbell''', « Plutarch as a Source for Empedocles Re-examined », ''American Journal of Philology'', 92, 1971, p. 156-184. J. P. '''Hershbell''', « Hippolytus' ''Elenchos'' as a Source for Empedocles Re-examined », ''Phronesis'', 18, 1973, p. 97-114 et 187-203. Victor '''Goldschmidt''', ''La Doctrine d'Épicure et le droit'', Paris, Vrin, 1977. Avec une discussion de l'influence d'Empédocle sur Épicure. Jaap '''Mansfeld''', « Bad World and Demiurge A Gnostic Motif from Parmenides and Empedocles to Lucretius and Philo », 1981, réédition dans ''Studies in Later Greek Philosophy and Gnosticism'', Londres, Variorum Reprints, 1989, p. 261-314. ==== Réception moderne ==== Walther '''Kranz''', « Lucrez und Empedokles », ''Philologus'', 96, 1943, p. 68-107. Friedrich '''Nietzsche''', ''La Naissance de la philosophie à l'époque de la tragédie grecque'', traduction Geneviève Bianquis, Paris, Gallimard, 1949. Traduction du texte rédigé en 1870-1873 où Nietzsche consacre d'importantes pages à Empédocle. Clémence '''Ramnoux''', « Les Fragments d'un Empédocle de Nietzsche », ''Revue de Métaphysique et de Morale'', 70, 1965, n° 2. Friedrich '''Hölderlin''', ''La Mort d'Empédocle'', traduction par André Babelon, Paris, Grasset, 1929 traduction par Robert Rovini, ''Les Cahiers du Sud'', n° 378-379. Trois versions d'un drame inachevé 1797-1799 consacré au philosophe. === Instruments de travail === ==== Doxographie ==== Hermann '''Diels''', ''Doxographi Graeci'', Berlin, G. Reimer, 1879. Reproduction photomécanique Berlin, De Gruyter, 1958. Édition fondamentale des doxographes grecs, sources essentielles pour la connaissance d'Empédocle. ==== Sources anciennes en traduction ==== Diogène '''Laërce''', ''Vies et doctrines des philosophes illustres'', traduction, introduction et notes par Jean-François Balaudé et alii sous la direction de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche, collection « La Pochothèque », 1999. Livre VIII, 51-77 vie d'Empédocle. Théon de '''Smyrne''', ''Exposition des connaissances mathématiques utiles pour la lecture de Platon'', traduction J. Dupuis, Paris, Hachette, 1892. Nombreuses références à Empédocle et au pythagorisme. ==== Bibliographies ==== Friedrich '''Ueberweg''', ''Grundriss der Geschichte der Philosophie'', vol. I, nouvelle édition, Bâle-Stuttgart, Schwabe, 1954. Avec bibliographie détaillée sur Empédocle. Les éditions successives de Diels-Kranz comprennent des bibliographies mises à jour. Les ouvrages récents d'Inwood 2001, de Wright 1995, de Bollack 2003, de Rashed 2018 et l'édition Laks-Most 2016 fournissent des bibliographies étendues et actualisées. === Contexte sicilien et biographie === Thucydide, ''Histoire de la guerre du Péloponnèse'', livres VI-VII guerre de Sicile. Diodore de Sicile, ''Bibliothèque historique'', livres XI-XIII histoire de la Sicile au Ve siècle. {{AutoCat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Empédocle}} iek673t9c7536w0tabx34bqzp7q7068 Dictionnaire de philosophie/Émergence 0 83145 767906 754109 2026-06-17T05:03:43Z PandaMystique 119061 767906 wikitext text/x-wiki {{DicoPhilo|Émergence}} La notion d'émergence désigne une relation entre un tout et ses parties selon laquelle le tout manifeste des propriétés nouvelles qui, tout en dépendant ontologiquement des propriétés de ses parties et de leurs relations, ne peuvent néanmoins être réduites à celles-ci. Cette notion occupe une place centrale dans les débats contemporains en philosophie de l'esprit, en philosophie de la biologie et en métaphysique générale, où elle offre une voie médiane entre le réductionnisme strict et le dualisme. == Origines et formulation classique == === John Stuart Mill et la distinction fondatrice === Bien que le terme « émergence » lui-même n'apparaisse qu'ultérieurement, on attribue généralement à John Stuart Mill la première articulation philosophique claire de l'idée qui la sous-tend. Dans son ''Système de logique déductive et inductive'' (1843), Mill établit une distinction décisive entre deux types de lois causales : les lois homopathiques et les lois hétéropathiques<ref>Mill, John Stuart (1843). ''A System of Logic, Ratiocinative and Inductive'', livre III, chapitre 6, Londres, John W. Parker</ref>. Les premières obéissent au principe de « composition des causes », selon lequel les effets s'additionnent de manière prévisible et proportionnelle (comme l'addition vectorielle des forces en mécanique classique). Les secondes, en revanche, produisent des effets qui ne peuvent être déduits par simple addition ou composition des causes séparées, même lorsqu'on dispose d'une connaissance exhaustive de ces dernières. Mill observe que les propriétés de l'eau — sa transparence, sa liquidité, son pouvoir solvant — ne peuvent être déduites des propriétés de l'hydrogène et de l'oxygène considérés isolément. Bien qu'on connaisse parfaitement les propriétés chimiques et physiques des atomes constituants, rien dans ces propriétés n'aurait permis de prédire ou de comprendre les propriétés macroscopiques de l'eau. Cette observation pose les fondations conceptuelles de ce qui deviendra l'émergentisme : l'idée que certains phénomènes naturels, bien qu'issus de constituants élémentaires, possèdent une autonomie explicative et peut-être ontologique qui les rend irréductibles aux lois gouvernant ces constituants<ref>McLaughlin, Brian P. (1992). "The Rise and Fall of British Emergentism", dans Beckermann, Ansgar; Flohr, Hans; Kim, Jaegwon (dir.), ''Emergence or Reduction?'', Berlin, De Gruyter, p. 49-93</ref>. === L'émergentisme britannique classique et ses figures majeures === C'est George Henry Lewes qui, dans ses ''Problems of Life and Mind'' (1875), introduit véritablement le terme « émergent » pour qualifier précisément ces effets qui ne sont pas de simples résultantes additives<ref>Lewes, George Henry (1875). ''Problems of Life and Mind'', 2 volumes, Londres, Trübner, vol. 2, p. 412</ref>. Selon Lewes, une entité peut résulter de l'action d'entités plus fondamentales tout en étant radicalement nouvelle et irréductible par rapport à ces dernières. L'émergence n'est pas une illusion épistémique, mais une caractéristique réelle de la nature. L'émergentisme atteint sa maturité philosophique systématique avec trois grandes figures du début du vingtième siècle : Samuel Alexander, Conwy Lloyd Morgan et Charlie Dunbar Broad. Chacun élabore une métaphysique d'envergure fondée sur le concept d'émergence, bien qu'avec des emphases et des développements distincts. ==== Samuel Alexander : la cosmologie émergentiste ==== Dans son œuvre monumentale ''Space, Time, and Deity'' (1920), Samuel Alexander construit une cosmologie émergentiste selon laquelle l'univers se déploie selon une hiérarchie strictement stratifiée de niveaux d'organisation<ref>Alexander, Samuel (1920). ''Space, Time, and Deity'', 2 volumes, Londres, Macmillan</ref>. À la base se trouve l'Espace-Temps (''Space-Time''), substance primordiale ou ''matrix'' à partir de laquelle émergent successivement la matière brute, la vie, l'esprit ou conscience (''mind'') et, ultimement, la déité (''Deity''). Chaque niveau supérieur conserve les propriétés du niveau inférieur tout en manifestant des « qualités émergentes » entièrement nouvelles et inexplicables à partir du niveau inférieur seul. La déité, pour Alexander, ne représente pas une réalité actuelle mais plutôt une qualité émergente vers laquelle tend l'évolution cosmique — c'est une qualité en devenir, une puissance orientant l'univers sans y être pleinement réalisée. Cette conception théologique insolite place l'émergence au cœur même de la métaphysique du divin<ref>Alexander, Samuel (1920). ''Space, Time, and Deity'', vol. 2, livre IV, chapitres 44-46, p. 345-361</ref>. Alexander conçoit l'émergence comme un processus cosmique gouverné par ce qu'il nomme le ''nisus'' — une tendance intrinsèque de la matière vers la complexification, l'organisation et l'apparition de qualités radicalement nouvelles. Cette conception lie étroitement émergence et évolution, faisant de la première non pas un phénomène statique ou mécanique mais un processus dynamique inscrit dans le devenir temporel du cosmos. L'univers n'est pas une machine statique mais un processus créatif continuel. ==== Conwy Lloyd Morgan : l'évolution émergente ==== Biologiste et psychologue de formation, Conwy Lloyd Morgan publie en 1923 ''Emergent Evolution'', ouvrage fondateur dans lequel il élabore l'idée d'une évolution procédant non par gradations continues mais par « sauts » qualitatifs véritables<ref>Morgan, C. Lloyd (1923). ''Emergent Evolution'', Londres, Williams & Norgate</ref>. Cette thèse s'oppose directement au gradualism darwinien strict, affirmant que l'histoire naturelle connaît des moments de discontinuité qualitative où surgissent de véritables nouveautés irréductibles. Morgan distingue précisément les propriétés « résultantes » — qui sont simplement additives, prévisibles et réductibles — des propriétés « émergentes » — qui apparaissent lorsqu'un certain seuil critique de complexité organisationnelle est franchi et qui ne peuvent être ni prédites ni expliquées à partir de la seule connaissance des niveaux inférieurs. Il propose une image pyramidale de la réalité, structurée en niveaux hiérarchiques où chaque niveau supérieur possède des propriétés émergentes véritablement irréductibles aux propriétés des niveaux inférieurs. Remarquablement, Morgan maintient que cette émergence véritable s'inscrit entièrement dans le cadre d'un naturalisme scientifique, sans invoquer de forces vitales, d'énergies occultes ou de principes surnaturels. Il rejette explicitement le vitalisme cartésien autant que le mécanisme réductionniste, offrant une troisième voie<ref>Morgan, C. Lloyd (1923). ''Emergent Evolution'', p. 1-36</ref>. Morgan introduit en particulier le concept de « relationnalité » (''relatedness'') pour caractériser l'essence de l'émergence : ce qui émerge à un niveau donné constitue « un nouveau genre de relationnalité dont il n'existe aucune instance aux niveaux inférieurs »<ref>Morgan, C. Lloyd (1923). ''Emergent Evolution'', p. 15</ref>. L'émergence consiste précisément en l'apparition de nouveaux modes d'organisation relationnelle entre les composants d'un système — modes qui n'existaient pas avant, même potentiellement. C'est la transformation des relations, plus que l'apparition de nouveaux éléments, qui constitue l'émergence. ==== C. D. Broad : analyse rigoureuse et lois trans-ordinales ==== Charlie Dunbar Broad offre dans ''The Mind and its Place in Nature'' (1925) l'analyse philosophique la plus rigoureuse et méthodique de la notion d'émergence<ref>Broad, C. D. (1925). ''The Mind and its Place in Nature'', Londres, Kegan Paul, réédition 1960</ref>. Broad formule un critère épistémologique d'une grande clarté : une propriété P d'un système S est émergente si et seulement si, même un « archange mathématique » possédant une connaissance logiquement complète des propriétés des parties de S, des lois gouvernant le comportement de ces parties prises isolément, et des lois gouvernant leur composition, ne pourrait malgré tout prédire ou déduire P avant son apparition effective dans le système composé. Cette impossibilité de prédiction, insiste Broad, ne reflète pas simplement des limitations épistémiques humaines contingentes. Elle témoigne plutôt d'une structure ontologique réelle du monde : certaines propriétés et certaines lois sont fondamentales dans l'architecture de la réalité et ne peuvent être dérivées d'autres propriétés ou lois plus basiques. Broad parle de « lois trans-ordinales » (''trans-ordinal laws'') ou « lois sui generis » qui gouvernent l'apparition de propriétés émergentes lorsque des composants s'organisent selon certaines configurations complexes<ref>Broad, C. D. (1925). ''The Mind and its Place in Nature'', p. 55-79</ref>. Ces lois doivent être « simplement avalées entières », selon sa formule évocatrice, avec cette « piété naturelle » dont parle Alexander — c'est-à-dire acceptées comme des faits ultimes de la nature auxquels toute explication scientifique doit finalement aboutir. Broad applique cette analyse systématique au problème central de la philosophie de l'esprit : les qualités phénoménales de l'expérience consciente (les ''qualia'' — la rougeur de la perception du rouge, la douleur vécue de la douleur) constituent selon lui des propriétés émergeantes qui ne peuvent être logiquement déduites de la connaissance complète des processus neurophysiologiques, aussi exhaustive soit-elle. C'est là un argument majeur en faveur de l'irréductibilité phénoménale du mental. === Le déclin de l'émergentisme britannique : causes historiques === L'émergentisme britannique connaît un déclin considérable à partir des années 1930, déclin qui s'accélère après la Seconde Guerre mondiale. Ce déclin ne résulte pas d'une réfutation philosophique décisive mais plutôt de convergences entre développements scientifiques et difficultés conceptuelles apparentes. Sur le plan scientifique, les progrès spectaculaires de la chimie quantique — culminant dans l'explication réductive de la liaison chimique par Linus Pauling et d'autres — ont semblé aux physiciens et chimistes démontrer que ce que les émergentistes considéraient comme des propriétés chimiques irréductibles pouvait en fait être déduit des lois de la mécanique quantique appliquées aux atomes constituants<ref>McLaughlin, Brian P. (1992). "The Rise and Fall of British Emergentism", p. 85-90</ref>. Cette réussite réductionniste spectaculaire dans un domaine que les émergentistes présentaient comme paradigmatique — la chimie inorganique — a considérablement ébranlé la crédibilité de leur programme. Sur le plan philosophique, l'émergentisme se heurtait à des difficultés conceptuelles majeures et apparemment insurmontables concernant la causalité. Si les propriétés émergentes possèdent de véritables pouvoirs causaux autonomes (la « causalité descendante » ou ''downward causation''), comment ces pouvoirs s'articulent-ils consistemment avec les pouvoirs causaux des propriétés de base ? Comment éviter la surdétermination causale ou la violation de la clôture causale du physique ? Ces questions, déjà problématiques pour les émergentistes classiques, trouveront leur formulation la plus aiguë dans l'« argument d'exclusion causale » de Jaegwon Kim au tournant des vingt-et-unième siècles. == Reformulations contemporaines == === Émergence faible et émergence forte : une distinction cruciale === Dans les débats contemporains, il est devenu usuel et utile de distinguer deux conceptions radicalement différentes de l'émergence : l'émergence « faible » (''weak emergence'') et l'émergence « forte » (''strong emergence'')<ref>Chalmers, David J. (2006). "Strong and Weak Emergence", dans Clayton, Philip; Davies, Paul (dir.), ''The Re-Emergence of Emergence'', Oxford University Press, p. 244-256</ref><ref>Bedau, Mark A. (1997). "Weak Emergence", ''Philosophical Perspectives'', vol. 11, p. 375-399</ref>. L'émergence faible caractérise les phénomènes de niveau macroscopique qui, bien que dérivant causalement et ontologiquement de processus de niveau microscopique selon des lois déterministes, ne peuvent néanmoins être prédits ou compris de manière effective et pratique qu'en suivant littéralement l'évolution dynamique du système dans le temps. L'émergence est ici principalement et fondamentalement de nature épistémique : elle reflète des limites pratiques et peut-être des limites de principe de notre capacité computationnelle et conceptuelle à déduire le comportement macroscopique à partir des lois microscopiques seules. Les exemples paradigmatiques d'émergence faible proviennent de la théorie des systèmes complexes : les motifs et patterns qui émergent dans les automates cellulaires (comme le fameux « Jeu de la Vie » de Conway), les structures auto-organisées spontanément dans les systèmes physiques loin de l'équilibre thermodynamique, ou les comportements collectifs complexes dans les systèmes multi-agents (essaims, trafic routier, foules). Dans tous ces cas, les phénomènes macroscopiques sont « en principe » réductibles et déterminés par les lois microscopiques, mais « en pratique » ou « effectivement » irréductibles. L'émergence forte, en revanche, désigne une relation métaphysique d'une tout autre nature : elle affirme que des propriétés de haut niveau ne sont pas déductibles, même ''en principe'' ou ''logiquement'', des propriétés et lois de bas niveau, indépendamment de considérations épistémiques concernant nos capacités de calcul. De plus, les propriétés fortement émergentes posséderaient des pouvoirs causaux autonomes véritables, irréductibles aux pouvoirs des propriétés de base. C'est précisément cette conception qu'incarnaient les émergentistes britanniques classiques. Les propriétés fortement émergentes seraient fondamentales dans l'architecture ontologique du réel, ne pourraient être réduites ontologiquement aux propriétés de leur base de survenance, et constitueraient de véritables innovations dans le tissu causal de l'univers. Cette distinction éclaire considérablement les débats académiques : de nombreux phénomènes considérés aujourd'hui comme « émergents » dans les sciences (notamment en sciences de la complexité, en biologie des systèmes, en neurosciences cognitives, en sciences sociales) relèvent principalement, sinon exclusivement, de l'émergence faible. L'émergence forte, quant à elle, demeure hautement controversée et son existence même est contestée par une majorité de philosophes analytiques. === L'émergence dans la philosophie de l'esprit contemporaine === C'est en philosophie de l'esprit et de la conscience que la notion d'émergence forte a connu son regain d'intérêt le plus significatif depuis les années 1970. Face aux difficultés redoutables du dualisme cartésien (le problème d'interaction : comment des substances radicalement hétérogènes peuvent-elles interagir causalement ?) et du réductionnisme physiciste strict (qui semble éliminer ou nier la dimension phénoménale irréducible de l'expérience consciente), l'émergentisme offre une position intermédiaire séduisante : le « physicalisme non réductionniste » ou plus précisément le « dualisme des propriétés »<ref>Kim, Jaegwon (2000). "L'émergence, les modèles de réduction et le mental", ''Philosophiques'', vol. 27, n° 1, p. 11-26</ref>. Selon cette approche émergentiste, les propriétés mentales (croyances, désirs, intentions, expériences conscientes) sont des propriétés émergentes qui superviennent sur des états physiques — particulièrement les états neurobiologiques du cerveau — sans pour autant s'y réduire ou en être logiquement dérivables. Les propriétés mentales dépendent ontologiquement de leur base physique (il n'y a aucun changement mental possible sans changement physique correspondant dans le cerveau), mais possèdent néanmoins une autonomie explicative et probablement causale propre. ==== L'argument d'exclusion causale de Jaegwon Kim : le défi central ==== Jaegwon Kim a formulé l'objection la plus redoutable et la plus influente contre cette forme de physicalisme émergentiste non réductionniste : l'« argument d'exclusion causale »<ref>Kim, Jaegwon (1998). ''Mind in a Physical World'', Cambridge, MIT Press</ref><ref>Kim, Jaegwon (2005). ''Physicalism, or Something Near Enough'', Princeton, Princeton University Press</ref>. Cet argument, présenté sous plusieurs formes au cours de la carrière de Kim, repose sur trois prémisses apparemment plausibles et difficilement contestables : 1. Clôture causale du domaine physique : tout événement physique qui possède une cause suffisante a une cause physique suffisante. Aucun événement physique n'est causé par quelque chose de non-physique. 2. Efficacité causale du mental : les propriétés mentales causent parfois des événements physiques. Nos croyances, désirs, intentions causent nos comportements corporels et ont ainsi un rôle causal réel. 3. Pas de surdétermination causale systématique : les événements physiques ne sont pas systématiquement « surdéterminés » — c'est-à-dire n'ont pas régulièrement plusieurs causes complètes et indépendantes suffisantes pour les produire. De ces trois prémisses, qui semblent chacune très raisonnables, Kim conclut que si les propriétés mentales ne sont pas strictement identiques aux propriétés physiques (comme l'affirme le physicalisme non réductionniste en admettant leur irréductibilité), alors ces propriétés mentales ne peuvent avoir de réelle efficacité causale : elles deviennent des épiphénomènes purs — des accompagnements casuels, sans pouvoir causal véritable, des véritables processus physiques qui font le travail causal. Pour Kim, cette conclusion inconfortable invite à abandonner purement et simplement le physicalisme non réductionniste. Il faut opter soit pour un réductionnisme plus franc et complet (identifiant les propriétés mentales à des propriétés physiques et acceptant ainsi leur réductibilité complète), soit pour une forme d'« émergentisme » qui reconnaît honnêtement l'impuissance explicative de la physique concernant les phénomènes mentaux — position que Kim lui-même juge très difficile à concilier avec le naturalisme scientifique standard<ref>Kim, Jaegwon (2006). "Being Realistic about Emergence", dans Clayton, Philip; Davies, Paul (dir.), ''The Re-Emergence of Emergence'', Oxford University Press, p. 189-202</ref>. Cet argument de Kim demeure au centre de tous les débats contemporains sur l'émergence et le physicalisme, et il reste profondément divisif : certains le considèrent comme démolisseur de toute forme de physicalisme non réductionniste viable, tandis que d'autres proposent diverses contre-stratégies. === Émergence et sciences de la complexité === Parallèlement aux débats en philosophie de l'esprit, le concept d'émergence (principalement au sens faible et épistémique) a connu un développement vigoureux et fécond dans les sciences de la complexité depuis les années 1970-1980. Les systèmes complexes — qu'ils soient physiques (turbulence, transitions de phase loin de l'équilibre, phénomènes critiques), chimiques (réactions oscillantes de Belousov-Zhabotinsky, structures dissipatives), biologiques (morphogenèse, dynamiques écosystémiques, réseaux neuronaux), ou sociaux (dynamiques de foules, marchés financiers, systèmes politiques) — manifestent tous des comportements collectifs émergents remarquables qui ne peuvent être compris par l'analyse réductionniste isolée de leurs composants<ref>Ladyman, James; Lambert, James; Wiesner, Karoline (2013). "What is a Complex System?", ''European Journal for Philosophy of Science'', vol. 3, n° 1, p. 33-67</ref>. Les caractéristiques typiques de ces systèmes complexes incluent : (1) des interactions hautement non-linéaires entre un nombre élevé de composants ; (2) des boucles de rétroaction multiples, positives et négatives ; (3) l'auto-organisation spontanée de structures ordonnées à partir de conditions initiales désordonnées ou chaotiques ; (4) la sensibilité accrue aux conditions initiales ; et (5) l'apparition de propriétés globales, de patterns et de régularités qui ne se manifestent qu'au niveau macroscopique collectif. L'auto-organisation constitue le processus paradigmatique à travers lequel émergence et complexité s'interpénètrent : ce processus par lequel un système, soumis à des contraintes énergétiques et matérielles et maintenu loin de l'équilibre thermodynamique, développe spontanément une structure ordonnée, une organisation complexe, sans aucune direction ou programmation externe<ref>Nicolis, Grégoire; Prigogine, Ilya (1977). ''Self-Organization in Nonequilibrium Systems'', New York, Wiley</ref>. Les exemples classiques incluent les cellules de Bénard (structures hexagonales apparaissant spontanément dans un fluide chauffé), les motifs réguliers de Turing en morphogenèse biologique, les comportements collectifs d'insectes sociaux (construction élaborée de termitières par des termites individuellement simples, optimisation des chemins par les colonies de fourmis). Remarquablement, cette conception scientifique de l'émergence met l'accent prioritaire sur la relationnalité et l'organisation plutôt que sur les propriétés intrinsèques individuelles des composants. Ce qui émerge au niveau macroscopique n'est pas tant une nouvelle substance ou une nouvelle force naturelle qu'un nouveau régime d'organisation dynamique, un nouveau mode de structuration des relations entre composants. Cette perspective rejoint l'intuition profonde de Lloyd Morgan concernant la « relationnalité » comme essence véritable de l'émergence. == Enjeux épistémologiques et métaphysiques fondamentaux == === Émergence et réductibilité scientifique === La notion d'émergence s'articule étroitement avec la question philosophique majeure de la réductibilité scientifique. Traditionnellement, en philosophie des sciences, on considère qu'une théorie scientifique T₁ est réduite à une théorie scientifique T₂ si et seulement si les lois et concepts de T₁ peuvent être logiquement dérivés de ceux de T₂, éventuellement enrichis par des « lois de correspondance » ou « lois-ponts » établissant des connexions systématiques entre les vocabulaires des deux théories<ref>Nagel, Ernest (1961). ''The Structure of Science'', New York, Harcourt, Brace & World, chapitre 11</ref>. L'émergence forte implique l'échec de principe de cette réduction : certaines lois ou propriétés fondamentales de T₁ ne peuvent être logiquement dérivées de T₂, quelles que soient les richesses ou enrichissements apportés à cette dernière. C'est précisément ce que les émergentistes britanniques classiques défendaient : les lois biologiques et psychologiques ne sont pas en principe réductibles aux lois physico-chimiques, même si les systèmes biologiques et mentaux sont entièrement composés de matière physico-chimique. L'émergence faible, en revanche, demeure compatible avec la réductibilité de principe tout en soulignant les limites pratiques insurmontables de la dérivation effective : même si les phénomènes macroscopiques « découlent » logiquement et causalement des lois microscopiques, leur compréhension et explication effectives requièrent des concepts, des modèles et des explications autonomes au niveau macroscopique. Il s'instaure ici une forme d'« irréductibilité épistémique » ou d'« autonomie explicative » sans irréductibilité ontologique stricte. Cette distinction éclaire profondément les débats contemporains sur le statut des sciences spéciales (biologie, psychologie, sociologie, neurosciences) vis-à-vis de la physique fondamentale. Même si l'on admet le physicalisme ontologique strict (tout ce qui existe est, en dernière analyse, physique), cela n'implique pas logiquement le réductionnisme explicatif intégral : les sciences spéciales peuvent légitimement conserver une autonomie méthodologique et conceptuelle durable<ref>Fodor, Jerry (1974). "Special Sciences (Or: The Disunity of Science as a Working Hypothesis)", ''Synthese'', vol. 28, n° 2, p. 97-115</ref>. === Holisme méthodologique et émergence === L'émergence entretient des liens complexes et ambigus avec le holisme — la doctrine selon laquelle « le tout est plus que la somme de ses parties ». Il convient cependant de distinguer plusieurs formes distinctes de holisme pour éviter les confusions terminologiques. Le holisme ontologique affirme que certains touts possèdent une réalité propre et autonome, irréductible à celle de leurs parties constituantes. Cette position se heurte à des difficultés conceptuelles : si le tout est vraiment distinct et séparable de ses parties, qu'est-ce qui garantit et explique la dépendance manifeste du tout vis-à-vis de ses parties ? L'émergence offre une voie médiane conceptuellement cohérente : le tout dépend ontologiquement strictement de ses parties et de leur organisation (aucun changement dans le tout sans changement correspondant dans les parties ou leurs relations), mais manifeste néanmoins des propriétés et des pouvoirs causaux véritablement nouveaux. Le holisme épistémologique ou méthodologique soutient que la compréhension et l'explication de certains systèmes et phénomènes requièrent intrinsèquement une approche synthétique au niveau global qui ne peut être remplacée ou dérivée de l'analyse réductive des parties isolées. Cette position est largement compatible avec l'émergence faible : même si le système « n'est ontologiquement rien d'autre que » ses parties en interaction, sa compréhension effective et pratique nécessite des concepts, des modèles et des outils propres au niveau macroscopique collectif. Le holisme sémantique (défendu notamment par Quine et Donald Davidson dans sa théorie de l'anomalisme du mental) concerne la signification et la référence des termes linguistiques et affirme que celle-ci dépend de la totalité du réseau conceptuel et théorique dans lequel s'insère le terme. Cette forme de holisme sémantique demeure relativement indépendante des questions d'émergence ontologique et causale<ref>Esfeld, Michael (2001). ''Holism in Philosophy of Mind and Philosophy of Physics'', Dordrecht, Kluwer Academic Publishers</ref>. === Niveaux de réalité et stratification ontologique === La notion d'émergence implique conceptuellement une vision stratifiée ou hiérarchisée de la réalité naturelle, organisée en niveaux distincts — niveau physique, chimique, biologique, psychologique, social. Chaque niveau supérieur « repose sur » ou « supervient sur » le niveau inférieur dans des relations de dépendance robustes, tout en manifestant potentiellement des propriétés et des lois émergentes propres. Cette image hiérarchisée soulève cependant plusieurs questions philosophiques épineuses. Comment précisément individuer et délimiter les niveaux distincts ? Qu'est-ce qui définit réellement un « niveau » : la nature ontologique des entités considérées, les lois spécifiques qui les gouvernent, les échelles spatiales ou temporelles caractéristiques, ou simplement les domaines disciplinaires de compétence des sciences particulières ? La stratification en niveaux est-elle objective et découverte dans la nature elle-même, ou reflète-t-elle simplement notre organisation pragmatique et conventionnelle de la connaissance scientifique ? De plus, la relation de « survenance » entre niveaux — formellement définie comme : le niveau supérieur supervient sur le niveau inférieur si et seulement si aucune différence au niveau supérieur n'est possible sans différence correspondante au niveau inférieur — n'implique pas automatiquement la réduction explicative ni l'émergence ontologique. La survenance établit simplement une dépendance ontologique forte, mais laisse ouverte la question de la réductibilité explicative et de l'autonomie causale<ref>Kim, Jaegwon (1993). ''Supervenience and Mind'', Cambridge, Cambridge University Press</ref>. === Causalité descendante : possibilité conceptuelle et défis === L'une des caractéristiques les plus controversées attribuées aux propriétés émergentes est la « causalité descendante » (''downward causation'') : la capacité supposée des propriétés de haut niveau à influencer et à causer des changements dans les processus de bas niveau qui les réalisent matériellement. Les exemples invoqués par les défenseurs de la causalité descendante sont nombreux et intuitifs : la sélection naturelle opérant au niveau des organismes et des populations contraint effectivement l'évolution au niveau génomique et génétique ; les états mentaux volontaires — croyances, intentions, désirs — causent les comportements corporels en influençant causalement les processus neuronaux du cerveau ; la structure organisationnelle et les normes d'une institution sociale contraignent et canalisent les comportements individuels de ses membres. Cependant, l'argument d'exclusion causale de Kim vise précisément à montrer que la causalité descendante devient problématique — et peut-être impossible — dans le cadre d'une ontologie physicaliste acceptant la clôture causale du domaine physique. Si tout événement physique possède déjà une cause physique suffisante au niveau microstructurel, quel rôle ou pouvoir causal genuine reste-t-il pour les propriétés de niveau macroscopique ? Plusieurs philosophes contemporains ont tenté de défendre la viabilité conceptuelle de la causalité descendante en la redéfinissant ou en la réinterprétant. Selon une approche proposée notamment par Carl Gillett, les propriétés émergentes ne causent pas leurs effets de manière indépendante ou supplémentaire par rapport à leur base de réalisation physique. Au contraire, elles causent leurs effets précisément en vertu de, et par l'intermédiaire de, leur réalisation physique : c'est en étant réalisées par certains états physiques complexes que les propriétés mentales acquièrent réellement des pouvoirs causaux sur d'autres états physiques. Il s'agirait d'un mode de causalité réelle mais « médiatisée » par le physique — distinct de la causalité « productrice » classique supposée entre événements séparés<ref>Gillett, Carl (2016). ''Reduction and Emergence in Science and Philosophy'', Cambridge, Cambridge University Press</ref>. D'autres philosophes (notamment Donald Campbell) ont proposé de concevoir la causalité descendante moins en termes de production causale que comme exercice de contraintes ou de sélection : les structures de haut niveau ne produisent pas directement ou efficacement les événements de bas niveau, mais elles contraignent de manière réelle l'espace des trajectoires possibles au niveau microstructurel, sélectionnant parmi les possibilités ce qui peut effectivement se réaliser<ref>Campbell, Donald T. (1974). "Downward Causation in Hierarchically Organised Biological Systems", dans Ayala, Francisco J.; Dobzhansky, Theodosius (dir.), ''Studies in the Philosophy of Biology'', Macmillan, p. 179-186</ref>. == Perspectives et prolongements contemporains == === Émergence et neurosciences contemporaines de la conscience === Les neurosciences contemporaines de la conscience constituent un domaine de recherche d'une fertilité exceptionnelle pour l'application empirique et la discussion philosophique du concept d'émergence. La question centrale reste : comment l'expérience consciente phénoménale — avec ses aspects qualitatifs irréductibles, sa subjectivité, sa dimensionnalité phénoménale — émerge-t-elle de l'activité matérielle et électrochimique du cerveau ? Plusieurs théories neuroscientifiques d'envergure proposent des mécanismes explicatifs distincts. La théorie de l'espace de travail neuronal global (''Global Neuronal Workspace''), élaborée par Stanislas Dehaene, Jean-Pierre Changeux et Lionel Naccache, postule que la conscience correspond à l'accès de l'information sensorielle et cognitive dans un réseau anatomiquement distribué de neurones à longue distance permettant la diffusion globale et rapide de l'information à travers tout le cerveau<ref>Dehaene, Stanislas; Changeux, Jean-Pierre (2011). "Experimental and Theoretical Approaches to Conscious Processing", ''Neuron'', vol. 70, n° 2, p. 200-227</ref>. L'émergence de la conscience serait ainsi intrinsèquement liée à un certain régime d'activité collective neuronale caractérisé par une intégration et une diffusion d'information à grande échelle transhémisphérique. La théorie de l'information intégrée (''Integrated Information Theory'' ou IIT), proposée par Giulio Tononi et collaborateurs, caractérise la conscience ou la « capacité phénoménale » d'un système par le degré d'intégration informationnelle que le système génère : un système possède une conscience phénoménale d'autant plus riche et intense que l'information qu'il génère intrinsèquement est à la fois hautement différenciée (capable d'un nombre immense d'états distincts) et fortement intégrée (chaque partie du système est informationnellement contrainte par toutes les autres)<ref>Tononi, Giulio (2008). "Consciousness as Integrated Information: a Provisional Manifesto", ''Biological Bulletin'', vol. 215, n° 3, p. 216-242</ref>. L'émergence de la conscience correspondrait au franchissement de seuils critiques d'intégration informationnelle. Ces théories neuroscientifiques, bien que divergentes dans leurs détails mécanistiques, partagent une conception fondamentale de la conscience comme propriété émergente systémique collective — une propriété qui résulte de l'organisation complexe et de la dynamique collective d'ensembles neuronaux massifs, plutôt que des propriétés de neurones individuels isolés. Reste ouverte la question philosophique cruciale et peut-être irrésolvable : ces théories rendent-elles véritablement compte de l'émergence de la conscience au sens fort (impliquant l'irréductibilité véritable des ''qualia'' phénoménaux) ou seulement au sens faible (expliquant causalement et neurobiologiquement les corrélats matériels de la conscience et les fonctions cognitives associées, tout en laissant complètement inexpliqué le « fossé explicatif » entre propriétés physico-chimiques et expérience phénoménale vécue) ?<ref>Chalmers, David J. (1995). "Facing Up to the Problem of Consciousness", ''Journal of Consciousness Studies'', vol. 2, n° 3, p. 200-219</ref> === Émergence en biologie : de la biochimie moléculaire à l'écologie === La biologie contemporaine offre de multiples exemples tangibles de phénomènes et de processus émergents à différentes échelles organisationnelles. Au niveau moléculaire, les propriétés fonctionnelles remarquables des protéines émergent du repliement tridimensionnel complexe des longues chaînes polypeptidiques. Au niveau cellulaire, le métabolisme énergétique et l'homéostasie physiologique émergent des réseaux intriqués d'interactions biochimiques catalytiques. Au niveau organismique, les comportements complexes coordonnés émergent de l'activité intégrée des systèmes nerveux distribués. Au niveau écologique, les dynamiques de populations et l'équilibre ou l'instabilité des écosystèmes émergent des interactions multiples entre organismes et avec leur environnement physique. Le débat philosophique historique entre « mécanisme biologique » strict et « vitalisme » qui a structuré la biologie du dix-neuvième et du début du vingtième siècle peut être réconsidéré et rééclairé à travers le prisme de l'émergence. Les mécanistes soutenaient rigoureusement que tous les phénomènes biologiques s'expliquent entièrement par réduction aux lois physico-chimiques ; les vitalistes invoquaient des principes ou forces vitales irréductibles, surnaturelles. L'émergentisme, en particulier dans la version sophistiquée de Broad, offrait une troisième voie conceptuellement médiane : les organismes vivants sont entièrement constitués de matière physico-chimique ordinaire gouvernée par les lois de la physique et de la chimie, mais manifestent néanmoins des propriétés biologiques et obéissent à des lois biologiques qui, bien qu'en continuité naturelle avec les lois physiques, ne s'y réduisent pas entièrement<ref>Broad, C. D. (1925). ''The Mind and its Place in Nature'', p. 43-79</ref>. La biologie contemporaine des systèmes dynamiques réactualise et valide cette perspective émergentiste en étudiant intensément les propriétés émergentes des réseaux biologiques complexes (réseaux métaboliques, réseaux de régulation génétique, réseaux de signalisation cellulaire, réseaux neuronaux) : ces propriétés réseau ne peuvent être comprises par l'analyse réductionniste isolée des composants (gènes, protéines, récepteurs) mais requièrent des approches systémiques intégratives modélisant la dynamique des interactions multiples<ref>Kitano, Hiroaki (2002). "Systems Biology: A Brief Overview", ''Science'', vol. 295, n° 5560, p. 1662-1664</ref>. === Émergence et philosophie des sciences sociales === Les sciences sociales posent de manière aiguë et centrale la question de l'émergence. Les phénomènes sociaux macroscopiques — institutions formelles, marchés économiques, langues naturelles, systèmes culturels — « émergent » causalement et temporellement des actions et interactions d'innombrables individus particuliers. Mais possèdent-ils réellement une réalité objective et une autonomie causale propres, ou ne constituent-ils que des façons commodes et pragmatiques de parler d'agrégats d'individus ? L'« individualisme méthodologique » classique soutient rigoureusement que tous les phénomènes sociaux doivent s'expliquer ultimement par réduction aux propriétés, préférences et actions d'individus particuliers. Le « holisme méthodologique » affirme en revanche que certains faits sociaux cruciaux ne peuvent s'expliquer que par d'autres faits sociaux au niveau collectif, sans réduction aux individus. L'émergence offre une position médiane philosophiquement cohérente : les phénomènes sociaux dépendent ontologiquement strictement des individus et de leurs interactions (il n'y a pas de société sans individus, pas de marché sans acteurs économiques), mais possèdent néanmoins des propriétés structurelles et suivent des régularités causales qui ne se manifestent qu'au niveau collectif et exercent en retour une influence causale ou constitutive réelle sur les comportements individuels<ref>Sawyer, R. Keith (2005). ''Social Emergence: Societies as Complex Systems'', Cambridge, Cambridge University Press</ref>. Émile Durkheim, dans son ouvrage fondateur ''Les Règles de la méthode sociologique'' (1895), défendait déjà une forme perspicace d'émergentisme social : il affirmait que les faits sociaux constituent « un ordre de faits spécifiques et irréductibles », émergeant de la combinaison et de l'interaction d'éléments individuels mais manifestant des propriétés « complètement étrangères » et inaccessibles à ces derniers pris isolément<ref>Durkheim, Émile (1895). ''Les Règles de la méthode sociologique'', 2nd édition, Paris, Félix Alcan, préface et introduction, p. xvi-xxv</ref>. == Conclusion : bilan et perspectives d'avenir == La notion d'émergence occupe une position singulière et fertile dans le paysage philosophique et scientifique contemporain. Elle est à la fois profondément attirante conceptuellement et problématique philosophiquement, offrant une voie médiane intuitive entre réductionnisme strict et dualisme, tout en soulevant des difficultés conceptuelles sérieuses et peut-être insurmontables. L'ambiguïté fondamentale entre émergence faible (principalement épistémique et computationnelle) et émergence forte (ontologiquement et causalement réelle) traverse l'ensemble des débats actuels et structure profondément les positions antagonistes. L'émergence faible est largement acceptée et trouve de nombreuses applications fécondes et empiriquement validées dans les sciences de la complexité, la biologie des systèmes, les neurosciences cognitives, la physique des systèmes loin de l'équilibre. Elle correspond à une stratégie explicative scientifiquement légitime et importante, reconnaissant que certains phénomènes naturels, bien que dérivant causalement de processus de bas niveau réductibles en principe, requièrent pour leur compréhension effective et leur explication des concepts et des outils propres au niveau macroscopique. L'émergence forte demeure hautement controversée. L'argument d'exclusion causale de Kim soulève des difficultés conceptuelles sérieuses et apparemment graves pour toute tentative de concilier physicalisme non réductionniste authentique et autonomie causale véritable des propriétés émergentes. Cependant, certains philosophes persévérants maintiennent que l'irréductibilité apparente de l'expérience consciente phénoménale — le « fossé explicatif » entre propriétés physico-chimiques et qualia — constitue un argument empirique et conceptuel puissant en faveur de l'émergence forte, même si cela implique de réviser certains présupposés du naturalisme physicaliste standard<ref>Chalmers, David J. (2006). "Strong and Weak Emergence", p. 244-256</ref>. Au-delà des controverses métaphysiques persistantes, la notion d'émergence invite à une réflexion profonde sur la structure même de la réalité naturelle, l'organisation hiérarchique effectivement observable des sciences particulières, et les modes véritables d'explication et de compréhension scientifiques. Elle rappelle que la complexité remarquable du monde naturel ne se laisse peut-être pas entièrement capturer par le projet réductionniste classique de ramener toute réalité à un niveau fondamental unique et d'expliquer tous les phénomènes par ses seules lois microscopiques. Au contraire, la reconnaissance de niveaux d'organisation distincts avec leurs propriétés et leurs régularités propres, leur autonomie explicative et potentiellement causale, peut constituer non pas un échec de l'explication scientifique mais une caractéristique incontournable et peut-être inévitable de celle-ci. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == Textes classiques fondateurs : * Alexander, Samuel (1920). ''Space, Time, and Deity'', 2 volumes, Londres, Macmillan. * Broad, C. D. (1925). ''The Mind and its Place in Nature'', Londres, Kegan Paul; réédition 1960. * Mill, John Stuart (1843). ''A System of Logic, Ratiocinative and Inductive'', Londres, John W. Parker. * Morgan, C. Lloyd (1923). ''Emergent Evolution'', Londres, Williams & Norgate. Études historiques et systématiques : * McLaughlin, Brian P. (1992). "The Rise and Fall of British Emergentism", dans Beckermann, A.; Flohr, H.; Kim, J. (dir.), ''Emergence or Reduction? Essays on the Prospects of Nonreductive Physicalism'', Berlin, De Gruyter, p. 49-93. * McLaughlin, Brian P. (1997). "Emergence and Supervenience", ''Intellectica'', vol. 25, p. 25-43. * O'Connor, Timothy; Wong, Hong Yu (2020). "Emergent Properties", ''Stanford Encyclopedia of Philosophy'', édition d'été 2020. Débats philosophiques contemporains : * Bedau, Mark A.; Humphreys, Paul (dir.) (2008). ''Emergence: Contemporary Readings in Philosophy and Science'', Cambridge, MIT Press. * Chalmers, David J. (2006). "Strong and Weak Emergence", dans Clayton, P.; Davies, P. (dir.), ''The Re-Emergence of Emergence'', Oxford, Oxford University Press, p. 244-256. * Gibb, Sophie; Hendry, Robin; Lancaster, Tom (dir.) (2019). ''The Routledge Handbook of Emergence'', Londres, Routledge. * Kim, Jaegwon (1998). ''Mind in a Physical World'', Cambridge, MIT Press. * Kim, Jaegwon (2005). ''Physicalism, or Something Near Enough'', Princeton, Princeton University Press. * Kim, Jaegwon (2006). "Being Realistic about Emergence", dans Clayton, P.; Davies, P. (dir.), ''The Re-Emergence of Emergence'', Oxford, Oxford University Press, p. 189-202. * Wilson, Jessica M. (2021). ''Metaphysical Emergence'', Oxford, Oxford University Press. Applications scientifiques empiriques : * Dehaene, Stanislas; Changeux, Jean-Pierre (2011). "Experimental and Theoretical Approaches to Conscious Processing", ''Neuron'', vol. 70, n° 2, p. 200-227. * Gillett, Carl (2016). ''Reduction and Emergence in Science and Philosophy'', Cambridge, Cambridge University Press. * Kitano, Hiroaki (2002). "Systems Biology: A Brief Overview", ''Science'', vol. 295, n° 5560, p. 1662-1664. * Sawyer, R. Keith (2005). ''Social Emergence: Societies as Complex Systems'', Cambridge, Cambridge University Press. {{AutoCat}} indsdvbw73r74q82b4e6stbcsbg86v4 Dictionnaire de philosophie/Existence 0 83174 767902 754247 2026-06-17T04:59:15Z PandaMystique 119061 767902 wikitext text/x-wiki {{DicoPhilo|Existence}} L'existence constitue l'une des notions fondamentales de la philosophie, désignant le fait d'être, de se tenir dans la réalité. Du latin ''ex-sistere'' (« se tenir hors de », « sortir de »), le terme renvoie à la présence effective dans le monde, par opposition à l'essence qui définit ce qu'une chose est. Cette distinction entre existence et essence traverse toute l'histoire de la philosophie occidentale et a donné lieu à des débats qui se poursuivent jusqu'à aujourd'hui. == Émergence médiévale du concept == Le concept d'existence, au sens philosophique strict, émerge tardivement dans l'histoire de la pensée. Dans l'Antiquité grecque, Platon et Aristote n'emploient pas de terme spécifiquement dédié à ce que nous nommons aujourd'hui « existence ». Aristote parle de l'« être en tant qu'être » (''to on hê on'') dans sa ''Métaphysique'', mais cette notion recouvre l'ensemble de ce qui est, sans séparer nettement existence et essence<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a20-25, traduction J. Tricot, Paris, Vrin, 1991, p. 155-156.</ref>. C'est au Moyen Âge que la notion d'existence acquiert son statut philosophique propre, particulièrement dans le cadre de la pensée arabo-persane et de la scolastique latine. Avicenne (Ibn Sīnā, 980-1037) introduit une distinction capitale entre l'essence (''māhiyya'') et l'existence (''wujūd''). Pour lui, l'existence n'est pas contenue dans l'essence des choses créées : elle leur advient de l'extérieur, par l'acte créateur de Dieu, qui est le seul « Existant nécessaire » (''wājib al-wujūd''), celui en qui essence et existence sont identiques<ref>Avicenne, ''Métaphysique du Shifā'', IX, 4, traduction G. Anawati, Paris, Vrin, 1978, p. 262-263.</ref>. Cette doctrine aura une influence déterminante sur la pensée médiévale occidentale. Thomas d'Aquin (1225-1274) reprend et développe cette distinction dans son traité ''De ente et essentia'' (1254-1256), où il affirme que dans les créatures, l'essence et l'acte d'être (''esse'') sont réellement distincts. L'essence détermine ce qu'une chose est, tandis que l'existence est l'acte par lequel cette essence se tient dans la réalité. Seul Dieu, en tant qu'« acte pur d'exister » (''ipsum esse subsistens''), est tel que son essence consiste à exister<ref>Thomas d'Aquin, ''De ente et essentia'', chapitre IV, édition L.-B. Geiger, Paris, Vrin, 1948, p. 34-35.</ref>. Cette « composition réelle » entre essence et existence dans les êtres créés fonde la métaphysique thomiste de la participation : les créatures participent à l'être divin sans s'identifier à lui<ref>Étienne Gilson, ''L'être et l'essence'', Paris, Vrin, 1948, rééd. 2000, p. 141-162.</ref>. == La critique kantienne : l'existence n'est pas un prédicat réel == La conception médiévale de l'existence comme propriété réelle des choses sera radicalement remise en question par Emmanuel Kant (1724-1804). Dans la ''Critique de la raison pure'' (1781), Kant formule une objection décisive contre la preuve ontologique de l'existence de Dieu, en affirmant que « l'être n'est manifestement pas un prédicat réel, c'est-à-dire un concept de quelque chose qui puisse s'ajouter au concept d'une chose »<ref>Emmanuel Kant, ''Critique de la raison pure'', AK III, 398 (A 598/B 626), traduction A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, rééd. 1968, p. 428.</ref>. Pour Kant, dire qu'une chose existe n'ajoute rien à son concept. L'existence n'est pas une détermination qui enrichirait la compréhension de l'objet, mais désigne seulement « la position absolue de la chose »<ref>Ibid., A 599/B 627, p. 429.</ref>. Un exemple fameux illustre cette thèse : cent thalers réels ne contiennent pas plus de déterminations que cent thalers possibles ; la différence ne réside pas dans le contenu du concept, mais dans le fait que les thalers réels sont posés dans le contexte de l'expérience possible<ref>Ibid., A 599/B 627, p. 429-430.</ref>. L'existence n'est donc pas un attribut de la chose, mais concerne notre rapport cognitif à elle : elle signifie que l'objet est donné dans l'expérience sensible, qu'il appartient au « contexte de toute l'expérience »<ref>Ibid., A 601/B 629, p. 431.</ref>. Cette analyse kantienne aura des conséquences considérables. Elle met fin à la possibilité de déduire l'existence à partir de l'essence, et rejette toute prétention de la métaphysique rationnelle à établir l'existence de Dieu ou de l'âme par la seule analyse conceptuelle. Comme Kant l'affirme lui-même, « notre conscience de toute existence appartient entièrement à l'unité de l'expérience »<ref>Ibid., A 601/B 629, p. 431.</ref>. == Kierkegaard et la subjectivité existante == Au XIXe siècle, Søren Kierkegaard (1813-1855) opère un renversement fondamental en faisant de l'existence non plus un problème logique ou métaphysique, mais une question éminemment subjective et personnelle. Contre le système hégélien qui prétend englober toute la réalité dans le mouvement dialectique de l'Idée, Kierkegaard affirme l'irréductibilité de l'existence individuelle, singulière et contingente. Pour le philosophe danois, l'existence désigne le mode d'être propre à l'individu humain dans sa dimension concrète, temporelle et passionnée. Exister, ce n'est pas simplement « être là », mais se rapporter à soi-même dans l'inquiétude, le choix et l'engagement. « La vérité, c'est la subjectivité », écrit-il dans le ''Post-scriptum aux Miettes philosophiques'' (1846), signifiant par là que la vérité existentielle ne réside pas dans l'objectivité d'un savoir abstrait, mais dans l'appropriation subjective par laquelle l'individu fait sienne une conviction et l'incarne dans sa vie<ref>Søren Kierkegaard, ''Post-scriptum définitif et non scientifique aux Miettes philosophiques'', traduction P.-H. Tisseau, Paris, Gallimard, 1949, p. 197-198.</ref>. Kierkegaard distingue plusieurs « stades » ou « sphères » de l'existence : le stade esthétique, où l'individu vit dans l'instant et la jouissance ; le stade éthique, où il assume la responsabilité de ses choix dans la durée ; et le stade religieux, où il se rapporte à Dieu dans la foi, par-delà toute médiation rationnelle<ref>Søren Kierkegaard, ''Ou bien... ou bien'', traduction F. et O. Prior et M.-H. Guignot, Paris, Gallimard, 1943, tome II, p. 154-186.</ref>. L'existence authentique suppose le passage par l'angoisse, sentiment qui révèle à l'individu sa liberté vertigineuse et la possibilité du péché<ref>Søren Kierkegaard, ''Le Concept de l'angoisse'', traduction K. Ferlov et J.-J. Gateau, Paris, Gallimard, 1935, rééd. 1969, p. 47-61.</ref>. == L'existentialisme sartrien : l'existence précède l'essence == Jean-Paul Sartre (1905-1980) reprend et radicalise l'héritage kierkegaardien en formulant le principe fondamental de l'existentialisme athée : « l'existence précède l'essence »<ref>Jean-Paul Sartre, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946, p. 21-22.</ref>. Cette formule condense une thèse ontologique et anthropologique : l'être humain existe d'abord, surgit dans le monde, et ce n'est qu'ensuite qu'il se définit par ses choix et ses actes. Il n'y a pas de nature humaine préétablie, pas d'essence qui précéderait et déterminerait l'existence, car « il n'y a pas de Dieu pour la concevoir »<ref>Ibid., p. 22.</ref>. Dans ''L'être et le néant'' (1943), Sartre distingue deux modes d'être fondamentaux : l'« en-soi » (''en-soi''), qui caractérise les choses inertes, massives, coïncidant pleinement avec elles-mêmes ; et le « pour-soi » (''pour-soi''), qui définit la conscience humaine comme néantisation, arrachement à soi, perpétuel dépassement vers des possibles<ref>Jean-Paul Sartre, ''L'être et le néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943, rééd. « Tel », 1976, p. 33-34, 111-142.</ref>. Le pour-soi existe sur le mode du « ne pas être ce qu'il est et être ce qu'il n'est pas » : il est toujours en projet, en avance sur lui-même, condamné à la liberté<ref>Ibid., p. 515-516.</ref>. Cette liberté ontologique implique une responsabilité totale : « l'homme est condamné à être libre » et « responsable de ce qu'il est »<ref>Sartre, ''L'existentialisme est un humanisme'', op. cit., p. 37, 24.</ref>. Choisir pour soi, c'est choisir pour toute l'humanité, car en se faisant, l'homme dessine une image de ce que devrait être l'homme<ref>Ibid., p. 25-26.</ref>. De cette structure existentielle découle l'angoisse, sentiment de la liberté face à elle-même, mais aussi la mauvaise foi, attitude par laquelle la conscience tente de fuir sa liberté en se réifiant, en se faisant chose<ref>Sartre, ''L'être et le néant'', op. cit., p. 82-106.</ref>. == Heidegger et la question de l'être : le Dasein == Martin Heidegger (1889-1976) renouvelle profondément la question de l'existence en l'inscrivant dans le cadre d'une interrogation plus originaire : la question du sens de l'être. Dans ''Être et temps'' (''Sein und Zeit'', 1927), Heidegger introduit le concept de « Dasein » (littéralement « être-là ») pour désigner l'être humain en tant qu'il est le lieu où la question de l'être se pose<ref>Martin Heidegger, ''Être et temps'', traduction F. Vezin, Paris, Gallimard, 1986, §2, p. 33-38.</ref>. Le Dasein se distingue de tous les autres étants par le fait que « dans son être, il y va de cet être même » (''in seinem Sein um dieses Sein selbst geht'')<ref>Ibid., §4, p. 53.</ref>. Autrement dit, le Dasein n'est pas simplement présent comme une chose, mais existe : il se rapporte à son être, il a à être. Heidegger réserve le terme « existence » (''Existenz'') au seul Dasein, pour le distinguer de l'« être-sous-la-main » (''Vorhandenheit'') des objets et de l'« être-à-portée-de-main » (''Zuhandenheit'') des ustensiles<ref>Ibid., §9, p. 67-70.</ref>. L'existence du Dasein se caractérise par plusieurs « existentiaux », structures ontologiques fondamentales : l'« être-au-monde » (''In-der-Welt-sein''), qui signifie que le Dasein n'est jamais isolé mais toujours déjà engagé dans un monde familier<ref>Ibid., §12-13, p. 78-92.</ref> ; l'« être-avec » (''Mitsein''), qui indique la coexistence originaire avec autrui<ref>Ibid., §26, p. 156-158.</ref> ; la « préoccupation » (''Sorge''), qui unifie la structure temporelle du Dasein comme être jeté dans un passé, projeté vers des possibles futurs, et présent à son monde<ref>Ibid., §41, p. 237-248.</ref>. Heidegger distingue l'existence authentique (''eigentlich'') de l'existence inauthentique (''uneigentlich''). Le plus souvent, le Dasein vit dans le « On » (''das Man''), mode d'être anonyme où il se conforme aux normes sociales et se perd dans la quotidienneté<ref>Ibid., §27, p. 162-170.</ref>. L'existence authentique, au contraire, suppose que le Dasein assume sa finitude et se rapporte à sa mort comme possibilité ultime, « possibilité de l'impossibilité de l'existence »<ref>Ibid., §53, p. 329-332.</ref>. C'est dans l'angoisse face à la mort que le Dasein accède à sa liberté la plus propre, à sa « résolution devançante » (''vorlaufende Entschlossenheit'')<ref>Ibid., §62, p. 382-387.</ref>. == Perspectives contemporaines == La phénoménologie française du XXe siècle prolonge et transforme l'analyse heideggérienne. Maurice Merleau-Ponty (1908-1961) insiste sur l'ancrage corporel de l'existence : le corps n'est pas un objet parmi d'autres, mais le « véhicule de l'être au monde », le lieu d'insertion dans le tissu du sensible<ref>Maurice Merleau-Ponty, ''Phénoménologie de la perception'', Paris, Gallimard, 1945, rééd. « Tel », 1976, p. 97.</ref>. Exister, c'est d'abord être chair (''Leib''), sentir et être senti, dans une « intentionnalité opérante » qui précède toute activité réflexive<ref>Ibid., p. 478-495.</ref>. Gabriel Marcel (1889-1973), représentant de l'existentialisme chrétien, distingue le « problème » (question objective, extérieure au sujet) du « mystère » (réalité qui englobe le sujet et ne peut être objectivée). L'existence appartient au registre du mystère : je ne peux la traiter de l'extérieur, car « je suis mon corps » et non pas « j'ai un corps »<ref>Gabriel Marcel, ''Être et avoir'', Paris, Aubier, 1935, rééd. 1968, p. 11-29.</ref>. L'existence se révèle dans la « participation » à autrui, dans l'engagement et la fidélité qui constituent des « indices de métaproblématique »<ref>Gabriel Marcel, ''Du refus à l'invocation'', Paris, Gallimard, 1940, p. 47-62.</ref>. Karl Jaspers (1883-1969) élabore une philosophie de l'« Existenz », qu'il distingue du simple « Dasein » (être-là empirique). L'Existenz désigne la liberté propre de l'individu qui se réalise dans les « situations-limites » (''Grenzsituationen'') – mort, souffrance, combat, faute – où il est confronté à des dimensions de l'être qu'aucune connaissance objective ne peut maîtriser<ref>Karl Jaspers, ''Philosophie'', tome II, ''Éclairement de l'existence'', traduction J. Hersch, Berlin, Springer, 1932, rééd. Paris, Springer-Verlag France, 1986, p. 177-230.</ref>. Dans ces situations, l'individu accède à la transcendance et réalise son « être-soi » authentique (''Selbstsein'')<ref>Ibid., p. 231-289.</ref>. == Débats contemporains en ontologie analytique == Dans la tradition analytique anglo-saxonne, la question de l'existence est reprise à nouveaux frais. Après Bertrand Russell et Gottlob Frege, qui ont montré que l'existence est un quantificateur logique et non un prédicat de premier ordre<ref>Gottlob Frege, « Fonction et concept » (1891), dans ''Écrits logiques et philosophiques'', traduction C. Imbert, Paris, Seuil, 1971, p. 97-98.</ref>, des débats importants émergent au XXe siècle sur le statut ontologique des objets non existants. Alexius Meinong (1853-1920) avait défendu l'idée qu'il existe des objets « subsistants » (comme le nombre deux ou l'or) qui n'ont pas d'existence spatio-temporelle, et même des objets « inexistants » (comme le cercle carré) qui possèdent des propriétés sans exister<ref>Alexius Meinong, « Über Gegenstandstheorie » (1904), dans ''Gesamtausgabe'', vol. II, Graz, Akademische Druck, 1971, p. 481-535.</ref>. Cette position, critiquée par Russell, a été reprise sous diverses formes dans les débats contemporains sur la quantification et la référence<ref>William C. Kneale et Martha Kneale, ''The Development of Logic'', Oxford, Clarendon Press, 1962, p. 696-707.</ref>. Willard Van Orman Quine (1908-2000) formule le critère célèbre : « Être, c'est être la valeur d'une variable liée » (''to be is to be the value of a bound variable'')<ref>Willard Van Orman Quine, « On What There Is » (1948), dans ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953, rééd. 1980, p. 15.</ref>. Selon ce critère, poser la question de l'existence revient à déterminer sur quelles entités nos théories quantifient. Cette approche déplace la question de l'existence du champ de la métaphysique spéculative vers celui de l'analyse logique du langage et de l'engagement ontologique de nos discours théoriques<ref>Willard Van Orman Quine, ''Le mot et la chose'' (1960), traduction J. Dopp et P. Gochet, Paris, Flammarion, 1977, p. 297-325.</ref>. == Conclusion == La notion d'existence parcourt toute l'histoire de la philosophie occidentale, du questionnement médiéval sur la distinction essence-existence jusqu'aux analyses phénoménologiques et existentialistes du XXe siècle, en passant par la critique kantienne et les développements de l'ontologie analytique. Loin d'être une évidence, l'existence apparaît comme un concept polysémique, susceptible d'acceptions multiples selon qu'on l'envisage du point de vue logique (quantification), métaphysique (acte d'être), épistémologique (position dans l'expérience) ou existentiel (mode d'être du sujet humain). Le débat entre essentialisme et existentialisme, la tension entre objectivité et subjectivité, la question du rapport entre langage et être continuent de structurer la réflexion philosophique contemporaine sur ce qui signifie « être » et « exister ». Comme l'écrivait Heidegger au début d'« Être et temps », « cette question est aujourd'hui tombée dans l'oubli », mais elle demeure « la question fondamentale de la philosophie »<ref>Heidegger, ''Être et temps'', op. cit., §1, p. 27.</ref>. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == * Aristote, ''Métaphysique'', livres Γ et Z, traduction J. Tricot, Paris, Vrin, 1991. * Thomas d'Aquin, ''De ente et essentia'' / ''L'être et l'essence'', édition bilingue L.-B. Geiger, Paris, Vrin, 1948. * Emmanuel Kant, ''Critique de la raison pure'', traduction A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, rééd. 1968. * Søren Kierkegaard, ''Post-scriptum définitif et non scientifique aux Miettes philosophiques'', traduction P.-H. Tisseau, Paris, Gallimard, 1949. * Martin Heidegger, ''Être et temps'', traduction F. Vezin, Paris, Gallimard, 1986. * Jean-Paul Sartre, ''L'être et le néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943. * Jean-Paul Sartre, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946. * Étienne Gilson, ''L'être et l'essence'', Paris, Vrin, 1948, rééd. 2000. * Frédéric Nef, ''Qu'est-ce que la métaphysique ?'', Paris, Gallimard, 2004. {{autocat}} 2xlh2g31juvxfnexbsmwik43ue906vu Dictionnaire de philosophie/Désobéissance 0 83182 767900 754358 2026-06-17T04:55:42Z PandaMystique 119061 /* Notes et références */ 767900 wikitext text/x-wiki {{DicoPhilo|Désobéissance}} La désobéissance constitue l'acte par lequel un individu ou un groupe refuse délibérément de se conformer à une autorité, une loi ou une norme établie. Loin de se réduire à un simple manquement passif, la désobéissance engage une position active et consciente de refus qui soulève des questions philosophiques essentielles sur la nature de l'autorité politique, les fondements de l'obligation morale, et les limites de l'obéissance légitime. Elle traverse l'histoire de la philosophie comme une interrogation permanente : à quelles conditions précises une autorité peut-elle légitimement commander, et à quelles conditions la conscience individuelle peut-elle justifier son refus? == Fondements antiques et médiévaux == === Antigone et la tension entre loi naturelle et loi positive === La tragédie ''Antigone'' de Sophocle offre l'une des premières et des plus influentes représentations philosophiques de la désobéissance<ref>Sophocle, ''Antigone'', trad. P. Mazon, Paris, Les Belles Lettres, 1958, vers 450-460</ref>. Face au décret du roi Créon interdisant d'ensevelir son frère Polynice, Antigone oppose les « lois non écrites, inébranlables des dieux » (''nomoi agrapta tôn theôn'') aux édits humains. Cette protestation exprime bien plus qu'une simple rébellion personnelle : elle énonce une exigence morale supérieure, celle des lois divines et naturelles qui, selon Antigone, préexistent aux conventions humaines et doivent prévaloir sur elles<ref>Sophocle, ''Antigone'', vers 454-455</ref>. La figure d'Antigone incarne la tension entre deux conceptions concurrentes de la justice : celle qui émane de l'autorité établie et légalement formelle (la justice positive de Créon) et celle qui s'enracine dans des principes moraux transcendants (la justice naturelle). Son acte de désobéissance affirme qu'il existe des obligations morales antérieures et supérieures aux commandements de l'État, et que dans certaines circonstances morales exceptionnelles, l'exigence éthique doit prévaloir sur l'obéissance civile mécanique. Cette figure revient constamment dans l'histoire de la philosophie : chez Hegel qui en fait un moment de la conscience tragique, chez Hölderlin, chez Hannah Arendt qui voit en elle l'emblème de la contestation morale de l'injustice légale<ref>Hannah Arendt, « On Civil Disobedience », dans ''Crises of the Republic'', New York, Harcourt Brace, 1970, p. 44-55</ref>. === Platon et la limite de l'obéissance === Dans la pensée grecque classique, la question de l'obéissance et de la désobéissance se pose de manière profondément nuancée. Le dialogue intitulé ''Criton'' met en scène Socrate refusant de s'évader de prison bien qu'il ait été injustement condamné à mort. Les Lois, personnifiées de manière allégorique, rappellent à Socrate qu'il leur doit son éducation civique et sa formation intellectuelle, et qu'il a tacitement accepté leur autorité en choisissant de demeurer à Athènes plutôt que de s'exiler<ref>Platon, ''Criton'', trad. L. Brisson, Paris, Flammarion, 1997, 50a-54d</ref>. Socrate reconnaît cette force de l'argument et accepte sa condamnation. Pourtant, dans l'''Apologie'', le même Socrate énonce un principe qui semble contredire sa soumission finale : il déclare qu'il continuerait à philosopher et à poursuivre sa mission même si la cité le lui interdisait explicitement, car il doit « obéir à dieu plutôt qu'aux hommes »<ref>Platon, ''Apologie de Socrate'', trad. L. Brisson, Paris, Flammarion, 1997, 29d</ref>. Cette tension entre deux passages du corpus platonicien révèle une limite constitutive de l'obligation politique : elle ne peut s'étendre jusqu'à exiger l'abandon de la conscience morale. L'obéissance aux lois n'est pas absolue; elle rencontre une limite morale au-delà de laquelle l'obligation de se soumettre cesse de s'appliquer. === Aristote et la distinction entre justice générale et justice particulière === Aristote développe une distinction importante qui ouvrira la voie à la notion de « loi naturelle ». Dans l'''Éthique à Nicomaque'', il distingue entre justice générale, qui consiste en l'obéissance régulière aux lois, et justice particulière, qui concerne le traitement équitable dans chaque situation spécifique<ref>Aristote, ''Éthique à Nicomaque'', Livre V, chap. 7-10, trad. J. Tricot, Paris, Vrin, 1990</ref>. Cette distinction ouvre la possibilité théorique que certaines lois, bien que formellement valides et dûment édictées par l'autorité compétente, puissent être matériellement injustes ou ne pas servir le bien commun qu'elles prétendent viser. La tradition du droit naturel, développée ultérieurement par les stoïciens romains (notamment Cicéron) et reprise par la scholastique médiévale, affirme l'existence de lois universelles inscrites dans la nature rationnelle de l'univers et accessibles à la raison humaine<ref>Cicéron, ''De officiis'', Livre I, 4, trad. M. Testard, Paris, Les Belles Lettres, 1965</ref>. Thomas d'Aquin, synthétisant Aristote et la théologie chrétienne, affirme dans la ''Somme théologique'' qu'une loi injuste ne mérite pas véritablement le nom de loi mais constitue plutôt « un acte de violence »<ref>Thomas d'Aquin, ''Somme théologique'', I-II, Questions 90-97, particulièrement Q. 92 art. 1, trad. Éditions de la Revue des Jeunes, Paris, 1925</ref>. Cette conception théologique et philosophique ouvre explicitement la possibilité théorique d'une désobéissance légitime face aux lois qui contrediraient frontalement la loi naturelle et la justice substantielle. == La philosophie politique moderne et l'émergence du droit de résistance == === John Locke et le contrat social fiduciaire === La philosophie politique moderne transforme profondément la question de la désobéissance en l'articulant au problème du contrat social et de la légitimité du pouvoir souverain. John Locke, dans son ''Second Traité du gouvernement civil'' (1689), développe une théorie cohérente et systématique du droit de résistance à l'oppression<ref>John Locke, ''Two Treatises of Government'', Cambridge University Press, 1988 (édition critique de P. Laslett), Second Treatise, chapitre XIX, « Of the Dissolution of Government »</ref>. Selon Locke, les individus ne transfèrent au gouvernement qu'une portion limitée et précise de leurs droits naturels, et uniquement à titre fiduciaire (c'est-à-dire en confiance), dans le but spécifique de préserver plus efficacement leur vie, leur liberté et leurs propriétés. Lorsque le pouvoir politique excède manifestement ses prérogatives légitimes ou menace délibérément les droits fondamentaux qu'il était contractuellement tenu de protéger, les citoyens conservent un droit de résistance, voire de révolution. Ce droit de résistance n'est pas chez Locke un simple droit individuel susceptible d'abus arbitraires, mais un droit collectif qui s'exerce lorsque le gouvernement rompt le contrat social qui le lie au peuple de manière systématique et prolongée<ref>Locke, ''Second Treatise'', §222-243</ref>. La tradition rousseauiste et révolutionnaire française reprendra cette doctrine : la Déclaration française de 1789 inscrit explicitement « la résistance à l'oppression » parmi les droits naturels et imprescriptibles de l'homme<ref>Déclaration des droits de l'homme et du citoyen, 26 août 1789, article 2</ref>. === Jean-Jacques Rousseau et la volonté générale === Jean-Jacques Rousseau complexifie cette analyse en introduisant une distinction conceptuelle décisive entre la volonté générale, qui vise par définition l'intérêt commun et le bien public, et la volonté de tous, simple agrégation mécanique des volontés particulières et intéressées<ref>Rousseau, ''Du contrat social'', Livre II, chapitre 3, Paris, Flammarion, 2001, p. 54-56</ref>. Dans cette perspective rousseauiste, la légitimité de la désobéissance dépend entièrement de sa capacité à servir l'intérêt commun plutôt que des intérêts sectoriels ou particuliers. La désobéissance ne peut moralement se justifier que si elle tend à restaurer l'expression authentique et uncorrompue de la volonté générale lorsque celle-ci a été confisquée, dénaturée ou instrumentalisée par des factions. == La désobéissance civile : émergence d'une pratique politico-philosophique == === Henry David Thoreau : la conscience comme dernière instance morale === Henry David Thoreau inaugure au XIXe siècle une forme spécifique et philosophiquement articulée de désobéissance qu'il nomme d'abord « résistance au gouvernement civil » (''Resistance to Civil Government''). Son essai séminal, publié en 1849 dans la revue ''Aesthetic Papers'', puis republié en 1866 sous le titre désormais canonique ''Civil Disobedience'', s'enracine dans son refus personnel et public de payer l'impôt fédéral de l'État du Massachusetts pour protester contre l'institution de l'esclavage, l'extermination systématique des peuples autochtones, et la guerre américaine d'agression contre le Mexique (1846-1848)<ref>Thoreau, Henry David, « Resistance to Civil Government », ''Aesthetic Papers'', 1849, republié sous le titre « Civil Disobedience »</ref>. En 1846, le shérif Sam Staples d'arrondissement de Concord invite Thoreau à payer ses impôts en retard. Thoreau refuse délibérément et publiquement, ce qui entraîne son incarcération brève mais significative. Dans son essai, Thoreau affirme que la conscience individuelle constitue l'instance morale suprême, antérieure et supérieure à toute loi positive de l'État. Il affirme avec force : « Sous un gouvernement qui emprisonne injustement quiconque, la vraie place d'un homme juste est aussi en prison<ref>Thoreau, ''Civil Disobedience'', édition Penguin, p. 10</ref>. » Pour Thoreau, l'individu dispose d'une obligation morale qui transcende l'obligation légale : obéir à sa conscience morale. Il refuse vigoureusement l'idée que l'individu vertueux doive attendre qu'une majorité démocratique se forme pour s'opposer à une injustice manifeste. Il écrit à cet égard : « Une minorité n'est impuissante que lorsqu'elle se conforme à la majorité<ref>Thoreau, ''Civil Disobedience'', standard edition, p. 12</ref>. » Cette conception profondément individualiste de la désobéissance marque la pensée politique moderne, bien qu'elle soit ultérieurement critiquée. Hannah Arendt reprochers à Thoreau de confondre la conscience privée (relevant du for intérieur personnel) avec l'opinion politique publique (relevant de l'espace politique collectif)<ref>Arendt, « Civil Disobedience », 1970, p. 44-45</ref>. Néanmoins, Thoreau établit plusieurs principes qui deviennent constitutifs de la théorie moderne : le caractère public et ouvert du refus, la volonté de se soumettre aux conséquences légales de son acte, et la nature explicitement non-violente de la résistance. === Mohandas K. Gandhi et la ''satyagraha'' : vérité et force === Mohandas K. Gandhi s'inspire directement des écrits de Thoreau pour développer sa propre philosophie de la résistance non-violente, qu'il nomme ''satyagraha'', littéralement « force de la vérité » ou plus précisément « étreinte de la vérité »<ref>Gandhi, Mohandas K., ''The Essential Gandhi: His Life, Work, and Ideas'', trad. Louis Fischer, New York, Vintage, 2002, p. 142-165</ref>. Pour Gandhi, la désobéissance civile ne constitue pas simplement un refus passif, une résistance négative, mais une forme d'action positive, créatrice et transformatrice visant à transformer profondément l'adversaire par un appel sincère à sa conscience morale et à son humanité partagée. La ''satyagraha'' implique non seulement la non-violence physique absolue (''ahimsa'') mais aussi l'absence radicale de haine, de rancœur ou de malveillance envers l'oppresseur. Gandhi écrit : « Le satyagrahi doit montrer de la bonne volonté et de l'amour envers son adversaire, même face à la répression la plus brutale<ref>Gandhi, ''Non-violence in Peace and War'', Ahmedabad, Navajivan Press, 1948, vol. 1, p. 3-8</ref>. » Cette exigence éthique profonde n'est pas seulement morale mais stratégiquement efficace : elle maintient ouverte la possibilité d'une transformation mutuelle. La désobéissance civile gandhienne se distingue donc par son caractère profondément transformateur et sa dimension éthique. Elle ne cherche pas seulement à empêcher une injustice ou à obtenir des concessions tactiques, mais à établir une nouvelle relation entre oppresseurs et opprimés, fondée sur la reconnaissance mutuelle de leur dignité humaine commune. Cette dimension éthique, spirituelle et humaniste, ancrée dans la philosophie hindoue et les traditions du non-violence (''ahimsa''), aura une influence considérable et durable sur les mouvements de libération politique du XXe siècle<ref>Sharp, Gene, ''The Politics of Nonviolent Action'', Boston, Porter Sargent, 1973, vol. 1, p. 109-145</ref>. === Martin Luther King Jr. : la distinction entre lois justes et lois injustes === Martin Luther King Jr. reprend et adapte de manière créative les principes gandhiens dans le contexte spécifique de la lutte pour les droits civiques aux États-Unis d'Amérique. Dans sa célèbre « Lettre de la prison de Birmingham » (écrite le 16 avril 1963), King développe une distinction philosophique fondamentale entre lois justes et lois injustes, distinction qui s'inscrit explicitement dans la tradition du droit naturel aristotélicien et thomiste<ref>King, Martin Luther Jr., « Letter from a Birmingham Jail », avril 1963, publié dans ''Why We Can't Wait'', New York, Harper & Row, 1964, p. 76-95</ref>. S'appuyant directement sur saint Augustin (qui affirme « une loi injuste n'est pas une loi ») et sur Thomas d'Aquin, King énonce sa propre formule : « Toute loi qui élève la personnalité humaine est juste. Toute loi qui abaisse la personnalité humaine est injuste. Tous les statuts de ségrégation sont injustes parce que la ségrégation distord l'âme et endommage la personnalité<ref>King, « Letter from Birmingham Jail », p. 78-79</ref>. » King insiste sur plusieurs caractéristiques essentielles que doivent satisfaire les actes de désobéissance civile pour être justifiés moralement : (1) elle doit être publique et ouverte, sans caractère clandestin; (2) elle doit être entreprise avec amour sincère plutôt qu'avec haine ou rage; (3) elle doit être accompagnée d'une volonté consciente et résolue d'accepter la peine légale qui s'ensuit<ref>King, « Letter from Birmingham Jail », p. 91-93</ref>. Cette dernière exigence n'est pas masochiste mais profondément stratégique : en acceptant volontairement la punition, en restant en prison, le désobéissant manifeste son respect fondamental pour le système légal en général tout en contestant une loi particulière; il cherche ainsi à « éveiller la conscience de la communauté » face à l'injustice persistante<ref>King, « Letter from Birmingham Jail », p. 82</ref>. King développe également le concept d'« amour agressif » (''aggressive love''), qui articule la fermeté inflexible de l'action directe non-violente avec le refus total de la violence physique et de la haine personnelle. La désobéissance civile, dans cette perspective kingienne, n'est pas seulement un moyen tactique pour obtenir des concessions, mais l'expression d'un engagement éthique profond envers la dignité humaine<ref>Livingston, Alexander G., « Martin Luther King Jr.'s Late Theory of Civil Disobedience », ''The Journal of Politics'', vol. 82, no 2, 2020, p. 704-706</ref>. === Hannah Arendt et la dimension collective de la désobéissance === Hannah Arendt propose dans son essai « On Civil Disobedience » (1970) une analyse qui effectue une rupture consciente avec l'individualisme de Thoreau et offre une perspective fondamentalement nouvelle et collective<ref>Hannah Arendt, « Civil Disobedience », dans ''Crises of the Republic'', New York, Harcourt Brace, 1970</ref>. Pour Arendt, la désobéissance civile ne procède pas de la conscience individuelle, mais constitue essentiellement un phénomène collectif, public et politique. Elle critique explicitement la conception thoreauvienne qui fonde la désobéissance sur la conscience personnelle : la conscience, selon Arendt, relève du domaine intérieur de la conscience privée et reste, en tant que telle, apolitique<ref>Arendt, « Civil Disobedience », p. 49</ref>. La désobéissance civile authentique procède non de la conviction de conscience privée, mais d'opinions partagées publiquement et débattues au sein de groupes organisés et de minorités politiques. Arendt distingue clairement la désobéissance civile des actions criminelles ordinaires : tandis que le criminel agit habituellement dans l'ombre, en dissimulant son action, et que ses motivations sont généralement égoïstes et privées, le désobéissant civil agit publiquement et ouvertement, au nom de principes moraux qu'il partage explicitement avec d'autres citoyens, et en vue du bien commun<ref>Arendt, « Civil Disobedience », p. 50-51</ref>. La désobéissance civile remplit selon Arendt une fonction politique essentielle et même constitutive dans les démocraties modernes : elle constitue un contre-pouvoir effectif face aux défaillances et dérives du système représentatif et du système judiciaire. Elle envisage même la possibilité philosophique d'institutionnaliser partiellement la désobéissance civile à travers des « groupes de pression » organisés qui permettraient aux minorités politiques de faire effectivement entendre leur voix<ref>Arendt, « Civil Disobedience », p. 102-103</ref>. == Perspectives non-occidentales == === La pensée confucéenne : Mencius et le mandat du ciel === Dans la tradition confucéenne classique, la question de la désobéissance se formule en termes distincts de ceux de la philosophie politique occidentale. Mencius (IVe siècle av. J.-C.), principal développeur de la pensée confucéenne, articule l'idée que le souverain qui gouverne de manière tyranniquement injuste perd le « mandat du ciel » (''tianming'')<ref>Mencius, trad. D.C. Lau, Penguin Classics, 1970, Livre I, Part A, sections 7-8</ref>. Il affirme explicitement que les tyrans anciens comme l'empereur Jie et le roi Zhou méritaient légitimement d'être destitués et renversés car, par leur maltraitance systématique du peuple, ils avaient effectivement cessé d'être de véritables souverains légitimes<ref>Mencius, Livre II, Part B, sections 8-9</ref>. Cette conception confucéenne diffère fondamentalement du droit occidental de résistance : elle s'inscrit dans une vision hiérarchique et cosmique de l'ordre social où la légitimité procède de l'accord harmoniex entre le Ciel, le souverain et le peuple. Là où la théorie occidentale moderne insiste sur les droits individuels et le contrat social, la théorie confucéenne insiste sur les devoirs éthiques et l'harmonie cosmique. Le confucianisme met fortement l'accent sur le devoir de remontrance loyale (''jian'') : les conseillers, ministres et fonctionnaires ont l'obligation morale absolue d'avertir le souverain de ses erreurs et écarts éthiques, même au péril de leur propre vie<ref>Political Authority and Resistance to Injustice: A Confucian Perspective, article académique, 2022, p. 8-12</ref>. Cette tradition d'une critique loyale et courageuse reconnaît une forme de désobéissance au nom de principes éthiques transcendants, tout en maintenant le cadre général du respect des hiérarchies et de la piété filiale. === La tradition juridique et politique islamique === Dans la pensée politique islamique classique et contemporaine, la question de l'obéissance au gouvernant s'énonce selon le principe fondamental quranique : « Pas d'obéissance à une créature dans la désobéissance au Créateur »<ref>Formule rapportée dans les recueils de hadith ''Sahih Bukhari'' et ''Sunan ibn Majah'', trad. M.M. Khan et B.A. Siddiqi, Islamic University of Madinah</ref>. Les juristes musulmans (''fuqaha'') des différentes écoles juridiques (''madhabs'') ont développé une doctrine complexe et sophistiquée concernant les droits et obligations envers les gouvernants injustes. Le consensus majoritaire parmi les juristes stipule que les musulmans doivent obéir aux dirigeants musulmans (''wali'') même s'ils commettent des péchés personnels, tant qu'ils ne manifestent pas de mécréance flagrante (''kufr ash-sharih'') ou n'ordonnent pas explicitement de violer les commandements divins essentiels (''haram sharih'')<ref>al-Mawardi, ''Al-Ahkam as-Sultaniyyah'' (Les lois du gouvernement), trad. anglaise par Wafaa H. Wahba, Garnet Publishing, 1996, p. 12-45</ref>. Cette position conservatrice s'explique historiquement par la crainte que la rébellion contre le pouvoir établi n'engendre davantage de mal que de bien, provoquant des guerres civiles (''fitna'') et une effusion de sang massifs<ref>Ibn Qayyim al-Jawziyyah, ''I'lam al-Muwaqqi'in 'an Rabb al-'Alamin'' (Les informations du Juriste inspiré par le Seigneur du Monde), édition Dar al-Jil, 1973</ref>. Cependant, les musulmans conservent le devoir moral absolu de désobéir à tout ordre explicite qui contreviendrait directement à la loi divine (''sharia'') ou commanderait un péché grave. La désobéissance civile légitime se limite ainsi aux situations où l'autorité gouvernementale commande explicitement de commettre un péché ou un acte illicite (''haram''), auquel cas chaque musulman doit refuser publiquement. == Enjeux philosophiques contemporains == === Rawls et les critères de la désobéissance civile justifiée === La théorie philosophique contemporaine s'efforce de définir avec précision les critères permettant de distinguer la désobéissance civile moralement justifiée de la simple criminalité ordinaire ou du nihilisme anarchique. John Rawls, dans sa ''Théorie de la justice'' (1971), propose une conception que certains penseurs jugent restrictive ou insuffisamment sensible aux contextes d'oppression systémique<ref>Rawls, John, ''A Theory of Justice'', Cambridge, Harvard University Press, 1971, sections 55-59, révisé 1999</ref>. Selon Rawls, la désobéissance civile se justifie moralement uniquement dans les sociétés « presque justes » (''nearly just societies'') face à des violations manifestes et persistantes des principes fondamentaux de justice, et seulement après épuisement complet et démonstratif des voies légales normales<ref>Rawls, ''Théorie de la justice'', trad. C. Audard, Paris, Seuil, 1987, sections 55-59</ref>. Elle doit rester strictement non-violente, publique et transparente, et manifester un respect général et sincère pour le système légal. Rawls définit la désobéissance civile comme « un acte public, non-violent et conscientieux de rupture avec la loi, entrepris dans le but d'amener un changement dans les lois ou dans la politique gouvernementale »<ref>Rawls, ''Political Liberalism'', New York, Columbia University Press, 1993, p. 336</ref>. D'autres penseurs contemporains contestent ces restrictions rawlsiennes comme trop étroites. Ils soulignent que les conditions posées par Rawls risquent d'exclure ou de délégitimer les formes de désobéissance justifiées dans les contextes d'oppression systémique prolongée où les voies légales sont délibérément obstruées par les dominants. La question de la légitimité morale de formes plus « inciviles » de désobéissance (destruction sélective de propriété publique, perturbation économique coordonnée, occupation de terres, etc.) reste un objet de débat vif et philosophiquement sérieux dans la littérature académique contemporaine<ref>Brownlee, Kimberley, ''Conscience and Conviction: The Case for Civil Disobedience'', Oxford, Oxford University Press, 2012, ch. 1-2</ref>. === Désobéissance et légitimité démocratique === Un problème philosophique central concerne la relation profonde entre désobéissance civile et légitimité démocratique. Comment justifier moralement la désobéissance dans un régime démocratique où les citoyens disposent déjà théoriquement de moyens légaux pour contester les lois (vote démocratique, manifestations autorisées, recours juridiques, pétitions)? Plusieurs réponses philosophiquement articulées s'offrent. D'une part, les limites structurelles du système représentatif et électoral : les minorités politiques stables (sur la base de la race, du genre, de la religion, ou de la classe) risquent d'être systématiquement ignorées ou marginalisées par la règle majoritaire, particulièrement lorsqu'elles constituent des « minorités discrètes » sans pouvoir de marchandage politique<ref>Delmas, Candice, ''A Duty to Resist: When Disobedience Should Be Uncivil'', Oxford, Oxford University Press, 2018, p. 45-78</ref>. D'autre part, la lenteur intrinsèque des processus démocratiques, législatifs et judiciaires face à l'urgence existentielle de certaines injustices graves (discrimination raciale systémique, crise écologique) rend la désobéissance éthiquement requise plutôt que simplement permise. La désobéissance civile peut aussi enrichir et approfondir la démocratie substantive en constituant une forme élargie de participation citoyenne, un moyen pour les citoyens ordinaires d'exercer un pouvoir de contestation effectif au-delà des canaux institutionnels habituels limités. Dans cette perspective, elle ne mine pas le système démocratique mais le complète en maintenant vivante la possibilité d'une critique fondamentale des institutions établies<ref>Arendt, ''Crises of the Republic'', 1970, p. 100-110</ref>. === Désobéissance épistémique et justice cognitive === Récemment, certains philosophes ont considérablement étendu le concept de désobéissance au domaine épistémique et cognitif. Le penseur décolonial Walter D. Mignolo parle de « désobéissance épistémique » pour désigner le refus conscient et structuré de se conformer aux systèmes de production et de validation de la connaissance dominants, notamment ceux hérités de la modernité coloniale occidentale<ref>Mignolo, Walter D., ''The Darker Side of Western Modernity: Global Futures, Decolonial Options'', Durham, Duke University Press, 2011, p. 75-102</ref>. Cette forme de désobéissance ne concerne pas directement les lois politiques ou civiles mais les cadres intellectuels profonds, les régimes de vérité, et les hiérarchies épistémiques qui structurent notre compréhension même du monde. La désobéissance épistémique vise à décoloniser la pensée philosophique, scientifique et politique, et à revendiquer la légitimité épistémique et la dignité intellectuelle de savoirs marginalisés, occultés ou systématiquement disqualifiés par la domination épistémique occidentale<ref>Lugones, María, « Toward a Decolonial Feminism », ''Hypatia'', vol. 25, no 4, 2010, p. 742-759</ref>. C'est une forme de résistance qui opère sur le plan de la production de vérité et de sens. == Conclusion == La désobéissance, loin d'être un simple refus négatif de l'autorité ou un manquement passif à l'ordre établi, se révèle être un concept philosophique profondément complexe qui engage des questions centrales sur la nature de l'autorité politique, les sources de sa légitimité, et les limites morales du pouvoir. De la figure tragique d'Antigone aux mouvements contemporains de justice climatique et de justice raciale, la pensée de la désobéissance traverse l'histoire de la philosophie politique comme une interrogation permanente sur les conditions auxquelles une autorité peut légitimement commander et les conditions auxquelles les citoyens et les peuples peuvent justifier leur refus. La diversité des traditions philosophiques occidentales et non-occidentales montre clairement qu'il n'existe pas de réponse univoque, définitive ou universelle à la question de savoir quand précisément la désobéissance est justifiée. Néanmoins, plusieurs exigences morales reviennent constamment à travers ces traditions diverses : l'appel à des principes éthiques qui transcendent et surpassent les lois positives ordinaires; la dimension publique, collective et communicative de l'acte de désobéissance; et la nécessité philosophique de maintenir un lien, même tendu et critique, avec la communauté politique dont on conteste légitimement certaines décisions. La désobéissance civile, dans ses formes les plus élaborées et éthiquement réfléchies, ne vise pas à détruire ou à nier l'ordre juridique mais plutôt à le transformer de manière fondamentale, en rappelant constamment que toute autorité, tout pouvoir, doit ultimement se justifier devant l'exigence incontournable de justice, d'égale dignité humaine et de reconnaissance mutuelle. == Notes et références == {{references|colonnes=2}} == Bibliographie == * Arendt, Hannah, « Civil Disobedience », dans ''Crises of the Republic'', New York, Harcourt Brace, 1970 * Aristote, ''Éthique à Nicomaque'', Livre V, trad. J. Tricot, Paris, Vrin, 1990 * al-Mawardi, ''Al-Ahkam as-Sultaniyyah'' (Les lois du gouvernement), trad. anglaise par Wafaa H. Wahba, Garnet Publishing, 1996 * Brownlee, Kimberley, ''Conscience and Conviction: The Case for Civil Disobedience'', Oxford, Oxford University Press, 2012 * Cicéron, ''De officiis'', Livre I, 4, trad. M. Testard, Paris, Les Belles Lettres, 1965 * Déclaration des droits de l'homme et du citoyen, 26 août 1789, article 2 * Delmas, Candice, ''A Duty to Resist: When Disobedience Should Be Uncivil'', Oxford, Oxford University Press, 2018 * Gandhi, Mohandas K., ''The Essential Gandhi: His Life, Work, and Ideas'', trad. Louis Fischer, New York, Vintage, 2002 * Ibn Qayyim al-Jawziyyah, ''I'lam al-Muwaqqi'in 'an Rabb al-'Alamin'' (Les informations du Juriste inspiré par le Seigneur du Monde), édition Dar al-Jil, 1973 * King, Martin Luther Jr., « Letter from a Birmingham Jail », avril 1963, publié dans ''Why We Can't Wait'', New York, Harper & Row, 1964 * Livingston, Alexander G., « Martin Luther King Jr.'s Late Theory of Civil Disobedience », ''The Journal of Politics'', vol. 82, no 2, 2020, p. 704-706 * Locke, John, ''Two Treatises of Government'', Cambridge University Press, 1988 (édition critique de P. Laslett), Second Treatise * Lugones, María, « Toward a Decolonial Feminism », ''Hypatia'', vol. 25, no 4, 2010, p. 742-759 * Mencius, trad. D.C. Lau, Penguin Classics, 1970 * Mignolo, Walter D., ''The Darker Side of Western Modernity: Global Futures, Decolonial Options'', Durham, Duke University Press, 2011 * Platon, ''Apologie de Socrate'' et ''Criton'', trad. L. Brisson, Paris, Flammarion, 1997 * Rawls, John, ''A Theory of Justice'', Cambridge, Harvard University Press, 1971 (révisé 1999) * Rawls, John, ''Political Liberalism'', New York, Columbia University Press, 1993 * Rousseau, Jean-Jacques, ''Du contrat social'', Paris, Flammarion, 2001 * Sharp, Gene, ''The Politics of Nonviolent Action'', Boston, Porter Sargent, 1973, vol. 1 * Sophocle, ''Antigone'', trad. P. Mazon, Paris, Les Belles Lettres, 1958 * Thomas d'Aquin, ''Somme théologique'', I-II, Questions 90-97, trad. Éditions de la Revue des Jeunes, Paris, 1925 * Thoreau, Henry David, « Resistance to Civil Government », ''Aesthetic Papers'', 1849, republié sous le titre « Civil Disobedience » {{Autocat}} 9mynmcv5j7yl7i99j7rjmkewxcrveu5 Dictionnaire de philosophie/Erreur 0 83207 767904 754882 2026-06-17T05:01:56Z PandaMystique 119061 767904 wikitext text/x-wiki {{DicoPhilo|Erreur}} L'erreur désigne, au sens philosophique le plus général, un jugement faux, une croyance inadéquate ou une représentation inexacte de la réalité. Elle se distingue du mensonge (qui implique l'intention de tromper), de l'ignorance (qui est l'absence de connaissance) et de l'illusion (qui est une perception déformée). La question de l'erreur est centrale en épistémologie, car elle soulève le problème fondamental des conditions et des limites de la connaissance humaine : comment pouvons-nous nous tromper, et comment pouvons-nous corriger ou éviter l'erreur ? == Définitions et distinctions == === Nature et types d'erreurs === L'erreur peut être définie simplement comme l'inadéquation entre notre jugement et la réalité. Cependant, cette définition générale englobe plusieurs types distincts d'erreurs : * L'erreur factuelle : porter un jugement faux sur un état de choses (« Le soleil tourne autour de la Terre ») * L'erreur logique : commettre une faute dans un raisonnement, même si les prémisses sont vraies * L'erreur méthodologique : employer une mauvaise méthode pour parvenir à la connaissance * L'erreur morale : se tromper sur ce qui est bien ou mal, juste ou injuste Cette classification montre que l'erreur n'est pas un phénomène unifié. Elle intervient à différents niveaux de notre vie cognitive et pratique. === Erreur et vérité === L'erreur n'a de sens philosophique que par rapport à la vérité. Dès l'Antiquité, les penseurs ont reconnu la profondeur du problème. Xenophane (VI{{e}} siècle av. J.-C.) formule déjà l'aporie fondamentale : « Nul homme n'a connu ni ne connaîtra jamais la vérité certaine sur les dieux et sur toutes les choses dont je parle. Car même si, par le plus grand des hasards, il venait à dire la vérité, il ne le saurait pas lui-même, car tout n'est qu'opinion. »<ref>Xenophane, fragment DK 21 B 34</ref> Cette parole ancienne pose le problème épistémologique essentiel : même si nous énonçons la vérité, comment savoir que nous ne nous trompons pas ? == L'Antiquité grecque et romaine == === Platon et le problème de la possibilité de l'erreur === Dans le ''Théétète'', Platon pose la question apparemment paradoxale : comment l'erreur est-elle possible ? Si nous connaissons quelque chose, nous ne pouvons nous tromper à son sujet. Si nous ne la connaissons pas, nous ne pouvons rien en dire. Comment peut-on alors se tromper ?<ref>Platon, ''Théétète'', 188a-c</ref> Platon propose plusieurs solutions pour résoudre ce paradoxe. Dans la théorie de la « tablette de cire » (''plax kai keros''), l'âme ressemble à une plaque de cire sur laquelle les perceptions s'impriment. L'erreur survient quand nous appliquons la mauvaise empreinte à la mauvaise perception. L'image est celle du sceau : si le sceau ne correspond pas à l'impression, l'erreur se produit. Dans la ''République'', Platon établit également une hiérarchie des états mentaux, du bas en haut : l'opinion (''doxa''), la croyance (''pistis''), l'intellection (''dianoia'') et enfin la connaissance scientifique (''epistémè''). L'erreur réside largement dans la confusion entre ces niveaux.<ref>Platon, ''République'', Livre VI, 509d-511e</ref> === Aristote et l'erreur dans le jugement === Aristote concentre son analyse de l'erreur sur le jugement, considéré comme le lieu propre où l'erreur se produit. Dans le ''De l'interprétation'', il établit la distinction fondamentale : une proposition est vraie si elle dit de ce qui est qu'il est, ou de ce qui n'est pas qu'il n'est pas. Elle est fausse dans le cas contraire.<ref>Aristote, ''Métaphysique'', Livre Γ (Gamma), 1011b25-27</ref> C'est une formulation précoce de la théorie de la vérité-correspondance. Aristote identifie aussi les paralogismes (raisonnements incorrects formellement) et les sophismes (raisonnements trompeurs intentionnels). Dans les ''Réfutations sophistiques'', il analyse systématiquement les moyens par lesquels on peut induire l'erreur par la parole. Un point crucial chez Aristote est que l'erreur peut provenir de prémisses fausses dans un raisonnement logiquement correct. Même un syllogisme parfait ne produit la science véritable (''epistémè'') que s'il repose sur des prémisses vraies et premières. C'est pourquoi, dans les ''Seconds Analytiques'', Aristote souligne que la science authentique exige non seulement un raisonnement valide, mais aussi des principes véritables et premiers.<ref>Aristote, ''Seconds Analytiques'', I, 2, 71b9-72a5</ref> === La doctrine stoïcienne de l'assentiment === Pour les stoïciens, l'erreur n'est pas simplement une affaire de contenu faux, mais d'un mauvais usage de la faculté d'assentiment (''sunkatathesis'' en grec, ''assensio'' en latin). Cette analyse introduit une dimension volontaire dans l'erreur qui était moins présente chez les platoniciens. La représentation (''phantasia'') vient à l'esprit de façon passive. Mais l'assentiment à cette représentation est un acte volontaire de notre raison. L'erreur survient précisément quand nous donnons notre assentiment à une représentation qui n'est pas « compréhensive » (''kataleptikè phantasia''), c'est-à-dire qui ne garantit pas sa propre vérité par son caractère d'évidence intrinsèque.<ref>Cicéron, ''Académiques'' II, xii, 37</ref> Le sage stoïcien, selon cette doctrine, s'abstient précisément de donner son assentiment aux représentations non compréhensives. Cette suspension volontaire du jugement (proche de l'epochè des sceptiques) est le moyen d'éviter l'erreur. Les stoïciens insistent : nous ne sommes jamais forcés d'assentir. C'est par un choix que nous nous trompons, ce qui rend l'erreur une forme de faute morale.<ref>Épictète, ''Entretiens'', II, xx, 28-31</ref> Cette conception a profondément influencé les débats entre les stoïciens et les sceptiques académiciens (comme Arcésilas et Carnéade), qui arguaient qu'aucune représentation n'est jamais suffisamment compréhensive pour garantir l'absence d'erreur. Pour les sceptiques, il faut donc suspendre l'assentiment sur toutes choses. == La philosophie médiévale == === Augustin : l'erreur, le libre arbitre et le péché === Saint Augustin reprend et transforme profondément la problématique platonicienne de l'erreur. Dans le ''De libero arbitrio'' (''Du libre arbitre''), il établit que l'erreur provient non d'un défaut de nos facultés cognitives (qui viennent de Dieu et sont donc bonnes en elles-mêmes), mais d'un détournement volontaire de notre libre arbitre.<ref>Augustin, ''De libero arbitrio'', II, 19</ref> Augustin opère un basculement décisif : le problème n'est pas gnoséologique mais moral. Nous nous trompons parce que notre volonté se détourne du Bien suprême (Dieu) pour se porter vers les biens inférieurs. L'erreur devient ainsi une forme de désordre de la volonté. Pour Augustin, l'erreur a aussi une dimension historique et existentielle. Elle est liée au péché originel qui a obscurci notre intelligence et affaibli notre volonté. La connaissance véritable nécessite donc une illumination divine (''illuminatio divina''), une participation à la lumière éternelle de Dieu. Sans cette grâce, nous restons en proie à l'erreur et aux illusions des sens et de l'imagination. === Thomas d'Aquin : intellect, jugement et composition === Thomas d'Aquin, reprenant la distinction aristotélicienne, soutient que l'erreur ne peut pas provenir de l'intellect en tant que tel, car l'intellect saisit correctement son objet propre (les essences intelligibles). L'erreur se produit plutôt dans le jugement, quand l'intellect compose ou divise des concepts.<ref>Thomas d'Aquin, ''Somme théologique'', Ia, question 17, article 3</ref> Thomas introduit aussi une distinction cruciale : l'erreur est une fausse connaissance, un jugement tenu pour vrai alors qu'il est faux. Elle se distingue de l'ignorance (simple absence de connaissance) et de la non-connaissance (absence de la faculté elle-même). Cette triple distinction affine considérablement notre compréhension du phénomène. Thomas analyse également en détail les causes de l'erreur : les prémisses fausses, le raisonnement incorrect, l'influence des passions sur le jugement, les préjugés de l'éducation. Il reconnaît que notre volonté peut nous pousser à juger avant d'avoir des preuves suffisantes, et que nos désirs et aversions influencent nos jugements. == La philosophie moderne == === Descartes : précipitation de la volonté et usage impropre du libre arbitre === Dans les ''Méditations métaphysiques'', Descartes place le problème de l'erreur au cœur de sa réflexion philosophique. Sa question est celle-ci : comment Dieu, qui est parfait et véridique, a-t-il pu créer des êtres sujets à l'erreur ? La solution cartésienne est révolutionnaire. Elle réside dans la ''Méditation quatrième'' : l'erreur provient de la disproportion entre notre entendement (faculté passive de concevoir), qui est fini, et notre volonté (faculté active de juger), qui est infinie. L'entendement nous présente des idées claires ou confuses, mais c'est la volonté qui affirme ou nie. L'erreur survient quand nous jugeons (acte de la volonté) avant ou sans que l'entendement ait une perception suffisamment claire et distincte.<ref>Descartes, ''Méditations métaphysiques'', Méditation quatrième, Adam-Tannery IX, 46</ref> Le problème, selon Descartes, n'est pas que nous puissions nous tromper (ce qui serait blâmable à Dieu), mais que nous ''choisissons'' de nous tromper par une sorte de précipitation ou de précipité (''praecipitatio''). Descartes écrit : « Si je m'abstiens de donner mon jugement sur une chose, lorsque je ne la conçois pas avec assez de clarté et de distinction, il est évident que j'en use fort bien, et que je ne suis point trompé. »<ref>Descartes, ''Méditations métaphysiques'', Méditation quatrième, Adam-Tannery IX, 47</ref> Ainsi, Dieu n'est pas responsable de nos erreurs ; nous sommes responsables du mauvais usage de notre libre arbitre. La règle pour éviter l'erreur est donc celle de l'évidence : ne juger que de ce qui nous apparaît clairement et distinctement. === Spinoza : l'erreur comme privation et inadéquation === Spinoza, dans l'''Éthique'', rejette la solution cartésienne. Pour lui, l'erreur n'est pas due à un mauvais usage de la volonté (qu'il refuse de distinguer réellement de l'entendement). Au contraire, l'erreur est simplement une privation de connaissance, c'est-à-dire une forme d'ignorance.<ref>Spinoza, ''Éthique'', Deuxième Partie, proposition 35</ref> Une idée fausse n'est pas quelque chose de positif, une sorte de tromperie active. C'est plutôt une idée inadéquate, c'est-à-dire une idée incomplète ou partielle. Spinoza donne l'exemple célèbre du soleil : quand nous le voyons, il semble se trouver à deux cents pieds de nous. Cette apparence persiste même quand nous savons scientifiquement que le soleil est beaucoup plus éloigné. L'apparence elle-même ne constitue pas une erreur : elle est une idée vraie de l'affection de notre corps par la lumière solaire. L'erreur consiste plutôt dans l'ignorance de la vraie distance du soleil, ignorance qui nous pousse à croire en la proximité apparente.<ref>Spinoza, ''Éthique'', Deuxième Partie, proposition 35, scolie</ref> Pour Spinoza, la connaissance progresse en trois genres : du premier genre (expérience directe et imagination), au deuxième genre (connaissance rationnelle des propriétés communes), au troisième genre (intuition des essences particulières sous l'espèce de l'éternité). L'erreur réside dans la prédominance du premier genre de connaissance. === Locke : les sources de l'erreur dans le jugement === John Locke, fondateur de l'empirisme moderne, situe l'origine de l'erreur dans l'acte de jugement. Dans l'''Essai sur l'entendement humain'', il opère une distinction cruciale : la connaissance est la perception de l'accord ou du désaccord entre nos idées. Le jugement, en revanche, est notre façon de suppléer au manque de certitude dans la connaissance.<ref>Locke, ''Essai sur l'entendement humain'', Livre IV, chapitre XIV</ref> Locke identifie quatre sources principales de l'erreur : * Le manque de preuves : nous jugeons sans avoir suffisamment d'évidence * La mauvaise utilisation des preuves disponibles : nous manquons d'habileté à nous servir correctement de ce que nous savons * Le manque de volonté de chercher : nous ne nous donnons pas la peine d'acquérir les preuves nécessaires * Les fausses mesures de probabilité : nous laissons nos désirs, nos préjugés et nos passions fausser notre évaluation des probabilités Locke insiste particulièrement sur l'erreur qui provient des mots et du langage. Souvent, nous croyons avoir des idées clares alors que nous possédons simplement des mots vagues ou mal définis. Cette confusion entre les mots et les idées qu'ils sont censés exprimer est une source majeure d'erreur, notamment en philosophie et en théologie.<ref>Locke, ''Essai sur l'entendement humain'', Livre III, chapitre XI</ref> === Leibniz : les petites perceptions et la confusion === Leibniz enrichit la compréhension de l'erreur en introduisant sa théorie des petites perceptions (''infinitesimal perceptions''). Selon lui, nous avons une infinité de perceptions inconscientes ou subliminales : trop petites, trop nombreuses, trop habituelles pour être remarquées individuellement. Ces perceptions confuses influencent nos jugements sans que nous en soyons conscients.<ref>Leibniz, ''Nouveaux essais sur l'entendement humain'', Préface</ref> L'erreur peut ainsi provenir de perceptions confuses qui échappent à notre aperception consciente. Leibniz donne l'exemple célèbre du bruit de la mer : nous entendons le bruit de chaque vague individuellement, et même de chaque goutte d'eau, mais nous ne percevons pas distinctement chacune de ces perceptions. Nous ne percevons que leur ensemble confus. De même, beaucoup de nos erreurs proviennent de perceptions distinctes que nous ne discernons pas clairement. Leibniz maintient cependant un principe fondamental : toute erreur est ultimement une forme de confusion (''confusio''). Une connaissance parfaitement claire et distincte ne peut être erronée. L'erreur est donc toujours un défaut de clarté dans nos représentations mentales. === Kant : l'erreur, l'illusion et l'illusion transcendantale === Dans la ''Critique de la raison pure'', Kant opère une révolution dans la conception de l'erreur. Il distingue nettement l'erreur de l'illusion (''Schein''). L'erreur est un jugement qui peut être reconnu comme faux et corrigé. L'illusion, en revanche, est plus profonde : c'est une apparence qui persiste même après qu'on ait reconnu qu'elle est trompeuse (comme les illusions d'optique classiques).<ref>Kant, ''Critique de la raison pure'', Première Critique, A293-294/B349-350</ref> Kant donne un exemple instructif : si un bâton plongé dans l'eau semble courbé, l'erreur consiste à croire que le bâton est réellement courbé. Mais si, même après avoir compris que le bâton n'est pas courbé, on continue à le percevoir comme courbé, c'est une illusion. Kant identifie l'illusion transcendantale, qui est l'illusion propre à la raison pure elle-même. Cette illusion nous pousse naturellement à appliquer les catégories de l'entendement au-delà de leur domaine d'application légitime (l'expérience possible) et à prétendre connaître les choses en soi. C'est ainsi que naissent les erreurs fondamentales de la métaphysique traditionnelle : la prétention à connaître Dieu, l'âme immortelle et le monde considéré comme une totalité absolue, alors que ces objets dépassent les limites de toute expérience possible.<ref>Kant, ''Critique de la raison pure'', Première Critique, A293-298/B349-355</ref> La ''Dialectique transcendantale'' de Kant, qui occupe la moitié de la ''Critique'', analyse systématiquement ces illusions de la raison pure. Kant montre que ces erreurs ne sont pas accidentelles ou évitables, mais qu'elles naissent nécessairement de la structure même de notre raison. La raison tend naturellement à chercher l'inconditionné au-delà de toute expérience possible. C'est ainsi que se constituent les trois idées de la raison pure : l'âme (inconditionnée des phénomènes mentaux), le monde (totalité inconditionnée de tous les phénomènes), et Dieu (cause inconditionnée de toute existence). == La philosophie des sciences == === Francis Bacon : la théorie des idoles de l'esprit === Francis Bacon, au début de l'époque moderne, fait de la question des sources d'erreur un élément central de sa philosophie de la nature. Dans le ''Novum Organum'' (1620), il introduit sa célèbre théorie des idoles (''idola'') de l'esprit, c'est-à-dire de sources systématiques d'erreur qui offusquent l'esprit humain et l'empêchent d'accéder à la connaissance véritable de la nature.<ref>Bacon, ''Novum Organum'', Livre I, aphorismes 39-68</ref> Bacon identifie quatre types d'idoles : * Les idoles de la tribu (''idola tribus'') : erreurs communes à tous les êtres humains, qui proviennent de la nature humaine elle-même. Par exemple, la tendance à voir plus d'ordre et d'uniformité qu'il n'y en a réellement, ou à généraliser à partir d'exemples trop rares. * Les idoles de la caverne (''idola specus'') : erreurs particulières à chaque individu, qui proviennent de son éducation, de ses lectures, de ses préférences et de son tempérament personnel. Chacun a sa propre « caverne » de préjugés. * Les idoles du forum ou du marché (''idola fori'') : erreurs provenant de l'usage du langage et des mots mal définis. Les mots trompent l'entendement, car ils ne correspondent pas toujours aux réalités qu'ils prétendent désigner. * Les idoles du théâtre (''idola theatri'') : erreurs dues aux systèmes philosophiques reçus et aux dogmes des écoles. Bacon les compare à des pièces de théâtre ou à des fables qui nous présentent des mondes imaginaires. Bacon insiste sur la nécessité d'une libération systématique de ces idoles pour permettre à la connaissance scientifique de progresser. Il promeut une méthode rigoureuse fondée sur l'expérimentation contrôlée et l'induction prudente, à la place du raisonnement déductif des aristotéliciens. === Gaston Bachelard : l'obstacle épistémologique === Gaston Bachelard, dans ''La Formation de l'esprit scientifique'' (1938), introduit le concept révolutionnaire d'obstacle épistémologique. Contrairement aux obstacles matériels, l'obstacle épistémologique est interne à l'acte même de connaître. C'est une connaissance antérieure, ou plutôt une pseudo-connaissance, qui fait obstacle à une connaissance nouvelle et plus adéquate.<ref>Bachelard, ''La Formation de l'esprit scientifique'', Paris, Vrin, 1938, p. 13</ref> Bachelard énonce une proposition paradoxale et profonde : « On connaît contre une connaissance antérieure. »<ref>Bachelard, ''La Formation de l'esprit scientifique'', p. 14</ref> L'obstacle n'est donc pas simplement l'ignorance, mais précisément une connaissance première ou immédiate qui empêche l'accès à la connaissance scientifique. L'expérience première, loin d'être le fondement de la science, en est souvent le plus grand obstacle. Bachelard identifie plusieurs types d'obstacles épistémologiques : * L'expérience première : l'observation directe non questionnée, la tendance à croire ce qu'on voit * La généralisation hâtive : tirer des conclusions générales à partir d'expériences limitées * L'obstacle verbal : croire qu'expliquer un phénomène revient à le nommer * L'obstacle substantialiste : attribuer à une substance des qualités diverses et souvent contradictoires * L'obstacle animiste : projeter la vie et l'intention dans la matière inerte * La connaissance quantitative mal comprise : croire que mesurer c'est comprendre Pour Bachelard, la science progresse non par accumulation graduelle, mais par ruptures épistémologiques qui exigent de surmonter ces obstacles. L'esprit scientifique doit constamment lutter contre lui-même, contre ses propres habitudes de pensée et ses préjugés les plus tenaces. === Karl Popper : falsifiabilité et correction de l'erreur === Karl Popper transforme radicalement la conception de l'erreur en philosophie des sciences. Dans ''La Logique de la découverte scientifique'' (1934), il soutient que la science ne progresse pas par accumulation ou confirmation de vérités, mais par élimination des erreurs.<ref>Popper, ''La Logique de la découverte scientifique'', Payot, 1973, p. 54-57</ref> Popper rejette le principe de vérification des positivistes logiques et lui substitue le principe de falsifiabilité ou de réfutabilité : une théorie n'est scientifique que si elle peut être contredite par une observation empirique possible. Une théorie qui ne peut jamais être réfutée, parce qu'elle est compatible avec tous les résultats empiriques possibles, n'est pas scientifique.<ref>Popper, ''Conjectures et réfutations'', Payot, 1985, p. 64-65</ref> Pour Popper, toute connaissance scientifique est essentiellement conjecturale : nous ne pouvons jamais prouver qu'une théorie est véritablement vraie, nous pouvons seulement prouver qu'elle est fausse. Une théorie qui a résisté à des tentatives répétées de réfutation est dite corroborée, mais jamais définitivement vérifiée. L'erreur n'est donc pas quelque chose à redouter ou à éliminer complètement, mais elle est essentielle au processus scientifique lui-même. Comme Popper l'écrit : « Nous pouvons apprendre de nos erreurs. »<ref>Popper, ''Objective Knowledge'', Clarendon Press, 1972, p. 7</ref> C'est en identifiant nos théories comme fausses, en les réfutant expérimentalement, que nous avançons graduellement vers une meilleure compréhension du monde. Toute erreur qui peut être reconnue et éliminée par la méthode scientifique est une victoire pour la science. == La psychologie cognitive contemporaine == === Heuristiques et biais cognitifs === À partir des années 1970, les psychologues et lauréats du prix Nobel Daniel Kahneman et Amos Tversky ont développé une théorie révolutionnaire des heuristiques et des biais cognitifs qui a renouvelé profondément notre compréhension des erreurs humaines. Une heuristique est un raccourci mental, une règle de raisonnement simple et pragmatique que nous utilisons automatiquement et, le plus souvent, inconsciemment pour résoudre des problèmes complexes. Les heuristiques sont généralement utiles et efficaces, permettant un traitement cognitif économe. Cependant, elles peuvent aussi conduire à des erreurs systématiques et prévisibles, appelées biais cognitifs.<ref>Kahneman, D., Slovic, P., et Tversky, A. (éd.), ''Judgment under Uncertainty: Heuristics and Biases'', Cambridge University Press, 1982</ref> Kahneman et Tversky ont identifié trois heuristiques principales : * L'heuristique de représentativité : nous jugeons de la probabilité qu'un objet appartienne à une catégorie en fonction de sa ressemblance avec le prototype typique de cette catégorie, en ignorant souvent d'autres informations statistiques pertinentes. * L'heuristique de disponibilité : nous jugeons de la fréquence ou de la probabilité d'un événement en fonction de la facilité avec laquelle des exemples nous viennent spontanément à l'esprit, ce qui peut nous faire surestimer les événements dramatiques ou médiatisés. * L'heuristique d'ancrage et d'ajustement : notre jugement est influencé de façon disproportionnée par une valeur initiale (l'ancre), même si cette valeur est arbitraire ou irrélevante, et nous ajustons insuffisamment à partir de cette valeur. === Les principaux biais cognitifs === Ces heuristiques produisent de nombreux biais cognitifs, dont voici quelques exemples majeurs : * Le biais de confirmation : tendance sélective à chercher, à favoriser et à mémoriser les informations qui confirment nos croyances préexistantes, tout en ignorant ou minimisant les informations qui les contredisent. * Le biais rétrospectif (ou ''hindsight bias'') : tendance à surestimer, après coup, la probabilité ou la prévisibilité d'un événement qui s'est produit. On dit souvent « Je le savais depuis le début ». * L'excès de confiance : tendance à surestimer la précision de nos connaissances et la justesse de nos jugements, notamment dans les domaines où nous avons une expertise. * Le biais d'ancrage : influence disproportionnée d'une première information reçue sur nos jugements ultérieurs, même quand cette information est clairement non pertinente ou reconnue comme inexacte. * L'erreur du joueur : croyance erronée que des événements indépendants (comme les lancers d'une pièce de monnaie) sont liés ou influencés par les résultats antérieurs. Cette recherche montre que l'erreur humaine n'est pas simplement due à un manque d'attention, à la fatigue ou à l'ignorance, mais qu'elle est systématique et prévisible. Nous commettons des erreurs non ''malgré'' nos processus de pensée, mais ''à cause'' d'eux. Même les experts reconnaissent qu'ils sont sujets à ces biais. === Système 1 et Système 2 de la pensée === Kahneman a synthétisé ces résultats en distinguant deux systèmes de pensée dans son livre ''Thinking, Fast and Slow'' (2011). Le Système 1 est rapide, automatique, intuitif et demande peu d'effort, mais il est sujet aux biais cognitifs. Le Système 2 est lent, délibératif, logique et demande un effort cognitif considérable, mais il est généralement plus fiable.<ref>Kahneman, D., ''Système 1, Système 2 : Les deux vitesses de la pensée'', Flammarion, 2012</ref> La plupart de nos erreurs proviennent du fait que nous nous fions trop au Système 1, au lieu d'engager notre Système 2 plus réflexif. Le Système 1 nous permet de vivre efficacement dans un monde complexe et de prendre rapidement des décisions, mais il nous rend aussi vulnérables aux erreurs systématiques et aux illusions cognitives. Reconnaître cette distinction est une étape importante pour améliorer notre capacité à éviter les erreurs, notamment en contexte scientifique ou décisionnel. == Les traditions non-occidentales == === Le bouddhisme : l'ignorance comme racine de la souffrance === Dans le bouddhisme, l'avidyā (l'ignorance) est considérée comme la racine primaire de la souffrance (''dukkha''). Mais il ne s'agit pas simplement d'un manque de connaissance factuelle ou intellectuelle. C'est une méconnaissance fondamentale de la nature profonde de la réalité. Les Quatre Nobles Vérités enseignées par le Bouddha identifient l'ignorance comme la cause première de la souffrance. Cette ignorance porte essentiellement sur trois caractéristiques fondamentales de l'existence, appelées les Trois Caractéristiques: * L'impermanence (''anicca'') : tout phénomène est en changement constant. Rien n'est permanent ou éternel. * La souffrance ou l'insatisfaction (''dukkha'') : tout phénomène conditionné est marqué par l'insatisfaction ou l'insuffisance. * Le non-soi (''anattā'') : il n'existe pas de moi permanent, autonome et substantiel. Le soi est une construction fictive. L'erreur fondamentale consiste à croire en la permanence des choses, en l'existence d'un soi essentiellement permanent, et à s'attacher aux phénomènes impermanents. Cette erreur n'est pas simplement théorique : elle structure profondément notre façon de vivre et engendre inévitablement la souffrance. Le bouddhisme identifie également les Trois Poisons qui perpétuent cette ignorance fondamentale : * Le désir-attachement (''rāga''): la tendance à nous accrocher aux plaisirs et à ce qui nous plaît * L'aversion-haine (''dveṣa''): le rejet de ce qui nous déplaît ou nous fait souffrir * L'ignorance-illusion (''moha''): la méconnaissance de la nature réelle des choses La voie bouddhiste vers la libération (''nirvāṇa'') consiste précisément à dissiper cette ignorance fondamentale par la pratique de la sagesse (''prajñā''), de l'éthique (''śīla'') et de la méditation (''samādhi''). La connaissance libératrice n'est pas simplement intellectuelle ou théorique, mais elle doit être experiencielle : voir directement, par une expérience méditative, la nature réellement impermanente, insatisfaisante et sans-soi de tous les phénomènes. Dans le bouddhisme Mahāyāna, notamment dans la philosophie Madhyamaka de Nāgārjuna (II{{e}}-III{{e}} siècle), l'erreur métaphysique fondamentale est identifiée à la croyance en l'existence inhérente (''svabhāva'') des phénomènes. Nāgārjuna enseigne la vacuité (''śūnyatā'') : tous les phénomènes sont vides d'existence propre ou substantielle. Ils existent seulement en interdépendance avec d'autres phénomènes, selon le principe de production conditionnée (''pratītyasamutpāda''). L'erreur métaphysique par excellence est donc la réification, c'est-à-dire attribuer aux phénomènes une substantialité ou une existence autonome qu'ils n'ont pas. == Conclusion == La notion d'erreur traverse toute l'histoire de la philosophie et demeure une question centrale en épistémologie contemporaine. De Platon à Kahneman, en passant par Descartes, Bachelard et Popper, les penseurs ont cherché à comprendre les mécanismes profonds de l'erreur, ses origines et ses remèdes. Plusieurs leçons majeures émerges de cette histoire réflexive : 1. L'erreur est inévitable. Dès l'Antiquité, avec Xenophane, et plus explicitement avec le fallibilisme moderne (Popper), la philosophie reconnaît que la connaissance humaine est essentiellement faillible. Même nos meilleures théories scientifiques ne sont que provisoires et susceptibles d'être réfutées par de nouvelles preuves. Il n'existe pas de point d'Archimède d'où nous puissions connaître avec certitude absolue. 2. L'erreur a des causes multiples et systématiques. Elle n'est pas simplement due à des défauts accidentels ou à un manque d'attention. Elle provient de la structure même de nos facultés cognitives, de nos habitudes mentales, de nos préjugés culturels, et de nos processus psychologiques automatiques. Les biais cognitifs montrent que nous commettons des erreurs non ''malgré'' nos mécanismes mentaux, mais ''par suite'' de leur fonctionnement. 3. L'erreur peut être féconde et créatrice. Contrairement à une conception purement négative de l'erreur, Bachelard et Popper montrent que l'erreur est essentielle au progrès de la connaissance. C'est en identifiant et en corrigeant nos erreurs que nous progressons vers une compréhension plus adéquate. La science progresse par conjecture et réfutation, par essai et correction d'erreurs. 4. La vigilance épistémique est nécessaire. Que ce soit la suspension du jugement stoïcienne, la règle de l'évidence cartésienne, la méthode expérimentale de Bacon, ou la conscience contemporaine des biais cognitifs, toutes ces approches soulignent la nécessité d'une vigilance critique constante pour minimiser l'erreur. Nous ne pouvons pas nous fier passivement à nos impressions ou à nos intuitions. 5. L'erreur a une dimension existentielle et pratique. Particulièrement dans les traditions non-occidentales comme le bouddhisme, l'erreur n'est pas seulement un problème théorique de connaissance, mais elle a des conséquences profondes pour notre existence et notre bien-être. Notre façon de comprendre le monde (ou de nous y tromper) détermine notre manière de vivre et notre rapport à la souffrance. À l'époque contemporaine, la question de l'erreur se repose avec une acuité nouvelle. L'époque des « fake news » et de la désinformation massive, l'amplification des biais cognitifs par les algorithmes des réseaux sociaux, et la fragmentation de nos espaces informationnels rendent plus urgent que jamais de comprendre les mécanismes de l'erreur et de développer nos capacités critiques. La philosophie de l'erreur, loin d'être une discipline abstraite, est devenue une ressource indispensable pour naviguer dans notre monde complexe et pluraliste. == Notes et références == {{references|colonnes=2}} == Bibliographie == === Sources primaires === * Aristote, ''Métaphysique'', traduction J. Tricot, Vrin, 1991 * Aristote, ''Seconds Analytiques'', traduction J. Tricot, Vrin, 1987 * Augustin, ''Du libre arbitre'', traduction F.-J. Thonnard, Desclée de Brouwer, 1952 * Bacon, F., ''Novum Organum'', traduction M. Malherbe et J.-M. Pousseur, PUF, 1986 * Bachelard, G., ''La Formation de l'esprit scientifique'', Vrin, 1938 * Descartes, R., ''Méditations métaphysiques'', édition J.-M. Beyssade et M. Beyssade, Garnier-Flammarion, 1992 * Épictète, ''Entretiens'', traduction J. Souilhé, Les Belles Lettres, 1943-1965 * Kant, E., ''Critique de la raison pure'', traduction A. Tremesaygues et B. Pacaud, PUF, 1944 * Leibniz, G.W., ''Nouveaux essais sur l'entendement humain'', édition J. Brunschwig, Garnier-Flammarion, 1990 * Locke, J., ''Essai sur l'entendement humain'', traduction J.-M. Vienne, Vrin, 2001 * Platon, ''Théétète'', traduction M. Narcy, Garnier-Flammarion, 1995 * Popper, K., ''La Logique de la découverte scientifique'', traduction N. Thyssen-Rutten et P. Devaux, Payot, 1973 * Popper, K., ''Conjectures et réfutations'', traduction M.-I. et M.B. de Launay, Payot, 1985 * Spinoza, B., ''Éthique'', traduction B. Pautrat, Seuil, 1999 * Thomas d'Aquin, ''Somme théologique'', traduction A.-M. Roguet, Cerf, 1984-1986 === Études secondaires === * BonJour, L., ''Epistemology: Classic Problems and Contemporary Responses'', Rowman & Littlefield, 2002 * Engel, P., ''La Vérité. Réflexions sur quelques truismes'', Hatier, 1998 * Gilson, É., ''René Descartes. Discours de la méthode, texte et commentaire'', Vrin, 1925 * Hadot, P., ''Qu'est-ce que la philosophie antique ?'', Gallimard, 1995 * Kahneman, D., ''Système 1, Système 2 : Les deux vitesses de la pensée'', traduction R. Clarinard, Flammarion, 2012 * Lecourt, D., ''L'épistémologie historique de Gaston Bachelard'', Vrin, 1969 * Long, A.A. et Sedley, D.N., ''Les Philosophes hellénistiques'', traduction J. Brunschwig et P. Pellegrin, Garnier-Flammarion, 2001, 3 volumes * Marion, J.-L., ''Sur la pensée passive de Descartes'', PUF, 2013 * Nadler, S., ''Spinoza's Ethics: An Introduction'', Cambridge University Press, 2006 * Popkin, R.H., ''Histoire du scepticisme d'Érasme à Spinoza'', traduction C. Hivet, PUF, 1995 * Prigogine, I. et Stengers, I., ''La Nouvelle Alliance. Métamorphose de la science'', Gallimard, 1979 * Sosa, E., ''Epistemology'', Princeton University Press, 2017 {{AutoCat}} [[Catégorie:Épistémologie]] [[Catégorie:Logique]] 0ak4wyt9hm16ug4kjez9k9ez0j1jca4 Dictionnaire de philosophie/Désir 0 83594 767901 760083 2026-06-17T04:56:09Z PandaMystique 119061 /* Notes et références */ 767901 wikitext text/x-wiki {{DicoPhilo|Désir}} Le '''désir''' (du latin ''desiderare'') a une étymologie discutée mais éclairante. Le mot se décompose en ''de-'' (préfixe privatif) et ''sidus, sideris'' (constellation, groupe d'étoiles — à distinguer de ''stella'', l'étoile isolée). Le verbe appartenait, comme son antonyme ''considerare'' (« observer attentivement les astres »), à la langue des augures romains, qui scrutaient le ciel pour y lire les présages : ''desiderare'' signifiait « constater l'absence de la constellation attendue », et par extension « déplorer une absence », « regretter ce qui manque », puis « souhaiter vivement obtenir »<ref>Ernout, A. et Meillet, A., ''Dictionnaire étymologique de la langue latine. Histoire des mots'', 4{{e}} éd., Paris, Klincksieck, 2001, s.v. « sidus » ; voir aussi ''Dictionnaire historique de la langue française'' (dir. A. Rey), Paris, Le Robert, 2019, s.v. « désir ».</ref>. Véridique ou non dans le détail, cette étymologie inscrit d'emblée l'idée d'un manque au cœur du désir : désirer, ce serait fondamentalement tendre vers ce dont on est séparé, viser ce qui n'est pas là. Le désir se distingue ainsi du simple besoin biologique par la dimension de représentation qui l'accompagne : là où le besoin s'éteint par la satisfaction, le désir peut se relancer indéfiniment, s'attacher à de nouveaux objets, voire se nourrir de sa propre insatisfaction. Notion centrale de la philosophie depuis l'Antiquité, le désir touche à l'ensemble des grandes questions philosophiques : la nature de l'âme et du corps, le bonheur et la vie bonne, la morale et la liberté, la connaissance de soi et le rapport à autrui. Chaque époque philosophique a reformulé le problème du désir en fonction de ses cadres conceptuels propres : les Grecs l'ont pensé comme ''erôs'' et ''epithumia'', la philosophie classique comme ''appetitus'' et ''conatus'', la modernité comme pulsion, manque ou production. L'enjeu traverse toute l'histoire de la pensée : le désir est-il une force positive qui nous porte vers le bien et la vérité, ou une servitude qui nous enchaîne à l'illusion ? Faut-il le maîtriser, le supprimer, le libérer, ou le transformer ? == Philosophie antique : les premières théorisations du désir == === Platon : Éros, le manque et l'ascension vers le Beau === La philosophie platonicienne du désir s'articule autour de trois dialogues majeurs : le ''Banquet'', le ''Phèdre'' et la ''République''. Platon y élabore une conception du désir comme manque (''endeia'') orienté vers ce qui nous fait défaut, mais capable, s'il est correctement éduqué, de conduire l'âme du sensible à l'intelligible. Dans le ''Banquet'', le discours de Diotime rapporté par Socrate présente Éros comme un ''daimôn'', un intermédiaire entre les mortels et les dieux, fils de Poros (la ressource) et de Pénia (la pauvreté)<ref>Platon, ''Le Banquet'', 203b-204a, trad. L. Brisson, Paris, GF-Flammarion, 2007, p. 144-146.</ref>. Éros n'est ni beau ni laid, ni savant ni ignorant : il est cet entre-deux qui pousse à chercher ce qu'on n'a pas. Désirer, c'est donc essentiellement manquer : « Ce qu'on n'a pas, ce qu'on n'est pas, ce dont on manque, voilà les objets du désir et de l'amour »<ref>Platon, ''Le Banquet'', 200e, trad. L. Brisson, op. cit., p. 141.</ref>. Mais ce manque n'est pas stérile : il est le moteur d'une ascension dialectique. Diotime décrit une échelle de l'amour (''scala amoris'') qui va de l'amour d'un beau corps à celui de tous les beaux corps, puis de la beauté des âmes, des actions, des sciences, jusqu'à la contemplation du Beau en soi (''to kalon auto kath'hauto'')<ref>Platon, ''Le Banquet'', 210a-211d, trad. L. Brisson, op. cit., p. 155-158.</ref>. Le désir est donc susceptible d'une conversion : d'érotique, il devient philosophique. Dans la ''République'' (livre IV), Platon propose une tripartition de l'âme qui structure durablement la pensée du désir. L'âme comprend une partie désirante (''epithumêtikon''), siège des appétits corporels et des plaisirs sensibles ; une partie ardente ou ''irascible'' (''thumoeides''), siège du courage et de l'honneur ; et une partie rationnelle (''logistikon''), qui aspire à la vérité<ref>Platon, ''République'', IV, 435a-441c, trad. G. Leroux, Paris, GF-Flammarion, 2016, p. 243-255.</ref>. La justice de l'âme consiste dans la subordination harmonieuse de ces trois parties, le ''logistikon'' commandant au ''thumoeides'' qui dompte les appétits. Le désir n'est donc pas mauvais en soi, mais il doit être ordonné par la raison. Cette tripartition établit une hiérarchie qui influencera profondément les conceptions morales et psychologiques ultérieures. Le ''Phèdre'' reprend cette structure sous la forme allégorique du mythe de l'attelage ailé : l'âme est un cocher (la raison) conduisant deux chevaux, l'un noble et docile (le ''thumos''), l'autre rétif et indiscipliné (l{{'}}''epithumia'')<ref>Platon, ''Phèdre'', 246a-248c, trad. L. Brisson, Paris, GF-Flammarion, 2012, p. 117-122.</ref>. Le désir y apparaît comme une force ambivalente : il peut aussi bien tirer l'âme vers le bas (le cheval noir de la concupiscence) que participer à son élévation vers les réalités intelligibles, à condition d'être guidé par la raison. === Aristote : le désir comme mouvement et la délibération pratique === Aristote propose une approche du désir plus naturaliste et ancrée dans la psychologie du vivant. Dans le traité ''De l'âme'' (''De Anima''), il définit le désir (''orexis'') comme la faculté motrice de l'âme, celle qui met effectivement en mouvement l'animal et l'homme<ref>Aristote, ''De l'âme'', III, 10, 433a-433b, trad. R. Bodéüs, Paris, GF-Flammarion, 1993, p. 237-241.</ref>. L{{'}}''orexis'' comprend trois formes : l{{'}}''epithumia'' (appétit sensible, lié au plaisir immédiat), le ''thumos'' (emportement, colère) et la ''boulêsis'' (souhait rationnel, désir du bien tel que la raison le conçoit). Ni l'intellect seul ni le désir seul ne suffisent à expliquer l'action : c'est leur coopération, sous la forme du ''syllogisme pratique'', qui détermine la conduite. Le syllogisme pratique articule une prémisse majeure qui exprime un désir ou une évaluation générale (par exemple : « tout ce qui est doux est agréable »), une prémisse mineure qui constate un fait particulier (« ceci est doux »), et une conclusion qui n'est pas un jugement théorique mais l'action elle-même (goûter l'aliment). L'action résulte ainsi de la rencontre entre un désir qui vise un certain type de bien et une perception qui identifie un cas particulier de ce bien<ref>Aristote, ''De l'âme'', III, 11, 434a16-21, trad. R. Bodéüs, op. cit., p. 243 ; ''De motu animalium'', 7, 701a7-25.</ref>. Ce modèle fait du désir une condition nécessaire mais non suffisante de l'action : sans désir, l'intellect ne met rien en mouvement ; sans intellect, le désir reste aveugle. Dans l{{'}}''Éthique à Nicomaque'', Aristote inscrit le désir dans la théorie du bonheur (''eudaimonia''). Le désir humain se distingue du simple appétit animal par sa capacité à être informé par la raison et à se soumettre à la délibération (''bouleusis''). L'homme vertueux n'est pas celui qui supprime ses désirs, mais celui qui, par l'habitude et l'éducation, parvient à désirer ce que la raison juge bon : « L'homme tempérant désire les choses qu'il faut, comme il faut, et quand il faut »<ref>Aristote, ''Éthique à Nicomaque'', III, 12, 1119b15-18, trad. J. Tricot, Paris, Vrin, 1994, p. 164.</ref>. La vertu (''aretê'') n'est donc pas la négation du désir mais sa juste mesure, sa mise en forme par la raison pratique. L'incontinent (''akratês''), celui qui agit contre son meilleur jugement sous la pression du désir, constitue un cas philosophique crucial qui révèle la complexité des rapports entre raison et désir<ref>Aristote, ''Éthique à Nicomaque'', VII, 1-10, 1145a15-1152a35, trad. J. Tricot, op. cit., p. 338-372.</ref>. === Les sagesses hellénistiques : maîtriser ou éradiquer le désir === ==== Épicure : la classification des désirs et le calcul des plaisirs ==== Épicure élabore une théorie du bonheur fondée sur une classification rigoureuse des désirs. Il distingue trois catégories : les désirs naturels et nécessaires (boire, manger, se protéger du froid), les désirs naturels mais non nécessaires (les plaisirs raffinés de la table, les plaisirs sexuels), et les désirs ni naturels ni nécessaires (la gloire, le pouvoir, la richesse illimitée)<ref>Épicure, ''Lettre à Ménécée'', 127-128, trad. J.-F. Balaudé, Paris, Le Livre de Poche, 2009, p. 44-46 ; voir aussi Diogène Laërce, ''Vies et doctrines des philosophes illustres'', X, 149.</ref>. Seuls les premiers méritent d'être satisfaits sans réserve ; les seconds peuvent être satisfaits avec modération ; les troisièmes doivent être éliminés, car ils engendrent un désir infini, source de trouble (''tarakhê'') et de souffrance. Le bonheur épicurien réside dans l'ataraxie (absence de trouble de l'âme) et l'aponie (absence de douleur du corps). Contrairement à une interprétation courante, Épicure ne prône pas la multiplication des plaisirs, mais leur sélection rationnelle : « Tout plaisir, parce qu'il a une nature appropriée à la nôtre, est un bien ; cependant tout plaisir n'est pas à choisir »<ref>Épicure, ''Lettre à Ménécée'', 129, trad. J.-F. Balaudé, Paris, Le Livre de Poche, 2009, p. 47.</ref>. Le sage épicurien pratique un ''calcul des plaisirs'' (''logismos'') qui met en balance le plaisir attendu et les douleurs susceptibles de suivre. Le désir n'est pas mauvais en lui-même, mais il doit être borné par la compréhension de la nature : le corps se satisfait de peu, et c'est l'opinion fausse qui crée les désirs démesurés. ==== Le stoïcisme : le désir comme passion et le consentement rationnel ==== Pour les stoïciens, le désir (''epithumia'') figure parmi les quatre passions fondamentales (avec la crainte, le plaisir et la peine), et il se définit comme un « élan irrationnel » ou un « mouvement de l'âme contraire à la raison »<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VII, 110-116, trad. M.-O. Goulet-Cazé (dir.), Paris, Le Livre de Poche, 1999, p. 880-885.</ref>. Les passions résultent de jugements erronés sur la valeur des choses : elles consistent à prendre pour des biens ou des maux ce qui n'est en réalité qu'indifférent (''adiaphoron''). Désirer la richesse ou la santé, c'est leur attribuer une valeur qu'elles n'ont pas et se condamner au malheur. Épictète pousse cette position à son terme en faisant de la distinction entre « ce qui dépend de nous » (nos jugements, nos impulsions) et « ce qui ne dépend pas de nous » (le corps, la fortune, la réputation) le fondement de toute sagesse : « Ne demande pas que les choses arrivent comme tu le désires, mais désire qu'elles arrivent comme elles arrivent, et tu couleras des jours heureux »<ref>Épictète, ''Manuel'', VIII, trad. É. Bréhier, dans ''Les Stoïciens'', Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1962, p. 1113.</ref>. L'idéal stoïcien n'est pas, à proprement parler, l'éradication de toute impulsion, mais la substitution aux passions irrationnelles de mouvements conformes à la raison (''eupatheia'') : la joie rationnelle au lieu du plaisir passionnel, la vigilance raisonnable au lieu de la crainte, la volonté rationnelle (''boulêsis'') au lieu du désir aveugle<ref>Cicéron, ''Tusculanes'', IV, 6, 12-14, trad. J. Humbert, Paris, Les Belles Lettres, 1960, p. 14-16.</ref>. Marc Aurèle, dans ses ''Pensées pour moi-même'', met en pratique ce que le commentateur Pierre Hadot a nommé la « discipline du désir » (à côté de la discipline de l'assentiment et de la discipline de l'action), en l'articulant étroitement à la physique stoïcienne<ref>Hadot, Pierre, ''La Citadelle intérieure. Introduction aux Pensées de Marc Aurèle'', Paris, Fayard, 1992, p. 101-124.</ref>. Puisque tout obéit au ''logos'' universel et que chaque événement s'insère dans l'enchaînement nécessaire des causes cosmiques, le sage ne peut raisonnablement désirer que les choses soient autrement qu'elles ne sont. Marc Aurèle s'exerce ainsi à accueillir chaque événement — maladie, ingratitude d'autrui, menace de mort — comme l'expression d'un ordre qui le dépasse : « Tout ce qui arrive, arrive justement »<ref>Marc Aurèle, ''Pensées pour moi-même'', IV, 10, trad. É. Bréhier, dans ''Les Stoïciens'', op. cit., p. 1159.</ref>. La discipline du désir ne consiste pas en un renoncement morne, mais en une conversion du regard : ce que le profane subit comme un malheur, le sage l'accueille comme un fragment de l'ordre universel auquel il consent librement. Il s'agit, au sens propre, de vouloir ce qui arrive, c'est-à-dire de faire coïncider son désir particulier avec le mouvement de la nature universelle, de sorte que rien ne puisse troubler l'âme<ref>Marc Aurèle, ''Pensées pour moi-même'', V, 8 et VIII, 7, trad. É. Bréhier, dans ''Les Stoïciens'', op. cit., p. 1166, 1190.</ref>. == Pensée médiévale : le désir entre concupiscence et charité == === Augustin : le désir comme amour détourné === Augustin d'Hippone hérite de la pensée platonicienne du désir comme manque, mais la transforme profondément dans un cadre chrétien. Tout désir humain est, en son fond, désir de Dieu : « Tu nous as faits pour toi, Seigneur, et notre cœur est inquiet jusqu'à ce qu'il repose en toi »<ref>Augustin, ''Confessions'', I, 1, 1, trad. P. de Labriolle, Paris, Les Belles Lettres, 1996, p. 1.</ref>. Mais ce désir fondamental est corrompu par le péché originel, qui détourne l'amour de Dieu vers les créatures. Augustin distingue ainsi la ''cupiditas'' (concupiscence, amour désordonné des biens terrestres) de la ''caritas'' (charité, amour de Dieu et des créatures en Dieu)<ref>Augustin, ''De Doctrina Christiana'', III, 10, 16, trad. M. Moreau, Paris, Institut d'Études Augustiniennes, coll. « Bibliothèque augustinienne », vol. 11/2, 1997, p. 256-259 ; voir aussi ''La Cité de Dieu'', XIV, 28, trad. G. Combès, Paris, Desclée de Brouwer, coll. « Bibliothèque augustinienne », 1959, vol. 35, p. 461-463.</ref>. Le désir n'est pas mauvais en son essence, mais dans son orientation : c'est le même amour qui, dirigé vers Dieu, sauve, et qui, dirigé vers les biens périssables, damne. La pensée augustinienne du désir est ainsi traversée par une tension entre la reconnaissance de la positivité du désir (le désir de Dieu est le mouvement le plus profond de l'âme) et l'expérience de sa corruption (la concupiscence de la chair, la concupiscence des yeux, l'orgueil de la vie). Le récit autobiographique des ''Confessions'' illustre magistralement ce drame intérieur : le jeune Augustin, prisonnier de ses désirs charnels, ne peut se convertir par la seule force de sa volonté. La libération à l'égard du désir désordonné ne s'obtient que par la grâce divine. === Thomas d'Aquin : l'intégration scolastique du désir === Thomas d'Aquin élabore, dans la ''Somme théologique'', une synthèse entre l'héritage aristotélicien et la théologie chrétienne. Il distingue l'appétit naturel (l'inclination de toute chose vers sa fin propre, commune à tous les êtres), l'appétit sensible (propre aux animaux et aux hommes, lié à la connaissance sensible, et comprenant deux puissances distinctes : le ''concupiscible'', qui porte vers le bien sensible plaisant et fuit le mal pénible — c'est par lui que l'on désire la nourriture ou que l'on fuit la douleur — et l{{'}}''irascible'', qui permet d'affronter les obstacles et les difficultés qui s'opposent à l'obtention du bien ou à la fuite du mal — c'est par lui que l'on se met en colère ou que l'on fait preuve d'audace face au danger) et l'appétit rationnel ou volonté (''voluntas''), propre à l'homme, qui désire le bien universel tel que l'intellect le représente<ref>Thomas d'Aquin, ''Somme théologique'', Ia, q. 80, a. 1-2 et q. 82, a. 1, trad. A.-M. Roguet (dir.), Paris, Cerf, 1984, vol. 1, p. 694-697, 704-706.</ref>. Les passions ne sont pas, pour Thomas, intrinsèquement mauvaises : ce sont des mouvements de l'appétit sensible qui précèdent le jugement rationnel et qui peuvent être orientés vers le bien par la vertu. Le désir (''desiderium'' ou ''concupiscentia'' au sens neutre) est le mouvement de l'appétit vers un bien absent ; le plaisir (''delectatio'') est le repos dans un bien obtenu. L'amour (''amor'') est la complaisance originelle dans le bien, qui précède et fonde le désir<ref>Thomas d'Aquin, ''Somme théologique'', Ia-IIae, q. 25-27, trad. A.-M. Roguet (dir.), op. cit., vol. 2, p. 184-206.</ref>. La béatitude, fin ultime de tout désir humain, consiste dans la vision de Dieu, qui seule peut combler l'appétit rationnel tourné vers le bien infini. == De l'âge classique aux Lumières : le désir entre mécanisme et puissance == === Descartes : les passions de l'âme et la générosité === Descartes propose, dans ''Les Passions de l'âme'' (1649), une théorie à la fois physiologique et morale du désir. Les passions sont des « perceptions, ou des sentiments, ou des émotions de l'âme, qu'on rapporte particulièrement à elle, et qui sont causées, entretenues et fortifiées par quelque mouvement des esprits »<ref>Descartes, ''Les Passions de l'âme'', art. 27, dans ''Œuvres philosophiques'', éd. F. Alquié, Paris, Garnier, 1973, t. III, p. 979.</ref>. Les « esprits » dont il est ici question sont les ''esprits animaux'', c'est-à-dire, dans la physiologie cartésienne, des particules très fines du sang qui, portées au cerveau par les artères, se meuvent dans les nerfs et les muscles et agissent sur l'âme par l'intermédiaire de la glande pinéale. Les passions ne sont donc pas des événements purement spirituels : elles ont une assise corporelle, et leur force tient à la vigueur des mouvements qui les causent dans le corps. Le désir est l'une des six passions primitives (avec l'admiration, l'amour, la haine, la joie et la tristesse) et se définit comme une « agitation de l'âme causée par les esprits qui la dispose à vouloir pour l'avenir les choses qu'elle se représente lui être convenables »<ref>Descartes, ''Les Passions de l'âme'', art. 86, éd. F. Alquié, op. cit., t. III, p. 1026.</ref>. Le désir est ainsi la seule passion orientée vers l'avenir : là où l'amour et la haine portent sur un objet présent, le désir vise ce qui n'est pas encore obtenu ou ce qu'on veut éviter. La position cartésienne est remarquable en ce qu'elle refuse de condamner les passions en bloc : « Elles sont toutes bonnes de leur nature, et nous n'avons rien à éviter que leurs mauvais usages ou leurs excès »<ref>Descartes, ''Les Passions de l'âme'', art. 211, éd. F. Alquié, op. cit., t. III, p. 1091.</ref>. La maîtrise du désir ne procède pas de sa suppression mais de l'exercice de la ''générosité'', que Descartes tient pour « la clef de toutes les autres vertus »<ref>Descartes, ''Les Passions de l'âme'', art. 161, éd. F. Alquié, op. cit., t. III, p. 1068.</ref>. La générosité comporte deux composantes : d'une part, la connaissance que rien ne nous appartient véritablement sinon la libre disposition de nos volontés ; d'autre part, la résolution ferme de n'user de cette liberté que pour ce que nous jugeons être le meilleur. Le généreux ne désire que ce qui est en son pouvoir, ne s'afflige pas de ce qui ne l'est pas, et ne méprise jamais personne, car il sait que chacun possède la même liberté de volonté — position qui rapproche Descartes, sur ce point, du stoïcisme, tout en s'en distinguant par la confiance dans le bon usage des passions plutôt que dans leur éradication. === Hobbes : le désir comme mouvement vital === Thomas Hobbes développe, dans le ''Léviathan'' (1651), une conception intégralement mécaniste du désir. Hobbes applique aux mouvements de l'âme le modèle de la physique galiléenne : de même qu'un corps en mouvement continue de se mouvoir indéfiniment tant que rien ne l'arrête, de même l'organisme humain est traversé par de petits mouvements internes, imperceptibles, que Hobbes nomme ''endeavour'' (conatus, effort). Quand ce mouvement est dirigé vers un objet dont on se représente qu'il contribuera à notre conservation et à notre bien-être, il s'appelle ''désir'' ou ''appétit'' ; quand il s'éloigne de ce que nous jugeons nuisible, il s'appelle ''aversion''. Le plaisir et la douleur ne sont rien d'autre que l'expérience de ces mouvements d'approche et de fuite<ref>Hobbes, ''Léviathan'', chap. VI, trad. G. Mairet, Paris, Gallimard, coll. « Folio essais », 2000, p. 127-132.</ref>. Hobbes refuse l'idée d'un souverain bien (''summum bonum'') : il n'existe pas de fin dernière qui mettrait un terme au désir. « La félicité de cette vie ne consiste pas dans le repos d'un esprit satisfait. Car il n'existe en réalité ni ce ''finis ultimus'' (fin dernière), ni ce ''summum bonum'' (bien suprême) dont il est question dans les ouvrages des anciens moralistes »<ref>Hobbes, ''Léviathan'', chap. XI, trad. G. Mairet, op. cit., p. 189.</ref>. Le désir est donc perpétuel : la vie humaine est une course ininterrompue où s'arrêter, c'est être dépassé. La puissance — capacité présente de satisfaire ses désirs futurs — devient l'objet principal du désir, car chacun doit s'assurer les moyens de ses satisfactions à venir. Cette dynamique sans fin a des conséquences politiques décisives. Dans l{{'}}''état de nature'' — situation hypothétique où les hommes vivent sans autorité commune —, les désirs de chacun entrent inévitablement en compétition avec ceux des autres. Hobbes identifie trois causes de conflit inhérentes à la nature humaine : la compétition (pour les biens matériels), la défiance (chacun craignant que l'autre ne le devance) et la gloire (chacun voulant être reconnu et respecté)<ref>Hobbes, ''Léviathan'', chap. XIII, trad. G. Mairet, op. cit., p. 222-225.</ref>. L'état de nature est ainsi une « guerre de chacun contre chacun » (''bellum omnium contra omnes''), non pas au sens d'un combat permanent, mais d'une disposition constante au conflit. C'est pour échapper à cette condition misérable que les hommes acceptent de transférer leurs droits à un souverain absolu — le Léviathan — capable de contenir les désirs par la crainte d'une puissance commune. La philosophie politique hobbesienne naît ainsi directement d'une anthropologie du désir illimité. === Spinoza : le désir comme essence de l'homme === L'entreprise spinoziste opère une révolution conceptuelle dans la pensée du désir. Dans l{{'}}''Éthique'' (1677), Spinoza définit le désir (''cupiditas'') comme « l'essence même de l'homme, en tant qu'elle est conçue comme déterminée, par une quelconque affection d'elle-même, à faire quelque chose »<ref>Spinoza, ''Éthique'', III, Définitions des affects, 1, trad. B. Pautrat, Paris, Seuil, coll. « Points », 2010, p. 303.</ref>. Le désir n'est pas un accident de la nature humaine, il en est le fond même. Spinoza identifie le désir au ''conatus'' — l'effort par lequel chaque chose persévère dans son être : « L'effort par lequel chaque chose s'efforce de persévérer dans son être n'est rien en dehors de l'essence actuelle de cette chose »<ref>Spinoza, ''Éthique'', III, prop. 7, trad. B. Pautrat, op. cit., p. 219.</ref>. Rapporté à l'âme seule, ce ''conatus'' s'appelle volonté ; rapporté à l'âme et au corps ensemble, il s'appelle appétit (''appetitus'') ; quand l'appétit est accompagné de conscience, il s'appelle désir (''cupiditas''). La formule la plus célèbre de Spinoza sur le désir renverse de fond en comble la perspective platonicienne et scolastique : « Nous ne désirons pas une chose parce que nous la jugeons bonne, mais au contraire nous la jugeons bonne parce que nous la désirons »<ref>Spinoza, ''Éthique'', III, prop. 9, scolie, trad. B. Pautrat, op. cit., p. 223.</ref>. Le désir n'est plus un manque qui aspire à un bien préexistant ; il est une puissance affirmative qui constitue les valeurs par son mouvement même. Le bien et le mal ne sont pas des qualités intrinsèques des choses, mais des expressions de l'augmentation ou de la diminution de notre puissance d'agir (''potentia agendi''). L'éthique spinoziste ne consiste donc pas à réprimer les désirs, mais à comprendre leur genèse et à transformer les affects passifs en affects actifs. Spinoza distingue en effet deux régimes du désir. Dans le régime passif, nous sommes déterminés par des causes extérieures que nous ne comprenons pas : nous désirons tel objet, nous haïssons telle personne, nous craignons tel événement sans percevoir l'enchaînement des causes qui produit ces affects en nous. Nous croyons agir alors que nous sommes agis — c'est ce que Spinoza nomme la ''servitude'' (titre de la quatrième partie de l{{'}}''Éthique''). Dans le régime actif, nous comprenons les causes qui nous déterminent, et cette compréhension même transforme la nature de l'affect : la crainte aveugle, une fois comprise dans ses causes, cesse d'être une passion subie et devient un mouvement de l'esprit dont nous sommes la cause adéquate. « Un affect qui est une passion cesse d'être une passion sitôt que nous en formons une idée claire et distincte »<ref>Spinoza, ''Éthique'', V, prop. 3, trad. B. Pautrat, op. cit., p. 487.</ref>. La tristesse, par exemple, qui résulte de la perte d'un bien, peut être atténuée et transformée dès lors que nous comprenons la nécessité de la nature qui a produit cette perte : elle ne disparaît pas entièrement, mais elle perd son emprise tyrannique sur l'esprit. Spinoza distingue trois genres de connaissance qui correspondent à autant de rapports au désir. Le premier genre (l'imagination, l'opinion, l'expérience vague) nous livre des idées confuses et mutilées : c'est le régime des affects passifs, où nous sommes le jouet de nos passions. Le deuxième genre (la raison) nous donne accès aux notions communes et aux lois générales de la nature : il permet de comprendre les causes de nos affects et d'en diminuer l'emprise. Le troisième genre (la « science intuitive ») saisit l'essence singulière de chaque chose comme découlant de la nature divine : il produit un affect actif suprême, l{{'}}''amour intellectuel de Dieu'' (''amor Dei intellectualis''), béatitude dans laquelle le sage ne cesse pas de désirer mais désire à partir d'une compréhension pleine de sa propre nature et de celle de Dieu<ref>Spinoza, ''Éthique'', V, prop. 25-36, trad. B. Pautrat, op. cit., p. 519-541.</ref>. Le sage spinoziste n'est pas sans désir : il est celui dont le désir est devenu pleinement actif, c'est-à-dire dont la puissance d'agir et de penser s'accroît par la connaissance plutôt que d'être diminuée par l'ignorance. === Hume : le désir et la raison esclave des passions === David Hume établit, dans le ''Traité de la nature humaine'' (1739-1740), une thèse provocatrice sur le rapport entre raison et désir. La raison, soutient-il, est et ne peut être que l'esclave des passions : « La raison est, et ne doit qu'être, l'esclave des passions ; elle ne peut jamais prétendre à d'autre fonction qu'à les servir et à leur obéir »<ref>Hume, ''Traité de la nature humaine'', II, III, 3, trad. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1991, p. 271.</ref>. L'argument de Hume repose sur une analyse des opérations respectives de la raison et des passions. La raison, telle que Hume la conçoit, n'a que deux fonctions : découvrir les relations entre les idées (comme en mathématiques et en logique) et établir des faits concernant l'existence réelle des choses (comme dans les sciences de la nature). Or, ni l'une ni l'autre de ces opérations ne peuvent, à elles seules, mettre en mouvement la volonté. La démonstration qu'un triangle possède certaines propriétés ne me pousse à rien ; la constatation que le feu brûle ne me fait reculer que parce que j'ai un désir préalable de ne pas souffrir. La raison peut me dire ''que'' telle chose est le cas et ''comment'' atteindre un objectif donné, mais elle ne peut jamais me fournir l'objectif lui-même : celui-ci vient toujours d'une passion, d'un désir, d'une inclination<ref>Hume, ''Traité de la nature humaine'', II, III, 3, trad. P. Baranger et P. Saltel, op. cit., p. 266-272.</ref>. Il s'ensuit qu'il n'est pas « contraire à la raison de préférer la destruction du monde entier à une égratignure de mon doigt », formule volontairement choquante par laquelle Hume veut montrer que la raison seule ne peut condamner aucune préférence, car les préférences relèvent du domaine des passions, non de celui du vrai et du faux<ref>Hume, ''Traité de la nature humaine'', II, III, 3, trad. P. Baranger et P. Saltel, op. cit., p. 272.</ref>. Cette position, connue comme la « théorie humienne de la motivation », exercera une influence considérable sur la philosophie morale analytique contemporaine. Elle établit un modèle que l'on peut résumer ainsi : toute action suppose un état conatif (un désir, une préférence, un souhait) qui lui fournit sa direction, et un état cognitif (une croyance) qui lui fournit ses moyens. Sans désir, pas de motivation à agir, quelle que soit la quantité de savoir dont on dispose. == La philosophie allemande : le désir entre raison, reconnaissance et volonté == === Kant : le désir et la loi morale === La philosophie pratique de Kant se construit, d'un certain point de vue, contre le désir, ou plus exactement contre la prétention du désir à fonder la moralité. Dans la ''Critique de la raison pratique'' (1788), Kant définit la faculté de désirer (''Begehrungsvermögen'') comme « la faculté d'être, par ses représentations, cause de la réalité des objets de ces représentations »<ref>Kant, ''Critique de la raison pratique'', Préface, note, trad. J.-P. Fussler, Paris, GF-Flammarion, 2003, p. 83.</ref>. Mais il opère une distinction fondamentale entre les mobiles pathologiques (fondés sur le désir, l'inclination, le plaisir) et le mobile moral (le respect pour la loi). Une action n'a de valeur morale que si elle est accomplie par devoir, c'est-à-dire par respect pour la loi morale universelle, et non par inclination ou pour satisfaire un désir, fût-il le plus noble. Kant distingue les impératifs hypothétiques (qui commandent sous la condition d'un désir : « si tu veux X, fais Y ») de l'impératif catégorique (qui commande inconditionnellement : « agis de telle sorte que la maxime de ton action puisse être érigée en loi universelle »). Toute éthique fondée sur le désir est, pour Kant, une éthique ''hétéronome'' : elle soumet la volonté à un objet extérieur (le plaisir, le bonheur) au lieu de la laisser se déterminer par sa propre loi<ref>Kant, ''Critique de la raison pratique'', I, I, chap. 1, § 8, théorème IV, trad. J.-P. Fussler, op. cit., p. 117-119.</ref>. Le bonheur (la satisfaction complète de toutes nos inclinations) reste cependant un objet légitime de la raison pratique, mais il ne peut fonder la moralité : il en est la récompense espérée dans le cadre du ''souverain bien'' (l'union de la vertu et du bonheur). Toutefois, Kant reconnaît que la loi morale elle-même produit un affect : le ''respect'' (''Achtung''), qui est un sentiment suscité par la raison et non par la sensibilité. Le respect est, paradoxalement, le seul « sentiment moral » compatible avec l'autonomie : il est l'effet de la loi sur la sensibilité, l'humiliation de l'amour-propre devant l'exigence inconditionnelle du devoir<ref>Kant, ''Critique de la raison pratique'', I, I, chap. 3, « Des mobiles de la raison pure pratique », trad. J.-P. Fussler, op. cit., p. 183-207.</ref>. === Hegel : le désir, la reconnaissance et la dialectique du maître et du serviteur === La pensée hégélienne du désir (''Begierde'') s'inscrit dans le mouvement de la ''Phénoménologie de l'esprit'' (1807), où elle constitue un moment décisif de l'itinéraire de la conscience. Hegel introduit le désir au seuil de la section sur la « conscience de soi » (chapitre IV) : la conscience de soi, explique-t-il, est d'abord désir en général (''Begierde überhaupt'')<ref>Hegel, ''Phénoménologie de l'esprit'', chap. IV, « La vérité de la certitude de soi-même », trad. B. Bourgeois, Paris, Vrin, 2018, p. 191-195.</ref>. Pour devenir certaine de soi, la conscience doit nier l'objet extérieur qui se présente à elle : elle le consomme, le détruit, l'assimile. Mais cette négation de l'objet naturel échoue à satisfaire durablement la conscience de soi, car l'objet consommé est immédiatement remplacé par un autre. Le désir naturel est donc pris dans un cercle : il nie l'objet, mais l'objet renaît sans cesse. La véritable satisfaction du désir exige que la conscience soit reconnue par une autre conscience de soi. Le désir se transforme alors en désir de reconnaissance (''Begehren nach Anerkennung''). C'est dans ce cadre que s'inscrit la célèbre dialectique du maître et du serviteur (''Herrschaft und Knechtschaft''). Deux consciences de soi s'affrontent dans une « lutte pour la reconnaissance » où chacune cherche à faire reconnaître sa liberté par l'autre. L'une, le maître, risque sa vie et soumet l'autre ; celle-ci, le serviteur, choisit la vie et se soumet. Mais cette relation se renverse dialectiquement : le maître, qui jouit par l'intermédiaire du travail du serviteur, dépend en réalité de lui ; le serviteur, par le travail, transforme la nature et acquiert une conscience de soi effective à travers ses œuvres<ref>Hegel, ''Phénoménologie de l'esprit'', chap. IV, B, « Domination et servitude », trad. B. Bourgeois, op. cit., p. 199-210.</ref>. Alexandre Kojève, dans son ''Introduction à la lecture de Hegel'' (1947), a donné à ces pages une interprétation anthropologique qui a profondément marqué la philosophie française du XXe siècle. Le désir humain, soutient Kojève, diffère du désir animal en ce qu'il est ''désir d'un désir'' : l'homme ne désire pas simplement des objets naturels, il désire être désiré et reconnu par un autre homme. Le désir humain est essentiellement social, et l'histoire est le déploiement de la lutte pour la reconnaissance<ref>Kojève, ''Introduction à la lecture de Hegel'', Paris, Gallimard, coll. « Tel », 1979 [1947], p. 11-34.</ref>. === Schopenhauer : le Vouloir-vivre et la souffrance du désir === Arthur Schopenhauer, dans ''Le Monde comme volonté et comme représentation'' (1818/1844), élabore la métaphysique du désir la plus sombrement pessimiste de la tradition occidentale. Derrière le monde des phénomènes (le monde comme représentation), Schopenhauer identifie une réalité unique et fondamentale : la Volonté (''Wille''), impulsion aveugle et sans fin, qui se manifeste dans toute la nature, de la force de gravitation aux passions humaines. Le désir humain n'est qu'une expression individuée de ce Vouloir-vivre cosmique<ref>Schopenhauer, ''Le Monde comme volonté et comme représentation'', trad. A. Burdeau, revue par R. Roos, Paris, PUF, coll. « Quadrige », 2014, livre II, § 17-29, p. 141-212.</ref>. La Volonté est, par essence, insatisfaite : elle est effort sans but, tension sans terme. « Tout vouloir procède d'un besoin, c'est-à-dire d'une privation, c'est-à-dire d'une souffrance »<ref>Schopenhauer, ''Le Monde comme volonté et comme représentation'', livre IV, § 57, trad. A. Burdeau, revue par R. Roos, op. cit., p. 394.</ref>. L'existence humaine oscille entre la douleur du désir insatisfait et l'ennui qui suit la satisfaction — car le désir satisfait cède immédiatement la place à un nouveau désir. La vie est ainsi comparée à un pendule oscillant entre souffrance et ennui. Les échappatoires sont la contemplation esthétique (qui suspend momentanément le désir dans la vision désintéressée des Idées), la compassion morale (qui brise l'illusion de l'individualité) et, de manière plus décisive, la négation ascétique du Vouloir-vivre, que Schopenhauer rapproche de la sagesse bouddhiste et du mysticisme chrétien<ref>Schopenhauer, ''Le Monde comme volonté et comme représentation'', livre IV, § 68-71, trad. A. Burdeau, revue par R. Roos, op. cit., p. 464-516.</ref>. === Nietzsche : le désir comme volonté de puissance === Nietzsche s'oppose frontalement au pessimisme schopenhauerien en affirmant la positivité du désir et de la vie. Là où Schopenhauer voyait dans la Volonté une impulsion aveugle dont il fallait se libérer, Nietzsche y reconnaît la puissance créatrice qui fait la grandeur de l'existence. Le concept de ''volonté de puissance'' (''Wille zur Macht''), élaboré principalement dans ''Par-delà bien et mal'' (1886) et les fragments posthumes, désigne non pas un simple désir de domination politique ou physique, mais la tendance fondamentale de tout vivant à croître, à se dépasser, à affirmer et à intensifier sa puissance créatrice. « La vie elle-même est essentiellement appropriation, atteinte, conquête de ce qui est étranger et plus faible, oppression, dureté, imposition de ses propres formes, incorporation et, pour le moins et le plus modéré, exploitation »<ref>Nietzsche, ''Par-delà bien et mal'', § 259, trad. P. Wotling, Paris, GF-Flammarion, 2000, p. 256.</ref>. La volonté de puissance traverse le vivant tout entier : elle se manifeste aussi bien dans l'instinct de l'artiste qui crée des formes nouvelles que dans l'effort du penseur qui élabore de nouvelles valeurs, ou dans le courage de celui qui surmonte une épreuve. Nietzsche critique la tradition philosophique occidentale pour avoir systématiquement dévalué le désir et le corps au profit de l'âme, de la raison et de l'au-delà. Le ''Zarathoustra'' célèbre le corps comme « grande raison » et condamne les « contempteurs du corps » qui trahissent la vie au nom d'idéaux ascétiques<ref>Nietzsche, ''Ainsi parlait Zarathoustra'', I, « Des contempteurs du corps », trad. G.-A. Goldschmidt, Paris, Le Livre de Poche, 1983, p. 49-51.</ref>. L'idéal ascétique — la négation de la vie, du désir, du corps — est l'expression d'une volonté de puissance retournée contre elle-même, d'une vie qui, ne pouvant s'affirmer, préfère vouloir le néant que ne rien vouloir du tout<ref>Nietzsche, ''La Généalogie de la morale'', III, § 28, trad. P. Wotling, Paris, GF-Flammarion, 2002, p. 225-226.</ref>. La « transvaluation de toutes les valeurs » (''Umwertung aller Werte'') que Nietzsche appelle de ses vœux consiste précisément à renverser cette dépréciation séculaire. Il ne s'agit pas de remplacer une table de valeurs par une autre, mais de substituer à une évaluation fondée sur la négation de la vie (le « non » que l'ascète oppose au désir, au corps, au devenir) une évaluation fondée sur son affirmation (le « oui » que le créateur dit à l'existence dans sa totalité). La doctrine de l{{'}}''éternel retour du même'' constitue l'épreuve suprême de cette affirmation : serais-tu capable de désirer que cette vie, telle qu'elle est, avec toutes ses joies et toutes ses souffrances, revienne éternellement, identique à elle-même, sans que rien n'y soit changé<ref>Nietzsche, ''Le Gai Savoir'', § 341, trad. P. Wotling, Paris, GF-Flammarion, 2007, p. 280.</ref> ? Celui qui peut répondre « oui » à cette question — qui peut vouloir chaque instant de sa vie une infinité de fois — est celui qui a atteint l{{'}}''amor fati'', l'amour du destin, c'est-à-dire le désir affirmatif par excellence : non pas le désir d'autre chose que ce qui est, mais le désir que ce qui est soit exactement ainsi et pas autrement. La sagesse nietzschéenne ne réside donc ni dans la suppression du désir ni dans sa limitation, mais dans son intensification jusqu'à embrasser la totalité de l'existence. == La philosophie contemporaine : le désir entre manque, production et altérité == === Freud : le désir inconscient et l'économie pulsionnelle === L'invention freudienne de la psychanalyse renouvelle en profondeur la question du désir en introduisant la dimension de l{{'}}''inconscient''. Le désir (''Wunsch''), pour Freud, est la tentative de retrouver une satisfaction première, liée à une expérience de plaisir originaire. Le modèle initial est donné dans ''L'Interprétation du rêve'' (1900) : le rêve est un « accomplissement (déguisé) d'un désir (refoulé) »<ref>Freud, ''L'Interprétation du rêve'' [1900], trad. J.-P. Lefebvre, Paris, Seuil, coll. « Points », 2013, p. 197.</ref>. Le désir inconscient est indestructible ; il persiste indéfiniment dans l'inconscient et cherche sans cesse à se frayer un chemin vers la conscience et la satisfaction, en empruntant des voies détournées (rêves, lapsus, symptômes, actes manqués). Freud distingue le désir du besoin biologique par un mécanisme décisif, qu'il nomme l{{'}}''expérience de satisfaction'' (''Befriedigungserlebnis''). La première fois qu'un besoin (la faim, par exemple) est satisfait, le nourrisson enregistre à la fois la tension déplaisante du besoin et l'image de l'objet qui a procuré la satisfaction (le sein maternel, le lait). Dès lors, chaque retour de la tension fait resurgir la trace mnésique de cette première satisfaction : l'appareil psychique tente de retrouver la perception originaire en la ''réinvestissant'' de l'intérieur, c'est-à-dire en produisant une image hallucinatoire de l'objet satisfaisant. Le désir, au sens freudien, est précisément ce mouvement qui cherche à rétablir la situation de la satisfaction première en réactivant ses traces dans la mémoire<ref>Freud, ''L'Interprétation du rêve'' [1900], trad. J.-P. Lefebvre, Paris, Seuil, coll. « Points », 2013, chap. VII, section C, p. 598-604.</ref>. C'est pourquoi le désir n'est jamais totalement satisfait par un objet réel : il vise moins un objet présent qu'un objet perdu, la répétition d'une expérience originaire qui, en tant que telle, ne peut être reproduite à l'identique. Le concept de ''pulsion'' (''Trieb'') doit être soigneusement distingué du désir (''Wunsch''). La pulsion désigne la poussée constante, d'origine somatique, qui exige un travail psychique : elle se caractérise par une source (une zone corporelle), un but (la satisfaction), un objet (ce par quoi la satisfaction est atteinte, objet éminemment variable et substituable) et une poussée (sa force motrice)<ref>Freud, « Pulsions et destins de pulsions » [1915], dans ''Métapsychologie'', trad. J. Laplanche et J.-B. Pontalis, Paris, Gallimard, coll. « Folio essais », 1986, p. 18-22.</ref>. La pulsion se situe à la frontière du psychique et du somatique : elle est la représentation psychique d'une excitation corporelle. Le désir, lui, est le scénario psychique dans lequel la pulsion cherche sa satisfaction — scénario qui emprunte des voies détournées (condensation, déplacement) et qui peut être refoulé sans que la pulsion disparaisse. La théorie freudienne des pulsions connaît une évolution majeure avec l'introduction, dans ''Au-delà du principe de plaisir'' (1920), de la dualité entre pulsions de vie (Éros, qui tendent à lier, à unifier, à conserver) et pulsion de mort (Thanatos, qui tend à délier, à détruire, à ramener au niveau de tension zéro), qui complexifie considérablement la théorie en montrant que le désir ne tend pas toujours vers la conservation et le plaisir, mais peut aussi tendre vers la répétition compulsive, la destruction et le retour à l'inanimé<ref>Freud, ''Au-delà du principe de plaisir'' [1920], trad. J. Laplanche et J.-B. Pontalis, dans ''Essais de psychanalyse'', Paris, Payot, coll. « Petite Bibliothèque Payot », 2001, p. 43-115.</ref>. === Sartre : le désir et le projet de liberté === Jean-Paul Sartre, dans ''L'Être et le Néant'' (1943), inscrit le désir dans sa phénoménologie de la conscience et de la liberté. Sartre distingue deux modes d'être fondamentaux : l{{'}}''en-soi'' (le mode d'être des choses, plein, massif, identique à lui-même — une pierre est une pierre, rien de plus) et le ''pour-soi'' (le mode d'être de la conscience humaine, qui se caractérise par une fissure interne, une distance à soi). La conscience humaine, en effet, n'est jamais purement et simplement ce qu'elle est : le serveur de café qui joue à être serveur n'est pas serveur comme l'encrier est encrier — il peut toujours prendre du recul par rapport à son rôle, l'interroger, le refuser. Inversement, la conscience est toujours déjà engagée vers ce qu'elle n'est pas encore : elle se projette vers des possibles, des situations à venir, des versions d'elle-même qu'elle n'a pas réalisées. C'est le sens de la formule célèbre : le pour-soi « est ce qu'il n'est pas et n'est pas ce qu'il est »<ref>Sartre, ''L'Être et le Néant'', Paris, Gallimard, coll. « Tel », 1976 [1943], p. 33.</ref>. Ce décalage constitutif de la conscience est précisément ce que Sartre appelle le ''manque''. Le pour-soi est traversé par un défaut d'être : il aspire à la plénitude de l'en-soi (être quelque chose de défini, de stable, de complet) tout en étant condamné à ne jamais l'atteindre, puisque la conscience est par définition ce qui se dépasse sans cesse. Le désir est la manifestation de ce manque ontologique. Désirer, c'est se projeter vers ce qui nous manque, nier le donné au profit du possible. Mais Sartre refuse de penser le désir comme une simple tendance naturelle : le désir est toujours repris et assumé dans un ''projet'' existentiel libre, c'est-à-dire dans un choix fondamental par lequel chaque homme donne un sens à son existence. « Le désir est manque d'être. Il est hanté en son être le plus intime par l'être dont il est désir »<ref>Sartre, ''L'Être et le Néant'', op. cit., p. 127.</ref>. Tout désir particulier (désirer un métier, un amour, une reconnaissance) est l'expression d'un projet plus fondamental par lequel le pour-soi tente — en vain — de combler son manque d'être. Le désir d'autrui occupe une place centrale dans la phénoménologie sartrienne. Le désir sexuel, analysé dans la troisième partie de ''L'Être et le Néant'' (chapitre 3, « Les relations concrètes avec autrui »), est la tentative de saisir la liberté de l'autre à travers son corps, de s'emparer de sa subjectivité. Mais cette tentative est vouée à l'échec : l'autre, en tant que liberté, m'échappe toujours. Les relations humaines oscillent entre le sadisme (tenter de réduire l'autre à un objet) et le masochisme (se faire objet pour l'autre), sans jamais atteindre la réciprocité parfaite. Cette dialectique tragique du désir intersubjectif illustre la formule célèbre : « L'enfer, c'est les autres »<ref>Sartre, ''Huis clos'', scène 5, Paris, Gallimard, coll. « Folio », 2000 [1944], p. 93.</ref>. === Lacan : le désir comme désir de l'Autre === Jacques Lacan, dans son retour à Freud à travers les outils de la linguistique structurale et de la philosophie hégélienne, élabore une théorie du désir qui le distingue rigoureusement du besoin et de la demande. Cette distinction tripartite constitue l'un des apports les plus originaux de la pensée lacanienne. Le ''besoin'' est d'ordre biologique : il porte sur un objet déterminé et se satisfait par cet objet (la faim se satisfait par la nourriture). La ''demande'' apparaît dès lors que le besoin doit passer par le langage pour s'exprimer : le nourrisson qui crie pour obtenir le sein ne formule pas seulement un besoin physiologique, il s'adresse à un autre (la mère) et réclame, au-delà de l'objet nourricier, une preuve d'amour — une présence, une attention inconditionnelle. Or cette dimension d'amour, par nature absolue (on demande d'être aimé sans condition), ne peut jamais être pleinement satisfaite par aucun objet particulier. Le ''désir'' est précisément ce qui reste dans l'écart entre le besoin (qui peut être comblé) et la demande d'amour (qui ne peut pas l'être) : il est « la marge qui se creuse entre la demande de satisfaction du besoin et la demande d'amour »<ref>Lacan, « La signification du phallus » [1958], dans ''Écrits'', Paris, Seuil, 1966, p. 690-691.</ref>. Le désir est donc, par structure, indestructible et insatisfait : il naît de l'impossibilité pour le langage de coïncider avec ce qui le dépasse. La formule « le désir de l'homme est le désir de l'Autre » constitue le noyau de la théorie lacanienne<ref>Lacan, ''Le Séminaire, livre XI, Les quatre concepts fondamentaux de la psychanalyse'' [1964], Paris, Seuil, coll. « Points », 1990, p. 209.</ref>. L'« Autre » (avec une majuscule) ne désigne pas simplement une autre personne, mais le lieu du langage, de la loi et de la culture — ce grand réservoir symbolique dans lequel le sujet humain est plongé dès sa naissance et qui le précède. La formule signifie au moins deux choses : d'une part, que nous désirons ce que l'Autre (les parents, la société, la culture) valorise et désire — notre désir est modelé par le discours qui nous entoure ; d'autre part, que nous désirons être reconnus, aimés, désirés par cet Autre — nous voulons être l'objet de son désir. Le désir est en outre structuré par le langage selon le mécanisme de la ''métonymie''. En rhétorique, la métonymie consiste à désigner une chose par une autre qui lui est contiguë (dire « boire un verre » pour « boire le contenu du verre »). De même, le désir glisse indéfiniment d'un objet à un autre par contiguïté : je désire cette voiture, puis ce voyage, puis cette reconnaissance, sans que jamais aucun de ces objets ne satisfasse le désir lui-même. Chaque objet obtenu en appelle un autre, parce qu'aucun n'est le « vrai » objet du désir. Lacan nomme ''objet a'' (prononcé « objet petit a ») ce reste irréductible qui cause le désir sans jamais se laisser saisir. L{{'}}''objet a'' n'est pas un objet réel ni un objet imaginaire : il est ce qui, dans l'expérience du sujet, a été irrémédiablement perdu lors de l'entrée dans le langage (le sein, la voix, le regard, les fèces sont des figures de cet objet), et dont l'absence creuse dans le sujet un vide que rien ne vient combler. C'est ce vide qui relance indéfiniment le mouvement du désir<ref>Lacan, ''Le Séminaire, livre X, L'angoisse'' [1962-1963], Paris, Seuil, 2004, p. 99-120.</ref>. L'angoisse surgit précisément lorsque le sujet se trouve confronté à l{{'}}''objet a'' sans la médiation protectrice du langage et du fantasme. === Levinas : le Désir métaphysique et l'altérité absolue === Emmanuel Levinas, dans ''Totalité et Infini'' (1961), opère une distinction fondamentale entre le ''besoin'' et le ''Désir'' (avec une majuscule) qui rompt avec l'ensemble de la tradition philosophique antérieure. Le besoin part de moi et se dirige vers un objet qui peut le combler : j'ai faim, je mange, le besoin est satisfait. Dans le besoin, le sujet se rapporte au monde pour se l'assimiler, pour le ramener à soi : la nourriture ingérée devient mon corps, le savoir acquis devient ma connaissance. Le besoin est donc un mouvement circulaire — il part du Même et y revient. Levinas montre que la plus grande partie de la tradition philosophique a pensé le désir sur ce modèle du besoin : chez Platon, Éros désire le Beau parce qu'il en manque, et la contemplation du Beau comble ce manque ; chez Hegel, la conscience de soi désire l'autre pour s'assurer de sa propre identité ; même chez Freud, le désir cherche à retrouver un objet perdu. Dans tous ces cas, le mouvement vers l'autre aboutit à un retour au même : l'autre est réduit, assimilé, compris (au sens étymologique de « pris avec soi »). Le Désir métaphysique, au contraire, se porte vers l'absolument Autre (''Autrui''), qui ne peut jamais être assimilé, englobé ni réduit au Même. Ce Désir n'est pas un manque à combler — il ne naît pas d'une privation — mais une ouverture à ce qui excède toute capacité de compréhension et de possession : « Le Désir métaphysique tend vers tout autre chose, vers l'absolument autre »<ref>Levinas, ''Totalité et Infini'', La Haye, Martinus Nijhoff, 1961 ; rééd. Paris, Le Livre de Poche, coll. « Biblio essais », 1990, p. 21.</ref>. Levinas compare ce Désir à celui qu'éprouve l'homme « qui ne manque de rien » pour un pays qu'il n'a jamais connu et dont il ne peut se faire aucune image<ref>Levinas, ''Totalité et Infini'', op. cit., p. 22.</ref>. Ce Désir ne se nourrit pas de ce qu'il atteint ; au contraire, il grandit à mesure qu'il s'approche de l'Autre, parce que l'Autre demeure toujours au-delà de ce que je peux en saisir. Le lieu par excellence de cette rencontre avec l'absolument Autre est le ''visage'' (''visage d'autrui''). Par « visage », Levinas n'entend pas les traits physiques d'un individu — un ensemble de caractéristiques que je pourrais décrire, comparer, classer — mais la manière dont autrui se présente à moi dans sa nudité et sa vulnérabilité, en excédant toute image que je pourrais m'en former. Le visage ne se laisse pas contenir dans une représentation : il « déborde » toute idée que j'en ai. C'est pourquoi il commande éthiquement : le visage d'autrui, dans sa fragilité exposée, me dit « tu ne tueras point » avant toute parole et ouvre la dimension éthique comme responsabilité infinie pour l'autre homme<ref>Levinas, ''Totalité et Infini'', op. cit., p. 211-214.</ref>. Le Désir levinassien n'est donc pas un affect psychologique parmi d'autres, mais une structure éthique fondamentale : il est le rapport à l'infini, l'impossibilité de se refermer sur soi, l'appel de l'autre qui précède et fonde toute subjectivité. Avant même que je me constitue comme sujet autonome, je suis déjà requis par le visage d'autrui. === Girard : le désir mimétique === René Girard, dans ''Mensonge romantique et vérité romanesque'' (1961) puis dans ''La Violence et le Sacré'' (1972), développe la théorie du ''désir mimétique''. Contre l'illusion romantique d'un désir spontané et autonome — l'idée que nos désirs naîtraient du fond de notre moi authentique, sans influence extérieure —, Girard soutient que le désir humain est toujours médiatisé par un tiers : nous ne désirons jamais directement un objet pour ses qualités propres, mais nous désirons ce qu'un autre — le ''médiateur'' ou le ''modèle'' — désire ou semble désirer. Le désir est essentiellement ''triangulaire'' : il suppose un sujet, un objet et un modèle<ref>Girard, ''Mensonge romantique et vérité romanesque'', Paris, Grasset, 1961 ; rééd. Paris, Hachette, coll. « Pluriel », 2011, p. 15-68.</ref>. C'est parce qu'un collègue admiré convoite une promotion que celle-ci nous apparaît soudain comme désirable ; c'est parce qu'un ami vante un lieu de vacances que nous commençons à en rêver ; c'est parce qu'un enfant voit un autre enfant saisir un jouet que ce jouet, jusque-là ignoré, devient l'objet d'un désir intense. Dans tous ces cas, l'objet ne tient pas sa valeur de ses propriétés intrinsèques, mais du désir que le modèle lui porte. Girard distingue la ''médiation externe'' de la ''médiation interne'', et cette distinction gouverne les conséquences du désir mimétique. Dans la médiation externe, le modèle est trop éloigné du sujet — socialement, géographiquement ou temporellement — pour que la rivalité soit possible : Don Quichotte imite Amadis de Gaule, le lecteur passionné admire un auteur qu'il ne rencontrera jamais. Le désir imité peut alors prendre la forme d'une émulation inoffensive, voire féconde. Dans la médiation interne, en revanche, le modèle est un proche, un pair, un semblable : un collègue, un ami, un voisin. Parce que le sujet et le modèle évoluent dans le même espace social et convoitent les mêmes biens, le désir engendre inévitablement la rivalité. Le modèle se transforme en obstacle — et l'obstacle en modèle : plus la résistance de l'autre est grande, plus l'objet paraît désirable. Le désir s'emballe dans une surenchère réciproque que Girard nomme « rivalité mimétique », et qui peut conduire à la haine et à la violence<ref>Girard, ''Mensonge romantique et vérité romanesque'', op. cit., p. 69-120.</ref>. Dans ''La Violence et le Sacré'' (1972), Girard prolonge cette analyse en montrant que la rivalité mimétique, lorsqu'elle se généralise à l'ensemble d'une communauté, engendre une crise indifférenciée où chacun devient le rival de tous. La résolution de cette crise passe, selon Girard, par le mécanisme du ''bouc émissaire'' : la violence de tous se concentre sur une victime unique, arbitrairement choisie, dont la mise à mort ou l'expulsion restaure la paix sociale. Le sacré, le sacrifice et les institutions religieuses archaïques sont, dans cette perspective, autant de dispositifs qui canalisent la violence née du désir mimétique<ref>Girard, ''La Violence et le Sacré'', Paris, Grasset, 1972 ; rééd. Paris, Hachette, coll. « Pluriel », 2010, p. 204-247.</ref>. La théorie girardienne a des implications considérables pour l'anthropologie, la sociologie et la critique littéraire, en montrant que l'objet du désir a moins d'importance que le rapport au modèle, et que l'autonomie du désir — la conviction que nous désirons par nous-mêmes, indépendamment de tout modèle — est le « mensonge romantique » que les grands romanciers (Cervantès, Stendhal, Flaubert, Proust, Dostoïevski) ont su démasquer. === Deleuze et Guattari : le désir comme production === Gilles Deleuze et Félix Guattari, dans ''L'Anti-Œdipe. Capitalisme et schizophrénie'' (1972), entreprennent une critique de part en part de la conception du désir comme manque, qu'ils attribuent à la tradition platonicienne reprise et consolidée par la psychanalyse. Leur thèse centrale est que le désir n'est pas manque mais ''production'' : il est un processus affirmatif, une force qui engendre du réel, et non une aspiration vers un objet absent. « Si le désir produit, il produit du réel. Si le désir est producteur, il ne peut l'être qu'en réalité, et de réalité »<ref>Deleuze et Guattari, ''L'Anti-Œdipe. Capitalisme et schizophrénie'', Paris, Minuit, 1972, p. 34.</ref>. Pour penser cette productivité du désir, Deleuze et Guattari forgent le concept de « machines désirantes ». L'idée est que le désir ne réside pas dans un sujet qui manquerait d'un objet, mais dans des ''connexions'' entre éléments hétérogènes qui produisent quelque chose de nouveau. Le modèle n'est plus celui du sujet qui tend vers l'objet absent, mais celui du branchement : une machine se connecte à une autre, un flux est émis et coupé par une autre machine qui le recueille et en émet un autre à son tour. Le nourrisson au sein, par exemple, n'est pas un sujet désirant un objet (le lait) dont il manque ; il est une bouche-machine branchée sur un sein-machine : la bouche coupe le flux de lait que le sein produit, et produit à son tour un flux de succion<ref>Deleuze et Guattari, ''L'Anti-Œdipe'', op. cit., p. 7-14.</ref>. Le désir est ce processus de connexion et de production, et non le manque qui précéderait la connexion. Ce modèle vaut à tous les niveaux : social, politique, artistique — partout le désir connecte, branche, produit. La cible principale de ''L'Anti-Œdipe'' est l'interprétation psychanalytique, et singulièrement œdipienne, du désir. Deleuze et Guattari reprochent à la psychanalyse freudienne de réduire systématiquement le désir aux coordonnées familiales du complexe d'Œdipe — le père, la mère, l'enfant — et de soumettre le désir à la logique du manque et de la castration. Le petit garçon désirerait la mère et craindrait la castration par le père : toute la vie désirante serait ainsi rabattue sur ce triangle familial. Deleuze et Guattari y voient une opération de « territorialisation » du désir : le désir, qui est par nature proliférant, multiple, capable de connexions illimitées, est capturé et enfermé dans un territoire clos (la famille, la structure œdipienne) qui le rend docile et gérable par les institutions sociales<ref>Deleuze et Guattari, ''L'Anti-Œdipe'', op. cit., p. 38-50.</ref>. À cette territorialisation, Deleuze et Guattari opposent un processus de « déterritorialisation » par lequel le désir échappe aux codes sociaux établis et invente de nouvelles connexions, de nouveaux agencements. La déterritorialisation n'est pas un simple désordre : elle est la capacité créatrice du désir à tracer des lignes de fuite, à produire du nouveau en dehors des cadres assignés. L'enjeu est proprement politique : le désir n'est pas une affaire privée cantonnée au divan du psychanalyste, il est une force sociale et historique. La question fondamentale de la politique, reformulée par Deleuze et Guattari à la suite de Spinoza et de Wilhelm Reich, est de comprendre pourquoi les hommes « désirent leur propre servitude » — pourquoi le désir peut être capturé, réprimé et retourné contre lui-même par les formations de pouvoir, et comment il peut s'en libérer. Deleuze reprend ici l'héritage spinoziste du désir comme puissance d'agir (''conatus'') et l'oppose frontalement à la tradition du désir-manque qui court de Platon à Lacan. == Problèmes transversaux == === Désir et bonheur : peut-on être heureux en désirant ? === La question du rapport entre désir et bonheur traverse toute l'histoire de la philosophie. Deux grandes orientations se dessinent. La première, qu'on peut appeler ''ascétique'' au sens large, considère que le bonheur exige une maîtrise, une limitation ou une suppression du désir. C'est la voie stoïcienne (ne désirer que ce qui dépend de nous), épicurienne (ne désirer que le nécessaire), schopenhauerienne (nier le Vouloir-vivre) et, dans une certaine mesure, kantienne (subordonner le désir à la loi morale). La seconde orientation, qu'on peut appeler ''affirmative'', soutient que le bonheur ne consiste pas à se délivrer du désir mais à l'accomplir, à augmenter sa puissance de désirer et d'agir. C'est la voie spinoziste (la joie comme augmentation de la puissance d'agir), nietzschéenne (l'affirmation tragique de la vie) et deleuzienne (le désir comme production). Ces deux orientations ne sont d'ailleurs pas toujours aussi opposées qu'il y paraît. L'épicurisme ne vise pas la suppression du plaisir mais sa sélection intelligente ; le stoïcisme ne supprime pas l'impulsion mais la rend rationnelle ; Spinoza ne refuse pas toute modération mais hiérarchise les affects selon leur caractère actif ou passif. La question reste cependant ouverte : le bonheur est-il compatible avec le caractère essentiellement insatisfait du désir, ou exige-t-il un rapport d'apaisement au manque ? === Désir et liberté : le désir est-il une servitude ? === Le problème de la liberté du désir comporte deux faces. D'une part, le désir peut être compris comme aliénation : dans la mesure où nous ne choisissons pas nos désirs, où ils s'imposent à nous de manière involontaire (Spinoza, Freud, Girard), le désir semble être une forme de détermination extérieure. « Les hommes se croient libres pour la seule raison qu'ils sont conscients de leurs actions mais ignorants des causes par lesquelles ils sont déterminés »<ref>Spinoza, ''Éthique'', III, prop. 2, scolie, trad. B. Pautrat, op. cit., p. 211.</ref>. L'homme qui croit choisir librement un objet de désir obéit en réalité à un enchaînement de causes (éducation, tempérament, rencontres) qu'il ignore. Girard approfondit ce diagnostic : si nos désirs sont toujours empruntés à un modèle, si nous désirons ce qu'un autre désire sans le savoir, alors l'autonomie du sujet désirant est une illusion. Le consommateur qui croit exprimer ses goûts personnels en achetant un produit à la mode ne fait que reproduire le désir d'un modèle social qu'il admire sans se l'avouer. D'autre part, le désir peut être pensé comme la manifestation même de la liberté. Pour Sartre, c'est par le désir que nous nous projetons vers le possible, que nous nions le donné, que nous nous arrachons au monde tel qu'il est : la conscience humaine est libre précisément parce qu'elle désire ce qui n'est pas encore, et refuse de coïncider avec ce qui est. L'esclave qui désire sa libération, l'artiste qui désire créer une œuvre qui n'existe pas encore, le résistant qui désire un autre ordre politique : dans chacun de ces cas, le désir est l'agent même de la liberté, la force par laquelle l'homme se soustrait à la pesanteur du donné. Plusieurs philosophes proposent des voies de réconciliation entre désir et liberté, qui ne passent ni par l'abolition du désir ni par la simple obéissance à ses impulsions. Pour Kant, la liberté s'exerce contre le désir, mais au nom d'une exigence plus haute : l'homme est libre non pas quand il satisfait ses inclinations, mais quand il leur résiste au nom de la loi morale qu'il se donne à lui-même. La liberté kantienne est autonomie — la capacité de la volonté à se déterminer par sa propre loi, indépendamment de tout désir sensible. Pour Spinoza, au contraire, la liberté ne s'oppose pas au désir mais le traverse et le transforme : elle consiste à comprendre les causes de nos affects pour devenir la cause adéquate de nos propres actions. L'homme libre, au sens spinoziste, n'est pas celui qui a supprimé ses désirs, mais celui qui les comprend assez pour que ses désirs procèdent de sa propre nature et non de causes extérieures subies passivement. La connaissance ne supprime pas le désir, elle le rend actif. La psychanalyse complique encore le problème en montrant que le sujet peut être aliéné par ses propres désirs inconscients, qui le déterminent à son insu. Le névrosé, par exemple, répète des schémas de désir (choix amoureux, conduites d'échec, symptômes) sans comprendre qu'il obéit à des scénarios infantiles refoulés. Lacan, en particulier, montre que le désir est structuré par le discours de l'Autre (la famille, la culture, le langage), de sorte que le sujet ne sait pas, le plus souvent, ce qu'il désire vraiment : il prend le désir de l'Autre pour le sien. La liberté, dans cette perspective, ne consiste pas à « faire ce qu'on veut » — car ce que l'on veut est souvent le désir d'un autre — mais à reconnaître et assumer la vérité de son propre désir, à se dégager de l'emprise du discours de l'Autre pour accéder à ce que Lacan appelle le « désir décidé », c'est-à-dire un désir dont le sujet accepte de répondre. === Désir et altérité : l'autre comme objet ou comme source du désir === Le rapport entre désir et altérité constitue l'un des nœuds les plus féconds de la réflexion contemporaine. Hegel montre que le désir proprement humain est désir de reconnaissance, c'est-à-dire qu'il ne peut se satisfaire que dans un rapport à un autre sujet. Sartre durcit cette intuition en montrant que le désir d'autrui est irréductiblement conflictuel, car chaque conscience cherche à s'affirmer aux dépens de l'autre. Levinas renverse la perspective en montrant que le désir authentique n'est pas désir de posséder l'autre, mais ouverture éthique à l'altérité irréductible d'autrui. Girard complète le tableau en révélant que nous ne désirons jamais sans modèle, que l'autre est toujours déjà présent dans la genèse même de notre désir. Ces approches dessinent un spectre de positions sur la relation entre désir et altérité : l'autre comme objet du désir (possession, consommation), comme condition du désir (reconnaissance, imitation), comme source du désir (le Désir métaphysique de l'absolument Autre), et comme matrice du désir (le désir comme effet du discours de l'Autre). Le dialogue entre ces perspectives constitue l'un des chantiers les plus vivants de la philosophie contemporaine. === Le désir dans la philosophie analytique contemporaine === La philosophie analytique contemporaine a développé, à partir de Hume, une réflexion importante sur le rôle du désir dans l'explication de l'action et la fondation de la morale. La ''théorie humienne de la motivation'' (''Humean theory of motivation'') soutient que toute action requiert un état conatif (un désir, un souhait, une préférence) et un état cognitif (une croyance sur les moyens de satisfaire ce désir). Sans désir, pas de motivation à agir ; la raison seule est « inerte ». Cette position, défendue notamment par Donald Davidson et Michael Smith, implique que les jugements moraux, pour être capables de motiver, doivent être liés à des désirs<ref>Smith, Michael, ''The Moral Problem'', Oxford, Blackwell, 1994, p. 7-12, 92-129.</ref>. Des philosophes anti-humiens, tels que Thomas Nagel et John McDowell, contestent cette thèse en soutenant que la raison peut être par elle-même une source de motivation et que certaines considérations normatives engendrent directement des désirs, plutôt que l'inverse<ref>Nagel, Thomas, ''The Possibility of Altruism'', Princeton, Princeton University Press, 1970, p. 27-32, 47-51.</ref>. Ce débat, qui prolonge sous une forme analytique la controverse entre Kant et Hume, reste l'un des plus actifs de la méta-éthique contemporaine. Derek Parfit, dans ''On What Matters'' (2011), a proposé une critique influente du subjectivisme du désir en éthique : l'idée que le bien pour une personne est ce qui satisfait ses désirs (théorie du « désir informé ») se heurte à des objections décisives, car les désirs peuvent être irrationnels, mal informés ou autodestructeurs. Le bien ne peut se réduire à ce que nous désirons<ref>Parfit, Derek, ''On What Matters'', Oxford, Oxford University Press, 2011, vol. 1, p. 41-82.</ref>. == Conclusion == Le désir constitue l'une des catégories les plus riches et les plus disputées de la philosophie. Son histoire conceptuelle dessine un champ de tensions irréductibles : entre le manque et la puissance, entre la servitude et la liberté, entre l'individu et l'autre, entre la nature et la culture. La tradition platonicienne, augustinienne et psychanalytique le pense comme manque orienté vers un objet absent — la Forme, Dieu, l'objet perdu. La tradition spinoziste, nietzschéenne et deleuzienne le pense comme puissance affirmative, effort de persévérer et de croître. La tradition hégélienne, sartrienne et lacanienne le pense comme rapport intersubjectif, désir de reconnaissance ou désir de l'Autre. La tradition stoïcienne, kantienne et bouddhiste le pense comme obstacle au bonheur et à la vertu, qu'il s'agit de maîtriser ou de dépasser. Aucune de ces perspectives ne suffit à elle seule à épuiser le phénomène du désir. Peut-être la philosophie du désir est-elle travaillée par la structure même qu'elle analyse : elle désire comprendre ce qui, dans le désir, échappe toujours partiellement à la compréhension. C'est ce qui fait du désir une notion à la fois incontournable et inépuisable, qui ne cesse de relancer la réflexion philosophique. == Notes et références == {{references|colonnes=2}} == Bibliographie sélective == === Sources primaires === * Aristote, ''De l'âme'', trad. R. Bodéüs, Paris, GF-Flammarion, 1993. * Aristote, ''Éthique à Nicomaque'', trad. J. Tricot, Paris, Vrin, 1994. * Augustin, ''Confessions'', trad. P. de Labriolle, Paris, Les Belles Lettres, 1996. * Augustin, ''De Doctrina Christiana'', trad. M. Moreau, Paris, Institut d'Études Augustiniennes, coll. « Bibliothèque augustinienne », vol. 11/2, 1997. * Deleuze, G. et Guattari, F., ''L'Anti-Œdipe. Capitalisme et schizophrénie'', Paris, Minuit, 1972. * Descartes, R., ''Les Passions de l'âme'', dans ''Œuvres philosophiques'', éd. F. Alquié, Paris, Garnier, 1973, t. III. * Épicure, ''Lettres et Maximes'', trad. J.-F. Balaudé, Paris, Le Livre de Poche, 2009. * Épictète, ''Manuel'', trad. É. Bréhier, dans ''Les Stoïciens'', Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1962. * Freud, S., ''L'Interprétation du rêve'' [1900], trad. J.-P. Lefebvre, Paris, Seuil, coll. « Points », 2013. * Freud, S., ''Essais de psychanalyse'', trad. J. Laplanche et J.-B. Pontalis, Paris, Payot, coll. « Petite Bibliothèque Payot », 2001. * Girard, R., ''Mensonge romantique et vérité romanesque'', Paris, Grasset, 1961 ; rééd. Paris, Hachette, coll. « Pluriel », 2011. * Hegel, G.W.F., ''Phénoménologie de l'esprit'', trad. B. Bourgeois, Paris, Vrin, 2018. * Hobbes, T., ''Léviathan'', trad. G. Mairet, Paris, Gallimard, coll. « Folio essais », 2000. * Hume, D., ''Traité de la nature humaine'', trad. P. Baranger et P. Saltel, Paris, GF-Flammarion, 1991. * Kant, I., ''Critique de la raison pratique'', trad. J.-P. Fussler, Paris, GF-Flammarion, 2003. * Lacan, J., ''Écrits'', Paris, Seuil, 1966. * Lacan, J., ''Le Séminaire, livre XI, Les quatre concepts fondamentaux de la psychanalyse'', Paris, Seuil, coll. « Points », 1990. * Levinas, E., ''Totalité et Infini'', La Haye, Martinus Nijhoff, 1961 ; rééd. Paris, Le Livre de Poche, coll. « Biblio essais », 1990. * Nietzsche, F., ''Le Gai Savoir'', trad. P. Wotling, Paris, GF-Flammarion, 2007. * Nietzsche, F., ''Par-delà bien et mal'', trad. P. Wotling, Paris, GF-Flammarion, 2000. * Nietzsche, F., ''La Généalogie de la morale'', trad. P. Wotling, Paris, GF-Flammarion, 2002. * Platon, ''Le Banquet'', trad. L. Brisson, Paris, GF-Flammarion, 2007. * Platon, ''Phèdre'', trad. L. Brisson, Paris, GF-Flammarion, 2012. * Platon, ''République'', trad. G. Leroux, Paris, GF-Flammarion, 2016. * Sartre, J.-P., ''L'Être et le Néant'', Paris, Gallimard, coll. « Tel », 1976 [1943]. * Schopenhauer, A., ''Le Monde comme volonté et comme représentation'', trad. A. Burdeau, revue par R. Roos, Paris, PUF, coll. « Quadrige », 2014. * Spinoza, B., ''Éthique'', trad. B. Pautrat, Paris, Seuil, coll. « Points », 2010. * Thomas d'Aquin, ''Somme théologique'', trad. A.-M. Roguet (dir.), Paris, Cerf, 1984. === Études === * Bréhier, É., ''Les Stoïciens'', Paris, Gallimard, coll. « Bibliothèque de la Pléiade », 1962. * Deleuze, G., ''Spinoza. Philosophie pratique'', Paris, Minuit, 1981. * Ernout, A. et Meillet, A., ''Dictionnaire étymologique de la langue latine. Histoire des mots'', 4{{e}} éd., Paris, Klincksieck, 2001. * Hadot, P., ''La Citadelle intérieure. Introduction aux Pensées de Marc Aurèle'', Paris, Fayard, 1992. * Kojève, A., ''Introduction à la lecture de Hegel'', Paris, Gallimard, coll. « Tel », 1979. * Laplanche, J. et Pontalis, J.-B., ''Vocabulaire de la psychanalyse'', Paris, PUF, coll. « Quadrige », 2007. * Nagel, T., ''The Possibility of Altruism'', Princeton, Princeton University Press, 1970. * Parfit, D., ''On What Matters'', Oxford, Oxford University Press, 2011, vol. 1. * Rabaté, J.-M. (dir.), ''The Cambridge Companion to Lacan'', Cambridge, Cambridge University Press, 2003. * Smith, M., ''The Moral Problem'', Oxford, Blackwell, 1994. == Articles connexes == * [[Dictionnaire de philosophie/Amour|Amour]] * [[Besoin]] * [[Bonheur]] * [[Conatus]] * [[Éros]] * [[Liberté]] * [[Manque]] * [[Passion]] * [[Plaisir]] * [[Pulsion]] * [[Reconnaissance]] * [[Volonté]] * [[Volonté de puissance]] p66pg3vauf4bysaftw47g3gh7d6akt6 Latin/Vocabulaire/Verba Latina frequentissima/026-050 0 83943 767888 767807 2026-06-17T01:00:06Z JackBot 14683 Formatage, [[Spécial:Pages non catégorisées]] 767888 wikitext text/x-wiki {{Sous-pages|Latin/Vocabulaire/Verba Latina frequentissima}} <div style="text-align: center; font-size: 90%;"> [[#habeo|habeo]] · [[#possum|possum]] · [[#video|video]] · [[#magnus|magnus]] · [[#deus|deus]] · [[#do|do]] · [[#atque, ac|atque, ac]] · [[#animus|animus]] · [[#multus|multus]] · [[#nunc|nunc]] · [[#etiam|etiam]] · [[#per|per]] · [[#alius|alius]] · [[#ne|ne]] · [[#neque, nec|neque, nec]] · [[#tamen|tamen]] · [[#enim|enim]] · [[#vir|vir]] · [[#homo|homo]] · [[#rex|rex]] · [[#pater|pater]] · [[#primus|primus]] · [[#bonus|bonus]] · [[#dies|dies]] · [[#nam|nam]] </div> == habeo == ''habeo, habere, habui, habitum'' (v.) : avoir, tenir ''Exempla gradatim digesta'' # ''Canem habeo.'' (J’ai un chien.) # ''Orationem in senatu habuit.'' (Il prononça un discours au sénat.) # ''Nihil habeo quod scribam.'' (Je n’ai rien à écrire.) Nota : relative au subjonctif après nihil. ''Exempla elocutionis'' * ''Compertum habeo.'' (Je tiens la chose pour établie.) *: ''Commentaire :'' habere + participe parfait insiste sur le résultat acquis et possédé ; tour expressif qui annonce de loin nos temps composés romans. * ''Habent sua fata libelli.'' (Les livres ont leur destin.) (Térentianus Maurus) *: ''Commentaire :'' personnification des livres par le simple jeu du possessif sua ; le vers, détaché de son contexte, est devenu proverbe. == possum == ''possum, posse, potui'' (v.) : pouvoir ''Exempla gradatim digesta'' # ''Currere possum.'' (Je peux courir.) # ''Hoc fieri potest.'' (Cela peut se faire.) # ''Ut potui, feci; ut volui, non potui.'' (J’ai fait comme j’ai pu ; comme je voulais, je n’ai pas pu.) ''Exempla elocutionis'' * ''Possunt, quia posse videntur.'' (Ils peuvent, parce qu’ils croient pouvoir.) (Virgile) *: ''Commentaire :'' polyptote possunt / posse ; la confiance crée la force, et la répétition du verbe mime ce cercle. Psychologie de la course en un hémistiche. * ''Fieri potest ut fallar.'' (Il se peut que je me trompe.) *: ''Commentaire :'' tour impersonnel de la prudence philosophique ; l’Académicien ne dit pas « je me trompe peut-être » mais met sa propre erreur à distance. == video == ''video, videre, vidi, visum'' (v.) : voir ''Exempla gradatim digesta'' # ''Stellas video.'' (Je vois les étoiles.) # ''Videor mihi felix esse.'' (Il me semble que je suis heureux.) Nota : videor, construction personnelle. # ''Videant consules ne quid res publica detrimenti capiat.'' (Que les consuls veillent à ce que la république ne subisse aucun dommage.) (formule sénatoriale) Nota : videre ne + subjonctif. ''Exempla elocutionis'' * ''Video meliora proboque, deteriora sequor.'' (Je vois le meilleur et je l’approuve, je suis le pire.) (Ovide) *: ''Commentaire :'' asyndète adversative au centre du vers ; le déchirement moral (l’acrasie des philosophes) tient dans l’absence même de conjonction. * ''Errare mihi videris.'' (Tu me sembles faire erreur.) *: ''Commentaire :'' videor atténue l’affirmation ; l’urbanité du dialogue cultivé consiste à présenter le désaccord comme une impression. == magnus == ''magnus, magna, magnum'' (adi.) : grand ''Exempla gradatim digesta'' # ''Domus magna est.'' (La maison est grande.) # ''Maior pars militum periit.'' (La plus grande partie des soldats périt.) # ''Magni ingenii est mentem a sensibus revocare.'' (C’est le propre d’un grand esprit de détacher la pensée des sens.) Nota : est + génitif (« c’est le propre d’un grand esprit »). ''Exempla elocutionis'' * ''Magna di curant, parva neglegunt.'' (Les dieux s’occupent des grandes choses, ils négligent les petites.) (Cicéron) *: ''Commentaire :'' double antithèse en asyndète (magna / parva, curant / neglegunt) ; la symétrie donne à la thèse théologique une allure d’évidence. * ''Parvo fames constat, magno fastidium.'' (La faim coûte peu, le dégoût coûte cher.) (Sénèque) *: ''Commentaire :'' ablatifs de prix antithétiques en chiasme avec leurs sujets ; morale frugale de Sénèque, où la syntaxe fait les comptes. == deus == ''deus, dei'' (subst. m.) : dieu ''Exempla gradatim digesta'' # ''Dei caelum tenent.'' (Les dieux occupent le ciel.) # ''Dis hostias immolaverunt.'' (Ils immolèrent des victimes aux dieux.) Nota : dis, datif pluriel contracte. # ''Natura ipsa docet deos esse.'' (La nature elle-même enseigne que les dieux existent.) Nota : proposition infinitive. ''Exempla elocutionis'' * ''Di immortales!'' (Dieux immortels !) *: ''Commentaire :'' exclamation-juron du théâtre et des plaidoyers ; la forme contracte di appartient à la langue vive, dei serait livresque. * ''Deum colit qui novit.'' (Honorer dieu, c’est le connaître.) (d’après Sénèque) *: ''Commentaire :'' brièveté sénéquienne : relative sans antécédent, cinq mots, pointe finale ; la piété redéfinie en une formule qui tient de l’épigramme. == do == ''do, dare, dedi, datum'' (v.) : donner ''Exempla gradatim digesta'' # ''Panem pauperi do.'' (Je donne du pain au pauvre.) # ''Operam litteris dedi.'' (Je me suis consacré aux lettres.) Nota : operam dare = « s’appliquer à ». # ''Dant veniam corvis, vexat censura columbas.'' (On pardonne aux corbeaux, la censure s’acharne sur les colombes.) (Juvénal) ''Exempla elocutionis'' * ''Bis dat qui cito dat.'' (Donner vite, c’est donner deux fois.) (d’après Publilius Syrus) *: ''Commentaire :'' reprise de dat aux deux membres, rime intérieure et rythme de sentence ; la maxime est faite pour la mémoire. * ''Da mihi, obsecro, hanc veniam.'' (Accorde-moi, je t’en conjure, cette grâce.) *: ''Commentaire :'' l’incise obsecro suspend la phrase entre le verbe et son objet ; registre de la prière, où le retard de l’objet ménage la supplication. == atque, ac == (coni.) : et, et de plus ''Exempla gradatim digesta'' # ''Pater atque filius adsunt.'' (Le père et le fils sont présents.) # ''Idem atque tu sentio.'' (Je pense la même chose que toi.) Nota : idem atque = « le même que ». # ''Simul atque venit, omnia mutata sunt.'' (Dès qu’il arriva, tout changea.) Nota : simul atque = « dès que ». ''Exempla elocutionis'' * ''Difficile est, atque adeo fieri non potest.'' (C’est difficile, et même cela ne se peut pas.) *: ''Commentaire :'' atque adeo corrige en renchérissant ; gradation rectificative de l’orateur qui feint de s’interrompre pour aller plus loin. * ''Mens atque animus, consilium atque sententia civitatis posita est in legibus.'' (L’intelligence et l’âme, la pensée et la volonté de la cité résident dans les lois.) (d’après Cicéron) *: ''Commentaire :'' doublets synonymiques liés par atque ; la plénitude oratoire double chaque notion, non pour préciser mais pour amplifier. == animus == ''animus, animi'' (subst. m.) : esprit, cœur, courage ''Exempla gradatim digesta'' # ''Animus meus laetus est.'' (Mon cœur est joyeux.) # ''Ex animo tibi gratias ago.'' (Je te remercie de tout cœur.) # ''Animum rege, qui nisi paret, imperat.'' (Gouverne ton cœur : s’il n’obéit pas, il commande.) (Horace) ''Exempla elocutionis'' * ''Animus aequus optimum est aerumnae condimentum.'' (Une âme égale est le meilleur assaisonnement du malheur.) (Plaute) *: ''Commentaire :'' métaphore culinaire appliquée à la morale ; le mélange du noble et du trivial est la marque du registre comique. * ''Corpus quasi vas est animi.'' (Le corps est comme le vase de l’âme.) (d’après Cicéron) *: ''Commentaire :'' quasi signale la métaphore comme approximation ; précaution du philosophe qui traduit en images, utile à qui rédige un lexique de philosophie. == multus == ''multus, multa, multum'' (adi.) : nombreux, abondant ''Exempla gradatim digesta'' # ''Multae aves cantant.'' (Beaucoup d’oiseaux chantent.) # ''Multa de te audivi.'' (J’ai entendu beaucoup de choses sur toi.) Nota : multa, neutre pluriel substantivé. # ''Multum legendum est, non multa.'' (Il faut lire beaucoup, non beaucoup de choses.) (d’après Pline le Jeune) ''Exempla elocutionis'' * ''Multa paucis dicere ars est.'' (Dire beaucoup en peu de mots est un art.) *: ''Commentaire :'' antithèse quantitative multa / paucis juxtaposée sans liaison ; l’idéal de brevitas énoncé brièvement, la forme prouvant le fond. * ''Multis ille bonis flebilis occidit.'' (Il est mort, pleuré de bien des gens de bien.) (Horace) *: ''Commentaire :'' disjonction multis... bonis qui enserre le vers ; le datif de point de vue fait du deuil collectif l’écrin du défunt. == nunc == (adv.) : maintenant ''Exempla gradatim digesta'' # ''Nunc ludimus.'' (Maintenant nous jouons.) # ''Nunc demum intellego.'' (Maintenant enfin je comprends.) # ''Nunc aut numquam agendum est.'' (C’est maintenant ou jamais qu’il faut agir.) Nota : adjectif verbal impersonnel. ''Exempla elocutionis'' * ''Nunc est bibendum.'' (C’est maintenant qu’il faut boire.) (Horace) *: ''Commentaire :'' nunc en tête, triomphal, libère la joie longtemps contenue (la mort de Cléopâtre) ; l’adverbe de temps devient cri. * ''Nunc huc, nunc illuc currit.'' (Il court tantôt ici, tantôt là.) *: ''Commentaire :'' anaphore alternative nunc... nunc ; la répétition peint l’agitation désordonnée, procédé descriptif élémentaire et sûr. == etiam == (adv.) : aussi, même, encore ''Exempla gradatim digesta'' # ''Etiam ego venio.'' (Moi aussi je viens.) # ''Non solum audivit, sed etiam vidit.'' (Il n’a pas seulement entendu, il a même vu.) # ''Etiam capillus unus habet umbram suam.'' (Même un seul cheveu a son ombre.) (Publilius Syrus) ''Exempla elocutionis'' * ''Etiam atque etiam rogo.'' (Je le demande instamment.) *: ''Commentaire :'' gémination figée etiam atque etiam, insistance codifiée de la langue épistolaire ; la politesse romaine répète au lieu d’intensifier. * ''Non modo pecuniam verum etiam vitam pro patria dedit.'' (Il a donné pour la patrie non seulement son argent mais encore sa vie.) *: ''Commentaire :'' gradation pleine non modo... verum etiam ; l’ordre croissant des sacrifices est obligatoire, l’inverser serait ridicule. == per == (praep. + acc.) : à travers, par, pendant ''Exempla gradatim digesta'' # ''Per viam ambulo.'' (Je marche sur la route.) # ''Per totam noctem vigilavit.'' (Il veilla pendant toute la nuit.) # ''Per me licet: fac quod vis.'' (Pour ma part, je n’y vois pas d’obstacle : fais ce que tu veux.) Nota : per me licet, locution. ''Exempla elocutionis'' * ''Per deos immortales te obtestor!'' (Au nom des dieux immortels, je t’en conjure !) *: ''Commentaire :'' per du serment et de l’adjuration ; la préposition spatiale devient l’opérateur du sacré. Pathos judiciaire et tragique. * ''Per varios casus, per tot discrimina rerum tendimus in Latium.'' (À travers tant de hasards, à travers tant de périls, nous marchons vers le Latium.) (Virgile) *: ''Commentaire :'' anaphore de per qui scande les épreuves ; l’épopée avance préposition par préposition, et le but (in Latium) n’arrive qu’à la fin. == alius == ''alius, alia, aliud'' (pron.) : autre ''Exempla gradatim digesta'' # ''Alius puer venit.'' (Un autre garçon vient.) # ''Alii legunt, alii scribunt.'' (Les uns lisent, les autres écrivent.) # ''Aliud est dicere, aliud facere.'' (Autre chose est de dire, autre chose de faire.) Nota : aliud... aliud distributif. ''Exempla elocutionis'' * ''Alii aliis subsidium ferunt.'' (Ils se portent secours les uns aux autres.) (d’après César) *: ''Commentaire :'' tour distributif alius alii, d’une densité intraduisible ; le latin condense en deux mots ce que le français étale en sept. * ''Aliud clausum in pectore, aliud in lingua promptum habent.'' (Ils ont une chose enfermée dans le cœur, une autre toute prête sur la langue.) (Salluste) *: ''Commentaire :'' antithèse pectore / lingua portée par l’anaphore de aliud ; la duplicité peinte par la symétrie même de la phrase. Style moraliste de Salluste. == ne == (coni. + subi.) : pour que... ne pas ; de peur que ''Exempla gradatim digesta'' # ''Ne timeas!'' (N’aie pas peur !) Nota : défense au subjonctif. # ''Moneo te ne hoc facias.'' (Je t’avertis de ne pas faire cela.) # ''Timeo ne hostes veniant.'' (Je crains que les ennemis ne viennent.) Nota : ne après verbe de crainte = sens positif. ''Exempla elocutionis'' * ''Hominem mortuum in urbe ne sepelito.'' (Qu’on n’ensevelisse pas de mort dans la ville.) (Loi des Douze Tables) *: ''Commentaire :'' ne + impératif futur, syntaxe des lois archaïques ; sécheresse normative, sans considérant ni justification. * ''Ne morte quidem terreri potest.'' (Même la mort ne peut l’effrayer.) *: ''Commentaire :'' ne... quidem encadre exactement le mot nié ; le relief maximal est obtenu par cet étau syntaxique unique en son genre. == neque, nec == (coni.) : et ne... pas, ni ''Exempla gradatim digesta'' # ''Nec legit nec scribit.'' (Il ne lit ni n’écrit.) # ''Neque hoc dixi neque dicere volui.'' (Je n’ai pas dit cela et je n’ai pas voulu le dire.) # ''Nec quisquam tam stultus est ut hoc credat.'' (Et personne n’est assez sot pour croire cela.) Nota : nec quisquam = « et personne ». ''Exempla elocutionis'' * ''Neque enim quisquam tam malus est ut malus videri velit.'' (Car personne n’est assez méchant pour vouloir paraître méchant.) (d’après Quintilien) *: ''Commentaire :'' neque enim, articulation argumentative de la prose d’idées ; la reprise de malus (esse / videri) porte toute la pointe psychologique. * ''Nec deos timuit.'' (Il ne craignit pas même les dieux.) *: ''Commentaire :'' nec à valeur de ne... quidem, condensation fréquente en poésie ; un seul mot fait l’économie d’une locution entière. == tamen == (adv.) : cependant, pourtant ''Exempla gradatim digesta'' # ''Pluit; tamen exeo.'' (Il pleut ; je sors pourtant.) # ''Quamquam senex erat, tamen fortiter pugnavit.'' (Bien qu’il fût vieux, il combattit pourtant avec courage.) # ''Sera tamen tacitis poena venit pedibus.'' (Tardive, la punition vient pourtant à pas silencieux.) (Tibulle) ''Exempla elocutionis'' * ''Vincemur fortasse; pugnabimus tamen.'' (Nous serons vaincus peut-être ; nous combattrons pourtant.) *: ''Commentaire :'' tamen rejeté en fin de phrase, position rare et donc expressive ; la résistance est le dernier mot, littéralement. * ''Ut desint vires, tamen est laudanda voluntas.'' (Même si les forces manquent, la volonté mérite pourtant l’éloge.) (Ovide) *: ''Commentaire :'' concession ut + subjonctif relevée par tamen ; le pentamètre a fait de cette consolation d’exilé une maxime d’école. == enim == (coni.) : en effet, car ''Exempla gradatim digesta'' # ''Tace: magister enim loquitur.'' (Tais-toi : car le maître parle.) Nota : enim toujours en seconde position. # ''Nihil enim sine causa fit.'' (Rien en effet ne se produit sans cause.) # ''Difficile est enim contra naturam pugnare.'' (Il est difficile, en effet, de lutter contre la nature.) ''Exempla elocutionis'' * ''Nemo enim fere saltat sobrius.'' (Car presque personne ne danse à jeun.) (Cicéron) *: ''Commentaire :'' enim, toujours en seconde position, introduit ici une justification faussement sérieuse ; l’humour d’avocat consiste à argumenter l’anodin. * ''Pecunia enim nervus belli est.'' (Car l’argent est le nerf de la guerre.) (d’après Cicéron) *: ''Commentaire :'' métaphore du nerf (nervus, le tendon, la corde de l’arc) ; enim soude la maxime à la démonstration qu’elle vient clore. == vir == ''vir, viri'' (subst. m.) : homme, mari ''Exempla gradatim digesta'' # ''Vir in agro laborat.'' (L’homme travaille dans le champ.) # ''Viri clari de re publica bene meruerunt.'' (Des hommes illustres ont bien mérité de la république.) Nota : bene mereri de = « bien mériter de ». # ''Viro bono nihil mali accidere potest.'' (À l’homme de bien, rien de mauvais ne peut arriver.) (thèse stoïcienne) ''Exempla elocutionis'' * ''Vir bonus dicendi peritus.'' (Un homme de bien expert en parole.) (Caton) *: ''Commentaire :'' définition catonienne de l’orateur, sans verbe, sèche comme une fiche de manuel ; vir bonus d’abord, la technique ensuite : l’ordre des mots est une hiérarchie morale. * ''O virum fortem!'' (Ô le courageux !) *: ''Commentaire :'' accusatif exclamatif ; l’éloge jaillit sans phrase, la syntaxe minimale de l’émotion. == homo == ''homo, hominis'' (subst. m.) : être humain, homme ''Exempla gradatim digesta'' # ''Homines in urbe habitant.'' (Les hommes habitent en ville.) # ''Homo doctus in se semper divitias habet.'' (L’homme instruit porte toujours ses richesses en lui.) (Phèdre) # ''Quot homines, tot sententiae.'' (Autant d’hommes, autant d’avis.) (Térence) ''Exempla elocutionis'' * ''Homo sum: humani nihil a me alienum puto.'' (Je suis homme : rien d’humain ne m’est étranger.) (Térence) *: ''Commentaire :'' polyptote homo / humani ; deux propositions juxtaposées, la seconde déduite de la première sans connecteur. Le manifeste de l’humanisme tient dans une réplique de comédie. * ''Cicero homo novus consul factus est.'' (Cicéron, homme nouveau, devint consul.) *: ''Commentaire :'' homo novus, terme socio-politique technique (premier de sa famille à atteindre les magistratures) ; le style n’est pas que figures, c’est aussi un lexique institutionnel précis. == rex == ''rex, regis'' (subst. m.) : roi ''Exempla gradatim digesta'' # ''Rex coronam gerit.'' (Le roi porte une couronne.) # ''Regibus expulsis, consules creati sunt.'' (Les rois chassés, on créa des consuls.) Nota : ablatif absolu. # ''Stoici dicebant solum sapientem vere regem esse.'' (Les stoïciens disaient que seul le sage est vraiment roi.) Nota : proposition infinitive. ''Exempla elocutionis'' * ''Aut regem aut fatuum nasci oportet.'' (Il faut naître roi ou bouffon.) (adage cité par Sénèque) *: ''Commentaire :'' alternative comique entre les deux seuls hommes qui disent ce qu’ils veulent ; la sagesse passe ici par la boutade. * ''Regem eum appellabant, quod nomen Romae invisum erat.'' (On l’appelait roi, nom odieux à Rome.) *: ''Commentaire :'' rex est, sous la République, un mot chargé négativement ; la stylistique inclut la connotation politique des mots, non leur seul sens. == pater == ''pater, patris'' (subst. m.) : père ''Exempla gradatim digesta'' # ''Pater meus agricola est.'' (Mon père est paysan.) # ''Patres conscripti in curiam convocati sunt.'' (Les sénateurs furent convoqués à la curie.) Nota : patres conscripti = « les sénateurs ». # ''Patris est filios non solum alere sed etiam educare.'' (C’est le devoir d’un père non seulement de nourrir ses fils mais aussi de les éduquer.) ''Exempla elocutionis'' * ''Cicero pater patriae appellatus est.'' (Cicéron fut nommé père de la patrie.) *: ''Commentaire :'' pater patriae, titre honorifique ; la figure étymologique pater / patria donne au titre sa résonance, comme si la langue elle-même le justifiait. * ''O pater, o patria, o Priami domus!'' (Ô père, ô patrie, ô maison de Priam !) (Ennius) *: ''Commentaire :'' triple apostrophe en anaphore, allitération en p ; la lamentation tragique procède par vagues. Vers célèbre, cité par Cicéron comme modèle de pathétique. == primus == ''primus, prima, primum'' (adi.) : premier ''Exempla gradatim digesta'' # ''Primus in ordine sto.'' (Je suis le premier du rang.) # ''Prima luce castra movimus.'' (Au point du jour, nous avons levé le camp.) # ''Primus inter pares habebatur.'' (Il était tenu pour le premier entre ses égaux.) ''Exempla elocutionis'' * ''Primus ego in patriam Musas deducam.'' (Le premier, je conduirai les Muses dans ma patrie.) (d’après Virgile) *: ''Commentaire :'' primus en tête + ego exprimé : double relief pour la revendication de primauté poétique ; topos de l’orgueil littéraire romain. * ''Primum moneo, deinde rogo, postremo minor.'' (D’abord j’avertis, ensuite je prie, enfin je menace.) *: ''Commentaire :'' les adverbes ordinaux structurent la gradation ; trois verbes de plus en plus durs, la colère organisée comme un plan. == bonus == ''bonus, bona, bonum'' (adi.) : bon ''Exempla gradatim digesta'' # ''Mater bona est.'' (La mère est bonne.) # ''Meliora speremus!'' (Espérons mieux !) Nota : subjonctif d’exhortation. # ''Quid sit summum bonum, inter philosophos non convenit.'' (Sur ce qu’est le souverain bien, les philosophes ne s’accordent pas.) Nota : convenit impersonnel. ''Exempla elocutionis'' * ''Boni pastoris est tondere pecus, non deglubere.'' (Un bon berger tond ses bêtes, il ne les écorche pas.) (Tibère, cité par Suétone) *: ''Commentaire :'' métaphore rustique au service d’une maxime fiscale ; le mot d’empereur emprunte sa force à l’image paysanne, comprise de tous. * ''Bona verba, quaeso!'' (Pas de mots de mauvais augure, je te prie !) (Térence) *: ''Commentaire :'' exclamation apotropaïque de la conversation familière ; bona verba relève de la langue religieuse (paroles de bon augure) passée dans l’usage courant. == dies == ''dies, diei'' (subst. m./f.) : jour ''Exempla gradatim digesta'' # ''Dies longus est.'' (Le jour est long.) # ''Die constituta omnes adfuerunt.'' (Au jour fixé, tous furent présents.) Nota : dies au féminin pour une date fixée. # ''Carpe diem, quam minimum credula postero.'' (Cueille le jour, te fiant le moins possible au lendemain.) (Horace) ''Exempla elocutionis'' * ''Dies diem docet.'' (Un jour instruit l’autre.) (d’après Publilius Syrus) *: ''Commentaire :'' polyptote dies / diem, sujet et objet du même mot ; l’expérience cumulative dite par la grammaire elle-même. * ''Amici, diem perdidi.'' (Mes amis, j’ai perdu ma journée.) (Titus, cité par Suétone) *: ''Commentaire :'' mot historique ; l’apostrophe initiale et la brièveté du constat font le pathétique de ce regret impérial (un jour sans bienfait est un jour perdu). == nam == (coni.) : car, en effet ''Exempla gradatim digesta'' # ''Mane domi: nam pluit.'' (Reste à la maison, car il pleut.) # ''Noli timere: nam tecum sum.'' (Ne crains rien, car je suis avec toi.) # ''Nam ut corpus cibo, ita animus litteris alitur.'' (Car de même que le corps se nourrit d’aliments, l’esprit se nourrit des lettres.) Nota : ut... ita corrélatifs. ''Exempla elocutionis'' * ''Nam quid ego de moribus eius dicam?'' (Car que dirais-je de ses mœurs ?) *: ''Commentaire :'' nam de la prétérition : l’orateur feint de renoncer à un développement qu’il annonce ainsi ; figure d’école, toujours efficace. * ''Nam tua res agitur, paries cum proximus ardet.'' (Car c’est ton affaire qui est en jeu, quand brûle le mur du voisin.) (Horace) *: ''Commentaire :'' maxime adossée à une image concrète (l’incendie mitoyen) ; nam articule la leçon générale à l’exemple sensible, démarche de la satire. {{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}} {{AutoCat}} 2kvnktr3degall13rmsg2c5wqyzvno0 Latin/Vocabulaire/Verba Latina frequentissima/051-075 0 83945 767889 767786 2026-06-17T01:00:07Z JackBot 14683 Formatage, [[Spécial:Pages non catégorisées]] 767889 wikitext text/x-wiki {{Sous-pages|Latin/Vocabulaire/Verba Latina frequentissima}} ; iam (adv.) : déjà, désormais : ''Exempla gradata'' :# ''Iam venio!'' (J'arrive !) :# ''Iam diu te exspecto.'' (Je t'attends depuis longtemps.) Nota : iam diu + présent. :# ''Non iam spes ulla salutis erat.'' (Il n'y avait plus aucun espoir de salut.) Nota : non iam = « ne... plus ». : ''Exempla stilistica'' : ''Iamque vale!'' (Et maintenant, adieu !) (Virgile) :: ''Commentaire :'' iamque marque l'instant du basculement ; dans la bouche de l'ombre de Créuse, l'adverbe temporel porte tout le pathétique de la séparation définitive. : ''Hostes iam iamque aderunt.'' (Les ennemis vont arriver d'un instant à l'autre.) :: ''Commentaire :'' gémination iam iamque = l'imminence haletante ; la répétition mime les regards jetés vers l'horizon. ---- ; quam (adv. / coni.) : que, combien ; que (comparaison) : ''Exempla gradata'' :# ''Quam pulchra est rosa!'' (Que la rose est belle !) :# ''Doctior est quam frater.'' (Il est plus savant que son frère.) :# ''Quam quisque norit artem, in hac se exerceat.'' (Que chacun s'exerce dans l'art qu'il connaît.) (Cicéron) Nota : attraction de l'antécédent. : ''Exempla stilistica'' : ''Quam multa, quam paucis!'' (Que de choses, en combien peu de mots !) :: ''Commentaire :'' double exclamation antithétique, elle-même réduite à quatre mots ; l'éloge de la brevitas qui s'applique à lui-même. : ''Quam primum veni!'' (Viens au plus tôt !) :: ''Commentaire :'' quam + superlatif = le degré maximal possible ; tour usuel mais expressif de l'urgence épistolaire. ---- ; autem (coni.) : or, mais, quant à : ''Exempla gradata'' :# ''Ego maneo, tu autem abis.'' (Moi je reste, toi en revanche tu pars.) :# ''Corpus mortale est, animus autem immortalis.'' (Le corps est mortel, l'âme en revanche est immortelle.) :# ''Quod autem ad amicitiam pertinet, postea dicam.'' (Quant à ce qui concerne l'amitié, j'en parlerai plus tard.) Nota : quod ad... pertinet. : ''Exempla stilistica'' : ''Quid autem est mors?'' (Mais qu'est-ce donc que la mort ?) :: ''Commentaire :'' autem introduit la question dialectique, le tournant de l'examen ; c'est la particule du dialogue philosophique, qui relance sans opposer brutalement. : ''Hoc autem ipsum, quod dico, difficile est dictu.'' (Mais cela même que je dis est difficile à dire.) :: ''Commentaire :'' autem de la reprise réflexive ; la prose philosophique revient sur ses propres mots, et le supin dictu fait écho à dico. ---- ; de (praep. + abl.) : au sujet de ; du haut de, de : ''Exempla gradata'' :# ''De monte descendimus.'' (Nous descendons de la montagne.) :# ''De pace agitur.'' (Il est question de la paix.) Nota : agitur de, impersonnel. :# ''De summa rerum senatus decrevit.'' (Le sénat statua sur la situation générale.) Nota : summa rerum = « l'ensemble des affaires ». : ''Exempla stilistica'' : ''De amicitia, de senectute, de officiis Cicero scripsit.'' (Cicéron a écrit sur l'amitié, la vieillesse, les devoirs.) :: ''Commentaire :'' de + ablatif, formule des titres de traités, calque du grec peri ; toute une bibliothèque philosophique tient dans cette préposition. : ''De nihilo nihil fit.'' (Rien ne naît de rien.) (d'après Lucrèce) :: ''Commentaire :'' polyptote nihilo / nihil aux deux pôles de la phrase ; l'axiome épicurien frappé comme une monnaie, la forme close disant la clôture de l'être. ---- ; noster, nostra, nostrum (pron. poss.) : notre : ''Exempla gradata'' :# ''Noster canis latrat.'' (Notre chien aboie.) :# ''Nostri maiores rem publicam sapienter constituerunt.'' (Nos ancêtres ont organisé la république avec sagesse.) :# ''Nostra interest hoc quam primum scire.'' (Il est de notre intérêt de le savoir au plus tôt.) Nota : interest + nostra. : ''Exempla stilistica'' : ''Plato noster haec docet.'' (Notre cher Platon enseigne ceci.) :: ''Commentaire :'' possessif d'affection et d'appartenance d'école (« notre Platon » = celui que nous lisons et aimons) ; tour fréquent chez Cicéron et Sénèque. : ''Nostri acriter restiterunt.'' (Les nôtres résistèrent avec acharnement.) (d'après César) :: ''Commentaire :'' nostri substantivé, langue du communiqué militaire ; le possessif enrôle le lecteur dans le camp romain sans même le nommer. ---- ; meus, mea, meum (pron. poss.) : mon, ma : ''Exempla gradata'' :# ''Mea soror cantat.'' (Ma sœur chante.) :# ''Mea quidem sententia, erras.'' (À mon avis du moins, tu te trompes.) :# ''Meum est officium te monere, tuum parere.'' (Mon devoir est de t'avertir, le tien d'obéir.) : ''Exempla stilistica'' : ''Mi fili!'' (Mon fils !) :: ''Commentaire :'' vocatif mi, forme propre à l'adresse affectueuse ; un seul phonème de différence avec meus, mais tout un registre de tendresse. : ''Mea mihi conscientia pluris est quam omnium sermo.'' (Ma conscience compte plus pour moi que les propos de tous.) (Cicéron) :: ''Commentaire :'' redoublement mea mihi en tête ; le possessif et le datif concentrent la phrase sur l'intériorité, contre la rumeur (sermo) rejetée à la fin. ---- ; tuus, tua, tuum (pron. poss.) : ton, ta : ''Exempla gradata'' :# ''Tuus liber in mensa iacet.'' (Ton livre est posé sur la table.) :# ''Tua sponte hoc fecisti.'' (Tu as fait cela de ton propre gré.) :# ''Non tuum est de hac re iudicare.'' (Ce n'est pas à toi de juger de cette affaire.) : ''Exempla stilistica'' : ''Vale. Tuus Marcus.'' (Porte-toi bien. Ton Marcus.) :: ''Commentaire :'' formule de clôture épistolaire ; le possessif seul, sans verbe, dit le lien. Degré zéro et degré intime de la syntaxe. : ''Quae tua est humanitas, ignosces.'' (Avec la bonté qui est la tienne, tu pardonneras.) :: ''Commentaire :'' relative incise de courtoisie, tournure cicéronienne par excellence ; on enrobe la requête dans l'éloge anticipé. ---- ; venio, venire, veni, ventum (v.) : venir : ''Exempla gradata'' :# ''Amici veniunt.'' (Les amis viennent.) :# ''Mihi in mentem venit veteris amicitiae.'' (Le souvenir de notre vieille amitié me revient à l'esprit.) Nota : venit in mentem + génitif. :# ''Ventum est ad summum montis.'' (On parvint au sommet de la montagne.) Nota : passif impersonnel. : ''Exempla stilistica'' : ''Veni, vidi, vici.'' (Je suis venu, j'ai vu, j'ai vaincu.) (César) :: ''Commentaire :'' asyndète, allitération, isocolie, trois parfaits de même structure ; la vitesse du style égale la vitesse de la campagne. Sommet du laconisme latin. : ''Venit summa dies.'' (Il est venu, le jour suprême.) (Virgile) :: ''Commentaire :'' verbe en tête, position rare et donc dramatique : l'événement surgit avant son sujet ; l'adjectif summa achève le vers funèbre de Troie. ---- ; tantus, tanta, tantum (adi.) : si grand : ''Exempla gradata'' :# ''Tanta turba in foro est!'' (Il y a une si grande foule au forum !) :# ''Tanta vis tempestatis fuit ut naves delerentur.'' (La violence de la tempête fut telle que les navires furent détruits.) :# ''Tantae molis erat Romanam condere gentem.'' (Tant il était laborieux de fonder la nation romaine.) (Virgile) Nota : génitif de qualité. : ''Exempla stilistica'' : ''Tantum religio potuit suadere malorum.'' (Tant la superstition a pu conseiller de crimes.) (Lucrèce) :: ''Commentaire :'' le génitif partitif malorum est rejeté à l'extrême fin du vers : la disjonction tantum... malorum suspend le jugement jusqu'au mot le plus noir. Vers-réquisitoire célèbre. : ''Tanto melior!'' (À la bonne heure ! / Bravo !) :: ''Commentaire :'' ablatif de mesure exclamatif, registre parlé ; la langue familière abrège là où la langue écrite construirait. ---- ; nullus, nulla, nullum (adi.) : aucun, nul : ''Exempla gradata'' :# ''Nullus discipulus abest.'' (Aucun élève n'est absent.) :# ''Nullo modo hoc fieri potest.'' (Cela ne peut se faire d'aucune manière.) :# ''Nulla dies sine linea.'' (Pas un jour sans une ligne.) (adage rapporté par Pline l'Ancien) : ''Exempla stilistica'' : ''Nullius addictus iurare in verba magistri.'' (Tenu de jurer sur les mots d'aucun maître.) (Horace) :: ''Commentaire :'' nullius en tête, disjoint de magistri par tout le vers ; la déclaration d'indépendance philosophique commence par le mot de la négation d'appartenance. : ''Nullus sum!'' (Je suis perdu !) (Plaute) :: ''Commentaire :'' hyperbole comique : « je ne suis plus personne » = « c'en est fait de moi » ; nullus prédicat d'un sujet personnel, audace de la langue parlée. ---- ; locus, loci (subst. m.) : lieu, place : ''Exempla gradata'' :# ''Hic locus pulcher est.'' (Ce lieu est beau.) :# ''Loco cedere turpe est militi.'' (Reculer est honteux pour un soldat.) Nota : loco cedere = « quitter sa position ». :# ''Preces apud eum locum non habuerunt.'' (Les prières n'eurent aucun effet sur lui.) Nota : locum habere = « avoir prise ». : ''Exempla stilistica'' : ''Hi sunt loci communes oratorum.'' (Ce sont là les lieux communs des orateurs.) :: ''Commentaire :'' locus, terme technique de la rhétorique (réservoir d'arguments) ; le sens spatial passé en métaphore institutionnalisée, jusqu'à notre « lieu commun ». : ''Est locus, Hesperiam Grai cognomine dicunt.'' (Il est un lieu, les Grecs le nomment Hespérie.) (Virgile) :: ''Commentaire :'' est locus, formule d'ouverture de l'ecphrasis épique ; le récit s'arrête, la géographie commence. Module narratif hérité d'Homère. ---- ; manus, manus (subst. f.) : main ; troupe : ''Exempla gradata'' :# ''Manus lavo.'' (Je me lave les mains.) :# ''Parva manus militum urbem defendit.'' (Une petite troupe de soldats défendit la ville.) Nota : manus = « troupe ». :# ''Hostes victi manus dederunt.'' (Les ennemis vaincus se rendirent.) Nota : manus dare = « se rendre ». : ''Exempla stilistica'' : ''Manus manum lavat.'' (Une main lave l'autre.) (Sénèque, Pétrone) :: ''Commentaire :'' polyptote proverbial ; la réciprocité intéressée dite par la grammaire de la réflexivité. Registre populaire assumé. : ''Res in manibus est.'' (L'affaire est en cours. / L'affaire nous occupe.) :: ''Commentaire :'' métaphore de la proximité immédiate : ce qu'on a « dans les mains » est ce qu'on traite ; idiome de la prose d'affaires et des lettres. ---- ; bellum, belli (subst. n.) : guerre : ''Exempla gradata'' :# ''Bellum malum est.'' (La guerre est un mal.) :# ''Bello confecto, milites domum redierunt.'' (La guerre achevée, les soldats rentrèrent chez eux.) Nota : ablatif absolu. :# ''Bellum nec timendum nec provocandum est.'' (Il ne faut ni craindre la guerre ni la provoquer.) Nota : double adjectif verbal. : ''Exempla stilistica'' : ''Bellum omnium contra omnes.'' (La guerre de tous contre tous.) (Hobbes) :: ''Commentaire :'' formule néo-latine (XVIIe siècle), à signaler comme telle dans un dictionnaire de philosophie ; le polyptote omnium / omnes lui donne sa frappe pseudo-antique. : ''Bella, horrida bella cerno.'' (Des guerres, d'horribles guerres, voilà ce que je vois.) (Virgile) :: ''Commentaire :'' gémination prophétique de bella, épithète expressive horrida ; la Sibylle parle par répétitions, le style mime la transe. ---- ; causa, causae (subst. f.) : cause, raison ; procès : ''Exempla gradata'' :# ''Causa morbi ignota est.'' (La cause de la maladie est inconnue.) :# ''Honoris causa venit.'' (Il est venu pour rendre hommage.) Nota : causa postposé + génitif. :# ''Multae sunt causae cur hoc credam.'' (Il y a bien des raisons pour que je le croie.) Nota : cur + subjonctif. : ''Exempla stilistica'' : ''Et propter vitam vivendi perdere causas.'' (Et pour sauver sa vie, perdre les raisons de vivre.) (Juvénal) :: ''Commentaire :'' paradoxe construit sur l'opposition vitam / vivendi causas ; la satire morale atteint ici la densité d'une thèse philosophique. : ''Reus causam dixit.'' (L'accusé a plaidé sa cause.) :: ''Commentaire :'' causam dicere, locution technique de la langue judiciaire ; le style, c'est aussi savoir reconnaître les syntagmes figés des institutions. ---- ; pars, partis (subst. f.) : partie, côté : ''Exempla gradata'' :# ''Partem panis accipio.'' (Je reçois une part de pain.) :# ''Maxima pars hominum hoc credit.'' (La plupart des hommes le croient.) :# ''Partes boni civis agere debemus.'' (Nous devons jouer le rôle d'un bon citoyen.) Nota : partes agere. : ''Exempla stilistica'' : ''Pars sanitatis velle sanari fuit.'' (Vouloir guérir était déjà une part de la guérison.) (Sénèque) :: ''Commentaire :'' maxime à pointe : l'infinitif sujet (velle sanari) et le parfait gnomique ; la psychologie morale condensée en sept mots. : ''Pro mea parte adiuvabo.'' (J'aiderai pour ma part.) :: ''Commentaire :'' formule de contribution mesurée ; la modestie codifiée de la prose de collaboration, sans figure mais non sans politesse. ---- ; urbs, urbis (subst. f.) : ville : ''Exempla gradata'' :# ''Urbs magna est Roma.'' (Rome est une grande ville.) :# ''Urbe capta, cives fugerunt.'' (La ville prise, les citoyens s'enfuirent.) Nota : ablatif absolu. :# ''Romae, in urbe omnium pulcherrima, diu vixit.'' (Il vécut longtemps à Rome, la plus belle des villes.) Nota : locatif + apposition. : ''Exempla stilistica'' : ''Romanae spatium est urbis et orbis idem.'' (L'espace de la ville de Rome et celui du monde ne font qu'un.) (Ovide) :: ''Commentaire :'' paronomase urbis / orbis, un seul phonème d'écart pour dire l'idéologie impériale ; le calembour élevé à la dignité de doctrine. : ''In Urbem redire cupio.'' (Je désire rentrer à Rome.) :: ''Commentaire :'' antonomase : urbs absolu désigne Rome seule ; pour un Romain, il n'y a qu'une Ville, et l'article manquant du latin est suppléé par l'évidence. ---- ; capio, capere, cepi, captum (v.) : prendre, saisir : ''Exempla gradata'' :# ''Piscem cepi.'' (J'ai pris un poisson.) :# ''Consilium cepimus fugiendi.'' (Nous avons formé le projet de fuir.) Nota : consilium capere + génitif du gérondif. :# ''Amore captus, omnia reliquit.'' (Saisi par l'amour, il abandonna tout.) : ''Exempla stilistica'' : ''Exordium captat benevolentiam iudicum.'' (L'exorde cherche à capter la bienveillance des juges.) :: ''Commentaire :'' capere et son fréquentatif captare ont fourni le vocabulaire technique de la rhétorique (captatio benevolentiae) ; la chasse comme métaphore du discours. : ''Nec te Troia capit.'' (Troie même est trop petite pour toi.) (Virgile) :: ''Commentaire :'' capere = « contenir » ; l'hyperbole héroïque loge la grandeur d'un homme dans un verbe d'espace. Litote et démesure à la fois. ---- ; populus, populi (subst. m.) : peuple : ''Exempla gradata'' :# ''Populus in foro convenit.'' (Le peuple se rassemble au forum.) :# ''Senatus populusque Romanus legatos misit.'' (Le sénat et le peuple romain envoyèrent des ambassadeurs.) :# ''Salus populi suprema lex esto.'' (Que le salut du peuple soit la loi suprême.) (Cicéron) Nota : esto, impératif futur. : ''Exempla stilistica'' : ''Maiestas populi Romani laesa est.'' (La majesté du peuple romain a été lésée.) :: ''Commentaire :'' génitif officiel des formules d'État (populi Romani) ; style juridique, où chaque mot est pesé et aucun n'est imagé. : ''Populus me sibilat, at mihi plaudo.'' (Le peuple me siffle, mais moi je m'applaudis.) (Horace) :: ''Commentaire :'' antithèse de la foule et de l'individu (populus / mihi, sibilat / plaudo) ; le sage se passe du suffrage du nombre, et le balancement de la phrase oppose le jugement public à la conscience de soi. ---- ; idem, eadem, idem (pron.) : le même : ''Exempla gradata'' :# ''Eundem librum lego.'' (Je lis le même livre.) :# ''Eadem nocte profecti sumus.'' (Nous sommes partis la même nuit.) :# ''Idem velle atque idem nolle, ea demum firma amicitia est.'' (Vouloir et refuser les mêmes choses, voilà la solide amitié.) (Salluste) : ''Exempla stilistica'' : ''Vultus erat semper idem.'' (Son visage était toujours le même.) :: ''Commentaire :'' l'identité d'humeur du sage (on le disait de Socrate) ; idem prédicat, sans image ni emphase : la constance dite par la constance du style. : ''Vir doctissimus idemque modestissimus.'' (Un homme très savant et tout aussi modeste.) :: ''Commentaire :'' idemque cumule les qualités en signalant que leur réunion est remarquable ; l'éloge procède par addition étonnée. ---- ; corpus, corporis (subst. n.) : corps : ''Exempla gradata'' :# ''Corpus meum fessum est.'' (Mon corps est fatigué.) :# ''Mens sana in corpore sano optanda est.'' (Il faut souhaiter un esprit sain dans un corps sain.) (d'après Juvénal) :# ''Animus corpori imperat sicut rex civibus suis.'' (L'âme commande au corps comme un roi à ses citoyens.) (d'après Salluste) : ''Exempla stilistica'' : ''Res publica unum corpus est.'' (L'État est un seul corps.) :: ''Commentaire :'' métaphore organiciste, fondatrice de toute une tradition politique (l'apologue de Ménénius Agrippa) ; l'image fait la doctrine. : ''Corpora prima Lucretius ea vocat quae dividi non possunt.'' (Lucrèce appelle corps premiers ceux qui ne peuvent être divisés.) :: ''Commentaire :'' corpora prima, périphrase latine pour les atomes grecs ; le traducteur philosophe préfère la périphrase native à l'emprunt. Leçon de méthode pour tout lexique philosophique latin. ---- ; vita, vitae (subst. f.) : vie : ''Exempla gradata'' :# ''Vita pulchra est.'' (La vie est belle.) :# ''Vitam rusticam poetae laudant.'' (Les poètes louent la vie des champs.) :# ''Non est vivere sed valere vita est.'' (Vivre, ce n'est pas être en vie, c'est être en bonne santé.) (Martial) : ''Exempla stilistica'' : ''O vita misero longa, felici brevis!'' (Ô vie, longue pour le malheureux, brève pour l'heureux !) (Publilius Syrus) :: ''Commentaire :'' apostrophe à la vie, double antithèse en chiasme (misero longa / felici brevis) ; la sentence dramatique faite pour être déclamée. : ''Vitam beatam vivere omnes cupiunt.'' (Tous désirent vivre une vie heureuse.) :: ''Commentaire :'' figure étymologique vitam vivere ; le complément interne, banal en grec, garde en latin une légère solennité. Vita beata, terme technique de l'éthique antique. ---- ; modus, modi (subst. m.) : manière, mesure : ''Exempla gradata'' :# ''Quo modo vales?'' (Comment te portes-tu ?) :# ''Servandus est modus in omnibus rebus.'' (Il faut garder la mesure en toutes choses.) :# ''Eius modi homines vitandi sunt.'' (Il faut éviter les hommes de cette espèce.) Nota : eius modi = « de ce genre ». : ''Exempla stilistica'' : ''Est modus in rebus, sunt certi denique fines.'' (Il y a une mesure dans les choses, il y a enfin des limites précises.) (Horace) :: ''Commentaire :'' parallélisme est / sunt, et denique qui feint l'impatience ; la doctrine du juste milieu énoncée sur le ton de l'évidence excédée. : ''Modo ridet, modo flet.'' (Tantôt il rit, tantôt il pleure.) :: ''Commentaire :'' modo... modo, anaphore alternative (cf. nunc... nunc) ; l'instabilité d'humeur peinte par le balancement de la phrase. ---- ; nomen, nominis (subst. n.) : nom : ''Exempla gradata'' :# ''Nomen meum scribo.'' (J'écris mon nom.) :# ''Nomine tantum rex erat, re vera servus.'' (Il n'était roi que de nom ; en réalité, il était esclave.) Nota : nomine / re opposés. :# ''Nomen atque omen.'' (Le nom est un présage.) (Plaute) : ''Exempla stilistica'' : ''Stat magni nominis umbra.'' (Il demeure, ombre d'un grand nom.) (Lucain) :: ''Commentaire :'' métaphore de l'ombre pour la grandeur survivante d'elle-même (Pompée) ; le génitif magni nominis enchâssé fait tout le vers. L'un des plus beaux raccourcis de la poésie latine. : ''Amicitiae nomine multa peccantur.'' (Bien des fautes se commettent au nom de l'amitié.) :: ''Commentaire :'' nomine = « sous couvert de » ; l'ablatif seul suffit à dénoncer l'écart entre le mot et la chose, thème moraliste par excellence. ---- ; miles, militis (subst. m.) : soldat : ''Exempla gradata'' :# ''Miles gladium gerit.'' (Le soldat porte un glaive.) :# ''Milites urbi praesidio erant.'' (Les soldats servaient de garnison à la ville.) Nota : double datif. :# ''Militis est parere, imperatoris providere.'' (Au soldat d'obéir, au général de prévoir.) : ''Exempla stilistica'' : ''Miles Romanus laborare didicit.'' (Le soldat romain a appris à peiner.) :: ''Commentaire :'' singulier collectif des historiens ; miles = l'armée entière, vue comme un type. Stylisation épique de la prose historique. : ''Miles gloriosus a Plauto deridetur.'' (Le soldat fanfaron est raillé par Plaute.) :: ''Commentaire :'' miles gloriosus, type comique devenu titre ; l'épithète suffit à camper le personnage. Le style crée des emplois figés que la culture transmet. ---- ; mors, mortis (subst. f.) : mort : ''Exempla gradata'' :# ''Mors vitae finis est.'' (La mort est la fin de la vie.) :# ''Morte patris audita, domum rediit.'' (À la nouvelle de la mort de son père, il rentra chez lui.) Nota : ablatif absolu. :# ''Mors, ut Stoicis videtur, nec bonum nec malum est.'' (La mort, selon les stoïciens, n'est ni un bien ni un mal.) Nota : ut videtur incise. : ''Exempla stilistica'' : ''Mors ultima linea rerum est.'' (La mort est la ligne d'arrivée des choses.) (Horace) :: ''Commentaire :'' métaphore empruntée au cirque (la ligne blanche au bout de la piste) ; l'image sportive apprivoise l'effroi. Définition par déplacement. : ''Pallida Mors aequo pulsat pede pauperum tabernas regumque turris.'' (La pâle Mort frappe d'un pied égal les cabanes des pauvres et les tours des rois.) (Horace) :: ''Commentaire :'' personnification, allitération en p, antithèse sociale pauperum / regum (turris, accusatif pluriel archaïque) ; l'égalité devant la mort dite par une symétrie parfaite des images. {{#invoke:Sous-Page|sousPage|taille préfixe=0.7em|taille titre=115%|italique=non}} {{AutoCat}} d3755iqucfbizmem3e821bva3676uzi Latin/Vocabulaire/Verba Latina frequentissima/Sommaire 0 83946 767890 767804 2026-06-17T01:00:08Z JackBot 14683 Formatage, [[Spécial:Pages non catégorisées]] 767890 wikitext text/x-wiki * [[Latin/Vocabulaire/Verba Latina frequentissima/001-025|001-025]] * [[Latin/Vocabulaire/Verba Latina frequentissima/026-050|026-050]] * [[Latin/Vocabulaire/Verba Latina frequentissima/051-075|051-075]] * [[Latin/Vocabulaire/Verba Latina frequentissima/076-100|076-100]] * [[Latin/Vocabulaire/Verba Latina frequentissima/101-125|101-125]] * [[Latin/Vocabulaire/Verba Latina frequentissima/126-150|126-150]] * [[Latin/Vocabulaire/Verba Latina frequentissima/151-175|151-175]] * [[Latin/Vocabulaire/Verba Latina frequentissima/176-200|176-200]] * [[Latin/Vocabulaire/Verba Latina frequentissima/201-225|201-225]] * [[Latin/Vocabulaire/Verba Latina frequentissima/226-250|226-250]] * [[Latin/Vocabulaire/Verba Latina frequentissima/251-275|251-275]] * [[Latin/Vocabulaire/Verba Latina frequentissima/276-300|276-300]] * [[Latin/Vocabulaire/Verba Latina frequentissima/301-325|301-325]] * [[Latin/Vocabulaire/Verba Latina frequentissima/326-350|326-350]] * [[Latin/Vocabulaire/Verba Latina frequentissima/351-375|351-375]] * [[Latin/Vocabulaire/Verba Latina frequentissima/376-400|376-400]] * [[Latin/Vocabulaire/Verba Latina frequentissima/401-425|401-425]] * [[Latin/Vocabulaire/Verba Latina frequentissima/426-450|426-450]] * [[Latin/Vocabulaire/Verba Latina frequentissima/451-475|451-475]] * [[Latin/Vocabulaire/Verba Latina frequentissima/476-500|476-500]] * [[Latin/Vocabulaire/Verba Latina frequentissima/501-525|501-525]] * [[Latin/Vocabulaire/Verba Latina frequentissima/526-550|526-550]] * [[Latin/Vocabulaire/Verba Latina frequentissima/551-575|551-575]] * [[Latin/Vocabulaire/Verba Latina frequentissima/576-600|576-600]] * [[Latin/Vocabulaire/Verba Latina frequentissima/601-625|601-625]] * [[Latin/Vocabulaire/Verba Latina frequentissima/626-650|626-650]] * [[Latin/Vocabulaire/Verba Latina frequentissima/651-675|651-675]] * [[Latin/Vocabulaire/Verba Latina frequentissima/676-700|676-700]] * [[Latin/Vocabulaire/Verba Latina frequentissima/701-725|701-725]] * [[Latin/Vocabulaire/Verba Latina frequentissima/726-750|726-750]] * [[Latin/Vocabulaire/Verba Latina frequentissima/751-775|751-775]] * [[Latin/Vocabulaire/Verba Latina frequentissima/776-800|776-800]] * [[Latin/Vocabulaire/Verba Latina frequentissima/801-825|801-825]] * [[Latin/Vocabulaire/Verba Latina frequentissima/826-850|826-850]] * [[Latin/Vocabulaire/Verba Latina frequentissima/851-875|851-875]] * [[Latin/Vocabulaire/Verba Latina frequentissima/876-900|876-900]] * [[Latin/Vocabulaire/Verba Latina frequentissima/901-925|901-925]] * [[Latin/Vocabulaire/Verba Latina frequentissima/926-950|926-950]] * [[Latin/Vocabulaire/Verba Latina frequentissima/951-975|951-975]] * [[Latin/Vocabulaire/Verba Latina frequentissima/976-1000|976-1000]] {{AutoCat}} 37c6rjybcas1fa95fdsd7hbcyy71nop Dictionnaire de philosophie/Pierre Kropotkine 0 83949 767844 2026-06-16T16:39:56Z PandaMystique 119061 Page créée avec « {{DicoPhilo|Pierre Kropotkine}} [[Fichier:Atelier Nadar - Pierre Kropotkine.jpg|vignette|upright=1.1|Pierre Kropotkine, photographie de l'atelier Nadar.]] Prince russe issu de la lignée de Rurik, géographe primé par les sociétés savantes de son temps, officier formé à la cour impériale, Pierre Kropotkine (1842-1921) employa toute son énergie à montrer que les sociétés humaines pouvaient se gouverner sans gouvernants. On le présente souvent comme « l... » 767844 wikitext text/x-wiki {{DicoPhilo|Pierre Kropotkine}} [[Fichier:Atelier Nadar - Pierre Kropotkine.jpg|vignette|upright=1.1|Pierre Kropotkine, photographie de l'atelier Nadar.]] Prince russe issu de la lignée de Rurik, géographe primé par les sociétés savantes de son temps, officier formé à la cour impériale, Pierre Kropotkine (1842-1921) employa toute son énergie à montrer que les sociétés humaines pouvaient se gouverner sans gouvernants. On le présente souvent comme « le prince anarchiste », formule commode qui dit la rupture sociale mais en masque l'essentiel : Kropotkine fut d'abord celui qui voulut donner à l'[[Dictionnaire de philosophie/Anarchisme|anarchie]] une assise scientifique. Là où d'autres en faisaient une exigence morale ou un cri de révolte, il entreprit de l'enraciner dans la nature elle-même, en s'appuyant sur la biologie, l'histoire et l'observation. Sa thèse centrale tient en un mot, qu'il emprunte au langage courant pour lui donner un sens technique : l'entraide. Contre l'idée, dominante à la fin du XIX{{e}}&nbsp;siècle, que la nature serait une arène où chaque individu lutte contre tous, il soutient que la coopération à l'intérieur d'une même espèce constitue un facteur de l'évolution, souvent plus important que la concurrence. De cette observation naturaliste, il tire une conséquence politique : si la sociabilité est inscrite dans le vivant, alors la contrainte de l'État n'a rien de nécessaire. Deux livres portent cette double ambition : ''La Conquête du pain'' (1892), où il dessine une société communiste sans pouvoir central, et ''L'Entraide, un facteur de l'évolution'' (1902), où il argumente la biologie de la coopération. == Repères biographiques == [[Fichier:Peter Kropotkin 1864.png|vignette|Kropotkine en 1864, durant ses années sibériennes.]] Kropotkine naît à Moscou le 9 décembre 1842, dans une famille de la haute aristocratie possédant des serfs. L'enfance se passe au contact de cette servitude domestique, dont il gardera une mémoire précise et indignée : c'est là, plus tard, qu'il situera l'une des sources de sa sensibilité sociale. Entré à près de quinze ans au corps des Pages, l'école la plus fermée de l'Empire, il côtoie le tsar Alexandre II, dont il devient brièvement le page de chambre. Il en sort en 1862 avec les meilleures notes et une décision qui consterne son entourage : au lieu d'une carrière dans la garde, il demande à servir en Sibérie. Les cinq années sibériennes (1862-1867) forment le tournant. Officier cosaque sur l'Amour, il parcourt à cheval des milliers de kilomètres, lève des cartes, étudie les glaciers et la faune. Deux apprentissages s'y croisent. Le premier est scientifique : ses relevés sur la structure des montagnes d'Asie et sur l'extension des anciennes glaciations lui vaudront une réputation de géographe. Le second est politique, et il le formulera sans détour dans ses souvenirs : l'expérience de l'administration impériale lui apprend l'impuissance du commandement. C'est en Sibérie, écrira-t-il, qu'il perdit toute foi dans la discipline d'État, ayant découvert que rien d'utile ne s'accomplit par l'ordre et la punition, mais seulement par l'accord de volontés convergentes. Un poète exilé, Mikhaïlov, lui met alors entre les mains le ''Système des contradictions économiques'' de Proudhon<ref>Pierre Kropotkine, ''Autour d'une vie. Mémoires''. Sur cet épisode, voir George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', Londres, 1950, p. 57-58.</ref>. De retour dans la capitale, il étudie les mathématiques, travaille pour la Société géographique russe et acquiert une notoriété savante. Membre actif du comité chargé de préparer une expédition arctique, il déduit vers 1871, de la dérive des glaces et des courants au large de la Nouvelle-Zemble, l'existence de terres encore inconnues plus au nord ; cette hypothèse parut confirmée deux ans plus tard par une expédition autrichienne conduite par Julius Payer et Carl Weyprecht, qui baptise l'archipel « Terre François-Joseph ». C'est aussi en 1871 que la Société géographique russe lui offre son secrétariat, c'est-à-dire une vie tout entière vouée à la recherche. Il refuse. La crise morale qui motive ce refus éclaire tout le reste : de quel droit, se demande-t-il, jouir des plaisirs élevés du savoir quand tout, autour de lui, n'est que misère et lutte pour un morceau de pain ? La science lui paraît un privilège tant qu'elle n'est pas le bien de tous<ref>Pierre Kropotkine, ''Autour d'une vie. Mémoires'' ; passage cité et commenté par Ángel Cappelletti, ''El pensamiento de Kropotkin''.</ref>. En 1872, un voyage en Suisse précipite sa conversion. Il y rencontre la Fédération jurassienne, l'aile antiautoritaire de l'Association internationale des travailleurs, et noue des liens avec James Guillaume puis avec l'horloger Adhémar Schwitzguébel, qui l'introduit auprès des ouvriers de Sonvilier. L'indépendance des horlogers du Jura, leur façon de penser par eux-mêmes et de s'organiser sans chefs, l'impressionne vivement : c'est au sortir de ces montagnes, dira-t-il, que ses vues sur le socialisme se fixèrent et qu'il se sut anarchiste. Il rentre en Russie chargé de littérature socialiste, rejoint le cercle Tchaïkovski et porte la propagande chez les ouvriers et les paysans. Arrêté en mars 1874, au lendemain d'une conférence donnée devant la Société géographique sur les formations glaciaires, il passe deux ans au secret dans la forteresse Pierre-et-Paul, où sa santé se délabre. Transféré à l'hôpital militaire, il s'en évade en 1876, et cette évasion devient aussitôt légendaire<ref>Brian Morris, ''Kropotkin'', Oakland, PM Press, 2018, premier chapitre ; Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 113-124.</ref>. Commence alors un exil de plus de quarante ans. Il fonde et anime le journal ''Le Révolté'', d'abord à Genève. L'assassinat d'Alexandre II en 1881 entraîne l'expulsion des réfugiés russes ; Kropotkine passe en France, où un procès l'envoie à la prison de Clairvaux de 1883 à 1886. Sa détention émeut le monde savant : le naturaliste Alfred Russel Wallace, le poète Swinburne, l'écrivain et artisan socialiste William Morris et nombre de collaborateurs de l{{'}}''Encyclopædia Britannica'' signent une pétition pour sa libération, que Victor Hugo remet en personne au ministre de la Justice ; Renan et l'Académie des sciences de Paris mettent leurs bibliothèques à sa disposition. Signe d'une rivalité intellectuelle durable, Huxley refuse d'y joindre son nom<ref>Ángel Cappelletti, ''El pensamiento de Kropotkin'', p. 388 ; sur les signataires, le refus de Huxley et la remise de la pétition au ministre par Victor Hugo, George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 193-195.</ref>. Libéré, il s'installe en Angleterre, où il écrira ses grands livres. L'unité du mouvement se brise en 1914. Hostile de longue date au militarisme, Kropotkine n'est pourtant pas pacifiste : il redoute que la victoire de l'Allemagne impériale n'écrase en Europe toute espérance d'émancipation. En 1916, il signe avec Jean Grave, Tcherkesov et quelques autres le « Manifeste des Seize », qui prend parti pour les Alliés. La majorité de ses compagnons, Malatesta, Emma Goldman, Alexandre Berkman, Rudolf Rocker, y voient un reniement et s'éloignent de lui<ref>Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 230-238 ; Brian Morris, ''Kropotkin'', 2018.</ref>. La révolution de février 1917 ouvre enfin le retour. En juin, après plus de quarante ans d'exil, Kropotkine rentre en Russie ; une foule d'environ soixante mille personnes l'accueille à Petrograd, en pleine nuit. Mais l'espoir tourne court. Kerenski lui propose un ministère, qu'il refuse, comme il refuse tout poste du gouvernement provisoire ; les anarchistes, de leur côté, lui tiennent rigueur de son ralliement à la guerre. Il s'installe à Moscou, puis se retire en 1918 à Dmitrov, petite ville au nord de la capitale, où il travaille avec la coopérative locale et achève son traité d'éthique. En mai 1919, une entrevue avec Lénine, ménagée par Bontch-Brouïevitch et connue surtout par le récit qu'en a laissé ce dernier, met face à face deux conceptions inconciliables de la révolution : Kropotkine plaide pour les coopératives et les syndicats, que Lénine juge « bavardages », tandis que Lénine défend la dictature et la terreur. Il n'offrira au pouvoir, prévient-il, qu'une aide négative : lui signaler ses fautes. Ses dernières interventions publiques seront des protestations, l'une contre la mainmise de l'État sur la presse, l'autre contre la pratique des otages. Il meurt à Dmitrov le 8 février 1921. Ses funérailles rassemblent des dizaines de milliers de personnes et forment le dernier grand rassemblement anarchiste que la Russie soviétique tolérera : des militants obtiennent une libération provisoire de prison pour y assister<ref>Brian Morris, ''Kropotkin'', 2018 ; Martin A. Miller, ''Kropotkin'', 1976, p. 240-247 ; le compte rendu de l'entretien provient de Vladimir Bontch-Brouïevitch, témoin proche du pouvoir soviétique, et la datation des rencontres avec Lénine demeure discutée.</ref>. == L'entraide comme facteur d'évolution == Pour saisir la portée de l'entraide, il faut se replacer dans le climat intellectuel des années 1880. Le darwinisme, vulgarisé et durci, sert alors à justifier la concurrence économique : la nature serait un champ de bataille où survit le plus apte, et la société devrait s'y conformer. En 1888, le biologiste Thomas Huxley publie un essai retentissant, ''The Struggle for Existence in Human Society'', qui décrit le monde vivant comme une lutte de gladiateurs et la vie tribale comme une guerre de chacun contre tous, à la manière de Hobbes. C'est à cette image que Kropotkine veut répondre. Sa réponse ne sort pas d'un cabinet, mais des forêts de Sibérie. Lecteur de ''L'Origine des espèces'', il y avait cherché en vain la concurrence acharnée entre animaux d'une même espèce que Darwin lui avait appris à attendre. Avec le zoologiste Ivan Poliakov, son compagnon d'exploration dans les régions du Vitim et de l'Amour, il avait parcouru ces terres l'esprit encore plein de Darwin, sans y rencontrer cette guerre intestine. Ce qu'il observait, c'était autre chose : des adaptations contre le froid et les ennemis, des oiseaux et des ruminants s'entraidant lors des migrations, des espèces luttant ensemble contre la disette plutôt que les unes contre les autres. Une conférence du zoologiste russe Karl Kessler, en 1880, lui fournit la formule qu'il fera sienne : l'appui mutuel est une loi de la nature au même titre que la lutte, mais, pour le progrès de l'espèce, il importe davantage. Kropotkine remarque d'ailleurs que les darwiniens russes, moins marqués par Malthus que leurs collègues anglais, avaient depuis longtemps cette intuition<ref>Pierre Kropotkine, ''L'Entraide, un facteur de l'évolution'', premier chapitre ; sur le contexte scientifique, Brian Morris, ''Kropotkin'', 2018.</ref>. Le livre déploie cette thèse en une vaste fresque, des sociétés animales aux « sauvages », des « barbares » à la cité médiévale, jusqu'aux pratiques d'entraide des sociétés modernes. L'argument biologique est précis : ce ne sont pas les individus les plus rivaux qui survivent, mais les espèces les plus sociables, parce que la coopération conserve mieux la vie et favorise les facultés qui assurent l'avenir du groupe. La conclusion renverse le mot d'ordre que Spencer avait forgé et que le darwinisme social reprit à son compte : « les plus aptes » sont les plus solidaires. Kropotkine se garde pourtant de l'excès inverse. Il refuse l'idylle de Rousseau autant que la guerre de Huxley : la nature n'est ni paix pure ni carnage. Surtout, il précise que l'entraide n'est qu'un facteur de l'évolution parmi d'autres, et reconnaît la part de l'affirmation individuelle. À un correspondant qui voulait modifier le titre de son livre, il rappelle qu'il n'a jamais prétendu expliquer comment l'entraide agit sur l'évolution, seulement montrer qu'elle y agit<ref>Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886'', Cambridge, 1989, p. 5-6.</ref>. Une part de sa biologie a depuis vieilli, en particulier son lamarckisme et sa croyance en l'hérédité des caractères acquis, que la génétique du XX{{e}}&nbsp;siècle, à laquelle travailla notamment Theodosius Dobzhansky, devait écarter. L'intuition centrale, en revanche, a tenu : Ashley Montagu a jugé que ses données et ses analyses résistaient bien à l'examen, et Stephen Jay Gould lui a rendu justice dans un essai au titre éloquent, « Kropotkin Was No Crackpot »<ref>Sur le lamarckisme de Kropotkine et la synthèse génétique ultérieure, comme sur le jugement d'Ashley Montagu, Brian Morris, ''Kropotkin'', 2018 ; Stephen Jay Gould, « Kropotkin Was No Crackpot », repris dans ''Bully for Brontosaurus'', 1991.</ref>. == Le communisme anarchiste == [[Fichier:La conquête du pain.jpg|vignette|Couverture de ''La Conquête du pain'' (1892), où Kropotkine expose le communisme anarchiste.]] Kropotkine n'a pas inventé l'anarchisme, ni même le communisme anarchiste, dont il fut plutôt le théoricien le plus écouté. Son apport tient à un déplacement précis à l'intérieur du socialisme antiautoritaire. Les héritiers de Bakounine se disaient « collectivistes » : ils voulaient socialiser les moyens de production, mais laissaient subsister une rétribution proportionnée au travail fourni. Au congrès de la Fédération jurassienne tenu à La Chaux-de-Fonds en octobre 1880, il pèse de tout son poids pour faire adopter un autre mot et une autre idée. Le terme de collectivisme, juge-t-il, garde l'odeur du salariat ; il faut lui préférer le communisme, c'est-à-dire la distribution selon les [[Dictionnaire de philosophie/Besoin|besoins]]. Il avait préparé le terrain, écrivant à Reclus et à Cafiero pour s'assurer de leur appui ; mais devant des délégués hésitants, que le mot effrayait, la résolution ne l'emporta que grâce au discours de Carlo Cafiero. La formule elle-même n'était pas neuve : Dumartheray l'avait esquissée dès 1876, et l'idée mûrissait alors dans les groupes italiens et espagnols<ref>Sur le congrès de La Chaux-de-Fonds et le rôle de Cafiero, Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886'', Cambridge, 1989, p. 51-64 ; Brian Morris, ''Kropotkin'', 2018.</ref>. L'argument de fond est une critique de la propriété appuyée sur l'histoire de la richesse. Toute production, soutient Kropotkine, est sociale et héritée : chaque parcelle de sol cultivée en Europe a été arrosée de la sueur de plusieurs générations. Les routes, les machines, le savoir accumulé, rien de tout cela n'est l'œuvre d'un seul homme. Dès lors, comment mesurer la part de chacun ? La question est sans réponse, et c'est là que le salariat se révèle injuste : il prétend évaluer une contribution individuelle qui se perd dans un tissu collectif. « De quel droit, demande-t-il, s'approprier la moindre parcelle de cet immense ensemble et dire : ceci est à moi, non à vous ? »<ref>Pierre Kropotkine, ''La Conquête du pain'', premier chapitre (« Nos richesses »).</ref> Kropotkine en tire la formule qu'il reprend au socialisme français : de chacun selon ses moyens, à chacun selon ses besoins. À ceux qui réclament une part proportionnelle, il oppose l'image simple du tas commun où chacun puise. ''La Conquête du pain'' (1892) tire les conséquences pratiques. Une révolution, pour Kropotkine, doit assurer dès le premier jour le bien-être de tous, faute de quoi elle perdra le soutien populaire. Il ne suffit donc pas de socialiser les usines, comme le veulent les collectivistes et les sociaux-démocrates ; il faut socialiser aussi le logement, les vivres, les vêtements, qui sont pour le travailleur des instruments de production au même titre que l'outil. Abolir la propriété privée des moyens de production tout en la maintenant sur les biens de consommation, c'est, dit-il, asseoir la société sur deux principes contraires : elle retombera dans la propriété ou ira jusqu'au communisme. Contre l'objection de la pénurie, il répond par le rationnement local au début, puis par l'essor d'une production que la science rend possible. Et il écarte une caricature : le communisme qu'il défend n'est pas la grande exploitation autoritaire, la charrue à vapeur passée sur les jardins et les vergers ; on ne touchera pas au lopin du paysan qui le cultive lui-même, avec ses enfants, sans salariés<ref>Pierre Kropotkine, ''La Conquête du pain'', 1892 ; cf. Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 9.</ref>. À l'économie politique, dans sa version libérale comme dans certaines lectures marxistes, il oppose encore un renversement de méthode. Les économistes partent de la production telle qu'elle existe, puis cherchent comment écouler les marchandises ; il faut partir des besoins, soutient Kropotkine, car c'est le besoin qui pousse d'abord l'homme à produire. De là sa réfutation de la théorie de la surproduction : les crises ne viennent pas de ce qu'on produit trop, mais de ce que les masses, tenues dans la pauvreté par l'organisation marchande, consomment trop peu. Loin de produire en excès, l'époque produirait plutôt trop peu, si l'on mesurait la production aux besoins réels qu'elle laisse insatisfaits<ref>Pierre Kropotkine, ''La Conquête du pain'' ; George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 318-319.</ref>. == L'intégration du travail et l'éducation intégrale == Le même refus de la spécialisation gouverne ''Champs, usines et ateliers'' (1899). Kropotkine y attaque la division du travail qu'Adam Smith avait érigée en principe. Cette division, écrivait-il déjà dans ''La Conquête du pain'', revient à étiqueter et marquer les hommes pour la vie : l'un épissera des cordages dans une fabrique, l'autre poussera d'énormes paniers de charbon au fond d'une mine, sans que nul comprenne jamais la machine, le métier ni la mine dans leur ensemble ; ainsi se perdent le goût du travail et la faculté d'inventer qui, aux débuts de l'industrie moderne, avaient créé les machines dont on s'enorgueillit. À la division, il oppose l'intégration : réunir l'agriculture et l'industrie, le travail du cerveau et celui de la main, décentraliser la production, faire en sorte que chaque région produise et consomme une grande variété de biens grâce à une agriculture intensive et à de petits ateliers<ref>Pierre Kropotkine, ''La Conquête du pain'' et ''Champs, usines et ateliers'' ; pour la formule citée, George Woodcock et Ivan Avakumovic, ''The Anarchist Prince'', 1950, p. 322 et 322-327.</ref>. Cette intégration appelle une autre école. Kropotkine se méfie de l'« éducation technique » réclamée de son temps, qui ne ferait que pérenniser la coupure entre savants et manœuvres. Il lui préfère l'éducation intégrale : que chaque être humain, sans distinction de naissance, joigne une connaissance réelle des sciences à la maîtrise d'un métier manuel. L'idée n'a rien d'utopique à ses yeux, et il convoque l'histoire des sciences pour le prouver : Galilée taillait ses lunettes, Leibniz inventait des machines, Linné devint botaniste en cultivant le jardin de son père. Le travail manuel, loin de nuire à la pensée abstraite, la nourrit. On reconnaît là une tradition continentale : l'expression même d'éducation intégrale remonte à Fourier, l'idée fut portée par Bakounine et par les pédagogues libertaires Paul Robin et Jean Grave, et Kropotkine, lecteur aussi de William Morris, l'introduit le premier dans le débat éducatif britannique<ref>Pierre Kropotkine, ''Champs, usines et ateliers'' ; Ruth Kinna, ''Kropotkin. Reviewing the Classical Anarchist Tradition'', Édimbourg, 2016, p. 133-134 ; sur la nouveauté de cette position dans les milieux éducatifs britanniques, Brian Morris, ''Kropotkin'', 2018.</ref>. == Une morale tirée de la nature == Le dernier grand chantier de Kropotkine, resté inachevé, est une éthique. Publié après sa mort, son traité (dont nous n'avons que le premier tome) veut fonder la [[Dictionnaire de philosophie/Morale|morale]] sur les résultats des sciences naturelles, sans recourir ni à la religion ni à aucune transcendance. L'entreprise prolonge ''L'Entraide'' : si la sociabilité est un fait de nature, elle peut servir de sol aux sentiments moraux. Kropotkine décrit alors une série ascendante en trois degrés. À la base, l'entraide, c'est-à-dire l'instinct social que nous partageons avec les animaux grégaires et que Darwin tenait pour plus constant encore que l'instinct de conservation. Au-dessus, la justice, qu'il entend au sens de l'équité, soit la reconnaissance de l'[[Dictionnaire de philosophie/Égalité|égalité]] entre les hommes ; il en crédite Proudhon, qui avait fait de la justice le principe premier de toute morale en la dressant contre l'injustice réelle. Au sommet, ce qu'il nomme la magnanimité, le don de soi sans attente de retour, propre à l'homme et qui mérite seul le nom de morale. La nature, résume-t-il, est le premier instructeur moral de l'homme<ref>Pierre Kropotkine, ''L'Éthique'' ; George Crowder, ''Classical Anarchism. The Political Thought of Godwin, Proudhon, Bakunin, and Kropotkin'', Oxford, 1991, p. 162-163.</ref>. Cette généalogie naturaliste se construit contre deux adversaires. Contre Kant d'abord. Kropotkine reconnaît au devoir kantien, à l'impératif catégorique, une grandeur certaine ; mais il lui reproche de laisser entière la question de l'origine du sens moral. Pourquoi obéir à la loi morale ? D'où vient ce commandement mystérieux ? En traitant la morale comme un domaine séparé du monde naturel, Kant, selon lui, se condamne à la faire dériver d'une source quasi divine, sans l'enraciner dans ce sentiment d'égalité qui, pour Kropotkine, fait le fond de la justice<ref>Pierre Kropotkine, ''L'Éthique'' ; voir Brian Morris, ''Kropotkin'', 2018, sur la lecture kropotkinienne de Kant.</ref>. Contre l'utilitarisme ensuite : Kropotkine ne le tient pas pour faux, mais pour court. La morale est plus que la pesée prudente des plaisirs ; le seul calcul du plaisir peut même conduire aux pires conduites. Reste l'influence qu'il revendique, celle de Jean-Marie Guyau et de son ''Esquisse d'une morale sans obligation ni sanction'' (1884). Guyau partait de la vie comme expansion : nous sentons en nous plus de force, plus d'amour, plus de larmes que nous n'en pouvons employer pour nous-mêmes, et de ce trop-plein naît le mouvement vers autrui, comme la plante fleurit sans y être contrainte. Le devoir n'est alors que la conscience d'un pouvoir. Kropotkine adopte cette morale de la surabondance, mais lui ajoute ce que Guyau avait laissé dans l'ombre : la dimension sociale. La morale, conclut-il, est le produit conjoint de l'instinct, du sentiment et de la raison ; elle ne se réduit pas aux faits de la vie, elle s'y appuie<ref>Jean-Marie Guyau, ''Esquisse d'une morale sans obligation ni sanction'', 1884 ; sur l'usage qu'en fait Kropotkine, Ruth Kinna, ''Kropotkin'', 2016, p. 150-151, et Ángel Cappelletti, ''El pensamiento de Kropotkin''.</ref>. == L'anarchie comme conception scientifique du monde == Ce souci de fonder en nature vaut aussi pour la politique. Kropotkine présente l'anarchie non comme une doctrine parmi d'autres, mais comme une vision d'ensemble du monde, ce que les penseurs allemands nomment ''Weltanschauung'', appuyée sur la méthode des sciences de la nature. L'anarchie, écrit-il, ne reconnaît pas d'autre méthode que celle des sciences naturelles. Son objet est de se former une idée de l'univers entier, y compris l'homme et la société, par la voie de l'induction et de la déduction, comme on étudie une fleur ou une ruche. Puisque l'esprit humain et la vie sociale sont des phénomènes naturels, rien ne justifie de changer de méthode en passant de la fleur à l'homme, ou de la colonie de castors à la cité<ref>Pierre Kropotkine, ''La Science moderne et l'anarchie'' ; Richard Morgan, ''The Making of Kropotkin's Anarchist Thought'', Londres, 2020, p. 74-75.</ref>. Cette position le sépare de deux côtés. D'un côté, des [[Dictionnaire de philosophie/Métaphysique|métaphysiques]] de la religion et de l'idéalisme allemand : il rejette aussi bien le dieu tout-puissant que l'Esprit universel de Hegel. De l'autre, de la [[Dictionnaire de philosophie/Dialectique|dialectique]] marxiste, qu'il tient pour une survivance de cette même métaphysique. Il avait pourtant emprunté à Comte et à Spencer l'idée d'une philosophie synthétique, embrassant d'un même mouvement la nature et la société, sans les suivre lorsqu'ils faisaient de la lutte pour la vie une loi sociale. La science, à ses yeux, ne livre jamais de vérités définitives, seulement une approximation toujours révisable, à la manière dont l'entendait le physiologiste Claude Bernard. Son attachement à la science alla d'ailleurs jusqu'à l'aveuglement : en 1913, il s'en prit vivement à Bergson, coupable selon lui de rabaisser la science en accordant trop à l'intuition dans la découverte<ref>Sur cette attaque de 1913, Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 2 ; sur l'ambition synthétique héritée de Comte et Spencer, Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', p. 3.</ref>. Sa critique de [[Dictionnaire de philosophie/Karl Marx|Marx]] procède du même principe. ''Le Capital'', concède-t-il, est un admirable pamphlet, mais sa portée scientifique lui paraît nulle : le matérialisme historique est à ses yeux [[Dictionnaire de philosophie/Déterminisme|déterministe]], donc paralysant pour l'action, et fondé sur des prédictions que les faits ont démenties<ref>Lettre de Kropotkine à James Guillaume (1903), citée par Caroline Cahm, ''Kropotkin and the Rise of Revolutionary Anarchism'', 1989, p. 3.</ref>. Il y a là un point que ses propres lecteurs lui ont retourné. À vouloir faire de l'anarchie une science, Kropotkine retombe parfois dans le défaut qu'il dénonçait chez Huxley, Spencer ou Marx : il s'appuie moins sur des lois vérifiables que sur une analogie séduisante entre la nature et la société. L'historien Martin Miller a noté que cet « anarchisme scientifique » repose sur une métaphore puissante, mais fragile<ref>Martin A. Miller, ''Kropotkin'', Chicago, 1976, p. 189.</ref>. == L'État, la commune et le fédéralisme == L'État, pour Kropotkine, ne se confond pas avec la société. C'est une formation historique, née pour protéger les privilèges d'une minorité, et qu'il convient d'étudier froidement, avec la même disposition d'esprit que s'il s'agissait d'une société de fourmis ou d'abeilles<ref>Pierre Kropotkine, « L'État, son rôle historique » et ''La Science moderne et l'anarchie'' ; pour la citation sur la méthode, Richard Morgan, ''The Making of Kropotkin's Anarchist Thought'', 2020, p. 74.</ref>. Cette approche le conduit à relire le Moyen Âge à rebours des Lumières dont il se réclame pourtant. Dans les cités libres, fédérations de quartiers et de guildes confédérées entre elles, il voit la forme la plus aboutie d'organisation sans État : entraide, arbitrage à la place du jugement, prix fixés d'un commun accord, approvisionnement assuré par la commune. Et ces villes savaient s'unir : la ligue lombarde, les ligues rhénane et toscane, les vieux cantons suisses montrent à ses yeux que des communes pouvaient se fédérer librement, par pacte et sans se soumettre à un centre. Jamais, ose-t-il écrire, ni avant ni depuis, l'humanité ne connut un bien-être pour tous comparable à celui des cités du Moyen Âge. L'État moderne, militaire et monarchique, se serait édifié du XVI{{e}} au XVIII{{e}}&nbsp;siècle sur les ruines de ces communes. La bourgeoisie, ensuite, n'a pas détruit cet appareil : elle en a hérité et l'a transformé à son profit. De là vient la défiance de Kropotkine envers tout « État ouvrier ». Confier à l'État la terre, les mines, les banques et les usines, comme le proposent les socialistes autoritaires, ce serait forger un instrument de tyrannie plus puissant encore, un capitalisme d'État où le pouvoir passe du capitaliste au bureaucrate. Les classes opprimées qui s'emparent de l'État, prévient-il, deviennent à leur tour des classes oppressives<ref>Ángel Cappelletti, ''El pensamiento de Kropotkin'' ; Pierre Kropotkine, ''La Science moderne et l'anarchie''.</ref>. Le progrès est ailleurs : dans la décentralisation, territoriale et fonctionnelle, dans la libre fédération des communes et des groupes, dans une organisation qui monte de la base vers le sommet et de la périphérie vers le centre, au rebours de la hiérarchie existante. La tournure que prit la révolution russe lui parut, jusqu'à sa mort, donner raison à ces avertissements. == Tensions et postérité == L'édifice de Kropotkine n'a pas échappé à la critique, et c'est sur son point d'appui même, la nature, qu'elle a porté. Si la morale et la politique se déduisent de l'ordre naturel, encore faut-il que la nature enseigne quelque chose en matière de valeurs. Or rien n'est moins sûr. George Crowder a montré que tout l'anarchisme classique, Kropotkine compris, repose sur un « naturalisme éthique » : l'idée que la valeur est inscrite dans le tissu du monde et que la science l'y découvrira. Cette idée se heurte à l'objection de Mill, selon laquelle la conformité à la nature n'a aucun rapport avec le bien et le mal. Entre le fait et la valeur, entre ce qui est et ce qui doit être, la science moderne a plutôt creusé un fossé qu'elle ne l'a comblé. La promesse de lire dans le vivant les règles de la conduite humaine paraît, à cette lumière, intenable<ref>George Crowder, ''Classical Anarchism'', 1991, p. 183-184, citant John Stuart Mill, ''La Nature''.</ref>. Ses défenseurs répondent que l'on simplifie sa position. Kropotkine, fait observer Brian Morris, prétendait fonder la morale sur les faits de la vie, non l'y réduire ; il rejetait la séparation rigide du fait et de la valeur, et tenait la connaissance scientifique pour une série d'approximations, non pour un dogme. Sa naturalisation de l'éthique serait ainsi moins naïve qu'il n'y paraît : elle ne tire pas un devoir d'un fait, elle reconnaît dans la sociabilité le terrain où poussent les sentiments moraux<ref>Brian Morris, ''Kropotkin'', PM Press, 2018.</ref>. Le débat reste ouvert, et il déborde Kropotkine : c'est celui de tout naturalisme moral. On lui a reproché aussi un optimisme trop confiant, sur la bonté humaine comme sur l'abondance prochaine. Son influence a pourtant traversé le siècle. Les travaux sur la coopération, l'[[Dictionnaire de philosophie/Altruisme|altruisme]] et la théorie des jeux évolutionnaire lui ont donné en partie raison. L'écologie sociale de Murray Bookchin, la géographie attentive aux communautés, les réflexions sur l'autogestion et le municipalisme lui doivent beaucoup. Et le tour autoritaire que prit la révolution russe, qu'il dénonça jusqu'à sa mort, a donné à sa critique de l'État un écho qu'elle n'avait pas de son vivant. Le « prince anarchiste » aura voulu, en somme, ce que peu osent encore : penser ensemble la nature et la liberté. == Notes et références == {{references|colonnes=2}} == Œuvres principales == === Écrits de Kropotkine === * ''Paroles d'un révolté'', recueil d'articles établi par Élisée Reclus, Paris, 1885 ([[s:Paroles d'un révolté|texte sur Wikisource]]). * ''Aux jeunes gens'', 1880 ([[s:Aux jeunes gens|texte sur Wikisource]]). * ''La Morale anarchiste'', 1891 ([[s:La Morale anarchiste|texte sur Wikisource]]). * ''La Conquête du pain'', Paris, 1892 ([[s:La Conquête du pain|texte sur Wikisource]]). * ''Champs, usines et ateliers'', 1899 ([[s:Champs, usines et ateliers|texte sur Wikisource]]). * ''Autour d'une vie. Mémoires'', Paris, 1902 (édition originale anglaise : ''Memoirs of a Revolutionist'', 1899). * ''L'Entraide, un facteur de l'évolution'', 1902 (édition anglaise : ''Mutual Aid: A Factor of Evolution'' ; traduction française, 1906). * ''La Grande Révolution, 1789-1793'', Paris, 1909 ([[s:La Grande Révolution|texte sur Wikisource]]). * ''La Science moderne et l'anarchie'', Paris, 1913. * ''L'Éthique'', publication posthume (édition russe, 1922 ; traduction anglaise, ''Ethics: Origin and Development'', 1924 ; [[s:L’Éthique|texte français sur Wikisource]]). === Études === * {{Ouvrage|langue=en|prénom1=Caroline|nom1=Cahm|titre=Kropotkin and the Rise of Revolutionary Anarchism, 1872-1886|lieu=Cambridge|éditeur=Cambridge University Press|année=1989}} * {{Ouvrage|langue=en|prénom1=George|nom1=Crowder|titre=Classical Anarchism|sous-titre=The Political Thought of Godwin, Proudhon, Bakunin, and Kropotkin|lieu=Oxford|éditeur=Clarendon Press|année=1991}} * {{Ouvrage|langue=en|prénom1=Ruth|nom1=Kinna|titre=Kropotkin|sous-titre=Reviewing the Classical Anarchist Tradition|lieu=Édimbourg|éditeur=Edinburgh University Press|année=2016}} * {{Ouvrage|langue=en|prénom1=Martin A.|nom1=Miller|titre=Kropotkin|lieu=Chicago|éditeur=University of Chicago Press|année=1976}} * {{Ouvrage|langue=en|prénom1=Richard|nom1=Morgan|titre=The Making of Kropotkin's Anarchist Thought|lieu=Londres|éditeur=Routledge|année=2020}} * {{Ouvrage|langue=en|prénom1=Brian|nom1=Morris|titre=Kropotkin|sous-titre=The Politics of Community|lieu=Oakland|éditeur=PM Press|année=2018}} * {{Ouvrage|langue=en|prénom1=George|nom1=Woodcock|prénom2=Ivan|nom2=Avakumovic|titre=The Anarchist Prince|sous-titre=A Biographical Study of Peter Kropotkin|lieu=Londres|éditeur=T. V. Boardman|année=1950}} * {{Ouvrage|langue=es|prénom1=Ángel|nom1=Cappelletti|titre=El pensamiento de Kropotkin|sous-titre=ciencia, ética y anarquía|lieu=Madrid|éditeur=Zero|année=1978}} * {{Ouvrage|langue=en|prénom1=Pierre|nom1=Kropotkine|responsabilité1=édition de Marshall S. Shatz|titre=The Conquest of Bread and Other Writings|lieu=Cambridge|éditeur=Cambridge University Press|année=1995}} {{AutoCat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Kropotkine, Pierre}} 4tcqzgno0t1cefnx1ivklti8vqrm77k