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:
namees una cadena terminada en nulo.tablees un puntero nulo, o bien está alineado y apunta a una lista de entradas de ranura válidas que termina en una entrada.slot = -1sin valoresslotduplicados.
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
-1identificador de ranura. Esto puede ocurrirNULLsi no hay entradas en la tabla. Consulta los valores permitidos y las firmas deQkIrSlotlos 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
QkIrBuiltinlos 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:
namees una cadena terminada en nulo.ir_inapunta a unQkIrHandleobjeto válido.ir_outapunta a unQkIrHandleobjeto válido.tablese refiere a instancias contiguas y válidas deVtableEntryque son todas entradas coherentes según la definición deQkPassSlot, sin entradasslotduplicadas de y que terminan en.slot = -1.tablecontiene 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
QkVtableEntryprestada que termina con una entrada con.slot = -1. ConsulteQkPassSlotpara conocer los valores de ranura permitidos y los tipos de punteros a funciones asociados. Los valores desconocidos deslotse 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:
thisapunta a datos del tipo adecuado para los métodos devtable.vtableapunta a una instancia válida deQkPassVtable.
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:
pmapunta a unQkPassManagerpassapunta a una instanciaQkPasspropia.
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:
pmes un puntero válido a unQkPassManager.ires un puntero de datos de propiedad del tipo indicado porir_in_handle.ir_in_handleapunta a un archivo válidoIrHandle.ir_out_handleapunta a un archivo válidoIrHandle.errores nulo o apunta a una ubicación de almacenamiento válida para una única escritura de unQkCompilationError *.
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 resultadoQkCompilationError *.
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.