Skip to main content
IBM Quantum Platform

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 QkControlFlowInstruction

La 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_idx doit 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 QkControlFlowInstruction qui 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 QkControlFlowInstruction qui 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 QkControlFlowInstruction qui 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 pointer

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 QkControlFlowInstruction qui 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 QkControlFlowInstruction qui 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 QkControlFlowInstruction qui 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 QkControlFlowInstruction qui 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 information

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 QkControlFlowInstruction qui 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 QkSwitchCaseLabels structure à effacer. La structure doit avoir été préalablement renseignée par qk_control_flow_switch_case_labels_uint.
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.