패스 매니저 인프라
Qiskit에는 패스 관리자, 패스 및 IR을 동적으로 정의하기 위한 범용 인프라가 포함되어 있습니다. Qiskit 자체에는 다양한 상황에서 컴파일 IR로 사용되는 특정 유형들이 포함되어 있지만, 확장 모듈에서도 자유롭게 자체 유형을 정의할 수 있습니다.
QkIrBuiltin
enum QkIrBuiltin
IR로 직접 사용할 수 있는 다양한 C 내장 API 유형을 나열합니다.
다음은 에 대한 유효한 입력값입니다 qk_ir_handle_builtin.
값:
열거자 QkIrBuiltin_Circuit
해당 객체 QkCircuit .
열거자 QkIrBuiltin_Dag
해당 객체 QkDag .
QkIrSlot
enum QkIrSlot
사용자 정의 IR에서 구현할 수 있는 사용 가능한 메서드들.
다음은 에 대한 유효한 값들과, QkVtableEntry::slot 의 table 인자에 필요한 관련 함수 포인터 유형들입니다 qk_ir_handle_new.
안전
소멸자를 포함한 모든 함수는 어떤 스레드에서든 호출 가능해야 합니다.
값:
열거자 QkIrSlot_Delete
IR의 data 에 대한 소멸자. 선택 사항입니다.
데이터 포인터가 인 경우 이 메서드는 호출되지 않습니다 NULL.
서명:
void delete(void *data);QkPassSlot
enum QkPassSlot
사용자 정의 패스에서 구현할 수 있는 사용 가능한 메서드들.
다음은 에 대한 유효한 값들과, QkVtableEntry::slot 의 table 인자에 필요한 관련 함수 포인터 유형들입니다 qk_pass_new.
안전
소멸자를 포함한 모든 함수는 어떤 스레드에서든 호출 가능해야 합니다.
값:
열거자 QkPassSlot_RunOwned
올바른 유형의 소유한 IR에서 패스를 실행하십시오. 필수.
서명:
void *run(void *this, void *ir, QkPassContext *context, QkCompilationError **error);구현
이 코드는 패스 동작을 구현합니다. this 이 vtable을 사용하여 qk_pass_new 전달된 값과 동일해집니다. ir vtable의 ir_in 필드에 지정된 유형의 소유 데이터를 가리킵니다. 필요한 경우 메모리가 해제되도록 ir 보장하는 것은 구현자의 책임입니다.
이 함수는 로 지정된 유형의 소유 데이터를 반환해야 하며 ir_out, 오류가 발생한 경우에는 NULL 를 반환해야 합니다.
함수가 오류 상태를 표시하려면, 유효한 소유 QkCompilationError * 객체를 포인터에 error 할당하고, 해당 ir 포인터가 해제되었는지 확인한 후 반환해야 합니다 NULL.
열거자 QkPassSlot_Delete
패스가 소멸될 때, 해당 패스의 this 인자에 대한 소멸자입니다. 선택 사항입니다.
데이터 포인터가 NULL.인 경우 이 함수는 호출되지 않습니다.
서명:
void delete(void *this);QkPass
typedef struct QkPass QkPass
C API를 통해 사용자 정의 동작이 정의된 패스입니다.
이것은 이전에 qk_pass_vtable_new.을 사용하여 일반적인 동작이 정의된 패스의 완전한 인스턴스입니다. 이 구조체의 인스턴스는 다음을 호출하여 생성합니다 qk_pass_new.
이러한 패스는 을 사용하여 QkPassManager 인스턴스에 추가할 수 있습니다 qk_passmanager_push_pass.
안전
데이터 this 포인터는 스레드 간에 전송하고 공유해도 안전해야 합니다. 이 클래스의 모든 메서드는 어떤 스레드에서든 안전하게 호출 가능해야 합니다 QkPassVtable .
QkCompilationError
typedef struct QkCompilationError QkCompilationError
컴파일 중에 발생한 구체적인 오류입니다.
사용자 정의 컴파일러 패스를 포함한 컴파일 파이프라인은 호출자에게 상세한 오류 정보를 반환해야 할 수도 있습니다. 이러한 오류는 일반적으로 프로그래밍 방식으로 처리하기 위한 것이 아니라, 최종 사용자가 직접 확인하고 이에 따라 조치를 취하도록 의도된 것입니다.
QkIrHandle
typedef struct QkIrHandle QkIrHandle
“IR 유형”을 나타내는 핸들 객체.
이 객체들은 IR 동작만을 나타내며, 완전한 IR 객체를 생성하려면 올바른 유형의 데이터 포인터와 결합해야 합니다. 패스와 패스 관리자를 정의하려면 타입 핸들만 있으면 됩니다.
이 중 하나를 인수로 받는 대부분의 함수는 해당 인수를 빌려 사용합니다. 핸들이 더 이상 필요하지 않게 되면, qk_ir_handle_free 를 호출하여 타입 객체에 대한 참조를 해제해야 합니다.
QkPassVtable
typedef struct QkPassVtable QkPassVtable
사용자 정의 패스의 동작을 나타내는 “타입 객체”.
이 객체들은 단지 동작만을 나타낼 뿐이며, 완전한 패스를 생성하려면 올바른 유형의 데이터 포인터와 결합되어야 합니다.
이것들은 를 사용하여 구성되며 qk_pass_vtable_new, 에 주어집니다 qk_pass_new.
가능한 동작과 그 의미에 대한 목록은 [여기] QkPassSlot 를 참조하십시오.
qk_compilation_error_new
QkCompilationError *qk_compilation_error_new(const char *msg)
메시지가 수정된 새로운 컴파일 오류를 생성합니다.
안전
msg 반드시 널 종결된 바이트를 가리켜야 합니다.
매개변수
- msg – 널로 끝나는 문자열을 가리키는 차용된 포인터.
리턴
자체 컴파일러 오류입니다.
qk_compilation_error_str
char *qk_compilation_error_str(const QkCompilationError *error)
오류를 나타내는 간단한 문자열 표현을 가져옵니다.
이 표현의 정확한 형식은 고정되어 있지는 않지만, 일반적으로 사용자에게 표시하기 위한 것입니다. 오류 메시지에는 Qiskit 외부에서 정의된 사용자 정의 패스에 의해 제어되는 임의의 문자열이 포함될 수 있습니다.
반환 값은 qk_str_free.을 사용하여 해제해야 합니다.
안전
가 유효한 을 가리키지 error 않는 경우, 동작은 정의되지 않습니다 QkCompilationError.
매개변수
- 오류 – 해당 메시지를 표시할 오류입니다.
리턴
오류를 나타내는 UTF-8 문자열 표현체입니다.
qk_compilation_error_free
void qk_compilation_error_free(QkCompilationError *error)
주어진 소유 포인터를 해제합니다.
가 null인 error 경우 아무 작업도 수행하지 않습니다.
안전
is error 가 null도 아니고 유효한 소유 객체를 가리키지도 않는 경우, is의 동작은 정의되지 않습니다 CompilationError.
매개변수
- 오류 – 해제할 소유 포인터입니다.
qk_ir_handle_new
QkIrHandle *qk_ir_handle_new(const char *name, const QkVtableEntry *table)
새로운 “IR” 유형의 동작을 정의하십시오.
이 함수는 새로운 IR 유형의 동작 구성 요소를 정의하기 위해 호출됩니다.
내장된 Qiskit 타입에 대한 핸들을 원한다면, 를 참조하십시오 qk_ir_handle_builtin.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다:
name는 널 종결 문자열입니다.tablenull 포인터이거나, 정렬되어 있으며 중복slot값이.slot = -1없는 항목으로 끝나는 유효한 슬롯 항목 목록을 가리킵니다.
매개변수
- name – IR 유형에 대한 사람이 읽기 쉬운 이름.
- table – IR에 대해 정의된 메서드 목록으로, 슬롯 ID로
-1를 사용하는 항목으로 끝납니다. 테이블에 항목이 없는NULL경우라면 그럴 수도 있습니다. 허용되는 값 및 함수 포인터 시그니처에QkIrSlot대해서는 를 참조하십시오.
리턴
IR 유형 객체에 대한 소유 핸들.
qk_ir_handle_builtin
QkIrHandle *qk_ir_handle_builtin(uint32_t ty)
Qiskit의 내장 타입에 대한 IR “타입 객체”를 가져옵니다.
매개변수
- ty – 원하는 유형을 나타내는 식별자. 허용되는 값은
QkIrBuiltin를 참조하십시오.
리턴
IR 유형 객체에 대한 소유 핸들, 또는 유효하지 않은 값이 지정된 경우 NULL .
qk_ir_handle_free
void qk_ir_handle_free(QkIrHandle *handle)
소유 중인 IR 핸들을 해제하세요.
핸들 처리가 완료되면, 직접 소유한 핸들 객체에 대해 이 메서드를 호출할 수 있습니다. 자신의 핸들을 사용하여 free를 호출한다고 해서 기존 QkIr 객체들이 무효화되지는 않습니다. 각 객체는 고유한 핸들을 가지고 있기 때문입니다.
포인터가 null인 경우 아무 작업도 수행하지 않습니다.
안전
handle 가 null이 아니면서 유효한 소유 QkIrHandle 객체를 가리키지 않는 경우, 동작은 정의되지 않습니다.
매개변수
- handle – 해제할 포인터.
qk_pass_vtable_new
QkPassVtable *qk_pass_vtable_new(const char *name, const QkIrHandle *ir_in, const QkIrHandle *ir_out, const QkVtableEntry *table)
사용자 정의 패스를 위한 새로운 “타입 객체”를 생성합니다.
이 함수의 출력값을 얻으면, qk_pass_new.을 사용하여 데이터 포인터와 결합함으로써 pass의 인스턴스를 생성합니다.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다:
name는 널 종결 문자열입니다.ir_in유효한QkIrHandle객체를 가리킵니다.ir_out유효한QkIrHandle객체를 가리킵니다.table는 에 의해 정의된 대로 모두 일관된 항목이며VtableEntry``QkPassSlot, 중복된 항목이slot없고 로 끝나는, 연속적이고 유효한 인스턴스들을 가리킵니다.slot = -1.table필요한 모든 슬롯에 해당하는 슬롯 아이템이 포함되어 있습니다.
매개변수
- 이름 – 패스에 부여된, 공백으로 끝나는 사람이 읽기 쉬운 이름입니다. 디버깅에 사용됩니다.
- ir_in – 해당 패스의 예상 입력 유형을 나타내는 IR “유형 객체”에 대한 차용된 핸들입니다.
- ir_out – 해당 패스의 예상 출력 유형을 나타내는 IR “유형 객체”에 대한 차용된 핸들입니다.
- 테이블 – 로 끝나는 항목이 포함된
QkVtableEntry객체들로 구성된 차용된 테이블.slot = -1. 허용되는 슬롯 값 및 관련 함수 포인터 유형에QkPassSlot대해서는 를 참조하십시오. 알 수 없는 값은 무시됩니다slot.
리턴
패스의 인스턴스를 생성하기 위해 qk_pass_new 대여할 수 있는 소유형 객체입니다.
qk_pass_vtable_free
void qk_pass_vtable_free(QkPassVtable *vtable)
.에 대한 단일 참조를 해제합니다 PassVtable.
이 vtable이 필요한 패스의 인스턴스 생성을 모두 마친 후 이 함수를 호출할 수 있습니다. 생성된 각 패스는 이 테이블에 대한 자체 참조를 가지고 있습니다.
vtable 일 때 아무 작업도 수행하지 않습니다 NULL.
안전
가 null이 vtable 아니거나 에 대한 유효한 소유 참조가 아닌 경우, 해당 동작은 정의되지 않습니다 PassVtable.
매개변수
- vtable – 해제할 소유 참조.
qk_pass_new
QkPass *qk_pass_new(void *data, const QkPassVtable *vtable)
이전에 동작이 정의된 패스의 새 인스턴스를 생성합니다.
그런 다음 결과 pass 객체는 일반적으로 또는 관련 메서드에 전달됩니다 qk_passmanager_push_pass.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다:
this. 내의 메서드에 적합한 유형의 데이터를 가리킵니다vtable.vtable...의 유효한 인스턴스를 가리킵니다QkPassVtable.
매개변수
- data – 이
vtable.에 대한 소유 데이터 포인터입니다. - vtable –.에 의해 생성된 차용된 “타입 객체”입니다
qk_pass_vtable_new.
리턴
소유 중인 패스 객체.
qk_pass_free
void qk_pass_free(QkPass *pass)
사용자 정의 패스 인스턴스를 해제합니다.
일반적으로 이 함수를 호출할 필요는 없습니다. 패스 매니저 생성 함수가 QkPass 인수의 소유권을 가져가기 때문입니다.
안전
가 null이 아니거나 에 대한 유효한 소유 포인터가 pass 아닌 경우, 해당 동작은 정의되지 않습니다 QkPass.
매개변수
- pass – 해제할 패스를 가리키는 소유 포인터.
qk_passmanager_new
QkPassManager *qk_passmanager_new(void)
빈 패스 관리자를 생성합니다.
이 객체는 사용자가 직접 해제해야 합니다.
리턴
소유된, 비어 있는 패스 관리자.
qk_passmanager_free
void qk_passmanager_free(QkPassManager *pm)
패스 관리자를 해제하세요.
안전
가 null이 아니거나 에 대한 유효한 포인터가 pm 아닌 경우, 동작은 정의되지 않습니다 QkPassManager.
매개변수
- pm – 패스 관리자를 가리키는 소유 포인터.
qk_passmanager_push_pass
QkExitCode qk_passmanager_push_pass(QkPassManager *pm, QkPass *pass)
패스를 패스 관리자에게 전달하십시오.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다:
pm유효한 것을 가리킵니다QkPassManagerpass자사가 소유한QkPass인스턴스를 가리킵니다.
매개변수
- pm – 패스 관리자를 가리키는 차용된 포인터.
- 패스 – 밀어낼 소유한 패스. 이렇게 하면 지정된 패스의 소유권을 빼앗게 됩니다.
리턴
QkExitCode_Success 타입이 성공적으로 추가된 경우, 또는 예상되는 IR 타입이 파이프라인의 기대치와 일치하지 않아 패스를 추가할 수 없는 경우 QkExitCode_IncompatibleTypes .
qk_passmanager_run_simple
void *qk_passmanager_run_simple(QkPassManager *pm, void *ir, const QkIrHandle *ir_in_handle, const QkIrHandle *ir_out_handle, QkCompilationError **error)
패스 관리자를 실행하십시오.
ir_in_handle 그리고 파이프라인의 유형 요구 사항을 충족해야 ir_out_handle 합니다. 이 함수는 해당 조건이 위반될 경우 오류 상태를 NULL 반환하고 (선택적으로) 설정합니다.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다:
pm는.에 대한 유효한 포인터입니다QkPassManager.ir는 가 나타내는 유형의 소유 데이터 포인터입니다ir_in_handle.ir_in_handle유효한IrHandle.을 가리킵니다.ir_out_handle유효한IrHandle.을 가리킵니다.errornull이거나, 1개의 데이터를 한 번만 쓸 수 있는 유효한 저장 위치를 가리킵니다QkCompilationError *.
매개변수
- pm – 실행할 패스 관리자를 가리키는 차용된 포인터.
- ir – 가 기대하는 유형의 소유 데이터 포인터
ir_in_handle. 이 함수는 포인터의 소유권을 인수하며, 오류가 발생하더라도 해당 포인터가 소멸되도록 처리합니다. - ir_in_handle – 패스 관리자의 입력 유형 및 의 유형에 해당하는 차용된 유형 객체입니다
ir. - ir_out_handle – 패스 관리자의 출력 유형에 해당하는 차용된 유형 객체.
- 오류 – 그렇지 않은 [out] 경우
NULL, 결과를QkCompilationError *기록할 위치.
리턴
치명적인 오류가 발생하지 않았다면, ir_out_handle.에 해당하는 유형의 소유 데이터 포인터가 반환됩니다. NULL 치명적인 오류가 발생한 경우.