---
title: transpiler (latest version)
description: API reference for qiskit_fermions.transpiler in the latest version of qiskit-fermions
source: https://eu-de.quantum.cloud.ibm.com/docs/en/api/qiskit-fermions/transpiler
---

# Transpiler

## Overview

Transpilation is the process of rewriting a given input circuit to conform with desired criteria such as topological and operational constraints of the hardware used to execute the final circuit. We are not going to explain this in more detail here, and instead refer to Qiskit’s documentation of the [`qiskit.transpiler`](/docs/api/qiskit/transpiler#module-qiskit.transpiler) module.

The focus here lies on explaining how we achieve the transpilation of a [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit") to a [`QuantumCircuit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit).

## Stages

Conceptually, we split the transpilation process into several stages:

| Stage                                                          | Description                                |
| -------------------------------------------------------------- | ------------------------------------------ |
| [Input](#qiskit-fermions-transpiler-stage-input)               | convert to DAG data structure              |
| [Optimization](#qiskit-fermions-transpiler-stage-optimization) | fermionic-level optimization               |
| [Layout](#qiskit-fermions-transpiler-stage-layout)             | fermion-to-qubit layouting                 |
| [Synthesis](#qiskit-fermions-transpiler-stage-synthesis)       | fermion-to-qubit synthesis                 |
| [Qubit](#qiskit-fermions-transpiler-stage-qubit)               | continued transpilation on the qubit-level |
| [Output](#qiskit-fermions-transpiler-stage-output)             | convert from DAG data structure            |

### Input

The various transpiler passes are implemented to work with [`FermionicDAGCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-dag-circuit#qiskit_fermions.circuit.FermionicDAGCircuit "qiskit_fermions.circuit.FermionicDAGCircuit") as the underlying data structure to store the circuit operations. Such directed acyclic graphs (DAGs) provide an efficient data model for the traversal and manipulation of circuits.

However, an end-user is more likely to work with a [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit") as it provides a more intuitive interface and data model. As such, this input stage simply runs the [`FermionicCircuitToDAG`](/docs/api/qiskit-fermions/transpiler-fermionic-circuit-to-dag#qiskit_fermions.transpiler.FermionicCircuitToDAG "qiskit_fermions.transpiler.FermionicCircuitToDAG") transpiler pass.

### Optimization

This stage of the transpilation pipeline can implement circuit optimizations while preserving the type of circuit to be an instance of [`FermionicDAGCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-dag-circuit#qiskit_fermions.circuit.FermionicDAGCircuit "qiskit_fermions.circuit.FermionicDAGCircuit"). As such, no qubit information is required (or necessarily available) at this point in the transpilation pipeline.

### Layout

One global configuration setting for the transpilation process is the fermion-to-qubit “layout”. This must be provided by the user and it must match the provided fermion-to-qubit mapping (in the sense that, if a chosen mapping encodes a fixed number of fermions with a different number of qubits, the configured layout must account for that).

In the general case, fermionic modes are not always encoded with an occupation-basis into the qubit register. Consequently, we cannot associate a single fermionic mode with a single qubit. Therefore, the user-provided fermion-to-qubit layout ([`F2QLayout`](/docs/api/qiskit-fermions/transpiler-f-2-q-layout#qiskit_fermions.transpiler.F2QLayout "qiskit_fermions.transpiler.F2QLayout")) associates [`FermionicRegister`](/docs/api/qiskit-fermions/circuit-fermionic-register#qiskit_fermions.circuit.FermionicRegister "qiskit_fermions.circuit.FermionicRegister") instances with [`QuantumRegister`](/docs/api/qiskit/circuit#qiskit.circuit.QuantumRegister) ones.

|                                                                                                                                              |                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
| [`F2QLayout`](/docs/api/qiskit-fermions/transpiler-f-2-q-layout#qiskit_fermions.transpiler.F2QLayout "qiskit_fermions.transpiler.F2QLayout") | A mapping of fermionic mode registers to quantum registers. |

The way to configure this global setting, is by placing a [`F2QLayout`](/docs/api/qiskit-fermions/transpiler-f-2-q-layout#qiskit_fermions.transpiler.F2QLayout "qiskit_fermions.transpiler.F2QLayout") instance in the `f2q_layout` field of the `property_set`. For more details refer to [Layouting Passes](/docs/api/qiskit-fermions/transpiler-passes#qiskit-fermions-transpiler-passes-layout).

### Synthesis

At its core, the transpilation is handled by the [`F2QSynthesis`](/docs/api/qiskit-fermions/transpiler-passes-f-2-q-synthesis#qiskit_fermions.transpiler.passes.F2QSynthesis "qiskit_fermions.transpiler.passes.F2QSynthesis") transpiler pass. It is conceptually similar to Qiskit’s [`HighLevelSynthesis`](/docs/api/qiskit/qiskit.transpiler.passes.HighLevelSynthesis) pass, which uses various plugins for transpiling high-level circuit instructions. For more details, refer to the documentation of [`F2QSynthesis`](/docs/api/qiskit-fermions/transpiler-passes-f-2-q-synthesis#qiskit_fermions.transpiler.passes.F2QSynthesis "qiskit_fermions.transpiler.passes.F2QSynthesis") directly.

How a given [`FermionicGate`](/docs/api/qiskit-fermions/circuit-fermionic-gate#qiskit_fermions.circuit.FermionicGate "qiskit_fermions.circuit.FermionicGate") can be synthesized in terms of qubit-based operations will depend on the particular gate type as well as the user-chosen fermion-to-qubit mapping. For more details, refer to [Transpiler Pass Plugins](/docs/api/qiskit-fermions/transpiler-passes-plugins#qiskit-fermions-transpiler-passes-synthesis-plugins).

### Qubit

At this point in the transpilation process, we have reached a [`DAGCircuit`](/docs/api/qiskit/qiskit.dagcircuit.DAGCircuit) instance and can continue to use Qiskit’s transpilation pipeline as one would usually.

> **Hint**
>
> Additional transpiler passes for optimizations on the qubit-level that take into account the knowledge of a circuit originating from a [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit") may be added in the future!

### Output

This stage implements effectively the reverse of [Input](#qiskit-fermions-transpiler-stage-input), by calling the [`QuantumDAGToCircuit`](/docs/api/qiskit-fermions/transpiler-quantum-dag-to-circuit#qiskit_fermions.transpiler.QuantumDAGToCircuit "qiskit_fermions.transpiler.QuantumDAGToCircuit") transpiler pass.

## Pass Managers

All of the stages above are the default stages by how the [`presets`](/docs/api/qiskit-fermions/transpiler-presets#module-qiskit_fermions.transpiler.presets "qiskit_fermions.transpiler.presets") orchestrate the various `MultiStagePassManager`.

The individual stages can be either a single pass (when they change from one internal representation (IR) to another, such as the [Input](#qiskit-fermions-transpiler-stage-input), [Synthesis](#qiskit-fermions-transpiler-stage-synthesis), and [Output](#qiskit-fermions-transpiler-stage-output) stages above) or a stage can be a [`BasePassManager`](/docs/api/qiskit/qiskit.passmanager.BasePassManager) whose internal passes can be modified.

For the stages operating on fermionic circuits ([Optimization](#qiskit-fermions-transpiler-stage-optimization) and [Layout](#qiskit-fermions-transpiler-stage-layout)), the type of passmanager to use is [`FermionicPassManager`](/docs/api/qiskit-fermions/transpiler-fermionic-pass-manager#qiskit_fermions.transpiler.FermionicPassManager "qiskit_fermions.transpiler.FermionicPassManager").

|                                                                                                                                                                                                                   |                                                                                                                                                                                                                    |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [`FermionicPassManager`](/docs/api/qiskit-fermions/transpiler-fermionic-pass-manager#qiskit_fermions.transpiler.FermionicPassManager "qiskit_fermions.transpiler.FermionicPassManager")(\[tasks, max\_iteration]) | A transpiler pass manager converting one [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit") to another. |

### Conversion Passes

Some very basic conversion passes are provided directly by this module:

|                                                                                                                                                                                                |                                                                                                                                                                                                                                                                                                                                                           |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`FermionicCircuitToDAG`](/docs/api/qiskit-fermions/transpiler-fermionic-circuit-to-dag#qiskit_fermions.transpiler.FermionicCircuitToDAG "qiskit_fermions.transpiler.FermionicCircuitToDAG")() | Converts a [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit") to a [`FermionicDAGCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-dag-circuit#qiskit_fermions.circuit.FermionicDAGCircuit "qiskit_fermions.circuit.FermionicDAGCircuit"). |
| [`FermionicDAGToCircuit`](/docs/api/qiskit-fermions/transpiler-fermionic-dag-to-circuit#qiskit_fermions.transpiler.FermionicDAGToCircuit "qiskit_fermions.transpiler.FermionicDAGToCircuit")() | Converts a [`FermionicDAGCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-dag-circuit#qiskit_fermions.circuit.FermionicDAGCircuit "qiskit_fermions.circuit.FermionicDAGCircuit") to a [`FermionicCircuit`](/docs/api/qiskit-fermions/circuit-fermionic-circuit#qiskit_fermions.circuit.FermionicCircuit "qiskit_fermions.circuit.FermionicCircuit"). |
| [`QuantumDAGToCircuit`](/docs/api/qiskit-fermions/transpiler-quantum-dag-to-circuit#qiskit_fermions.transpiler.QuantumDAGToCircuit "qiskit_fermions.transpiler.QuantumDAGToCircuit")()         | Converts a [`DAGCircuit`](/docs/api/qiskit/qiskit.dagcircuit.DAGCircuit) to a [`QuantumCircuit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit).                                                                                                                                                                                                         |

### Presets

For user convenience, the [`qiskit_fermions.transpiler.presets`](/docs/api/qiskit-fermions/transpiler-presets#module-qiskit_fermions.transpiler.presets "qiskit_fermions.transpiler.presets") module provides a number of functions for quickly building pre-defined transpilation pipelines.
