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 QkControlFlowInstructionA 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_idxdeve 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
QkControlFlowInstructionque 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
QkControlFlowInstructionque 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
QkControlFlowInstructionque 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 pointerSeguranç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
QkControlFlowInstructionque 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
QkControlFlowInstructionque 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
QkControlFlowInstructionque deve representar uma instruçãoIfElseouWhilecom 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
ForLoopcom uma coleção do tipoList.
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
ForLoopcom uma coleçãoRange. - 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
QkControlFlowInstructionque deve representar umForLoopcom um parâmetro de loopParameter.
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 informationSeguranç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
QkControlFlowInstructionque deve representar umForLoopcom 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
QkSwitchCaseLabelsestrutura a ser limpa. A estrutura deve ter sido preenchida anteriormente porqk_control_flow_switch_case_labels_uint.