제어 플로우
제어 흐름을 위한 Qiskit C API는 양자 회로에서 사용되는 제어 흐름 명령어를 검사할 수 있는 기능을 제공합니다. 제어 흐름 명령어의 유형을 조회하고, 중첩된 회로 블록에 접근하며, 조건 및 루프 매개변수를 확인하고, 중첩된 블록과 최상위 회로 간의 큐비트 및 클래식 비트 매핑을 가져올 수 있습니다.
typedef struct QkControlFlowInstruction QkControlFlowInstructionopaque QkControlFlowInstruction struct는 C API가 회로 내의 제어 흐름 명령어를 표현하고 분석하는 데 사용하는 주요 핸들입니다. 이는 호출을 통해 할당되며 qk_circuit_get_control_flow_instruction() , 호출을 통해 해제되어야 합니다 qk_control_flow_instruction_free(). 제어 흐름 구조를 다루는 대부분의 C API 함수는 이 불투명한 구조체에 대한 포인터를 인수로 받으며, 이로 인해 이 구조체는 C에서 제어 흐름 명령어를 검사하는 핵심 수단이 됩니다. 이 API에서 를 입력으로 QkControlFlowInstruction 사용하는 대부분의 함수는, 제어 흐름 명령어가 존재하는 동안 유효한 빌린 포인터를 반환하므로, 이러한 포인터를 별도로 해제할 필요가 없습니다.
데이터 유형.
QkControlFlowKind
enum QkControlFlowKind
이 열거형은 양자 회로에 나타날 수 있는 다양한 종류의 제어 흐름 명령어를 나타냅니다.
값:
enumerator QkControlFlowKind_Box
A Box 사용법
enumerator QkControlFlowKind_BreakLoop
루프 중단 명령어
enumerator QkControlFlowKind_ContinueLoop
루프 명령어 계속
enumerator QkControlFlowKind_ForLoop
for 루프 문
enumerator QkControlFlowKind_IfElse
if-else 문
enumerator QkControlFlowKind_Switch
case 문
enumerator QkControlFlowKind_While
while 루프 명령어
QkConditionType
enum QkConditionType
제어 흐름 명령어 내의 조건 유형 또는 스위치 대상을 나타냅니다.
이 열거형은 ( IfElse 또는 While 문 내의) 조건이나 (Switch 문 내의) Switch 대상이 고전 비트, 고전 레지스터, 또는 고전 표현식 중 어느 것을 대상으로 하는지 식별하는 데 사용됩니다.
값:
enumerator QkConditionType_ClBit
고전적 비트를 기반으로 한 조건
enumerator QkConditionType_ClReg
고전적 레지스터에 기반한 조건
enumerator QkConditionType_Expr
고전적 표현식에 기반한 조건
QkConditionBitInfo
struct QkConditionBitInfo
고전적인 비트 조건에 대한 정보.
이 구조체는 단일 고전 비트에 대해 작동하는 조건에 대한 세부 정보를 포함합니다
uint32_t clbit
회로 내 고전 비트의 인덱스
bool 조건
고전적 비트(참 또는 거짓)의 기대값
QkBoxDurationKind
enum QkBoxDurationKind
Box 명령어에 대한 지속 시간 지정 유형을 나타냅니다.
박스 지시문에는 지속 시간이 없거나, 구체적인 지속 시간 값이 지정되거나, 또는 고전적 표현식으로 지정된 지속 시간이 있을 수 있습니다.
값:
enumerator QkBoxDurationKind_NoDuration
기간 미지정
enumerator QkBoxDurationKind_Duration
QkDurationInfo구체적인 기간 값 (로 표시됨)
enumerator QkBoxDurationKind_Expr
고전적인 표현으로 명시된 기간
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Switch case에 사용되는 레이블을 포함합니다.
이 구조체는 Switch case 문에서 비교 대상으로 사용하는 레이블 값들의 배열을 포함합니다. 예를 들어, 와 case(1, 2, 3) 같은 경우에는 1, 2, 3이라는 세 가지 레이블이 있습니다. qk_control_flow_switch_case_labels_clear라벨 배열에 필요한 메모리는 에 의해 qk_control_flow_switch_case_labels_uint 할당되며, 를 사용하여 해제해야 합니다.
const uint64_t *labels
라벨 값 배열을 가리키는 포인터
size_t num_labels
배열에 포함된 레이블의 개수
QkLoopParamKind
enum QkLoopParamKind
ForLoop 제어 흐름 명령어에서 루프 매개변수의 유형.
이 열거형은 for-루프가 루프 매개변수가 없는지, Parameter 심볼을 사용하는지, 아니면 Variable (QkVar)을 사용하여 반복 값을 추적하는지를 나타냅니다.
값:
enumerator QkLoopParamKind_NoLoopParam
ForLoop 명령어에 루프 매개변수가 지정되지 않았습니다
enumerator QkLoopParamKind_Parameter
루프 매개변수는 매개변수입니다
enumerator QkLoopParamKind_Variable
루프 매개변수는 변수입니다
QkSymbolType
enum QkSymbolType
ForLoop 컨텍스트에서 기호의 유형.
이 열거형은 심볼이 독립된 변수인지, 아니면 인덱스를 통해 접근되는 매개변수 벡터 내의 요소인지를 나타냅니다.
값:
enumerator QkSymbolType_Standalone
간단한 이름을 가진 독립형 심볼
enumerator QkSymbolType_Element
기본명과 인덱스가 있는 원소 기호
QkSymbolInfo
struct QkSymbolInfo
유형 및 데이터를 포함한 심볼 정보.
이 구조체는 ForLoop 컨텍스트 내의 심볼을 나타내며, 이는 독립형 변수이거나 인덱스로 참조되는 요소일 수 있습니다.
QkSymbolType ty
기호의 유형(독립형 또는 요소형)
char *name
심볼 이름을 포함하는 널 종결 C 문자열. 독립형 심볼의 경우, 이것이 변수 이름입니다. 원소 기호의 경우, 이는 매개변수 벡터의 기본 이름입니다. qk_str_free이 문자열을 해제하는 것은 발신자의 책임입니다.
size_t 인덱스
원소 기호의 경우, 이는 매개변수 벡터 내의 인덱스입니다. 독립형 심볼의 경우, 이 필드는 사용되지 않으므로 무시해야 합니다.
QkLoopCollectionType
enum QkLoopCollectionType
ForLoop 제어 흐름 명령어에서 사용되는 컬렉션의 유형입니다.
값:
enumerator QkLoopCollectionType_List
이 루프는 명시적으로 지정된 요소 목록을 순회합니다
enumerator QkLoopCollectionType_Range
이 루프는 Python 형식의 범위(시작, 종료, 간격)를 순회합니다
QkLoopElements
struct QkLoopElements
ForLoop 제어 흐름 명령어의 루프 요소를 포함하는 구조체.
이 구조체는 에 qk_control_flow_loop_elements 의해 반환되며, 루프 요소 배열에 대한 포인터와 배열의 요소 개수를 모두 포함합니다. 이 포인터는 빌린 것이므로 호출 측에서 해제해서는 안 됩니다.
const ptrdiff_t *elements
루프 요소 배열을 가리키는 포인터.
size_t len
배열에서 요소의 수입니다.
함수
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
해당 유형의 제어 흐름 명령어를 확인하세요.
예
// 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;
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터.
리턴
제어 흐름 명령어의 종류.
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어에 포함된 회로 블록의 개수를 가져옵니다.
예
// 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...
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터.
리턴
이 제어 흐름 명령어에 포함된 회로 블록의 수.
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
제어 흐름 명령문 내의 회로 블록에 대한 포인터를 얻습니다.
제어 흐름 명령어에는 하나 이상의 회로 블록이 포함됩니다(예: ‘ IfElse ’에는 두 개의 블록이 있고, ‘Switch’에는 여러 개의 블록이 있을 수 있습니다). 이 함수는 인덱스를 통해 특정 블록을 가져옵니다.
예
// 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...안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터.
- block_idx – 가져올 블록의 인덱스.
qk_control_flow_num_blocks``block_idx반드시 범위 내(<)여야 합니다.
리턴
요청된 블록을 QkCircuit 나타내는 포인터. 제어 흐름 명령어가 존재하는 한 이 회로는 유효합니다. 이 회로는 제어 흐름 명령어가 소유하고 있으므로 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어에 대한 큐비트 매핑을 가져옵니다.
제어 흐름 명령어의 각 블록에서 사용되는 큐비트를 최상위 회로 내의 인덱스와 매핑하는 배열에 대한 포인터를 반환합니다. 배열의 길이는 제어 흐름 명령어가 사용하는 큐비트의 수와 같습니다. 중첩된 블록 내의 각 큐비트 인덱스에 i 대해, 배열의 인덱스에 i 해당하는 매핑은 최상위 회로에서 해당 큐비트 인덱스를 반환합니다.
예
// 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]);
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터.
리턴
큐비트 매핑을 나타내는 값들의 uint32_t 배열을 가리키는 포인터입니다. 제어 흐름 명령어가 존재하는 한 배열은 유효합니다. 이 배열은 제어 흐름 명령어가 소유하고 있으므로 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어에 대한 클래식 비트 매핑을 확인하세요.
제어 흐름 명령어 블록에서 사용되는 고전 비트를 최상위 회로 내의 인덱스에 매핑하는 배열에 대한 포인터를 반환합니다. 배열의 길이는 제어 흐름 명령어가 사용하는 고전 비트의 수와 같습니다. 중첩된 블록 내의 각 고전 비트 인덱스에 i 대해, 배열의 인덱스 i 위치에 있는 매핑은 최상위 회로에서 해당 고전 비트 인덱스를 반환합니다.
예
// 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]);
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터.
리턴
고전적인 비트 매핑을 나타내는 값들의 uint32_t 배열을 가리키는 포인터입니다. 제어 흐름 명령어가 존재하는 한 배열은 유효합니다. 이 배열은 제어 흐름 명령어가 소유하고 있으므로 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어의 조건 유형을 가져옵니다.
IfElse 또는 While 문에서 사용되는 조건의 유형을 반환합니다. 조건 유형은 해당 조건이 클래식 비트, 클래식 레지스터 또는 클래식 표현식을 기반으로 하는지 여부를 나타냅니다.
가 IfElse 나 While 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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;
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – IfElse 또는 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
QkConditionType 조건 유형을 나타내는 열거형 값.
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어의 클래식 비트 상태 정보를 가져옵니다.
고전적 비트 조건이 포함된 IfElse 또는 While 명령어에서 고전적 비트 인덱스와 기대값을 추출합니다.
가 IfElse 나 While 제어 흐름 명령어가 아니거나, 조건이 비트형이 아닌 경우 cf_inst 오류가 발생합니다.
예
// 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");안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 고전적인 비트 조건을 갖는 IfElse 나 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
QkConditionBitInfo 고전적 비트 인덱스와 기대값을 포함하는 구조체.
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어에 대한 클래식 레지스터 조건의 비트 폭을 확인합니다.
클래식 레지스터 조건이 포함된 IfElse 또는 While 명령어에서 클래식 레지스터의 비트 폭을 추출합니다.
가 IfElse 나 While 제어 흐름 명령어가 아니거나, 조건이 레지스터 유형이 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 고전적인 레지스터 조건을 갖는 IfElse 나 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
고전적 레지스터에 대한 조건의 비트 폭.
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어의 조건에 대한 클래식 레지스터를 가져옵니다.
클래식 레지스터 조건이 포함된 ‘ IfElse ’ 또는 ‘While’ 명령어에서 클래식 레지스터를 추출합니다.
가 IfElse 나 While 제어 흐름 명령어가 아니거나, 조건이 레지스터 유형이 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 고전적인 레지스터 조건을 갖는 IfElse 나 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
QkClassicalRegister.을 가리키는 빌린 포인터. 부모 회로가 유효한 한, 포인터는 유효한 상태를 유지합니다.
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어에 대한 클래식 레지스터 조건의 조건 값을 가져옵니다.
고전적인 레지스터 조건을 갖는 IfElse 또는 While 명령어에서 조건을 부호 없는 정수 값으로 추출합니다.
uint64_t가 IfElse 나 While 제어 흐름 명령어가 아니거나, 조건이 레지스터 유형이 아니거나, 조건 값이 에 들어가지 않는 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 고전적인 레지스터 조건을 갖는 IfElse 나 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
조건 값입니다.
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
제어 흐름 명령어의 고전적인 표현식을 구하십시오.
IfElse 나 While 문 중에서 식을 기반으로 한 조건이 포함된 경우, 해당 식을 추출합니다.
가 IfElse 나 While 제어 흐름 명령어가 아니거나, 조건이 표현식 유형이 아닐 경우 cf_inst 오류가 발생합니다.
사용법 예
// 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...
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 표현식 조건을 갖는 IfElse 또는 While 명령어를 나타내야 하는
QkControlFlowInstruction에 대한 유효한 포인터.
리턴
고전적인 표현을 나타내는 에 QkExprNode 대한 차용 포인터. 부모 회로가 유효한 한, 포인터는 유효한 상태를 유지합니다.
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Box 제어 흐름 명령어의 지속 시간을 확인합니다.
QkDurationInfo박스 지시문에는 지속 시간이 없을 수도 있고, 와 같은 구체적인 지속 시간 값이 지정될 수도 있으며, 식으로 표현된 지속 시간이 지정될 수도 있습니다. 이 함수는 현재 어떤 종류의 지속 시간이 있는지 반환합니다.
가 Box 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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;
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Box 유형이어야 합니다.
리턴
QkBoxDurationKind.와 같은 종류의 기간.
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Box 제어 흐름 명령어의 지속 시간 값 정보를 가져옵니다.
이 함수는 구체적인 지속 시간을 갖는 Box 명령어의 지속 시간 값과 유형을 반환합니다.
가 구체적인 지속 시간을 갖는 Box 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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;
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 구체적인 지속 시간을 갖는 Box 유형이어야 합니다.
리턴
지속 시간 값과 단위를 포함하는 구조체 QkDurationInfo .
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Box 제어 흐름 명령문의 지속 시간 표현식을 가져옵니다.
이 함수는 지속 시간이 식으로 지정된 경우, Box 명령어의 지속 시간을 정의하는 식에 대한 포인터를 반환합니다.
가 표현식 지속 시간을 갖는 Box 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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...안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 표현식 지속 시간을 갖는 Box 유형이어야 합니다.
리턴
QkExpr 지속 시간 표현식을 나타내는 포인터. 해당 표현식은 제어 흐름 명령어가 존재하는 한 유효합니다. 이 표현식은 제어 흐름 명령어가 소유하고 있으므로 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
ForLoop 제어 흐름 명령어에서 사용된 컬렉션의 유형을 가져옵니다.
이 함수는 ForLoop가 명시적인 요소 목록을 순회하는지, 아니면 Python 형식의 범위를 순회하는지 여부를 판단합니다.
가 ForLoop 의 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어(control flow instruction)를 가리키는 포인터로, 반드시 조건부 분기 명령어( ForLoop )여야 합니다.
리턴
CLoopCollectionType 컬렉션 유형을 나타내는 열거형 값.
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
ForLoop 가 반복 처리하는 요소 목록을 가져옵니다.
이 함수는 명시적 목록 컬렉션을 사용하는 ForLoop 제어 흐름 명령어에서 요소 목록을 가져옵니다. 이 함수를 호출하기 전에 를 사용하여 qk_control_flow_loop_collection_type 컬렉션 유형을 확인하십시오.
가 리스트 컬렉션을 사용하는 ForLoop 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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]);
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터로, 반드시 List 컬렉션을 가진 ForLoop 여야 합니다.
리턴
루프 요소 배열에 대한 포인터와 요소 개수를 포함하는 구조체 QkLoopElements . 포인터는 제어 흐름 명령어가 실행되는 동안 빌려 쓰며, 호출 측에서 이를 해제해서는 안 됩니다.
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)
Python 스타일의 범위를 반복 처리하는 ForLoop 의 범위 매개변수를 가져옵니다.
이 함수는 범위 컬렉션을 사용하는 ForLoop 제어 흐름 명령어에서 시작, 종료 및 단계 값을 가져옵니다. 이 함수를 호출하기 전에 를 사용하여 qk_control_flow_loop_collection_type 컬렉션 유형을 확인하십시오.
가 범위 컬렉션을 갖는 ForLoop 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
out_start``QkControlFlowInstruction가 에 대한 유효한 포인터가 아니거나,, out_stop, 또는 out_step 중 어느 하나라도 쓰기 작업이 가능한 정렬된 유효한 포인터가 아닌 경우 cf_inst , 해당 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어에 대한 포인터로, 반드시 Range 컬렉션을 가진 ForLoop 여야 합니다.
- out_start – 범위 시작값으로 설정될 출력 매개변수입니다.
- out_stop – 범위 종료값으로 설정될 출력 매개변수입니다.
- out_step – 범위 단계 값으로 설정될 출력 매개변수입니다.
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
ForLoop 제어 흐름 명령어에서 사용되는 루프 매개변수의 종류를 확인합니다.
이 함수는 ForLoop에 루프 매개변수가 없는지, 매개변수 심볼을 사용하는지, 아니면 Variable(QkVar)을 사용하여 반복 횟수 값을 추적하는지 여부를 판단합니다.
가 ForLoop 의 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어(control flow instruction)를 가리키는 포인터로, 반드시 조건부 분기 명령어( ForLoop )여야 합니다.
리턴
루프 매개변수의 종류를 나타내는 열거형 값 QkLoopParamKind .
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
ForLoop 제어 흐름 명령어에서 루프 매개변수 기호 정보를 가져옵니다.
이 함수는 매개변수(Parameter)를 루프 매개변수로 사용하는 루프-인-루프( ForLoop ) 명령어에서 루프 매개변수 심볼 정보를 가져옵니다. 반환값에는 QkSymbolInfo 심볼의 유형, 이름 및 인덱스(매개변수 벡터 요소 심볼의 경우)가 포함됩니다.
가 매개변수 루프 매개변수를 갖는 ForLoop 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 매개변수 루프 매개변수를 가진 ForLoop 를
QkControlFlowInstruction반드시 가리켜야 하는 유효한 포인터입니다.
리턴
QkSymbolInfo 심볼 정보를 포함하는 구조체. qk_str_free호출자는 필드에서 name 반환된 문자열을 을 사용하여 해제해야 합니다.
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
ForLoop 제어 흐름 명령어에서 루프 변수를 가져옵니다.
이 함수는 ForLoop 명령어에서 루프 매개변수로 사용되는 Variable(QkVar)에 대한 포인터를 반환합니다. 반환된 포인터는 제어 흐름 명령어의 실행 기간 동안 빌려 쓰게 되며, 호출 측에서 이를 해제해서는 안 됩니다.
가 변수 루프 매개변수를 갖는 ForLoop 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 변수 루프 매개변수를 갖는 ForLoop 를 반드시 나타내야 하는, 해당
QkControlFlowInstruction객체에 대한 유효한 포인터입니다.
리턴
루프 변수를 QkVar 나타내는 포인터. 이 포인터는 제어 흐름 명령어의 실행 기간 동안 유효합니다.
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Switch 제어 흐름 명령에 대한 Switch 대상의 유형을 가져옵니다.
switch 문은 고전 비트, 고전 레지스터, 또는 식 등 다양한 유형의 대상에 대해 작동할 수 있습니다. 이 함수는 Switch 문이 어떤 유형의 대상(target)을 사용하는지 반환합니다.
가 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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;
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Switch 유형이어야 합니다.
리턴
Switch 대상의 조건 유형은 QkConditionType.
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Switch 대상에 대한 클래식 비트 인덱스를 가져옵니다.
이 함수는 Switch 문에서 대상(target)이 클래식 비트일 때, Switch 문이 연산 대상으로 삼는 클래식 비트의 인덱스를 반환합니다.
가 고전적인 비트 타깃을 갖는 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 고전적인 비트 대상(bit target)을 갖는 Switch 유형이어야 합니다.
리턴
회로 내 고전 비트의 인덱스.
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Switch 문이 적용되는 클래식 레지스터를 가져옵니다.
이 함수는 스위치가 레지스터를 대상으로 연산을 수행할 때 스위치의 대상으로 사용되는 클래식 레지스터를 반환합니다.
가 레지스터를 대상으로 하는 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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...안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 레지스터를 대상으로 하는 Switch 유형이어야 합니다.
리턴
Switch가 연산을 수행하는 대상에 QkClassicalRegister 대한 포인터입니다. 제어 흐름 명령어가 존재하는 한 레지스터는 유효합니다. 이 레지스터는 제어 흐름 명령어가 소유하고 있으므로, 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Switch 대상에 대한 표현식을 가져옵니다.
이 함수는 Switch 대상이 식일 때 Switch 문이 연산 대상으로 사용하는 클래식 식에 대한 포인터를 반환합니다.
가 표현식을 대상으로 하는 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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...안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 표현식 대상이 지정된 Switch 유형이어야 합니다.
리턴
Switch 대상 식을 QkExpr 나타내는 포인터. 해당 표현식은 제어 흐름 명령어가 존재하는 한 유효합니다. 이 표현식은 제어 흐름 명령어가 소유하고 있으므로 호출 측에서 해제해서는 안 됩니다.
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Switch 문 내의 케이스 수를 구합니다.
Switch 문에 포함된 케이스 블록의 총 개수를 반환합니다. 여기에는 default 케이스가 있는 경우 해당 케이스도 포함됩니다.
가 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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...
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Switch 유형이어야 합니다.
리턴
Switch 문 내의 사례 수.
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Switch 문 내의 특정 케이스가 기본 케이스인지 확인합니다.
switch 문에는 다른 어떤 케이스에도 일치하지 않을 때 적용되는 기본 케이스를 포함할 수 있습니다. 이 함수는 지정된 인덱스에 있는 케이스가 기본 케이스인지 확인합니다. 기본 케이스에는 선행 레이블이 포함될 수도 있으며, 이는 기본 케이스에 대해 를 호출하여 qk_control_flow_switch_case_labels_uint 가져올 수 있습니다.
가 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);
}
}안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Switch 유형이어야 합니다.
- case_idx – 확인할 사례의 인덱스.
qk_control_flow_switch_num_cases.에서 반환된 값보다 작아야 합니다.
리턴
true 만약 의 case_idx 경우가 기본 경우라면, false 그렇지 않은 경우에는.
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)
Switch case에서 레이블을 표현하는 데 필요한 최대 비트 폭을 구하세요.
이 함수는 지정된 경우에 포함된 부호 없는 정수 레이블 중 어느 하나를 표현하는 데 필요한 최대 비트 수를 반환합니다. 이는 케이스 라벨을 저장하거나 처리하는 데 필요한 최소 비트 폭을 결정하는 데 유용합니다.
가 Switch 제어 흐름 명령어가 아닐 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아닌 경우 cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Switch 유형이어야 합니다.
- case_idx – 레이블 비트 폭을 가져올 케이스의 인덱스입니다.
qk_control_flow_switch_num_cases.에서 반환된 값보다 작아야 합니다.
리턴
케이스 내 레이블의 최대 비트 폭, 또는 케이스에 부호 없는 정수 레이블이 없는 경우(예: DEFAULT 지정자만 있는 경우) 0.
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Switch 문에서 특정 경우에 해당하는 레이블을 가져옵니다.
case(1, 2, 3)Switch 문 내의 각 case에는 하나 이상의 레이블이 있을 수 있습니다(예: 에는 1, 2, 3이라는 세 개의 레이블이 있습니다). 이 함수는 지정된 사례에 대한 모든 레이블을 가져옵니다. 기본값에도 레이블이 포함될 수 있으며, 이 함수를 통해 해당 레이블을 가져올 수 있다는 점에 유의하십시오. 추가 레이블 없이 기본 사례에 대해 호출되면, 이 함수는 반환된 QkSwitchCaseLabels struct 내에서 와 labels = NULL 를 설정합니다 num_labels = 0 . uint64_t이 함수를 호출하기 전에, 레이블이 에 들어갈 수 있도록 를 qk_control_flow_switch_case_labels_bit_width 사용해야 합니다.
uint64_t가 Switch 제어 흐름 명령어가 아니거나, case 레이블이 에 들어가지 않을 경우 cf_inst 오류가 발생합니다.
예
// 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);안전
QkControlFlowInstruction가 에 대한 유효한 포인터가 아니거나, 가 QkSwitchCaseLabels 구조체 에 대한 유효한 포인터가 아닌 경우 out_labels``cf_inst , 동작은 정의되지 않습니다.
매개변수
- cf_inst – 제어 흐름 명령어를 가리키는 포인터. 제어 흐름 명령어는 반드시 Switch 유형이어야 합니다.
- case_idx – 레이블을 가져올 케이스의 인덱스입니다.
qk_control_flow_switch_num_cases.에서 반환된 값보다 작아야 합니다.
리턴
QkSwitchCaseLabels 주어진 사례에 대한 레이블 정보가 포함된 구조체. 이 구조체에는 레이블 배열에 대한 포인터와 레이블의 개수가 포함됩니다. 만약 num_labels > 0그렇다면, 이 함수가 할당한 메모리를 해제하기 위해 를 호출해야 qk_control_flow_switch_case_labels_clear 합니다.
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
구조체를 QkSwitchCaseLabels 초기화합니다.
qk_control_flow_switch_case_labels_uint이 함수는 에 의해 할당된 메모리를 해제하기 위해 호출되어야 합니다. 이 함수를 호출하면, 구조체 내의 labels 포인터는 null로 설정되고 count는 0으로 설정됩니다.
예
// 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);안전
QkSwitchCaseLabels가 에 대한 유효한 포인터가 아닌 경우 labels , 동작은 정의되지 않습니다.
매개변수
- labels – 지울 구조체
QkSwitchCaseLabels(struct)에 대한 포인터.qk_control_flow_switch_case_labels_uint해당 구조체는 이전에.로 초기화되어 있어야 합니다.