Skip to main content
IBM Quantum Platform

Infraestructura de gestión de pases

Qiskit incluye una infraestructura genérica para definir dinámicamente gestores de pasadas, pasadas e IR. El propio Qiskit contiene ciertos tipos que se utilizan como IR de compilación en diferentes situaciones, pero las extensiones también pueden definir los suyos propios.

QkIrBuiltin

enum QkIrBuiltin

Enumeración de los diferentes tipos integrados de la API de C que se pueden utilizar directamente como IR.

Estas son las entradas válidas para qk_ir_handle_builtin.

Valores:

enumerador QkIrBuiltin_Circuit

El objeto QkCircuit .

enumerador QkIrBuiltin_Dag

El objeto QkDag .

QkIrSlot

enum QkIrSlot

Los métodos disponibles que puede implementar un IR personalizado.

Estos son los valores válidos para y QkVtableEntry::slot los tipos de puntero a función asociados necesarios para el argumento table de qk_ir_handle_new.

Seguridad

Todas las funciones, incluido el destructor, deben poder invocarse desde cualquier hilo.

Valores:

enumerador QkIrSlot_Delete

Un destructor para el de data un IR. Opcional.

Este método no se invoca si el puntero de datos es NULL.

Signatura:

void delete(void *data);

QkPassSlot

enum QkPassSlot

Los métodos disponibles que puede implementar una pasada personalizada.

Estos son los valores válidos para y QkVtableEntry::slot los tipos de puntero a función asociados necesarios para el argumento table de qk_pass_new.

Seguridad

Todas las funciones, incluido el destructor, deben poder invocarse desde cualquier hilo.

Valores:

enumerador QkPassSlot_RunOwned

Ejecuta la pasada en un IR propio del tipo adecuado. Obligatorio.

Signatura:

void *run(void *this, void *ir, QkPassContext *context, QkCompilationError **error);
Implementación

Esto implementa el comportamiento del pase. this será igual a un valor pasado a con qk_pass_new esta tabla de funciones virtuales. ir apuntará a los datos propios del tipo especificado por el campo ir_in de la tabla virtual. Es responsabilidad del desarrollador asegurarse de que se ir libere, si es necesario.

La función debe devolver los datos de su propiedad del tipo especificado por ir_out, o NULL si se ha producido un error.

Si la función desea indicar un estado de error, debe escribir un objeto QkCompilationError * válido de su propiedad en el error puntero, asegurarse de que el ir puntero se libere y devolver NULL.

enumerador QkPassSlot_Delete

Un destructor para el argumento this de una pasada, en el momento en que se destruye dicha pasada. Opcional.

Esto no se ejecutará si el puntero de datos es NULL.

Signatura:

void delete(void *this);

QkPass

typedef struct QkPass QkPass

Un paso con un comportamiento personalizado definido a través de la API de C.

Esta es una instancia completa de un paso cuyo comportamiento general se definió anteriormente mediante qk_pass_vtable_new. Para crear instancias de esta estructura, hay que llamar a qk_pass_new.

Estos pases se pueden añadir a las instancias de utilizando QkPassManager qk_passmanager_push_pass.

Seguridad

El puntero de datos this debe poder enviarse y compartirse de forma segura entre subprocesos. Todos los métodos de la clase QkPassVtable deben poder invocarse de forma segura desde cualquier hilo.

QkCompilationError

typedef struct QkCompilationError QkCompilationError

Se ha producido un error detallado durante la compilación.

Es posible que los procesos de compilación, incluidas las pasadas de compilador personalizadas, quieran proporcionar información detallada sobre los errores al llamante. Estos errores no suelen estar pensados para ser gestionados de forma programática, sino que están destinados a que el usuario final los lea y actúe en consecuencia.

QkIrHandle

typedef struct QkIrHandle QkIrHandle

Un objeto de referencia que representa un «tipo IR».

Estos objetos representan únicamente el comportamiento del IR; deben combinarse con un puntero de datos del tipo adecuado para generar un objeto IR completo. Solo se necesita el identificador de tipo para definir pasadas y gestores de pasadas.

La mayoría de las funciones que aceptan uno de estos argumentos lo toman prestado. Cuando ya no necesites el identificador, debes llamar a para qk_ir_handle_free liberar la referencia al objeto de tipo.

QkPassVtable

typedef struct QkPassVtable QkPassVtable

Un «objeto de tipo» que representa el comportamiento de un paso personalizado.

Estos objetos solo representan el comportamiento; deben combinarse con un puntero de datos del tipo adecuado para generar una pasada completa.

Se construyen utilizando qk_pass_vtable_new, y se entregan a qk_pass_new.

Consulta QkPassSlot para ver una enumeración de los posibles comportamientos y su semántica.

qk_compilation_error_new

QkCompilationError *qk_compilation_error_new(const char *msg)

Crea un nuevo error de compilación con un mensaje fijo.

Seguridad

msg debe apuntar a bytes terminados en NUL.

Parámetros

  • msg – Un puntero prestado a una cadena terminada en NUL.

Devuelve

Un error del compilador propio.

qk_compilation_error_str

char *qk_compilation_error_str(const QkCompilationError *error)

Obtén una representación sencilla del error en forma de cadena propia.

El formato exacto de esta representación no es fijo, pero, por lo general, está pensado para mostrársela a un usuario. Los mensajes de error pueden incluir cadenas arbitrarias controladas por pases personalizados definidos fuera de Qiskit.

El valor devuelto debe liberarse con qk_str_free.

Seguridad

El comportamiento es indefinido si error no apunta a un válido QkCompilationError.

Parámetros

  • error : el error para el que se desea obtener el mensaje.

Devuelve

Una representación del error en forma de cadena UTF-8.

qk_compilation_error_free

void qk_compilation_error_free(QkCompilationError *error)

Libera el puntero de propiedad indicado.

No hace nada si es error nulo.

Seguridad

El comportamiento es indefinido si no error es nulo ni apunta a un objeto válido de su propiedad CompilationError.

Parámetros

  • error : el puntero «owned» que se va a liberar.

qk_ir_handle_new

QkIrHandle *qk_ir_handle_new(const char *name, const QkVtableEntry *table)

Define el comportamiento de un nuevo tipo «IR».

Esta función se invoca para definir el componente de comportamiento de un nuevo tipo de IR.

Si quieres el identificador de un tipo Qiskit integrado, consulta qk_ir_handle_builtin.

Seguridad

El comportamiento es indefinido si se incumple cualquiera de las siguientes condiciones:

  • name es una cadena terminada en nulo.
  • table es un puntero nulo, o bien está alineado y apunta a una lista de entradas de ranura válidas que termina en una entrada .slot = -1 sin valores slot duplicados.

Parámetros

  • nombre : un nombre legible para el tipo de IR.
  • tabla : una tabla con los métodos definidos para el IR, que termina con una entrada que utiliza como -1 identificador de ranura. Esto puede ocurrir NULL si no hay entradas en la tabla. Consulta los valores permitidos y las firmas de QkIrSlot los punteros a funciones.

Devuelve

Un identificador propio del objeto de tipo IR.

qk_ir_handle_builtin

QkIrHandle *qk_ir_handle_builtin(uint32_t ty)

Obtener el «objeto de tipo» IR correspondiente a un tipo integrado de Qiskit.

Parámetros

  • ty – Un identificador del tipo deseado. Consulta QkIrBuiltin los valores permitidos.

Devuelve

Un identificador propio del objeto de tipo IR, o bien NULL si se proporciona un valor no válido.

qk_ir_handle_free

void qk_ir_handle_free(QkIrHandle *handle)

Liberar un nombre de usuario de IR propio.

Puedes llamar a esta función en los objetos de manejador de tu propiedad una vez que hayas terminado de utilizarlos. Llamar a «free» con tu propio identificador no invalida ningún objeto QkIr existente; estos tienen sus propios identificadores.

No hace nada si el puntero es nulo.

Seguridad

El comportamiento es indefinido si no handle es nulo y no apunta a un objeto QkIrHandle válido de su propiedad.

Parámetros

  • handle : el puntero que se va a liberar.

qk_pass_vtable_new

QkPassVtable *qk_pass_vtable_new(const char *name, const QkIrHandle *ir_in, const QkIrHandle *ir_out, const QkVtableEntry *table)

Crea un nuevo «objeto de tipo» para un paso personalizado.

Una vez que tengas el resultado de esta función, crea instancias del «pass» combinándolo con un puntero de datos mediante qk_pass_new.

Seguridad

El comportamiento es indefinido si se incumple cualquiera de las siguientes condiciones:

  • name es una cadena terminada en nulo.
  • ir_in apunta a un QkIrHandle objeto válido.
  • ir_out apunta a un QkIrHandle objeto válido.
  • table se refiere a instancias contiguas y válidas de VtableEntry que son todas entradas coherentes según la definición de QkPassSlot, sin entradas slot duplicadas de y que terminan en .slot = -1.
  • table contiene objetos para todas las ranuras necesarias.

Parámetros

  • nombre : un nombre legible para el usuario, terminado en NUL, que se ha tomado prestado para el pase. Se utiliza para la depuración.
  • ir_in – Un identificador prestado del «objeto de tipo» IR que representa el tipo de entrada esperado para la pasada.
  • ir_out – Un identificador tomado en préstamo del «objeto de tipo» IR que representa el tipo de salida esperado para la pasada.
  • tabla : una tabla de objetos QkVtableEntry prestada que termina con una entrada con .slot = -1. Consulte QkPassSlot para conocer los valores de ranura permitidos y los tipos de punteros a funciones asociados. Los valores desconocidos de slot se ignoran.

Devuelve

Un objeto de tipo «owned» que se puede prestar qk_pass_new para crear instancias del tipo «pass».

qk_pass_vtable_free

void qk_pass_vtable_free(QkPassVtable *vtable)

Liberar una única referencia a un PassVtable.

Puedes llamarla una vez que hayas terminado de crear las instancias de los pases que necesitan esta tabla virtual; cada pase creado tiene su propia referencia a la tabla.

No hace nada si es vtable NULL.

Seguridad

El comportamiento es indefinido si no vtable es nulo ni una referencia válida a un PassVtable.

Parámetros

  • vtable : la referencia de propiedad que se va a liberar.

qk_pass_new

QkPass *qk_pass_new(void *data, const QkPassVtable *vtable)

Crear una nueva instancia de un pase cuyo comportamiento se haya definido previamente.

A continuación, el objeto «result» se suele pasar a qk_passmanager_push_pass, o a un método relacionado.

Seguridad

El comportamiento es indefinido si se incumple cualquiera de las siguientes condiciones:

  • this apunta a datos del tipo adecuado para los métodos de vtable.
  • vtable apunta a una instancia válida de QkPassVtable.

Parámetros

  • datos – El puntero a los datos propios de este vtable.
  • vtable : un «objeto de tipo» tomado prestado creado por qk_pass_vtable_new.

Devuelve

Un objeto «pass» propio.

qk_pass_free

void qk_pass_free(QkPass *pass)

Liberar una instancia de pase personalizada.

Normalmente no es necesario llamar a esta función, ya que las funciones de creación del gestor de pases se apropian de los argumentos QkPass .

Seguridad

El comportamiento no está definido si no pass es ni nulo ni un puntero válido que apunte a un QkPass.

Parámetros

  • pass : un puntero propio al «pass» que se va a liberar.

qk_passmanager_new

QkPassManager *qk_passmanager_new(void)

Crea un gestor de pases vacío.

El usuario debe liberar este objeto.

Devuelve

Un gestor de pases vacío y propio.

qk_passmanager_free

void qk_passmanager_free(QkPassManager *pm)

Libera al gestor de pases.

Seguridad

El comportamiento no está definido si no pm es ni nulo ni un puntero válido a un QkPassManager.

Parámetros

  • pm – Un puntero propio al gestor de pases.

qk_passmanager_push_pass

QkExitCode qk_passmanager_push_pass(QkPassManager *pm, QkPass *pass)

Envía un pase al gestor de pases.

Seguridad

El comportamiento es indefinido si se incumple cualquiera de las siguientes condiciones:

  • pm apunta a un QkPassManager
  • pass apunta a una instancia QkPass propia.

Parámetros

  • pm – Un puntero prestado al gestor de pases.
  • pase – Un pase propio para avanzar. Esto te permite hacerte con la propiedad de la contraseña indicada.

Devuelve

QkExitCode_Success si el tipo se ha añadido correctamente, o QkExitCode_IncompatibleTypes si no se ha podido añadir el paso porque los tipos IR esperados no se ajustan a lo previsto por el proceso.

qk_passmanager_run_simple

void *qk_passmanager_run_simple(QkPassManager *pm, void *ir, const QkIrHandle *ir_in_handle, const QkIrHandle *ir_out_handle, QkCompilationError **error)

Ejecuta el gestor de contraseñas.

ir_in_handle y ir_out_handle deben ajustarse a los requisitos de tipo del proceso. Esta función devolverá NULL y (opcionalmente) establecerá el estado de error si se incumple esta condición.

Seguridad

El comportamiento es indefinido si se incumple cualquiera de las siguientes condiciones:

  • pm es un puntero válido a un QkPassManager.
  • ir es un puntero de datos de propiedad del tipo indicado por ir_in_handle.
  • ir_in_handle apunta a un archivo válido IrHandle.
  • ir_out_handle apunta a un archivo válido IrHandle.
  • error es nulo o apunta a una ubicación de almacenamiento válida para una única escritura de un QkCompilationError *.

Parámetros

  • pm – Un puntero tomado en préstamo al gestor de pases que se va a ejecutar.
  • ir – Un puntero a datos propios del tipo que espera ir_in_handle. Esta función se hace cargo de la propiedad del puntero y se encargará de que sea destruido, incluso si se produce un error.
  • ir_in_handle – Un objeto de tipo prestado que se corresponde con el tipo de entrada del gestor de pasadas y con el tipo de ir.
  • ir_out_handle : un objeto de tipo prestado que se corresponde con el tipo de salida del gestor de pasadas.
  • error – [out] Si no es así NULL, una ubicación donde guardar el resultado QkCompilationError * .

Devuelve

Si no se ha producido ningún error grave, entonces un puntero de datos propio del tipo correspondiente a ir_out_handle. NULL si se ha producido un error grave.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.