{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Installare e utilizzare i plugin transpiler\"\n",
        "description: \"Come installare e utilizzare i plugin transpiler in Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# Installare e utilizzare i plugin transpiler\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=\"Versioni del pacchetto\">\n",
        "    Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o versioni più recenti.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.1\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": [
        "Per facilitare lo sviluppo e il riutilizzo di codice di transpilazione personalizzato da parte della più ampia comunità di utenti di Qiskit, l'SDK di Qiskit supporta un'interfaccia di plugin che consente ai pacchetti di terze parti di Python di dichiarare che forniscono funzionalità di transpilazione estese accessibili tramite Qiskit.\n",
        "\n",
        "Attualmente, i plugin di terze parti possono fornire funzionalità di transpilazione estese in tre modi:\n",
        "\n",
        "* Un [plugin transpiler stage](/docs/api/qiskit/transpiler_plugins) fornisce un pass manager che può essere utilizzato al posto di uno dei [6 stadi](transpiler-stages) di uno staged pass manager preimpostato: `init`, `layout`, `routing`, `translation`, `optimization`, e `scheduling`.\n",
        "* Un [plugin per la sintesi unitaria](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) fornisce funzionalità estese per la sintesi di porte unitarie.\n",
        "* Un [plugin di sintesi di alto livello](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) fornisce funzionalità estese per la sintesi di \"oggetti di alto livello\" come funzioni lineari o operatori di Clifford. Gli oggetti di alto livello sono rappresentati da sottoclassi della classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation).\n",
        "\n",
        "Il resto della pagina descrive come elencare i plugin disponibili, installarne di nuovi e utilizzarli.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## Elenca i plugin disponibili e installa quelli nuovi\n",
        "\n",
        "Qiskit include già alcuni plugin integrati per la trasposizione. Per installarne altri, si può usare il gestore di pacchetti Python. Ad esempio, si può eseguire `pip install qiskit-toqm` per installare il plugin dello stadio di routing [Qiskit TOQM](https://github.com/qiskit-toqm/qiskit-toqm). Una serie di plugin di terze parti fa parte dell' [ecosistema Qiskit](https://qiskit.github.io/ecosystem/#transpiler_plugin).\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### Elenco dei plugin disponibili per la fase di transpilazione\n",
        "\n",
        "Utilizzare la funzione [list\\_stage\\_plugins](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins), passando il nome dello stadio di cui si vogliono elencare i plugin.\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": [
        "Se `qiskit-toqm` fosse installato, allora `toqm` apparirebbe nell'elenco dei plugin di `routing` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### Elenco dei plugin di sintesi unitari disponibili\n",
        "\n",
        "Utilizzare la funzione [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",
        "### Elenco dei plugin di sintesi di alto livello disponibili\n",
        "\n",
        "Utilizzare la funzione [high\\_level\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names), passando il nome del tipo di \"oggetto di alto livello\" da sintetizzare. Il nome corrisponde all'attributo [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) della classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation) che rappresenta il tipo di oggetto da sintetizzare.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']"
            ]
          },
          "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": [
        "È possibile utilizzare la classe [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) per elencare i nomi di tutti i plugin di sintesi di alto livello:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['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',\n",
              " 'clifford.rb_default']"
            ]
          },
          "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",
        "## Utilizza un plugin\n",
        "\n",
        "In questa sezione viene mostrato come utilizzare i plugin del transpiler. Negli esempi di codice, utilizziamo i plugin forniti con Qiskit, ma i plugin installati da pacchetti di terze parti vengono utilizzati allo stesso modo.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### Utilizza un plugin per la fase di transpilazione\n",
        "\n",
        "Per utilizzare un plugin di fase di transpilazione, specificarne il nome con l'argomento appropriato in [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). L'argomento viene formato aggiungendo `_method` al nome della fase di transpilazione. Ad esempio, per utilizzare il plugin `lookahead` di routing, dovremmo specificare `lookahead` come argomento `routing_method` .\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  In questi esempi viene utilizzato il backend `FakeSherbrooke``qiskit_ibm_runtime` fittizio di, ma è possibile provarlo su qualsiasi backend reale o fittizio compatibile con Qiskit.  I tuoi risultati potrebbero essere diversi.\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",
        "### Utilizza un plugin di sintesi unitario\n",
        "\n",
        "Per utilizzare un plugin di sintesi unitaria, specificare il suo nome come argomento di `unitary_synthesis_method` a [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) oppure [`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": [
        "La sintesi unitaria viene utilizzata negli stadi `init`, `translation` e `optimization` del gestore di passaggi a stadi restituito da [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o utilizzato in [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Per una descrizione di queste fasi, vedere [Fasi Transpiler](transpiler-stages).\n",
        "\n",
        "Utilizzare l'argomento `unitary_synthesis_plugin_config` , un dizionario a forma libera, per passare le opzioni per il metodo di sintesi unitaria. La documentazione del metodo di sintesi deve spiegare le opzioni che supporta. Per i link alla documentazione dei plugin di sintesi unitaria incorporati, consultare [questo elenco](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2).\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### Utilizza un plugin di sintesi di alto livello\n",
        "\n",
        "Per prima cosa, creare un [HLSConfig](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig) per per memorizzare i nomi dei plugin da usare per i vari oggetti di alto livello. Ad esempio:\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": [
        "Questa cella di codice crea una configurazione di sintesi di alto livello che utilizza il plugin `layers` per la sintesi degli oggetti [Clifford](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) e il plugin `pmh` per la sintesi degli oggetti [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) oggetti. I nomi degli argomenti delle parole chiave corrispondono agli argomenti di [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) della classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation) che rappresenta il tipo di oggetto da sintetizzare.\n",
        "Per ogni oggetto di alto livello, l'elenco dei plugin dati viene provato in sequenza finché uno di essi riesce (nell'esempio precedente, ogni elenco contiene solo un singolo plugin).\n",
        "\n",
        "Oltre a specificare un plugin con il suo nome, si può invece passare una tupla `(name, options)` , dove il secondo elemento della tupla è un dizionario contenente le opzioni del plugin. La documentazione del metodo di sintesi deve spiegare le opzioni che supporta. Per i link alla documentazione dei plugin di sintesi ad alto livello integrati, consultare [questo elenco](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2).\n",
        "\n",
        "Una volta creato l'oggetto `HLSConfig` , passarlo come argomento del metodo `hls_config` a [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o [`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": [
        "La sintesi di alto livello viene utilizzata negli stadi `init`, `translation` e `optimization` del gestore di passaggi a stadi restituito da [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) o utilizzato in [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Per una descrizione di queste fasi, vedere [Fasi Transpiler](transpiler-stages).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimento\">\n",
        "  * [Crea un plugin di transpiler](/docs/guides/create-transpiler-plugin).\n",
        "  * Consultate le [esercitazioni](/docs/tutorials) per trovare esempi di transpiling e di esecuzione di circuiti quantistici.\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
}