Skip to main content
IBM Quantum Platform

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 QkControlFlowInstruction

La 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_idx debe 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 QkControlFlowInstruction que 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 QkControlFlowInstruction que 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 QkControlFlowInstruction que 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 pointer

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 QkControlFlowInstruction que 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 QkControlFlowInstruction que 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 QkControlFlowInstruction que 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 QkControlFlowInstruction que debe representar un ForLoop con un parámetro de bucle Parameter.

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 information

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 QkControlFlowInstruction que debe representar un ForLoop con 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 QkSwitchCaseLabels estructura que se va a borrar. La estructura debe haberse rellenado previamente mediante qk_control_flow_switch_case_labels_uint.
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.