Flux de contrôle
L'API C de Qiskit dédiée au flux de contrôle offre des fonctionnalités permettant d'examiner les instructions de flux de contrôle utilisées dans les circuits quantiques. Vous pouvez interroger le type d'instruction de flux de contrôle, accéder aux blocs de circuit imbriqués, examiner les conditions et les paramètres de boucle, et récupérer les correspondances entre les qubits et les bits classiques entre les blocs imbriqués et le circuit de niveau supérieur.
typedef struct QkControlFlowInstruction QkControlFlowInstructionLa structure « opaque QkControlFlowInstruction » est le principal moyen utilisé par l'API C pour représenter et analyser les instructions de flux de contrôle au sein d'un circuit. Il est obtenu par un appel à qk_circuit_get_control_flow_instruction() et doit être libéré par un appel à qk_control_flow_instruction_free(). La plupart des fonctions de l'API C qui agissent sur des constructions de flux de contrôle attendent un pointeur vers cette structure opaque, ce qui en fait le moyen principal d'inspecter les instructions de flux de contrôle depuis le C. Notez que la plupart des fonctions de cette API qui utilisent QkControlFlowInstruction en entrée renvoient des pointeurs empruntés qui restent valides tant que l'instruction de flux de contrôle existe; il n'est donc pas nécessaire de libérer ces pointeurs séparément.
Types de données
QkControlFlowKind
enum QkControlFlowKind
Cette énumération représente les différents types d'instructions de contrôle de flux pouvant apparaître dans un circuit quantique.
Valeurs :
QkControlFlowKind_Box de l'enquêteur
Mode d'emploi d'une boîte
QkControlFlowKind_BreakLoop de l'enquêteur
Instruction « Break » de boucle
QkControlFlowKind_ContinueLoop de recenseur
Poursuivre l'instruction de boucle
QkControlFlowKind_ForLoop de l'enquêteur
Instruction de boucle « for »
QkControlFlowKind_IfElse de l'enquêteur
Instruction « if-else »
QkControlFlowKind_Switch de l'enquêteur
Instruction « switch case »
QkControlFlowKind_While de l'enquêteur
Instruction de boucle « while »
QkConditionType
enum QkConditionType
Représente le type de condition ou la cible d'une instruction de branchement dans une instruction de contrôle de flux.
Cette énumération sert à déterminer si une condition (dans les instructions « IfElse » ou « While ») ou une cible « Switch » (dans les instructions « Switch ») porte sur un bit classique, un registre classique ou une expression classique.
Valeurs :
QkConditionType_ClBit de l'enquêteur
Condition basée sur un bit classique
QkConditionType_ClReg de l'enquêteur
Condition basée sur un registre classique
QkConditionType_Expr de l'enquêteur
Condition fondée sur une expression classique
QkConditionBitInfo
struct QkConditionBitInfo
Informations sur une condition de bit classique.
Cette structure contient les détails d'une condition qui s'applique à un seul bit classique
uint32_t clbit
L'indice du bit classique dans le circuit
bool condition
La valeur attendue du bit classique (vrai ou faux)
QkBoxDurationKind
enum QkBoxDurationKind
Représente le type de spécification de durée pour une instruction « Box ».
Les instructions de la boîte peuvent ne pas avoir de durée, avoir une valeur de durée précise ou une durée spécifiée sous forme d'expression classique.
Valeurs :
QkBoxDurationKind_NoDuration de l'enquêteur
Durée non précisée
QkBoxDurationKind_Duration de l'enquêteur
Valeur de durée concrète (représentée par QkDurationInfo)
QkBoxDurationKind_Expr de l'enquêteur
Durée exprimée sous forme classique
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Contient les libellés d'un bloc « case » de l'opérateur « switch ».
Cette structure contient un tableau de valeurs d'étiquettes avec lesquelles une instruction « switch » effectue une comparaison. Par exemple, un cas comme case(1, 2, 3) celui-ci comporterait trois étiquettes : 1, 2 et 3. La mémoire allouée au tableau des étiquettes est allouée par qk_control_flow_switch_case_labels_uint et doit être libérée à l'aide de qk_control_flow_switch_case_labels_clear.
const uint64_t *labels
Pointeur vers un tableau de valeurs d'étiquettes
size_t num_labels
Nombre d'étiquettes dans le tableau
QkLoopParamKind
enum QkLoopParamKind
Le type du paramètre de boucle dans une instruction de contrôle de flux de type « ForLoop ».
Cette énumération indique si une boucle « for » ne comporte aucun paramètre de boucle, utilise un symbole « Parameter » ou utilise une variable (QkVar) pour suivre la valeur d'itération.
Valeurs :
QkLoopParamKind_NoLoopParam de l'enquêteur
Aucun paramètre de boucle n'est spécifié pour l'instruction « ForLoop »
QkLoopParamKind_Parameter de l'enquêteur
Le paramètre de boucle est un paramètre
QkLoopParamKind_Variable de l'enquêteur
Le paramètre de boucle est une variable
QkSymbolType
enum QkSymbolType
Le type de symbole dans le contexte d'un « ForLoop ».
Cette énumération indique si un symbole est une variable autonome ou un élément d'un vecteur de paramètres accessible via un index.
Valeurs :
QkSymbolType_Standalone de l'enquêteur
Un symbole autonome portant un nom simple
QkSymbolType_Element de l'enquêteur
Un symbole d'élément comportant un nom de base et un indice
QkSymbolInfo
struct QkSymbolInfo
Informations sur le symbole, notamment son type et ses données.
Cette structure représente un symbole dans un contexte « ForLoop », qui peut être soit une variable autonome, soit un élément indexé.
QkSymbolType ty
Le type de symbole (autonome ou élément)
char *nom
Une chaîne C terminée par un caractère nul contenant le nom du symbole. Pour les symboles autonomes, il s'agit du nom de la variable. Pour les symboles d'éléments, il s'agit du nom de base du vecteur de paramètres. Il incombe à l'appelant de libérer cette chaîne à l'aide de qk_str_free.
size_t index
Pour les symboles d'éléments, il s'agit de l'indice dans le vecteur de paramètres. Pour les symboles autonomes, ce champ n'est pas utilisé et doit être ignoré.
QkLoopCollectionType
enum QkLoopCollectionType
Le type de collection utilisé dans une instruction de contrôle de flux de type « ForLoop ».
Valeurs :
QkLoopCollectionType_List de l'enquêteur
La boucle parcourt une liste explicite d'éléments
QkLoopCollectionType_Range de l'enquêteur
La boucle parcourt une plage de type « Python » (début, fin, pas)
QkLoopElements
struct QkLoopElements
Une structure contenant les éléments d'une boucle issus d'une instruction de contrôle de flux de type « ForLoop ».
Cette structure est renvoyée par qk_control_flow_loop_elements et contient à la fois un pointeur vers le tableau des éléments de la boucle et le nombre d'éléments de ce tableau. Le pointeur est emprunté et ne doit pas être libéré par l'appelant.
const ptrdiff_t *elements
Pointeur vers le tableau contenant les éléments de la boucle.
size_t len
Nombre d'éléments du tableau.
Fonctions
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
Obtenir une instruction de type « contrôle de flux ».
Exemple
// 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;
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux.
Retours
Le type d'instruction de contrôle de flux.
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
Récupérer le nombre de blocs de circuit dans une instruction de flux de contrôle.
Exemple
// 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...
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux.
Retours
Le nombre de blocs de circuit contenus dans cette instruction de flux de contrôle.
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
Obtenir un pointeur vers un bloc de circuit au sein d'une instruction de flux de contrôle.
Les instructions de contrôle de flux contiennent un ou plusieurs blocs de circuit (par exemple, « IfElse » comporte deux blocs, tandis que « Switch » peut en comporter plusieurs). Cette fonction permet de récupérer un bloc spécifique à l'aide de son index.
Exemple
// 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...Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux.
- block_idx – L'index du bloc à récupérer.
block_idxdoit se situer dans les limites (<qk_control_flow_num_blocks).
Retours
Un pointeur vers le bloc QkCircuit représentant le bloc demandé. Le circuit reste valide tant que l'instruction de contrôle de flux existe. Le circuit appartient à l'instruction de contrôle de flux et ne doit pas être libéré par la fonction appelante.
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
Récupérer le mappage des qubits pour une instruction de flux de contrôle.
Renvoie un pointeur vers un tableau qui associe les qubits utilisés dans les blocs de l'instruction de flux de contrôle à leurs indices dans le circuit de niveau supérieur. La longueur du tableau correspond au nombre de qubits utilisés par l'instruction de flux de contrôle. Pour chaque indice i de qubit dans le bloc imbriqué, la correspondance à l'indice i dans le tableau donne l'indice de qubit correspondant dans le circuit de niveau supérieur.
Exemple
// 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]);
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux.
Retours
Un pointeur vers un tableau de uint32_t valeurs représentant la correspondance des qubits. Le tableau reste valide tant que l'instruction de contrôle de flux existe. Le tableau appartient à l'instruction de contrôle de flux et ne doit pas être libéré par l'appelant.
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
Récupérer la représentation binaire classique d'une instruction de contrôle de flux.
Renvoie un pointeur vers un tableau qui associe les bits classiques utilisés dans les blocs d'instructions de contrôle de flux à leurs indices dans le circuit de niveau supérieur. La longueur du tableau correspond au nombre de bits classiques utilisés par l'instruction de contrôle de flux. Pour chaque index i de bit classique dans le bloc imbriqué, la correspondance à l'index i dans le tableau donne l'index de bit classique correspondant dans le circuit de niveau supérieur.
Exemple
// 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]);
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux.
Retours
Un pointeur vers un tableau de uint32_t valeurs représentant le mappage binaire classique. Le tableau reste valide tant que l'instruction de contrôle de flux existe. Le tableau appartient à l'instruction de contrôle de flux et ne doit pas être libéré par l'appelant.
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
Récupérer le type de condition d'une instruction de flux de contrôle.
Renvoie le type de condition utilisé dans une instruction « IfElse » ou « While ». Le type de condition indique si la condition repose sur un bit classique, un registre classique ou une expression classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou «While».
Exemple
// 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;
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit correspondre à une instruction « IfElse » ou « While ».
Retours
Une QkConditionType valeur d'énumération indiquant le type de condition.
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
Récupérer les informations relatives à l'état des bits classiques d'une instruction de contrôle de flux.
Extrait l'index de bit classique et la valeur attendue à partir d'une instruction « IfElse » ou « While » comportant une condition de bit classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou «While », ou si la condition n'est pas de type binaire.
Exemple
// 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");Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit représenter une instruction « IfElse » ou « While » avec une condition binaire classique.
Retours
Une QkConditionBitInfo structure contenant l'indice binaire classique et la valeur attendue.
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
Récupérer la largeur en bits de la condition de registre classique pour une instruction de contrôle de flux.
Extrait la largeur en bits du registre classique à partir d'une instruction « IfElse » ou « While » comportant une condition liée à un registre classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou « While », ou si la condition n'est pas de type registre.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit représenter une instruction « IfElse » ou « While » avec une condition de registre classique.
Retours
La largeur en bits de la condition sur le registre classique.
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
Récupérer le registre classique correspondant à la condition d'une instruction de contrôle de flux.
Extrait le registre classique d'une instruction « IfElse » ou « While » comportant une condition liée à un registre classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou « While », ou si la condition n'est pas de type registre.
Exemple
// 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 pointerSécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit représenter une instruction « IfElse » ou « While » avec une condition de registre classique.
Retours
Un pointeur emprunté vers le QkClassicalRegister. Le pointeur reste valide tant que le circuit parent reste valide.
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
Récupérer la valeur de la condition du registre classique pour une instruction de contrôle de flux.
Extrait la condition sous la forme d'un entier non signé à partir d'une instruction « IfElse » ou « While » comportant une condition de registre classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou « While », si la condition n'est pas un type de registre, ou si la valeur de la condition ne tient pas dans un uint64_t.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit représenter une instruction « IfElse » ou « While » avec une condition de registre classique.
Retours
Valeur de condition.
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
Donnez l'expression classique d'une instruction de contrôle de flux.
Extrait l'expression classique d'une instruction « IfElse » ou « While » dont la condition est basée sur une expression.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « IfElse » ou « While », ou si la condition n'est pas de type expression.
Exemple d'utilisation
// 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...
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un élément
QkControlFlowInstructionqui doit représenter une instruction « IfElse » ou « While » avec une condition d'expression.
Retours
Un pointeur emprunté vers le QkExprNode représentant l'expression classique. Le pointeur reste valide tant que le circuit parent reste valide.
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Récupérer la durée d'une instruction de flux de contrôle de type « Box ».
Les instructions de la boîte peuvent ne pas avoir de durée, avoir une valeur de durée concrète telle que QkDurationInfo, ou une durée spécifiée sous forme d'expression. Cette fonction indique de quel type de durée il s'agit.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « Box ».
Exemple
// 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;
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Box ».
Retours
Le type de durée tel que QkBoxDurationKind.
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Récupérer les informations relatives à la durée d'une instruction de flux de contrôle de type « Box ».
Cette fonction récupère la valeur et le type de la durée d'une instruction « Box » dont la durée est définie.
Génère une erreur si cf_inst n'est pas une instruction de flux de contrôle « Box » ayant une durée précise.
Exemple
// 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;
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Box » et avoir une durée précise.
Retours
Une QkDurationInfo structure contenant la valeur de la durée et son unité.
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Récupérer l'expression de durée d'une instruction de flux de contrôle « Box ».
Cette fonction renvoie un pointeur vers l'expression qui définit la durée d'une instruction Box lorsque celle-ci est spécifiée sous forme d'expression.
Génère une erreur si cf_inst n'est pas une instruction de flux de contrôle de type « Box » comportant une expression de durée.
Exemple
// 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...Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Box » et comporter une durée d'expression.
Retours
Un pointeur vers l'expression QkExpr représentant la durée. L'expression est valide tant que l'instruction de contrôle de flux existe. L'expression appartient à l'instruction de flux de contrôle et ne doit pas être libérée par l'appelant.
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
Récupérer le type de collection utilisé dans une instruction de contrôle de flux « ForLoop ».
Cette fonction détermine si une fonction ForLoop itère sur une liste explicite d'éléments ou sur une plage de type Python.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop ».
Exemple
// 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
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers une instruction de contrôle de flux qui doit être une instruction de saut conditionnel ( ForLoop ).
Retours
Une CLoopCollectionType valeur d'énumération indiquant le type de collection.
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
Récupérer la liste des éléments sur lesquels un ForLoop effectue une itération.
Cette fonction récupère la liste des éléments d'une instruction de flux de contrôle « ForLoop » qui utilise une collection de liste explicite. Utilisez qk_control_flow_loop_collection_type pour déterminer le type de collection avant d'appeler cette fonction.
Génère une exception si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop » avec une collection de type liste.
Exemple
// 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]);
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Pointeur vers une instruction de contrôle de flux qui doit être une instruction « ForLoop » associée à une collection de type « List ».
Retours
Une QkLoopElements structure contenant un pointeur vers le tableau des éléments de la boucle et le nombre d'éléments. Le pointeur est emprunté pour la durée de l'instruction de flux de contrôle et ne doit pas être libéré par l'appelant.
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)
Récupère les paramètres de plage d'un objet ForLoop qui parcourt une plage de type Python.
Cette fonction récupère les valeurs de début, de fin et d'incrément d'une instruction de flux de contrôle « ForLoop » qui utilise une collection de plage. Utilisez qk_control_flow_loop_collection_type pour déterminer le type de collection avant d'appeler cette fonction.
Génère une exception si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop » associée à une collection de plage.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction, ou si l'un des out_startéléments out_stop,, ou out_step n'est pas un pointeur valide et aligné sur lequel écrire.
Paramètres
- cf_inst – Pointeur vers une instruction de contrôle de flux qui doit être une instance de type « ForLoop » contenant une collection de type « Range ».
- out_start – Paramètre de sortie qui sera défini sur la valeur de début de la plage.
- out_stop – Paramètre de sortie qui sera défini sur la valeur de fin de course.
- out_step – Paramètre de sortie qui sera défini sur la valeur du pas de l'intervalle.
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
Récupère le type du paramètre de boucle utilisé dans une instruction de contrôle de flux de type « ForLoop ».
Cette fonction détermine si une fonction « ForLoop » ne comporte pas de paramètre de boucle, utilise un symbole de paramètre ou utilise une variable (QkVar) pour suivre la valeur d'itération.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop ».
Exemple
// 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
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers une instruction de contrôle de flux qui doit être une instruction de saut conditionnel ( ForLoop ).
Retours
Une QkLoopParamKind valeur d'énumération indiquant le type du paramètre de boucle.
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
Récupérer les informations relatives au symbole du paramètre de boucle à partir d'une instruction de contrôle de flux « ForLoop ».
Cette fonction récupère les informations relatives au symbole du paramètre de boucle à partir d'une instruction « ForLoop » qui utilise un paramètre comme paramètre de boucle. La valeur renvoyée QkSymbolInfo contient le type, le nom et l'index du symbole (pour les symboles constituant les éléments d'un vecteur de paramètres).
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop » comportant un paramètre de boucle.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un
QkControlFlowInstructionqui doit représenter une ForLoop, avec un paramètre de boucle « Parameter ».
Retours
Une QkSymbolInfo structure contenant les informations relatives aux symboles. L'appelant doit libérer la chaîne renvoyée dans le name champ à l'aide de qk_str_free.
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
Récupérer la variable de boucle à partir d'une instruction de contrôle de flux de type « ForLoop ».
Cette fonction renvoie un pointeur vers la variable (QkVar) utilisée comme paramètre de boucle dans une instruction « ForLoop ». Le pointeur renvoyé est emprunté pour toute la durée d'exécution de l'instruction de contrôle de flux et ne doit pas être libéré par l'appelant.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « ForLoop » avec un paramètre de boucle de type «Variable».
Exemple
// 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 informationSécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur valide vers un
QkControlFlowInstructionqui doit représenter une ForLoop, avec un paramètre de boucle « Variable ».
Retours
Un pointeur vers la QkVar variable de boucle. Le pointeur reste valide pendant toute la durée d'exécution de l'instruction de contrôle de flux.
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Récupérer le type de la cible de l'instruction de contrôle de flux « Switch ».
Les instructions « switch » peuvent porter sur différents types de cibles : un bit classique, un registre classique ou une expression. Cette fonction renvoie le type de cible utilisé par l'instruction Switch.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type Switch.
Exemple
// 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;
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch ».
Retours
Le type de condition de la cible « Switch » est QkConditionType.
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Récupérer l'index de bits classique pour une cible Switch.
Cette fonction renvoie l'index du bit classique sur lequel porte une instruction Switch lorsque la cible de cette instruction est un bit classique.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux « Switch » avec une cible binaire classique.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch » avec une cible binaire classique.
Retours
L'indice du bit classique dans le circuit.
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Récupère le registre classique sur lequel opère une instruction Switch.
Cette fonction récupère le registre classique utilisé comme cible par la commande Switch lorsque celle-ci agit sur un registre.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type « Switch » avec une cible de registre.
Exemple
// 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...Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch » et avoir pour cible un registre.
Retours
Un pointeur vers la mémoire QkClassicalRegister sur laquelle le Switch opère. Le registre reste valide tant que l'instruction de contrôle de flux existe. Le registre appartient à l'instruction de contrôle de flux et ne doit pas être libéré par l'appelant.
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Récupérer l'expression d'une cible Switch.
Cette fonction renvoie un pointeur vers l'expression classique sur laquelle porte une instruction Switch lorsque la cible de cette instruction est une expression.
Génère une exception si cf_inst n'est pas une instruction de contrôle de flux « Switch » dont la cible est une expression.
Exemple
// 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...Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch » et comporter une expression cible.
Retours
Un pointeur vers l'expression QkExpr cible de Switch. L'expression est valide tant que l'instruction de contrôle de flux existe. L'expression appartient à l'instruction de flux de contrôle et ne doit pas être libérée par l'appelant.
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Obtenir le nombre de cas dans une instruction « switch ».
Renvoie le nombre total de blocs « case » dans l'instruction « Switch », y compris le bloc « default » s'il existe.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type Switch.
Exemple
// 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...
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch ».
Retours
Le nombre de cas dans l'instruction « Switch ».
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Vérifier si un cas spécifique d'une instruction « Switch » correspond au cas par défaut.
Les instructions « switch » peuvent comporter un cas par défaut qui s'applique lorsqu'aucun autre cas ne correspond. Cette fonction vérifie si le cas correspondant à l'index indiqué est le cas par défaut. Le cas par défaut peut également comporter des étiquettes de tête, qui peuvent être récupérées via qk_control_flow_switch_case_labels_uint sur le cas par défaut.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type Switch.
Exemple
// 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);
}
}Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch ».
- case_idx – L'index du dossier à vérifier. Doit être inférieur à la valeur renvoyée par
qk_control_flow_switch_num_cases.
Retours
true si le cas à case_idx est le cas par défaut, false sinon.
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)
Déterminez la largeur en bits maximale nécessaire pour représenter les étiquettes dans une instruction « case » de Switch.
Cette fonction renvoie le nombre maximal de bits nécessaires pour représenter n'importe laquelle des étiquettes d'entiers non signés dans le cas spécifié. Cela permet de déterminer la largeur en bits minimale nécessaire pour stocker ou traiter les étiquettes de cas.
Génère une erreur si cf_inst n'est pas une instruction de contrôle de flux de type Switch.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch ».
- case_idx – L'index du cas dont il faut récupérer la largeur en bits de l'étiquette. Doit être inférieur à la valeur renvoyée par
qk_control_flow_switch_num_cases.
Retours
La largeur maximale en bits des étiquettes dans le cas, ou 0 si le cas ne comporte aucune étiquette de type entier non signé (par exemple, s'il ne contient qu'un spécificateur DEFAULT).
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Récupérer les étiquettes correspondant à un cas spécifique dans une instruction « switch ».
Chaque cas d'une instruction « Switch » peut comporter une ou plusieurs étiquettes (par exemple, case(1, 2, 3)) comporte trois étiquettes : 1, 2 et 3). Cette fonction récupère toutes les étiquettes associées à un dossier donné. Notez que le cas par défaut peut également contenir des étiquettes, qui peuvent être récupérées par cette fonction. Lorsqu'elle est appelée dans le cas par défaut, sans étiquettes supplémentaires, la fonction définit num_labels = 0 et labels = NULL dans la structure renvoyée QkSwitchCaseLabels . Avant d'appeler cette fonction, vous devez utiliser qk_control_flow_switch_case_labels_bit_width pour vous assurer que les étiquettes tiendront dans uint64_t.
Génère une exception si cf_inst n'est pas une instruction de contrôle de flux « Switch » ou si une étiquette « case » ne tient pas dans uint64_t.
Exemple
// 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);Sécurité
Le comportement est indéfini si cf_inst n'est pas un pointeur valide vers un QkControlFlowInstruction, ou si out_labels n'est pas un pointeur valide vers une QkSwitchCaseLabels structure.
Paramètres
- cf_inst – Un pointeur vers l'instruction de contrôle de flux. L'instruction de contrôle de flux doit être de type « Switch ».
- case_idx – L'index du cas dont il faut récupérer les étiquettes. Doit être inférieur à la valeur renvoyée par
qk_control_flow_switch_num_cases.
Retours
Une QkSwitchCaseLabels structure contenant les informations d'étiquette pour le cas donné. Cette structure contiendra un pointeur vers un tableau d'étiquettes ainsi que le nombre d'étiquettes. num_labels > 0Dans ce cas, vous devez appeler qk_control_flow_switch_case_labels_clear pour libérer la mémoire allouée par cette fonction.
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
Vider une QkSwitchCaseLabels structure.
Il faut appeler cette fonction pour libérer la mémoire allouée par qk_control_flow_switch_case_labels_uint. Une fois cette fonction appelée, le pointeur « labels » de la structure sera mis à null et la variable « count » sera remise à zéro.
Exemple
// 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);Sécurité
Le comportement est indéfini si labels n'est pas un pointeur valide vers un QkSwitchCaseLabels.
Paramètres
- labels – Un pointeur vers la
QkSwitchCaseLabelsstructure à effacer. La structure doit avoir été préalablement renseignée parqk_control_flow_switch_case_labels_uint.