{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Transpiler-Plugins installieren und verwenden\"\n",
        "description: \"So installieren und verwenden Sie Transpiler-Plugins in Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# Transpiler-Plugins installieren und verwenden\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a4052f5-554d-4633-a588-eb0583f66871",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Paketversionen\">\n",
        "    Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt.\n",
        "    Wir empfehlen die Verwendung dieser oder neuerer Versionen.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "12018a80-a1ce-4508-9d04-23c4176028e6",
      "metadata": {},
      "source": [
        "Um die Entwicklung und Wiederverwendung von benutzerdefiniertem Transpilationscode durch die breitere Gemeinschaft der Qiskit-Benutzer zu erleichtern, unterstützt das Qiskit-SDK eine Plugin-Schnittstelle, die es Paketen von Drittanbietern ( Python ) ermöglicht, zu erklären, dass sie erweiterte Transpilationsfunktionen bereitstellen, die über Qiskit zugänglich sind.\n",
        "\n",
        "Derzeit können Plugins von Drittanbietern erweiterte Transpilationsfunktionen auf drei Arten bereitstellen:\n",
        "\n",
        "* Ein [Transpiler-Stage-Plugin](/docs/api/qiskit/transpiler_plugins) bietet einen Passmanager, der anstelle einer der [6 Stufen](transpiler-stages) eines voreingestellten gestuften Passmanagers verwendet werden kann: `init`, `layout`, `routing`, `translation`, `optimization`, und `scheduling`.\n",
        "* Ein [unitäres Synthese-Plugin](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) bietet erweiterte Funktionen für die Synthese unitärer Gatter.\n",
        "* Ein [High-Level-Synthese-Plugin](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) bietet erweiterte Funktionen zur Synthese von \"High-Level-Objekten\" wie linearen Funktionen oder Clifford-Operatoren. Objekte der höheren Ebene werden durch Unterklassen der Klasse [Operation](/docs/api/qiskit/qiskit.circuit.Operation) dargestellt.\n",
        "\n",
        "Der Rest der Seite beschreibt, wie man verfügbare Plugins auflistet, neue Plugins installiert und sie verwendet.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## Verfügbare Plugins auflisten und neue installieren\n",
        "\n",
        "Qiskit enthält bereits einige integrierte Plugins für die Transpilierung. Um mehr zu installieren, können Sie Ihren Python Paketmanager verwenden. Sie könnten zum Beispiel `pip install qiskit-toqm` ausführen, um das [Qiskit TOQM](https://github.com/qiskit-toqm/qiskit-toqm) Routing Stage Plugin zu installieren. Eine Reihe von Plugins von Drittanbietern sind Teil des [Qiskit-Ökosystems](https://qiskit.github.io/ecosystem/#transpiler_plugin).\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### Liste der verfügbaren Transpiler-Stage-Plugins\n",
        "\n",
        "Verwenden Sie die Funktion [list\\_stage\\_plugins](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins) und übergeben Sie den Namen der Bühne, deren Plugins Sie auflisten möchten.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "817254a8-77d7-4eb4-8630-623e67bb2186",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['default', 'dense', 'sabre', 'trivial']"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins\n",
        "\n",
        "list_stage_plugins(\"layout\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "354f9be8-3567-4449-ba60-4d1c3258bb50",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['basic', 'default', 'lookahead', 'none', 'sabre']"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "list_stage_plugins(\"routing\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac57d3ce-afb3-4aba-8601-93513d4dd491",
      "metadata": {},
      "source": [
        "Wenn `qiskit-toqm` installiert wäre, würde `toqm` in der Liste der `routing` Plugins erscheinen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### Liste der verfügbaren einheitlichen Synthese-Plugins\n",
        "\n",
        "Verwenden Sie die Funktion [unitary\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "596cbb3d-2ece-4193-929c-79149f7e23bd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['aqc', 'clifford', 'default', 'gridsynth', 'sk']"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names\n",
        "\n",
        "unitary_synthesis_plugin_names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e33885d4-788f-4759-bd63-e26d7a45ff9e",
      "metadata": {},
      "source": [
        "<span id=\"list-available-high-level-synthesis-plugins\" />\n",
        "\n",
        "### Liste der verfügbaren Plugins für die High-Level-Synthese\n",
        "\n",
        "Verwenden Sie die Funktion [high\\_level\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names) und übergeben Sie den Namen des Typs des zu synthetisierenden \"High-Level-Objekts\". Der Name entspricht dem [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) attribut der Klasse [Operation](/docs/api/qiskit/qiskit.circuit.Operation), die den Typ des zu synthetisierenden Objekts darstellt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['rb_default', 'ag', 'bm', 'default', 'greedy', 'layers', 'lnn']"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import (\n",
        "    high_level_synthesis_plugin_names,\n",
        ")\n",
        "\n",
        "high_level_synthesis_plugin_names(\"clifford\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "583d7529-ab3e-449d-b7d0-e732801d7ae0",
      "metadata": {},
      "source": [
        "Sie können die [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) klasse können Sie die Namen aller High-Level-Synthese-Plugins auflisten:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['clifford.rb_default',\n",
              " 'FullAdder.default',\n",
              " 'FullAdder.ripple_c04',\n",
              " 'FullAdder.ripple_v95',\n",
              " 'HalfAdder.default',\n",
              " 'HalfAdder.qft_d00',\n",
              " 'HalfAdder.ripple_c04',\n",
              " 'HalfAdder.ripple_r25',\n",
              " 'HalfAdder.ripple_v95',\n",
              " 'IntComp.default',\n",
              " 'IntComp.noaux',\n",
              " 'IntComp.twos',\n",
              " 'ModularAdder.default',\n",
              " 'ModularAdder.modular_v17',\n",
              " 'ModularAdder.qft_d00',\n",
              " 'ModularAdder.ripple_c04',\n",
              " 'ModularAdder.ripple_v95',\n",
              " 'Multiplier.cumulative_h18',\n",
              " 'Multiplier.default',\n",
              " 'Multiplier.qft_r17',\n",
              " 'PauliEvolution.default',\n",
              " 'PauliEvolution.rustiq',\n",
              " 'WeightedSum.default',\n",
              " 'annotated.default',\n",
              " 'clifford.ag',\n",
              " 'clifford.bm',\n",
              " 'clifford.default',\n",
              " 'clifford.greedy',\n",
              " 'clifford.layers',\n",
              " 'clifford.lnn',\n",
              " 'linear_function.default',\n",
              " 'linear_function.kms',\n",
              " 'linear_function.pmh',\n",
              " 'mcmt.default',\n",
              " 'mcmt.noaux',\n",
              " 'mcmt.vchain',\n",
              " 'mcmt.xgate',\n",
              " 'mcx.1_clean_b95',\n",
              " 'mcx.1_clean_kg24',\n",
              " 'mcx.1_dirty_kg24',\n",
              " 'mcx.2_clean_kg24',\n",
              " 'mcx.2_dirty_kg24',\n",
              " 'mcx.default',\n",
              " 'mcx.gray_code',\n",
              " 'mcx.n_clean_m15',\n",
              " 'mcx.n_dirty_i15',\n",
              " 'mcx.noaux_hp24',\n",
              " 'mcx.noaux_v24',\n",
              " 'permutation.acg',\n",
              " 'permutation.basic',\n",
              " 'permutation.default',\n",
              " 'permutation.kms',\n",
              " 'permutation.token_swapper',\n",
              " 'qft.default',\n",
              " 'qft.full',\n",
              " 'qft.line']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis.plugin import (\n",
        "    HighLevelSynthesisPluginManager,\n",
        ")\n",
        "\n",
        "HighLevelSynthesisPluginManager().plugins.names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eed49d1-4723-4366-9edc-1f5aa73907ba",
      "metadata": {},
      "source": [
        "<span id=\"use-a-plugin\" />\n",
        "\n",
        "## Verwenden Sie ein Plugin\n",
        "\n",
        "In diesem Abschnitt zeigen wir, wie man Transpiler-Plugins verwendet. In den Codebeispielen verwenden wir Plugins, die mit Qiskit geliefert werden, aber Plugins, die aus Paketen von Drittanbietern installiert werden, werden auf die gleiche Weise verwendet.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### Verwenden Sie ein Transpiler-Stage-Plugin\n",
        "\n",
        "Um ein Transpiler-Stufen-Plugin zu verwenden, geben Sie dessen Namen mit dem entsprechenden Argument für [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) oder an [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Das Argument wird gebildet, indem an den Namen der `_method` Transpilationsstufe angehängt wird. Um beispielsweise das `lookahead` Routing-Plugin zu verwenden, würden wir für das `routing_method` Argument `lookahead` angeben.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  In diesen Beispielen wird das `FakeSherbrooke``qiskit_ibm_runtime` Mock-Backend von verwendet, Sie können es jedoch mit jedem Qiskit-kompatiblen echten oder simulierten Backend ausprobieren.  Ihre Ergebnisse können davon abweichen.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "d5e598b3-9226-4fbc-ac76-8eca08ec4af3",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, routing_method=\"lookahead\"\n",
        ")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "657db73c-7064-4569-a212-87642f16216e",
      "metadata": {},
      "source": [
        "<span id=\"use-a-unitary-synthesis-plugin\" />\n",
        "\n",
        "### Verwenden Sie ein einheitliches Synthese-Plugin\n",
        "\n",
        "Um ein unitäres Synthese-Plugin zu verwenden, geben Sie dessen Namen als Argument `unitary_synthesis_method` an [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) oder [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "28184c68-4b1e-46d2-a8a0-5480814bad9b",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend,\n",
        "    unitary_synthesis_method=\"sk\",\n",
        "    unitary_synthesis_plugin_config=dict(\n",
        "        basis_gates=[\"cz\", \"id\", \"rz\", \"sx\", \"x\"]\n",
        "    ),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c019cb3d-5069-4257-bfb6-e15600caa342",
      "metadata": {},
      "source": [
        "Die unitäre Synthese wird in den Stufen `init`, `translation` und `optimization` des staged pass manager verwendet, der von [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) zurückgegeben oder in [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Eine Beschreibung dieser Phasen finden Sie unter [Transpiler-Stufen](transpiler-stages).\n",
        "\n",
        "Verwenden Sie das Argument `unitary_synthesis_plugin_config` , ein frei formuliertes Wörterbuch, um Optionen für die unitäre Synthesemethode zu übergeben. Die Dokumentation der Synthesemethode sollte erklären, welche Optionen sie unterstützt. In [dieser Liste](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2) finden Sie Links zur Dokumentation der eingebauten unitären Synthese-Plugins.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### Verwenden Sie ein Plugin für die High-Level-Synthese\n",
        "\n",
        "Erstellen Sie zunächst eine [HLSConfig](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig), um um die Namen der Plugins zu speichern, die für verschiedene High-Level-Objekte verwendet werden sollen. Zum Beispiel:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "d4672004-aead-4827-9c10-5c70c3c2289b",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler.passes import HLSConfig\n",
        "\n",
        "hls_config = HLSConfig(clifford=[\"layers\"], linear_function=[\"pmh\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eab8d19-4b58-4f50-a205-039288e4a00d",
      "metadata": {},
      "source": [
        "Diese Codezelle erstellt eine High-Level-Synthesekonfiguration, die das `layers` -Plugin für die Synthese von [Clifford-Objekten](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) und das `pmh` -Plugin für die Synthese von [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) objekte verwendet. Die Namen der Schlüsselwortargumente entsprechen den [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) attribut der Klasse [Operation](/docs/api/qiskit/qiskit.circuit.Operation), die den Typ des zu synthetisierenden Objekts darstellt.\n",
        "Für jedes High-Level-Objekt wird die Liste der angegebenen Plugins nacheinander ausprobiert, bis eines davon erfolgreich ist (im obigen Beispiel enthält jede Liste nur ein einziges Plugin).\n",
        "\n",
        "Zusätzlich zur Angabe von können Sie stattdessen auch ein `(name, options)` Tupel übergeben, wobei das zweite Element des Tupels ein Wörterbuch mit Optionen für das Plugin ist. Die Dokumentation der Synthesemethode sollte erklären, welche Optionen sie unterstützt. In [dieser Liste](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2) finden Sie Links zu den Dokumentationen der eingebauten High-Level-Synthese-Plugins.\n",
        "\n",
        "Sobald Sie das Objekt `HLSConfig` erstellt haben, übergeben Sie es als `hls_config` argument an [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) oder [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "8784b881-2f37-4f75-b5c7-c84cdb8b8a60",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, hls_config=hls_config\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ea63c611-c213-4736-83f7-c46e918eb862",
      "metadata": {},
      "source": [
        "Die High-Level-Synthese wird in den Phasen `init`, `translation` und `optimization` des gestuften Pass-Managers verwendet, der von [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) zurückgegeben oder in [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Eine Beschreibung dieser Phasen finden Sie unter [Transpiler-Stufen](transpiler-stages).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlung\">\n",
        "  * [Erstelle ein Transpiler-Plugin](/docs/guides/create-transpiler-plugin).\n",
        "  * In den [Tutorien](/docs/tutorials) finden Sie Beispiele für die Transpilierung und den Betrieb von Quantenschaltungen.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}