Flujo de control
La API en C de Qiskit para el flujo de control ofrece herramientas para examinar las instrucciones de flujo de control utilizadas en los circuitos cuánticos. Puedes consultar el tipo de instrucción de flujo de control, acceder a bloques de circuito anidados, examinar condiciones y parámetros de bucle, y recuperar las correspondencias entre qubits y bits clásicos entre los bloques anidados y el circuito de nivel superior.
typedef struct QkControlFlowInstruction QkControlFlowInstructionLa estructura QkControlFlowInstruction «opaque» es el recurso principal que utiliza la API de C para representar y analizar las instrucciones de flujo de control dentro de un circuito. Se obtiene mediante una llamada a qk_circuit_get_control_flow_instruction() y debe liberarse mediante una llamada a qk_control_flow_instruction_free(). La mayoría de las funciones de la API de C que operan con construcciones de flujo de control esperan un puntero a esta estructura opaca, lo que la convierte en el medio principal para inspeccionar las instrucciones de flujo de control desde C. Ten en cuenta que la mayoría de las funciones de esta API que utilizan QkControlFlowInstruction como entrada devuelven punteros tomados en préstamo que siguen siendo válidos mientras exista la instrucción de flujo de control, por lo que no es necesario liberar estos punteros por separado.
Tipos de datos
QkControlFlowKind
enum QkControlFlowKind
Esta enumeración representa los diferentes tipos de instrucciones de flujo de control que pueden aparecer en un circuito cuántico.
Valores:
QkControlFlowKind_Box del censo
Instrucciones de A Box
QkControlFlowKind_BreakLoop del censo
Instrucción de salida de bucle
QkControlFlowKind_ContinueLoop del censo
Continuar con la instrucción de bucle
QkControlFlowKind_ForLoop del censo
Instrucción del bucle «for»
QkControlFlowKind_IfElse del censo
Instrucción «if-else»
QkControlFlowKind_Switch del censo
Instrucción «case» del switch
QkControlFlowKind_While del censo
Instrucción de bucle «while»
QkConditionType
enum QkConditionType
Representa el tipo de condición o el destino de la instrucción «Switch» en una instrucción de flujo de control.
Esta enumeración se utiliza para identificar si una condición (en las instrucciones « IfElse » o «While») o un destino «Switch» (en las instrucciones «Switch») opera sobre un bit clásico, un registro clásico o una expresión clásica.
Valores:
QkConditionType_ClBit del censo
Condición basada en un bit clásico
QkConditionType_ClReg del censo
Condición basada en un registro clásico
QkConditionType_Expr del censo
Condición basada en una expresión clásica
QkConditionBitInfo
struct QkConditionBitInfo
Información sobre una condición de bits clásica.
Esta estructura contiene los detalles de una condición que actúa sobre un único bit clásico
uint32_t clbit
El índice del bit clásico en el circuito
bool condición
El valor esperado del bit clásico (verdadero o falso)
QkBoxDurationKind
enum QkBoxDurationKind
Representa el tipo de especificación de duración para una instrucción «Box».
Las instrucciones de los recuadros pueden no tener duración, tener un valor de duración concreto o tener una duración especificada mediante una expresión clásica.
Valores:
QkBoxDurationKind_NoDuration del censo
No se ha especificado la duración
QkBoxDurationKind_Duration del censo
Valor concreto de la duración (representado como QkDurationInfo)
QkBoxDurationKind_Expr del censo
Duración expresada mediante una expresión clásica
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Contiene las etiquetas para un caso «Switch».
Esta estructura contiene una matriz de valores de etiqueta con los que se compara cada caso del «switch». Por ejemplo, un caso como case(1, 2, 3) este tendría tres etiquetas: 1, 2 y 3. La memoria para la matriz de etiquetas se asigna mediante qk_control_flow_switch_case_labels_uint y debe liberarse mediante qk_control_flow_switch_case_labels_clear.
const uint64_t *labels
Puntero a una matriz de valores de etiqueta
size_t num_labels
Número de etiquetas en la matriz
QkLoopParamKind
enum QkLoopParamKind
El tipo del parámetro de bucle en una instrucción de flujo de control « ForLoop ».
Esta enumeración indica si un bucle «for» carece de parámetro de bucle, utiliza un símbolo «Parameter» o utiliza una variable (QkVar) para controlar el valor de iteración.
Valores:
QkLoopParamKind_NoLoopParam del censo
No se ha especificado ningún parámetro de bucle para la instrucción « ForLoop »
QkLoopParamKind_Parameter del censo
El parámetro de bucle es un parámetro
QkLoopParamKind_Variable del censo
El parámetro del bucle es una variable
QkSymbolType
enum QkSymbolType
El tipo de símbolo en un contexto de « ForLoop ».
Esta enumeración indica si un símbolo es una variable independiente o un elemento dentro de un vector de parámetros al que se accede mediante un índice.
Valores:
QkSymbolType_Standalone del censo
Un símbolo independiente con un nombre sencillo
QkSymbolType_Element del censo
Un símbolo de elemento con un nombre base y un índice
QkSymbolInfo
struct QkSymbolInfo
Información sobre el símbolo, incluyendo el tipo y los datos.
Esta estructura representa un símbolo en un contexto de « ForLoop », que puede ser tanto una variable independiente como un elemento indexado.
QkSymbolType ty
El tipo de símbolo (independiente o elemento)
char *nombre
Una cadena en C terminada en nulo que contiene el nombre del símbolo. En el caso de los símbolos independientes, se trata del nombre de la variable. En el caso de los símbolos de elementos, se trata del nombre base del vector de parámetros. La persona que realiza la llamada es responsable de liberar esta cadena utilizando qk_str_free.
size_t índice
En el caso de los símbolos de los elementos, se trata del índice dentro del vector de parámetros. En el caso de los símbolos independientes, este campo no se utiliza y debe ignorarse.
QkLoopCollectionType
enum QkLoopCollectionType
El tipo de colección utilizado en una instrucción de flujo de control « ForLoop ».
Valores:
QkLoopCollectionType_List del censo
El bucle recorre una lista explícita de elementos
QkLoopCollectionType_Range del censo
El bucle recorre un rango del tipo « Python » (inicio, fin, paso)
QkLoopElements
struct QkLoopElements
Una estructura que contiene los elementos del bucle procedentes de una instrucción de flujo de control « ForLoop ».
Esta estructura es la que qk_control_flow_loop_elements devuelve y contiene tanto un puntero al array de elementos del bucle como el número de elementos que hay en el array. El puntero es un puntero prestado y el llamante no debe liberarlo.
const ptrdiff_t *elements
Puntero a la matriz de elementos del bucle.
size_t len
Número de elementos del array.
Funciones
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
Obtén el tipo de instrucción de flujo de control.
Ejemplo
// Assuming cf_inst is obtained from a circuit with control flow
QkControlFlowKind kind = qk_control_flow_kind(cf_inst);
switch (kind) {
case QkControlFlowKind_Box:
// do something with the box instruction
break;
case QkControlFlowKind_BreakLoop:
// do something with the break loop instruction
break;
case QkControlFlowKind_ContinueLoop:
// do something with the continue loop instruction
break;
case QkControlFlowKind_ForLoop:
// do something with the for loop instruction
break;
case QkControlFlowKind_IfElse:
// do something with the if-else instruction
break;
case QkControlFlowKind_Switch:
// do something with the switch instruction
break;
case QkControlFlowKind_While:
// do something with the while loop instruction
break;
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control.
Devuelve
El tipo de instrucción de flujo de control.
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
Obtiene el número de bloques de circuito de una instrucción de flujo de control.
Ejemplo
// Assuming cf_inst is obtained from a circuit with control flow
size_t num_blocks = qk_control_flow_num_blocks(cf_inst);
for (size_t i = 0; i < num_blocks; i++) {
const QkCircuit *block_circuit = qk_control_flow_block_circuit(cf_inst, i);
// Process each block...
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control.
Devuelve
El número de bloques de circuito que contiene esta instrucción de flujo de control.
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
Obtener un puntero a un bloque de circuito dentro de una instrucción de flujo de control.
Las instrucciones de flujo de control contienen uno o varios bloques de circuito (por ejemplo, « IfElse » tiene dos bloques, mientras que «Switch» puede tener varios bloques). Esta función recupera un bloque concreto por su índice.
Ejemplo
// Assuming cf_inst is an IfElse control flow instruction
const QkCircuit *true_block = qk_control_flow_block_circuit(cf_inst, 0);
const QkCircuit *false_block = qk_control_flow_block_circuit(cf_inst, 1);
// Process the true and false blocks...Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control.
- block_idx – El índice del bloque que se va a recuperar.
block_idxdebe estar dentro de los límites (<qk_control_flow_num_blocks).
Devuelve
Un puntero al que QkCircuit representa el bloque solicitado. El circuito es válido mientras exista la instrucción de flujo de control. El circuito es propiedad de la instrucción de flujo de control y la función que lo invoca no debe liberarlo.
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
Obtén la asignación de qubits para una instrucción de flujo de control.
Devuelve un puntero a una matriz que asocia los qubits utilizados en los bloques de la instrucción de flujo de control con sus índices en el circuito de nivel superior. La longitud de la matriz es igual al número de qubits que utiliza la instrucción de flujo de control. Para cada índice i de qubit del bloque anidado, la correspondencia en el índice i de la matriz proporciona el índice de qubit correspondiente en el circuito de nivel superior.
Ejemplo
// Assuming cf_inst is obtained from a circuit with control flow
const uint32_t *qubit_map = qk_control_flow_qubit_map(cf_inst);
uint32_t num_qubits = qk_circuit_num_qubits(qk_control_flow_block_circuit(cf_inst, 0));
for (uint32_t i = 0; i < num_qubits; i++) {
printf("Block qubit %u maps to circuit qubit %u\n", i, qubit_map[i]);
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control.
Devuelve
Un puntero a una matriz de uint32_t valores que representan la correspondencia de los qubits. La matriz es válida mientras exista la instrucción de flujo de control. La matriz es propiedad de la instrucción de flujo de control y la función que la invoca no debe liberarla.
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
Obtén la representación clásica en bits de una instrucción de flujo de control.
Devuelve un puntero a una matriz que asocia los bits clásicos utilizados en los bloques de las instrucciones de flujo de control a sus índices en el circuito de nivel superior. La longitud de la matriz es igual al número de bits clásicos que utiliza la instrucción de flujo de control. Para cada índice i de bit clásico del bloque anidado, la correspondencia en el índice i de la matriz proporciona el índice de bit clásico correspondiente en el circuito de nivel superior.
Ejemplo
// Assuming cf_inst is obtained from a circuit with control flow
const uint32_t *clbit_map = qk_control_flow_clbit_map(cf_inst);
uint32_t num_clbits = qk_circuit_num_clbits(qk_control_flow_block_circuit(cf_inst, 0));
for (uint32_t i = 0; i < num_clbits; i++) {
printf("Block clbit %u maps to circuit clbit %u\n", i, clbit_map[i]);
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control.
Devuelve
Un puntero a una matriz de uint32_t valores que representan la asignación clásica de bits. La matriz es válida mientras exista la instrucción de flujo de control. La matriz es propiedad de la instrucción de flujo de control y la función que la invoca no debe liberarla.
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
Obtener el tipo de condición de una instrucción de flujo de control.
Devuelve el tipo de condición utilizada en una instrucción « IfElse » o «While». El tipo de condición indica si la condición se basa en un bit clásico, un registro clásico o una expresión clásica.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While».
Ejemplo
// Assuming cf_inst is an IfElse or While control flow instruction
QkConditionType cond_type = qk_control_flow_condition_type(cf_inst);
switch (cond_type) {
case QkConditionType_ClBit:
// do something with classical bit...
break;
case QkConditionType_ClReg:
// do something with classical register...
break;
case QkConditionType_Expr:
// Process expression...
break;
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While».
Devuelve
Un QkConditionType valor de enumeración que indica el tipo de condición.
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
Obtener la información sobre el estado de los bits clásicos de una instrucción de flujo de control.
Extrae el índice de bits clásico y el valor esperado de una instrucción « IfElse » o «While» que tenga una condición de bits clásica.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While», o si la condición no es de tipo binario.
Ejemplo
// Assuming cf_inst is an IfElse or While instruction with a bit condition
QkConditionBitInfo bit_info = qk_control_flow_condition_bit_info(cf_inst);
printf("Condition: clbit[%u] == %s\n", bit_info.clbit, bit_info.condition ? "true" : "false");Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While» con una condición de bits clásica.
Devuelve
Una QkConditionBitInfo estructura que contiene el índice de bits clásico y el valor esperado.
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
Obtén el ancho en bits de la condición de registro clásica para una instrucción de flujo de control.
Extrae el ancho de bits del registro clásico de una instrucción « IfElse » o «While» que incluya una condición de registro clásico.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While», o si la condición no es de tipo registro.
Ejemplo
// Assuming cf_inst is an IfElse or While instruction with a register condition
uint64_t bit_width = qk_control_flow_condition_reg_cond_bit_width(cf_inst);
printf("Register bit width: %lu\n", bit_width);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While» con una condición de registro clásica.
Devuelve
El número de bits de la condición en el registro clásico.
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
Obtén el registro clásico para la condición de una instrucción de flujo de control.
Extrae el registro clásico de una instrucción « IfElse » o «While» que tenga una condición de registro clásico.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While», o si la condición no es de tipo registro.
Ejemplo
// Assuming cf_inst is an IfElse or While instruction with a register condition
const QkClassicalRegister* creg = qk_control_flow_condition_reg(cf_inst);
// Use the classical register pointerSeguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While» con una condición de registro clásica.
Devuelve
QkClassicalRegisterUn puntero prestado a. El puntero sigue siendo válido mientras el circuito principal siga siendo válido.
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
Obtener el valor de la condición del registro clásico para una instrucción de flujo de control.
Extrae la condición como un valor entero sin signo de una instrucción « IfElse » o «While» que tenga una condición de registro clásica.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While», si la condición no es de tipo registro o si el valor de la condición no cabe en un uint64_t.
Ejemplo
// Assuming cf_inst is an IfElse or While instruction with a register condition
uint64_t expected_value = qk_control_flow_condition_reg_cond_uint(cf_inst);
printf("Expected register value: %lu\n", expected_value);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While» con una condición de registro clásica.
Devuelve
El valor de condición.
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
Obtén la expresión clásica de una instrucción de flujo de control.
Extrae la expresión clásica de una instrucción « IfElse » o «While» que tenga una condición basada en una expresión.
Genera un error si cf_inst no es una instrucción de flujo de control « IfElse » o «While», o si la condición no es de tipo expresión.
Uso de ejemplo
// Assuming while_inst is a While control flow instruction with an expression condition
QkConditionType cond_type = qk_control_flow_condition_type(while_inst);
if (cond_type == QkConditionType_Expr) {
const QkExprNode *expr = qk_control_flow_condition_expr(while_inst);
// Use the expression...
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un
QkControlFlowInstructionque debe representar una instrucción « IfElse » o «While» con una condición de expresión.
Devuelve
Un puntero prestado a que QkExprNode representa la expresión clásica. El puntero sigue siendo válido mientras el circuito principal siga siendo válido.
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Obtén la duración de una instrucción de flujo de control de tipo «Box».
Las instrucciones del cuadro pueden no tener duración, tener un valor de duración concreto como QkDurationInfo, o una duración especificada mediante una expresión. Esta función devuelve el tipo de duración que hay.
Da un error si cf_inst no es una instrucción de flujo de control de tipo «Box».
Ejemplo
// Assuming cf_inst is a Box control flow instruction
QkBoxDurationKind duration_kind = qk_control_flow_box_duration_kind(cf_inst);
switch (duration_kind) {
case QkBoxDurationKind_NoDuration:
// do something...
break;
case QkBoxDurationKind_Duration:
// do something...
break;
case QkBoxDurationKind_Expr:
// do something...
break;
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser de tipo «Box».
Devuelve
El tipo de duración como QkBoxDurationKind.
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Obtener la información sobre el valor de la duración de una instrucción de flujo de un control «Box».
Esta función recupera el valor y el tipo de duración de una instrucción «Box» que tiene una duración concreta.
Da un error si cf_inst no es una instrucción de flujo de control «Box» con una duración concreta.
Ejemplo
// Assuming cf_inst is a Box instruction with a concrete duration
QkDurationInfo duration_info = qk_control_flow_box_duration_val_info(cf_inst);
if (duration_info.ty == QkDurationType_Dt) {
int64_t dt = duration_info.value.dt;
} else {
double time = duration_info.value.time;
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser de tipo «Box» y tener una duración concreta.
Devuelve
Una QkDurationInfo estructura que contiene el valor de la duración y la unidad.
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Obtener la expresión de duración de una instrucción de flujo de un control «Box».
Esta función obtiene un puntero a la expresión que define la duración de una instrucción «Box» cuando dicha duración se especifica como una expresión.
Genera un error si cf_inst no es una instrucción de flujo de control «Box» con una duración de expresión.
Ejemplo
// Assuming cf_inst is a Box instruction with an expression duration
const QkExpr *duration_expr = qk_control_flow_box_duration_expr(cf_inst);
// Use the expression to evaluate or analyze the duration...Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser de tipo «Box» y tener una duración de expresión.
Devuelve
Un puntero a la QkExpr expresión que representa la duración. La expresión es válida siempre y cuando exista la instrucción de flujo de control. La expresión pertenece a la instrucción de flujo de control y el llamante no debe liberarla.
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
Obtener el tipo de colección utilizado en una instrucción de flujo de control « ForLoop ».
Esta función determina si una función « ForLoop » recorre una lista explícita de elementos o un rango del tipo « Python ».
Genera un error si cf_inst no es una instrucción de flujo de control de « ForLoop ».
Ejemplo
// Assuming cf_inst is a ForLoop instruction
QkLoopCollectionType collection_type = qk_control_flow_loop_collection_type(cf_inst);
if (collection_type == QkLoopCollectionType_List) {
// Handle list-based loop
} else if (collection_type == QkLoopCollectionType_Range) {
// Handle range-based loop
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a una instrucción de flujo de control que debe ser una instrucción de salto condicional ( ForLoop ).
Devuelve
Un CLoopCollectionType valor de enumeración que indica el tipo de colección.
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
Obtener la lista de elementos sobre los que recorre un ForLoop.
Esta función recupera la lista de elementos de una instrucción de flujo de control « ForLoop » que utiliza una colección de lista explícita. Utiliza qk_control_flow_loop_collection_type para determinar el tipo de colección antes de llamar a esta función.
Genera un error si cf_inst no es una instrucción de flujo de control de tipo « ForLoop » con una colección de tipo lista.
Ejemplo
// Assuming cf_inst is a ForLoop instruction with a List collection type
QkLoopElements loop_elements = qk_control_flow_loop_elements(cf_inst);
for (size_t i = 0; i < loop_elements.len; i++) {
printf("Element %zu: %zu\n", i, loop_elements.elements[i]);
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero a una instrucción de flujo de control que debe ser un objeto de tipo « ForLoop » con una colección de tipo «List».
Devuelve
Una QkLoopElements estructura que contiene un puntero a la matriz de elementos del bucle y el número de elementos. El puntero se toma prestado mientras dura la instrucción de flujo de control y la función que lo invoca no debe liberarlo.
qk_control_flow_loop_range
void qk_control_flow_loop_range(const QkControlFlowInstruction *cf_inst, int64_t *out_start, int64_t *out_stop, int64_t *out_step)
Obtiene los parámetros de rango de un objeto ForLoop que recorre un rango del tipo Python.
Esta función recupera los valores de inicio, fin y paso de una instrucción de flujo de control « ForLoop » que utiliza una colección de rango. Utiliza qk_control_flow_loop_collection_type para determinar el tipo de colección antes de llamar a esta función.
Genera un error si cf_inst no es una instrucción de flujo de control de tipo « ForLoop » con una colección de rango.
Ejemplo
// Assuming cf_inst is a ForLoop instruction with a Range collection type
int64_t start, stop, step;
qk_control_flow_loop_range(cf_inst, &start, &stop, &step);
printf("Loop range: start=%ld, stop=%ld, step=%ld\n", start, stop, step);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction, o si alguno de out_start, out_stop, o out_step no es un puntero válido y alineado en el que se pueda escribir.
Parámetros
- cf_inst : un puntero a una instrucción de flujo de control que debe ser un objeto de tipo « ForLoop » con una colección «Range».
- out_start – Un parámetro de salida que se establecerá en el valor inicial del rango.
- out_stop – Un parámetro de salida que se establecerá en el valor de fin de rango.
- out_step – Un parámetro de salida que se establecerá en el valor del paso del rango.
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
Obtiene el tipo de parámetro de bucle utilizado en una instrucción de flujo de control « ForLoop ».
Esta función determina si un « ForLoop » carece de parámetro de bucle, utiliza un símbolo de parámetro o utiliza una variable (QkVar) para realizar el seguimiento del valor de iteración.
Genera un error si cf_inst no es una instrucción de flujo de control de « ForLoop ».
Ejemplo
// Assuming cf_inst is a ForLoop instruction
QkLoopParamKind param_kind = qk_control_flow_loop_param_kind(cf_inst);
if (param_kind == QkLoopParamKind_Parameter) {
// Loop uses a Parameter symbol
} else if (param_kind == QkLoopParamKind_Variable) {
// Loop uses a Variable
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a una instrucción de flujo de control que debe ser una instrucción de salto condicional ( ForLoop ).
Devuelve
Un QkLoopParamKind valor de enumeración que indica el tipo de parámetro del bucle.
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
Obtener la información sobre el símbolo del parámetro de bucle a partir de una instrucción de flujo de control « ForLoop ».
Esta función recupera la información del símbolo del parámetro de bucle de una instrucción « ForLoop » que utiliza un parámetro como parámetro de bucle. El valor devuelto QkSymbolInfo contiene el tipo, el nombre y el índice del símbolo (en el caso de los símbolos que son elementos de un vector de parámetros).
Da un error si cf_inst no es una instrucción de flujo de control de tipo « ForLoop » con un parámetro de bucle «Parameter».
Ejemplo
// Assuming cf_inst is a ForLoop control flow instruction with a Parameter loop parameter
QkSymbolInfo symbol_info = qk_control_flow_loop_symbol_info(cf_inst);
if (symbol_info.ty == QkSymbolType_Standalone) {
printf("Loop parameter: %s\n", symbol_info.name);
} else if (symbol_info.ty == QkSymbolType_Element) {
printf("Loop parameter: %s[%zu]\n", symbol_info.name, symbol_info.index);
}
qk_str_free(symbol_info.name);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un objeto
QkControlFlowInstructionque debe representar unForLoopcon un parámetro de bucleParameter.
Devuelve
Una QkSymbolInfo estructura que contiene la información sobre los símbolos. La función llamada debe liberar la cadena devuelta en el name campo utilizando qk_str_free.
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
Obtener la variable de bucle a partir de una instrucción de flujo de control « ForLoop ».
Esta función recupera un puntero a la variable (QkVar) utilizada como parámetro del bucle en una instrucción « ForLoop ». El puntero devuelto se toma prestado durante toda la duración de la instrucción de flujo de control y el llamante no debe liberarlo.
Da un error si cf_inst no es una instrucción de flujo de control de tipo « ForLoop » con un parámetro de bucle «Variable».
Ejemplo
// Assuming cf_inst is a ForLoop control flow instruction with a Variable loop parameter
const QkVar *loop_var = qk_control_flow_loop_variable(cf_inst);
// Use the loop variable pointer to access variable informationSeguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst – Un puntero válido a un objeto
QkControlFlowInstructionque debe representar unForLoopcon un parámetro de bucle variable.
Devuelve
Un puntero a la QkVar variable de bucle. El puntero es válido durante toda la vida útil de la instrucción de flujo de control.
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Obtener el tipo del destino de la instrucción «Switch» de control de flujo.
Las instrucciones «switch» pueden actuar sobre diferentes tipos de objetivos: un bit clásico, un registro clásico o una expresión. Esta función devuelve el tipo de destino que utiliza la instrucción «Switch».
Genera un error si cf_inst no es una instrucción de control de flujo de Switch.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
QkConditionType target_type = qk_control_flow_switch_target_type(cf_inst);
switch (target_type) {
case QkConditionType_ClBit:
// do something
break;
case QkConditionType_ClReg:
// do something
break;
case QkConditionType_Expr:
// do something
break;
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch».
Devuelve
El tipo de condición del destino «Switch» es QkConditionType.
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Obtener el índice de bits clásico de un destino Switch.
Esta función recupera el índice del bit clásico sobre el que opera una instrucción «Switch» cuando el destino de la instrucción «Switch» es un bit clásico.
Da un error si cf_inst no es una instrucción de control de flujo «Switch» con un destino de bits clásico.
Ejemplo
// Assuming cf_inst is a Switch instruction with a classical bit target
uint32_t clbit_idx = qk_control_flow_switch_target_bit(cf_inst);
printf("Switch operates on clbit %u\n", clbit_idx);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch» con un destino de bits clásico.
Devuelve
El índice del bit clásico en el circuito.
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Obtiene el registro clásico sobre el que opera una instrucción «Switch».
Esta función recupera el registro clásico que se utiliza como destino de Switch cuando Switch opera sobre un registro.
Genera un error si cf_inst no es una instrucción de control de flujo «Switch» con un registro como destino.
Ejemplo
// Assuming cf_inst is a Switch instruction with a register target
const QkClassicalRegister *reg = qk_control_flow_switch_target_register(cf_inst);
// Use the register to get its name, size, etc...Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch» con un registro como destino.
Devuelve
Un puntero a la QkClassicalRegister sobre la que opera Switch. El registro es válido mientras exista la instrucción de flujo de control. El registro pertenece a la instrucción de flujo de control y la función que lo llama no debe liberarlo.
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Obtener la expresión de un destino de Switch.
Esta función obtiene un puntero a la expresión clásica sobre la que opera una instrucción «Switch» cuando el destino de «Switch» es una expresión.
Genera un error si cf_inst no es una instrucción de control de flujo «Switch» con una expresión como destino.
Ejemplo
// Assuming cf_inst is a Switch instruction with an expression target
const QkExpr *target_expr = qk_control_flow_switch_target_expr(cf_inst);
// Evaluate the expression...Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch» con una expresión como objetivo.
Devuelve
Un puntero a la QkExpr expresión objetivo de Switch. La expresión es válida siempre y cuando exista la instrucción de flujo de control. La expresión pertenece a la instrucción de flujo de control y el llamante no debe liberarla.
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Obtener el número de casos de una instrucción «Switch».
Devuelve el número total de bloques «case» de la instrucción «Switch», incluido el «case» por defecto, si lo hay.
Genera un error si cf_inst no es una instrucción de control de flujo de Switch.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
size_t num_cases = qk_control_flow_switch_num_cases(cf_inst);
for (size_t i = 0; i < num_cases; i++) {
// Analyze the case...
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch».
Devuelve
El número de casos de la instrucción «Switch».
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Comprueba si un caso concreto de una instrucción «Switch» es el caso por defecto.
Las sentencias «switch» pueden incluir un caso por defecto que se aplica cuando ningún otro caso coincide. Esta función comprueba si el caso correspondiente al índice indicado es el caso por defecto. El caso predeterminado también puede incluir etiquetas iniciales, que se pueden recuperar mediante qk_control_flow_switch_case_labels_uint en el caso predeterminado.
Genera un error si cf_inst no es una instrucción de control de flujo de Switch.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
for (size_t i = 0; i < qk_control_flow_switch_num_cases(cf_inst); i++) {
if (qk_control_flow_switch_is_case_default(cf_inst, i)) {
printf("Case %zu is the default case\n", i);
}
}Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch».
- case_idx – El índice del caso que se va a comprobar. Debe ser inferior al valor devuelto por
qk_control_flow_switch_num_cases.
Devuelve
true si el caso en case_idx es el caso por defecto, false en caso contrario.
qk_control_flow_switch_case_labels_bit_width
uint64_t qk_control_flow_switch_case_labels_bit_width(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Obtén el ancho de bits máximo necesario para representar las etiquetas en un caso «case» de Switch.
Esta función devuelve el número máximo de bits necesarios para representar cualquiera de las etiquetas de enteros sin signo en el caso especificado. Esto resulta útil para determinar el ancho mínimo en bits necesario para almacenar o procesar las etiquetas de los casos.
Genera un error si cf_inst no es una instrucción de control de flujo de Switch.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
uint64_t bit_width = qk_control_flow_switch_case_labels_bit_width(cf_inst, 0);
printf("Maximum bit width for case 0: %lu\n", bit_width);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch».
- case_idx – El índice del caso cuyo ancho de bits de etiqueta se desea recuperar. Debe ser inferior al valor devuelto por
qk_control_flow_switch_num_cases.
Devuelve
El ancho máximo en bits de las etiquetas del caso, o 0 si el caso no contiene etiquetas de enteros sin signo (por ejemplo, si solo contiene un especificador DEFAULT).
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Obtener las etiquetas correspondientes a un caso concreto en una instrucción «Switch».
Cada caso de una instrucción «switch» puede tener una o varias etiquetas (por ejemplo, case(1, 2, 3)) tiene tres etiquetas: 1, 2 y 3). Esta función recupera todas las etiquetas de un caso determinado. Ten en cuenta que el caso por defecto también puede incluir etiquetas, que pueden recuperarse mediante esta función. Cuando se invoca en un caso por defecto sin etiquetas adicionales, la función establece num_labels = 0 y labels = NULL en la estructura devuelta QkSwitchCaseLabels . Antes de llamar a esta función, debes utilizar qk_control_flow_switch_case_labels_bit_width para asegurarte de que las etiquetas quepan en uint64_t.
Genera un error si cf_inst no es una instrucción de control de flujo «Switch» o si una etiqueta «case» no cabe en uint64_t.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
QkSwitchCaseLabels case_labels = qk_control_flow_switch_case_labels_uint(cf_inst, 0);
for (size_t i = 0; i < case_labels.num_labels; i++) {
printf("Label %zu: %lu\n", i, case_labels.labels[i]);
}
qk_control_flow_switch_case_labels_clear(&case_labels);Seguridad
El comportamiento es indefinido si cf_inst no es un puntero válido a un QkControlFlowInstruction, o si out_labels no es un puntero válido a una QkSwitchCaseLabels estructura.
Parámetros
- cf_inst : un puntero a la instrucción de flujo de control. La instrucción de flujo de control debe ser del tipo «Switch».
- case_idx – El índice del caso cuyas etiquetas se desean recuperar. Debe ser inferior al valor devuelto por
qk_control_flow_switch_num_cases.
Devuelve
Una QkSwitchCaseLabels estructura con la información de la etiqueta correspondiente al caso en cuestión. La estructura contendrá un puntero a una matriz de etiquetas y el número de etiquetas. num_labels > 0En ese caso, debes llamar a qk_control_flow_switch_case_labels_clear para liberar la memoria asignada por esta función.
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
Borrar una QkSwitchCaseLabels estructura.
Es necesario llamar a esta función para liberar la memoria asignada por qk_control_flow_switch_case_labels_uint. Tras llamar a esta función, el puntero «labels» de la estructura se establecerá en nulo y el contador se pondrá a cero.
Ejemplo
// Assuming cf_inst is a Switch control flow instruction
QkSwitchCaseLabels case_labels = qk_control_flow_switch_case_labels_uint(cf_inst, 0);
// Use the labels...
qk_control_flow_switch_case_labels_clear(&case_labels);Seguridad
El comportamiento es indefinido si labels no es un puntero válido a un QkSwitchCaseLabels.
Parámetros
- labels – Un puntero a la
QkSwitchCaseLabelsestructura que se va a borrar. La estructura debe haberse rellenado previamente medianteqk_control_flow_switch_case_labels_uint.