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

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

ماشین انتزاعی کوانتومی پایه 
در مقاله ای که ارائه شده توسط اسمیت، کورتیس و زنگ، کوایل مجموعه دستورهای یک ماشین انتزاعی کوانتومی (ْQuantum Abstract Machine)، شبیه به ماشین تورینگ را مشخص و بیان می‌کند، اما با وجود انتزاعی بودن، هنوز هم برای انجام کارهای کاربردی قابل استفاده تر است. وضعیت QAM را می‌توان به صورت ۶ تاپلی نشان داد  به طوری که:
  حالت (کوانتومی)، تعداد ثابت اما دلخواه کیوبیت است. ( با استفاده از نمایه سازی 0-based ایندکس شده‌است).
  یا حافظه کلاسیک، یک عدد  است که در آن، بیت‌های کلاسیک با استفاده از نمایه سازی مبتنی بر ۰ نمایه شده‌اند.
  یک لیست ثابت اما دلخواه از دروازه های (گیت‌های) ثابت است. (دروازه های منطقی کوانتومی که به پارامترهایی مانند گیت هادامارد وابسته نیستند)
  یک لیست ثابت اما دلخواه از دروازه های (گیت‌های) پارامتری است. (دروازه‌هایی که به تعدادی پارامتر پیچیده مانند دروازه تغییر فاز بستگی دارند که برای تعریف کامل به پارامتر زاویه نیاز دارد)
  دنباله ای است از دستورهای کوایل که باید اجرا شوند و برنامه را نمایش می‌دهد. طول و مقدار  با  نشان داده می‌شود.
  یک عدد صحیح شمارنده برنامه است که به دستور بعدی که باید اجرا شود اشاره می‌کند.  همیشه از ۰ شروع می‌شود (با اشاره به دستورالعمل صفرم،) و در  پایان می‌رسد. = نشان دهنده اتمام برنامه است. (توجه داشته باشید که آخرین دستورالعمل دارای ایندکس   است) شمارنده برنامه بعد از هر دستور افزایش می‌یابد، به جز دستورالعمل‌های جریان کنترل ویژه (پرش‌های مشروط و بدون قید و شرط، و HALT ویژه که با تنظیم  مساوی  برنامه را متوقف می‌کند.

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

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

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

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

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

مثال 
مثال زیر جریان کنترل کلاسیکی که نیاز است تا انتقال کوانتومی کیوبیت در ثبات ۲ به ثبات ۱ انجام شود را نشان می‌دهد:# 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نمونه‌هایی دیگر از پیاده‌سازی تبدیل فوریه کوانتومی و حل ویژه کوانتومی متغیر در مقاله یاد شده آورده شده‌است.

منابع 

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