کوایل (معماری مجموعه دستورات)

**کوایل**  یک معماری مجموعه دستورهای کوانتومی است که در ابتدا یک مدل حافظه کوانتومی/کلاسیک مشترک را معرفی نمود. **کوایل** را رابرت اسمیت (Robert Smith)، مایکل کورتیس (Michael Curtis) و ویلیام زنگ (William Zeng) در مقاله «*معماری مجموعه دستورهای کوانتومی عملی» (A Practical Quantum Instruction Set Architecture)* معرفی کردند. بخش بسیار زیادی از الگوریتم‌های کوانتومی (از جمله تله‌پورت کوانتومی، تصحیح خطای کوانتومی، شبیه‌سازی، و الگوریتم‌های بهینه‌سازی) نیاز به معماری حافظه مشترک دارند. کوایل برای استفاده در پردازنده‌های کوانتومی ابررسانا توسعه یافته‌است که این پردازنده‌ها توسط Rigetti Computing از طریق API های برنامه‌نویسی کوانتومی Forest توسعه داده شده‌اند. `pyQuil` یک کتابخانه پایتون است که برای توسعه برنامه‌های کوایل با ساختارهای سطوح بالاتر معرفی شده‌است. البته بک اند کوایل توسط محیط‌های برنامه‌نویسی دیگر که کوانتومی هستند نیز پشتیبانی و ساپورت می‌شود.

## ماشین انتزاعی کوانتومی پایه
در مقاله ای که ارائه شده توسط اسمیت، کورتیس و زنگ، کوایل مجموعه دستورهای یک ماشین انتزاعی کوانتومی (ْQuantum Abstract Machine)، شبیه به ماشین تورینگ را مشخص و بیان می‌کند، اما با وجود انتزاعی بودن، هنوز هم برای انجام کارهای کاربردی قابل استفاده تر است. وضعیت QAM را می‌توان به صورت ۶ تاپلی نشان داد (|\Psi\rangle, C, G, G', P, \kappa) به طوری که:
* |\Psi\rangle حالت (کوانتومی)، تعداد ثابت اما دلخواه کیوبیت است. (N_q با استفاده از نمایه سازی 0-based ایندکس شده‌است).
* C یا حافظه کلاسیک، یک عدد N_c است که در آن، بیت‌های کلاسیک با استفاده از نمایه سازی مبتنی بر ۰ نمایه شده‌اند.
* G یک لیست ثابت اما دلخواه از دروازه های (گیت‌های) ثابت است. (دروازه های منطقی کوانتومی که به پارامترهایی مانند گیت هادامارد وابسته نیستند)
* G' یک لیست ثابت اما دلخواه از دروازه های (گیت‌های) پارامتری است. (دروازه‌هایی که به تعدادی پارامتر پیچیده مانند دروازه تغییر فاز بستگی دارند که برای تعریف کامل به پارامتر زاویه نیاز دارد)
* P دنباله ای است از دستورهای کوایل که باید اجرا شوند و برنامه را نمایش می‌دهد. طول و مقدار P با |P| نشان داده می‌شود.
* \kappa یک عدد صحیح شمارنده برنامه است که به دستور بعدی که باید اجرا شود اشاره می‌کند. \kappa همیشه از ۰ شروع می‌شود (با اشاره به دستورالعمل صفرم،0^{th} instruction) و در |P| پایان می‌رسد. |P|=\kappa نشان دهنده اتمام برنامه است. (توجه داشته باشید که آخرین دستورالعمل دارای ایندکس  |P| - 1 است) شمارنده برنامه بعد از هر دستور افزایش می‌یابد، به جز دستورالعمل‌های جریان کنترل ویژه (پرش‌های مشروط و بدون قید و شرط، و `HALT` ویژه که با تنظیم \kappa مساوی |P| برنامه را متوقف می‌کند.

معناشناسی QAM به وسیله ضرب تانسور فضاهای هیلبرت و نقشه‌های خطی میان آن‌ها تعریف شده‌اند.

## ویژگی ها
کوایل برای تعریف دروازه‌های پارامتری شده احتمالی به شکل ماتریسی (کوایل راهی برای تأیید واحد بودن ماتریس‌ها، که شرط لازم برای امکان ساخت گیت تعریف ‌شده‌ است ارائه نمی دهد) و کاربرد آن‌ها در کیوبیت‌ها پشتیبانی دارد. این زبان همچنین از ویژگی های زیر پستیبانی میکند:

* تعریف های شبیه به ماکرو از مدارهای کوانتومی احتمالاً پارامتری شده و گسترده شده آنها
* اندازه‌گیری کیوبیت و ثبت نتیجه خروجی در حافظه کلاسیک
* همگام سازی با رایانه‌های کلاسیک با ساختار `WAIT` که اجرای برنامه کوایل را تا زمانی که یک برنامه کلاسیک پایان یابد، متوقف می‌کند
* ایجاد انشعاب مشروط و غیر مشروط
* پراگما
* گنجاندن فایل‌ها برای استفاده به عنوان کتابخانه

همچنین مجموعه استانداردی از گیت‌ها به عنوان یکی از کتابخانه‌ها تأمین شده‌است.

## ماشین مجازی کوانتومی ریگتی (Rigetti QVM)
Rigetti Computing یک ماشین مجازی کوانتومی را در بستر Common Lisp توسعه داده‌است که ماشین کوانتومی انتزاعی یاد شده را در یک کامپیوتر کلاسیک شبیه‌سازی می‌کند و قادر به تجزیه و اجرای برنامه‌های کوایل که از راه دور توسط HTTP اجرا می‌شوند میباشد.

## مثال
مثال زیر جریان کنترل کلاسیکی که نیاز است تا انتقال کوانتومی کیوبیت در ثبات ۲ به ثبات ۱ انجام شود را نشان می‌دهد:
```asm
# Declare classical memory
DECLARE ro BIT[2]
# Create Bell Pair
H 0
CNOT 0 1
# Teleport
CNOT 2 0
H 2
MEASURE 2 ro[0]
MEASURE 0 ro[1]
# Classically communicate measurements
JUMP-UNLESS @SKIP ro[1]
X 1
LABEL @SKIP
JUMP-UNLESS @END ro[0]
Z 1
LABEL @END
```
نمونه‌هایی دیگر از پیاده‌سازی تبدیل فوریه کوانتومی و حل ویژه کوانتومی متغیر در مقاله یاد شده آورده شده‌است.

## منابع

رده:برنامه‌نویسی کوانتومی
رده:رایانش کوانتومی
رده:معماری‌های مجموعه دستورالعمل