Skip to main content
IBM Quantum Platform

Fluxo de Controle

A API C do Qiskit para fluxo de controle oferece recursos para inspecionar as instruções de fluxo de controle utilizadas em circuitos quânticos. É possível consultar o tipo de instrução de fluxo de controle, acessar blocos de circuito aninhados, inspecionar condições e parâmetros de loop e recuperar mapeamentos de qubits e bits clássicos entre blocos aninhados e o circuito de nível superior.

typedef struct QkControlFlowInstruction QkControlFlowInstruction

A estrutura QkControlFlowInstruction “opaque” é o principal identificador utilizado pela API C para representar e analisar as instruções de fluxo de controle dentro de um circuito. É obtido por meio de uma chamada a qk_circuit_get_control_flow_instruction() e deve ser liberado por meio de uma chamada a qk_control_flow_instruction_free(). A maioria das funções da API C que operam em construções de fluxo de controle espera um ponteiro para essa estrutura opaca, tornando-a o principal meio para inspecionar instruções de fluxo de controle a partir do C. Observe que a maioria das funções desta API que utilizam QkControlFlowInstruction como entrada retornam ponteiros emprestados que permanecem válidos enquanto a instrução de fluxo de controle existir; portanto, esses ponteiros não precisam ser liberados separadamente.


Tipos de dados

QkControlFlowKind

enum QkControlFlowKind

Essa enumeração representa os diferentes tipos de instruções de fluxo de controle que podem aparecer em um circuito quântico.

Valores:

QkControlFlowKind_Box do recenseador

Instruções para a caixa

QkControlFlowKind_BreakLoop do recenseador

Instrução para interromper o ciclo

QkControlFlowKind_ContinueLoop do recenseador

Continuar a instrução de loop

QkControlFlowKind_ForLoop do recenseador

Instrução do loop “for”

QkControlFlowKind_IfElse do recenseador

Instrução if-else

QkControlFlowKind_Switch do recenseador

Instrução “case” do switch

QkControlFlowKind_While do recenseador

Instrução de loop while

QkConditionType

enum QkConditionType

Representa o tipo de condição ou o destino da instrução Switch em uma instrução de fluxo de controle.

Essa enumeração é usada para identificar se uma condição (nas instruções IfElse ou While) ou um destino da instrução Switch (nas instruções Switch) opera sobre um bit clássico, um registro clássico ou uma expressão clássica.

Valores:

QkConditionType_ClBit do recenseador

Condição baseada em um bit clássico

QkConditionType_ClReg do recenseador

Condição baseada em um registro clássico

QkConditionType_Expr do recenseador

Condição baseada em uma expressão clássica

QkConditionBitInfo

struct QkConditionBitInfo

Informações sobre uma condição de bits clássica.

Essa estrutura contém os detalhes de uma condição que atua sobre um único bit clássico

uint32_t clbit

O índice do bit clássico no circuito

bool condição

O valor esperado do bit clássico (verdadeiro ou falso)

QkBoxDurationKind

enum QkBoxDurationKind

Representa o tipo de especificação de duração para uma instrução Box.

As instruções da caixa podem não ter duração, ter um valor de duração específico ou ter uma duração especificada por meio de uma expressão clássica.

Valores:

QkBoxDurationKind_NoDuration do recenseador

Não há duração especificada

QkBoxDurationKind_Duration do recenseador

Valor da duração concreta (representado como QkDurationInfo)

QkBoxDurationKind_Expr do recenseador

Duração especificada como uma expressão clássica

QkSwitchCaseLabels

struct QkSwitchCaseLabels

Contém os rótulos para um caso do Switch.

Essa estrutura contém uma matriz de valores de rótulo com os quais o caso do Switch é comparado. Por exemplo, um caso como esse case(1, 2, 3) teria três rótulos: 1, 2 e 3. A memória para a matriz de rótulos é alocada por qk_control_flow_switch_case_labels_uint e deve ser liberada usando qk_control_flow_switch_case_labels_clear.

const uint64_t *labels

Ponteiro para uma matriz de valores de rótulo

size_t num_labels

Número de rótulos na matriz

QkLoopParamKind

enum QkLoopParamKind

O tipo do parâmetro de loop em uma instrução de fluxo de controle do tipo “ ForLoop ”.

Essa enumeração indica se um loop for não possui parâmetro de loop, utiliza um símbolo de parâmetro ou utiliza uma variável (QkVar) para rastrear o valor de iteração.

Valores:

QkLoopParamKind_NoLoopParam do recenseador

Não foi especificado nenhum parâmetro de loop para a instrução ForLoop

QkLoopParamKind_Parameter do recenseador

O parâmetro de loop é um parâmetro

QkLoopParamKind_Variable do recenseador

O parâmetro do loop é uma variável

QkSymbolType

enum QkSymbolType

O tipo de símbolo no contexto de “ ForLoop ”.

Essa enumeração indica se um símbolo é uma variável independente ou um elemento dentro de um vetor de parâmetros acessado por meio de um índice.

Valores:

QkSymbolType_Standalone do recenseador

Um símbolo independente com um nome simples

QkSymbolType_Element do recenseador

Um símbolo de elemento com um nome base e um índice

QkSymbolInfo

struct QkSymbolInfo

Informações sobre o símbolo, incluindo tipo e dados.

Essa estrutura representa um símbolo no contexto de um ForLoop, que pode ser uma variável independente ou um elemento indexado.

QkSymbolType ty

O tipo de símbolo (autônomo ou elemento)

char *nome

Uma string em C terminada por caractere nulo que contém o nome do símbolo. No caso de símbolos independentes, esse é o nome da variável. No caso dos símbolos de elementos, este é o nome base do vetor de parâmetros. O chamador é responsável por liberar essa string usando qk_str_free.

size_t índice

Para símbolos de elementos, este é o índice no vetor de parâmetros. Para símbolos independentes, este campo não é utilizado e deve ser ignorado.

QkLoopCollectionType

enum QkLoopCollectionType

O tipo de coleção utilizado em uma instrução de fluxo de controle do tipo “ ForLoop ”.

Valores:

QkLoopCollectionType_List do recenseador

O loop percorre uma lista explícita de elementos

QkLoopCollectionType_Range do recenseador

O loop percorre um intervalo no estilo Python (início, fim, passo)

QkLoopElements

struct QkLoopElements

Uma estrutura que contém elementos de um loop provenientes de uma instrução de fluxo de controle do tipo “ ForLoop ”.

Essa estrutura é retornada por qk_control_flow_loop_elements e contém tanto um ponteiro para a matriz de elementos do loop quanto o número de elementos na matriz. O ponteiro é emprestado e não deve ser liberado pelo chamador.

const ptrdiff_t *elements

Ponteiro para a matriz de elementos do loop.

size_t len

Número de elementos na matriz.


Funções

qk_control_flow_kind

QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)

Obtenha o tipo de instrução de fluxo de controle.

Exemplo

// 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;
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle.

Retorna

O tipo de instrução de fluxo de controle.

qk_control_flow_num_blocks

size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)

Obter o número de blocos de circuito em uma instrução de fluxo de controle.

Exemplo

// 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...
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle.

Retorna

O número de blocos de circuito contidos nesta instrução de fluxo de controle.

qk_control_flow_block_circuit

const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)

Obter um ponteiro para um bloco de circuito dentro de uma instrução de fluxo de controle.

As instruções de fluxo de controle contêm um ou mais blocos de circuito (por exemplo, a instrução “ IfElse ” tem dois blocos, enquanto a instrução “Switch” pode ter vários blocos). Esta função recupera um bloco específico por índice.

Exemplo

// 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...

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle.
  • block_idx – O índice do bloco a ser recuperado. block_idx deve estar dentro dos limites (< qk_control_flow_num_blocks).

Retorna

Um ponteiro para o QkCircuit bloco solicitado. O circuito é válido enquanto a instrução de fluxo de controle existir. O circuito pertence à instrução de fluxo de controle e não deve ser liberado pelo chamador.

qk_control_flow_qubit_map

const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)

Obter o mapeamento de qubits para uma instrução de fluxo de controle.

Retorna um ponteiro para uma matriz que mapeia os qubits utilizados nos blocos da instrução de fluxo de controle para seus índices no circuito de nível superior. O comprimento da matriz é igual ao número de qubits utilizados pela instrução de fluxo de controle. Para cada índice i de qubit no bloco aninhado, o mapeamento no índice i da matriz fornece o índice do qubit correspondente no circuito de nível superior.

Exemplo

// 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]);
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle.

Retorna

Um ponteiro para uma matriz de uint32_t valores que representam o mapeamento do qubit. A matriz é válida enquanto a instrução de fluxo de controle existir. A matriz pertence à instrução de fluxo de controle e não deve ser liberada pelo chamador.

qk_control_flow_clbit_map

const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)

Obtenha o mapeamento clássico de bits para uma instrução de fluxo de controle.

Retorna um ponteiro para uma matriz que mapeia os bits clássicos utilizados nos blocos das instruções de fluxo de controle para seus índices no circuito de nível superior. O comprimento da matriz é igual ao número de bits clássicos utilizados pela instrução de fluxo de controle. Para cada índice i de bit clássico no bloco aninhado, o mapeamento no índice i da matriz fornece o índice de bit clássico correspondente no circuito de nível superior.

Exemplo

// 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]);
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle.

Retorna

Um ponteiro para uma matriz de uint32_t valores que representam o mapeamento clássico de bits. A matriz é válida enquanto a instrução de fluxo de controle existir. A matriz pertence à instrução de fluxo de controle e não deve ser liberada pelo chamador.

qk_control_flow_condition_type

QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)

Obter o tipo de condição de uma instrução de fluxo de controle.

Retorna o tipo da condição utilizada em uma instrução IfElse ou While. O tipo de condição indica se a condição se baseia em um bit clássico, um registro clássico ou uma expressão clássica.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”.

Exemplo

// 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;
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While.

Retorna

Um QkConditionType valor de enumeração que indica o tipo de condição.

qk_control_flow_condition_bit_info

QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)

Obter as informações sobre o estado dos bits clássicos de uma instrução de fluxo de controle.

Extrai o índice de bit clássico e o valor esperado de uma instrução IfElse ou While que possua uma condição de bit clássica.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”, ou se a condição não for do tipo bit.

Exemplo

// 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");

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While com uma condição de bit clássica.

Retorna

Uma QkConditionBitInfo estrutura que contém o índice de bits clássico e o valor esperado.

qk_control_flow_condition_reg_cond_bit_width

uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)

Obter a largura em bits da condição clássica do registro para uma instrução de fluxo de controle.

Extrai a largura em bits do registro clássico a partir de uma instrução IfElse ou While que contenha uma condição de registro clássico.

Gera erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”, ou se a condição não for um tipo de registro.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While com uma condição de registro clássica.

Retorna

A largura em bits da condição no registro clássico.

qk_control_flow_condition_reg

const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)

Obter o registro clássico para uma condição de instrução de fluxo de controle.

Extrai o registro clássico de uma instrução IfElse ou While que possua uma condição de registro clássico.

Gera erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”, ou se a condição não for um tipo de registro.

Exemplo

// 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

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While com uma condição de registro clássica.

Retorna

Um ponteiro emprestado para o QkClassicalRegister. O ponteiro permanece válido enquanto o circuito pai permanecer válido.

qk_control_flow_condition_reg_cond_uint

uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)

Obter o valor da condição do registro clássico para uma instrução de fluxo de controle.

Extrai a condição como um valor inteiro sem sinal a partir de uma instrução IfElse ou While que possua uma condição de registro clássica.

Gera erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”, se a condição não for do tipo registro ou se o valor da condição não couber em um uint64_t.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While com uma condição de registro clássica.

Retorna

O valor da condição.

qk_control_flow_condition_expr

const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)

Obtenha a expressão clássica para uma instrução de fluxo de controle.

Extrai a expressão clássica de uma instrução IfElse ou While que possua uma condição baseada em expressão.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo “ IfElse ” ou “While”, ou se a condição não for do tipo expressão.

Uso de Exemplo

// 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...
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um QkControlFlowInstruction que deve representar uma instrução IfElse ou While com uma condição de expressão.

Retorna

Um ponteiro emprestado para o QkExprNode que representa a expressão clássica. O ponteiro permanece válido enquanto o circuito pai permanecer válido.

qk_control_flow_box_duration_kind

QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)

Obter a duração de uma instrução de fluxo de controle do tipo Box.

As instruções da caixa podem não ter duração, ter um valor de duração específico, como QkDurationInfo, ou uma duração especificada por meio de uma expressão. Essa função retorna o tipo de duração presente.

Gera um erro se cf_inst não for uma instrução de fluxo de controle do tipo Box.

Exemplo

// 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;
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Box.

Retorna

O tipo de duração como QkBoxDurationKind.

qk_control_flow_box_duration_val_info

QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)

Obter as informações sobre o valor da duração de uma instrução de fluxo de um controle Box.

Esta função recupera o valor e o tipo da duração de uma instrução Box que possui uma duração concreta.

Gera um erro se cf_inst não for uma instrução de fluxo de controle do tipo “Box” com uma duração específica.

Exemplo

// 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;
 }

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Box e ter uma duração específica.

Retorna

Uma QkDurationInfo estrutura que contém o valor da duração e a unidade.

qk_control_flow_box_duration_expr

const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)

Obter a expressão de duração de uma instrução de fluxo de um controle Box.

Esta função retorna um ponteiro para a expressão que define a duração de uma instrução Box quando a duração é especificada como uma expressão.

Gera um erro se cf_inst não for uma instrução de fluxo de controle do tipo “Box” com uma expressão de duração.

Exemplo

// 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...

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Box e ter uma duração de expressão.

Retorna

Um ponteiro para o QkExpr que representa a expressão de duração. A expressão é válida enquanto a instrução de fluxo de controle existir. A expressão pertence à instrução de fluxo de controle e não deve ser liberada pelo chamador.

qk_control_flow_loop_collection_type

QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)

Obter o tipo de coleção utilizada em uma instrução de fluxo de controle do tipo “ ForLoop ”.

Essa função determina se uma função ForLoop percorre uma lista explícita de elementos ou um intervalo do tipo Python.

Gera um erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ”.

Exemplo

// 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
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para uma instrução de fluxo de controle que deve ser um ForLoop.

Retorna

Um CLoopCollectionType valor de enumeração que indica o tipo de coleção.

qk_control_flow_loop_elements

QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)

Obter a lista de elementos sobre os quais um ForLoop percorre.

Esta função recupera a lista de elementos de uma instrução de fluxo de controle do tipo “ ForLoop ” que utiliza uma coleção de lista explícita. Use qk_control_flow_loop_collection_type para determinar o tipo de coleção antes de chamar esta função.

Gera erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ” com uma coleção do tipo lista.

Exemplo

// 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]);
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para uma instrução de fluxo de controle que deve ser um ForLoop com uma coleção do tipo List.

Retorna

Uma QkLoopElements estrutura que contém um ponteiro para a matriz de elementos do loop e o número de elementos. O ponteiro é emprestado enquanto dura a instrução de fluxo de controle e não deve ser liberado pelo chamador.

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)

Obter os parâmetros de intervalo de um ForLoop que percorre um intervalo do tipo Python.

Esta função recupera os valores de início, fim e passo de uma instrução de fluxo de controle do tipo “ ForLoop ” que utiliza uma coleção de intervalos. Use qk_control_flow_loop_collection_type para determinar o tipo de coleção antes de chamar esta função.

Gera erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ” com uma coleção de intervalos.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction, ou se qualquer um dos out_start, out_stop, ou out_step não for um ponteiro válido e alinhado para gravação.

Parâmetros

  • cf_inst – Um ponteiro para uma instrução de fluxo de controle que deve ser um objeto ForLoop com uma coleção Range.
  • out_start – Um parâmetro de saída que será definido como o valor inicial do intervalo.
  • out_stop – Um parâmetro de saída que será definido com o valor de limite do intervalo.
  • out_step – Um parâmetro de saída que será definido com o valor do intervalo.

qk_control_flow_loop_param_kind

QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)

Obter o tipo do parâmetro de loop usado em uma instrução de fluxo de controle do tipo “ ForLoop ”.

Essa função determina se um ForLoop não possui parâmetro de loop, utiliza um símbolo de parâmetro ou utiliza uma variável (QkVar) para acompanhar o valor da iteração.

Gera um erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ”.

Exemplo

// 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
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para uma instrução de fluxo de controle que deve ser um ForLoop.

Retorna

Um QkLoopParamKind valor de enumeração que indica o tipo do parâmetro do loop.

qk_control_flow_loop_symbol_info

QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)

Obter as informações sobre o símbolo do parâmetro de loop a partir de uma instrução de fluxo de controle do tipo “ ForLoop ”.

Esta função recupera as informações do símbolo do parâmetro de loop de uma instrução ForLoop que utiliza um Parameter como seu parâmetro de loop. O valor retornado QkSymbolInfo contém o tipo, o nome e o índice do símbolo (no caso de símbolos que são elementos de um vetor de parâmetros).

Gera erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ” com um parâmetro de loop.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um objeto QkControlFlowInstruction que deve representar um ForLoop com um parâmetro de loop Parameter.

Retorna

Uma QkSymbolInfo estrutura que contém as informações sobre os símbolos. O chamador deve liberar a string retornada no name campo usando qk_str_free.

qk_control_flow_loop_variable

const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)

Obter a variável de loop a partir de uma instrução de fluxo de controle do tipo “ ForLoop ”.

Esta função retorna um ponteiro para a variável (QkVar) usada como parâmetro do loop na instrução ForLoop. O ponteiro retornado é emprestado durante toda a duração da instrução de fluxo de controle e não deve ser liberado pelo chamador.

Gera erro se cf_inst não for uma instrução de fluxo de controle do tipo “ ForLoop ” com um parâmetro de loop do tipo “Variável”.

Exemplo

// 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

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro válido para um objeto QkControlFlowInstruction que deve representar um ForLoop com um parâmetro de loop variável.

Retorna

Um ponteiro para a variável QkVar que representa a variável de loop. O ponteiro é válido durante todo o tempo de execução da instrução de fluxo de controle.

qk_control_flow_switch_target_type

QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)

Obter o tipo do destino da instrução de fluxo de controle Switch.

As instruções switch podem operar sobre diferentes tipos de alvos: um bit clássico, um registro clássico ou uma expressão. Essa função retorna o tipo de destino utilizado pela instrução Switch.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo Switch.

Exemplo

// 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;
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch.

Retorna

O tipo de condição do destino do Switch é QkConditionType.

qk_control_flow_switch_target_bit

uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)

Obter o índice de bits clássico de um destino do Switch.

Esta função retorna o índice do bit clássico sobre o qual uma instrução Switch opera quando o destino da instrução Switch é um bit clássico.

Gera um erro se cf_inst não for uma instrução de controle de fluxo Switch com um destino de bit clássico.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch com um destino de bit clássico.

Retorna

O índice do bit clássico no circuito.

qk_control_flow_switch_target_register

const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)

Obter o registro clássico no qual uma instrução Switch opera.

Esta função recupera o registro clássico utilizado como destino do Switch quando este opera sobre um registro.

Gera um erro se cf_inst não for uma instrução de controle de fluxo Switch com um registro como destino.

Exemplo

// 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...

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch com um registro como destino.

Retorna

Um ponteiro para o QkClassicalRegister no qual o Switch opera. O registro permanece válido enquanto a instrução de fluxo de controle existir. O registro pertence à instrução de fluxo de controle e não deve ser liberado pela função chamadora.

qk_control_flow_switch_target_expr

const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)

Obter a expressão de um destino do Switch.

Esta função retorna um ponteiro para a expressão clássica sobre a qual uma instrução Switch opera quando o alvo da instrução Switch é uma expressão.

Gera um erro se cf_inst não for uma instrução de fluxo de controle Switch com uma expressão como destino.

Exemplo

// 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...

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch com uma expressão como alvo.

Retorna

Um ponteiro para a QkExpr expressão-alvo do Switch. A expressão é válida enquanto a instrução de fluxo de controle existir. A expressão pertence à instrução de fluxo de controle e não deve ser liberada pelo chamador.

qk_control_flow_switch_num_cases

size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)

Obter o número de casos em uma instrução Switch.

Retorna o número total de blocos case na instrução Switch, incluindo o case padrão, se houver.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo Switch.

Exemplo

// 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...
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch.

Retorna

O número de casos na instrução Switch.

qk_control_flow_switch_is_case_default

bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)

Verifique se um caso específico em uma instrução Switch é o caso padrão.

As instruções switch podem ter um caso padrão que é executado quando nenhum outro caso é atendido. Esta função verifica se o caso no índice especificado é o caso padrão. O caso padrão também pode incluir rótulos iniciais, que podem ser recuperados por qk_control_flow_switch_case_labels_uint no caso padrão.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo Switch.

Exemplo

// 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);
    }
}

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch.
  • case_idx – O índice do caso a ser verificado. Deve ser menor que o valor retornado por qk_control_flow_switch_num_cases.

Retorna

true se o caso em case_idx for o caso padrão, false caso contrário.

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)

Obtenha a largura máxima em bits necessária para representar os rótulos em um caso do Switch.

Essa função retorna o número máximo de bits necessários para representar qualquer um dos rótulos de inteiros sem sinal no caso especificado. Isso é útil para determinar a largura mínima em bits necessária para armazenar ou processar as etiquetas das caixas.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do tipo Switch.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch.
  • case_idx – O índice do caso cuja largura de bits do rótulo deve ser recuperada. Deve ser menor que o valor retornado por qk_control_flow_switch_num_cases.

Retorna

A largura máxima em bits dos rótulos no caso, ou 0 se o caso não tiver rótulos de inteiros sem sinal (por exemplo, apenas um 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)

Obter os rótulos de um caso específico em uma instrução Switch.

Cada caso em uma instrução Switch pode ter um ou mais rótulos (por exemplo, case(1, 2, 3)) tem três rótulos: 1, 2 e 3). Esta função recupera todos os rótulos de um determinado caso. Observe que o caso padrão também pode incluir rótulos, que podem ser recuperados por esta função. Quando chamada em um caso padrão sem rótulos adicionais, a função define num_labels = 0 e labels = NULL na struct retornada QkSwitchCaseLabels . Antes de chamar essa função, você deve usar qk_control_flow_switch_case_labels_bit_width para garantir que os rótulos caibam em uint64_t.

Gera um erro se cf_inst não for uma instrução de controle de fluxo do Switch ou se um rótulo de caso não couber em uint64_t.

Exemplo

// 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);

Segurança

O comportamento é indefinido se cf_inst não for um ponteiro válido para um QkControlFlowInstruction, ou se out_labels não for um ponteiro válido para uma QkSwitchCaseLabels estrutura.

Parâmetros

  • cf_inst – Um ponteiro para a instrução de fluxo de controle. A instrução de fluxo de controle deve ser do tipo Switch.
  • case_idx – O índice do caso cujos rótulos devem ser recuperados. Deve ser menor que o valor retornado por qk_control_flow_switch_num_cases.

Retorna

Uma QkSwitchCaseLabels estrutura com as informações de rotulagem para o caso em questão. A estrutura conterá um ponteiro para uma matriz de rótulos e o número de rótulos. num_labels > 0Nesse caso, você deve chamar qk_control_flow_switch_case_labels_clear para liberar a memória alocada por esta função.

qk_control_flow_switch_case_labels_clear

void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)

Limpar uma QkSwitchCaseLabels estrutura.

É necessário chamar essa função para liberar a memória alocada por qk_control_flow_switch_case_labels_uint. Após chamar essa função, o ponteiro “labels” na estrutura será definido como nulo e a contagem será definida como zero.

Exemplo

// 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);

Segurança

O comportamento é indefinido se labels não for um ponteiro válido para um QkSwitchCaseLabels.

Parâmetros

  • labels – Um ponteiro para a QkSwitchCaseLabels estrutura a ser limpa. A estrutura deve ter sido preenchida anteriormente por qk_control_flow_switch_case_labels_uint.
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.