1 //---------------------------------------------------------------------------
\r
2 // Form for Parameter
\r
3 //---------------------------------------------------------------------------
\r
11 //---------------------------------------------------------------------------
\r
12 #pragma package(smart_init)
\r
13 #pragma resource "*.dfm"
\r
15 //---------------------------------------------------------------------------
\r
16 const double Pi = M_PI;
\r
17 //---------------------------------------------------------------------------
\r
18 class QPhaseController{
\r
26 QPhaseController(TCanvas *c){
\r
29 AngleStep = Pi/(double)Resolution;
\r
34 Canvas->Brush->Color = clBtnFace;
\r
35 Canvas->Pen->Color = clBlack;
\r
36 Canvas->Pen->Width = 2;
\r
38 Canvas->FillRect(Rect(0,0,s,s));
\r
39 Canvas->Brush->Color = clWhite;
\r
40 Canvas->Ellipse(0,0,Size*2,Size*2);
\r
41 int x = Size*cos(Theta);
\r
42 int y = -Size*sin(Theta);
\r
43 Canvas->Pen->Color = clRed;
\r
44 Canvas->MoveTo(Size,Size);
\r
45 Canvas->LineTo(Size+x,Size+y);
\r
47 void SetTheta(double t){
\r
48 Theta = t/(double)180*Pi;
\r
51 double GetTheta(int X, int Y){
\r
52 double x = (double)(X-Size);
\r
53 double y = (double)(Y-Size);
\r
54 Theta = atan2(-y,x);
\r
55 Theta = ((double)(int)((Theta + Pi)/AngleStep+AngleStep*0.5)*AngleStep-Pi);
\r
56 return Theta/Pi*180;
\r
59 //---------------------------------------------------------------------------
\r
61 TFParam::TFParam(TComponent* Owner) : TForm(Owner) {
\r
62 qpcRot = new QPhaseController(ImageRotPhase->Canvas);
\r
63 qpcCRot = new QPhaseController(ImageCRotPhase->Canvas);
\r
65 //---------------------------------------------------------------------------
\r
67 TFParam::FormDestroy(TObject *Sender) {
\r
71 //---------------------------------------------------------------------------
\r
72 // Methods for Create Circuit
\r
73 //---------------------------------------------------------------------------
\r
75 TFParam::CreateCircuit(int type, int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
77 if ( qManager->GetCircuitInclude(mx, my) != NULL) {
\r
83 qManager->AddCircuit(new QWalsh(mx,my));
\r
87 qManager->AddCircuit(new QMeasure(mx,my));
\r
91 qManager->AddCircuit(new QNot(mx,my));
\r
95 qManager->AddCircuit(new QPauliX(mx,my));
\r
99 qManager->AddCircuit(new QPauliY(mx,my));
\r
103 qManager->AddCircuit(new QPauliZ(mx,my));
\r
107 CreateCNOT(mx, my, qDraw, qManager);
\r
111 CreateCCNOT(mx, my, qDraw, qManager);
\r
115 CreateSWAP(mx, my, qDraw, qManager);
\r
119 CreateROT(mx, my, qDraw, qManager);
\r
123 CreateCROT(mx, my, qDraw, qManager);
\r
127 //---------------------------------------------------------------------------
\r
129 TFParam::CreateCNOT(int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
130 QCNot *qc = new QCNot(mx,my);
\r
132 if (!Execute(qc,qManager)) {
\r
135 qManager->AddCircuit(qc);
\r
138 //---------------------------------------------------------------------------
\r
140 TFParam::CreateCCNOT(int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
141 QCCNot *qc = new QCCNot(mx,my);
\r
143 if (!Execute(qc,qManager)) {
\r
146 qManager->AddCircuit(qc);
\r
149 //---------------------------------------------------------------------------
\r
151 TFParam::CreateSWAP(int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
152 QSwap *qc = new QSwap(mx,my);
\r
154 if (!Execute(qc,qManager)) {
\r
157 qManager->AddCircuit(qc);
\r
160 //---------------------------------------------------------------------------
\r
162 TFParam::CreateROT(int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
163 QRot *qc = new QRot(mx,my);
\r
165 if (!Execute(qc,qManager)) {
\r
168 qManager->AddCircuit(qc);
\r
171 //---------------------------------------------------------------------------
\r
173 TFParam::CreateCROT(int mx, int my, QDraw *qDraw, QManager *qManager) {
\r
174 QCRot *qc = new QCRot(mx,my);
\r
176 if (!Execute(qc,qManager)) {
\r
179 qManager->AddCircuit(qc);
\r
182 //---------------------------------------------------------------------------
\r
183 // Methods for Modify Circuit
\r
184 //---------------------------------------------------------------------------
\r
186 TFParam::ModifyCircuit(QCircuit *qc, QManager *qManager) {
\r
187 QCircuit *oldqc = qc->Clone();
\r
188 qManager->ClrCircuitFlg(qc);
\r
190 switch (qc->GetType()) {
\r
192 if (Execute((QBitbox*)qc)) {
\r
193 qManager->ModifyCircuit(oldqc, qc);
\r
198 if (Execute((QCNot*)qc, qManager)) {
\r
199 qManager->ModifyCircuit(oldqc, qc);
\r
204 if (Execute((QCCNot*)qc, qManager)) {
\r
205 qManager->ModifyCircuit(oldqc, qc);
\r
210 if (Execute((QSwap*)qc, qManager)) {
\r
211 qManager->ModifyCircuit(oldqc, qc);
\r
216 if (Execute((QRot*)qc, qManager)) {
\r
217 qManager->ModifyCircuit(oldqc, qc);
\r
222 if (Execute((QCRot*)qc, qManager)) {
\r
223 qManager->ModifyCircuit(oldqc, qc);
\r
229 qManager->SetAllCircuitFlg();
\r
231 //---------------------------------------------------------------------------
\r
233 TFParam::Execute(QBitbox *qBitBox) {
\r
234 TSBitBox->TabVisible = true;
\r
235 CBBitState->Items->Clear();
\r
236 CBBitState->Items->Add("|0>");
\r
237 CBBitState->Items->Add("|1>");
\r
238 CBBitState->ItemIndex = qBitBox->GetState();
\r
239 CBEnabled->Checked = qBitBox->Enabled;
\r
240 int mr = ShowModal();
\r
241 TSBitBox->TabVisible = false;
\r
243 if (mr==mrCancel)return false;
\r
244 qBitBox->Enabled = CBEnabled->Checked;
\r
245 qBitBox->SetState((int)CBBitState->ItemIndex);
\r
248 //---------------------------------------------------------------------------
\r
253 TFParam::Execute(QCNot *qCNot,QManager *qManager) {
\r
255 int *LineIndex = new int[qManager->GetLineNumber()];
\r
258 CBTarget->Items->Clear();
\r
259 for (int i=0;i<qManager->GetLineNumber();i++) {
\r
260 QCNot testqc(qCNot->GetX(), qCNot->GetY());
\r
261 testqc.SetTarget(i);
\r
262 if (i != qCNot->GetY() &&
\r
263 qManager->CanPutCircuit(&testqc)) {
\r
264 CBTarget->Items->Add("q"+IntToStr(i+1));
\r
265 LineIndex[index] = i;
\r
270 MessageBeep(MB_OK);
\r
271 delete []LineIndex;
\r
275 CBTarget->ItemIndex = 0;
\r
276 for (int i=0;i<CBTarget->Items->Count;i++) {
\r
277 if(qCNot->GetTarget()==LineIndex[i]){
\r
278 CBTarget->ItemIndex = i;
\r
282 TSCnot->TabVisible = true;
\r
283 int mr = ShowModal();
\r
284 TSCnot->TabVisible = false;
\r
286 if (mr==mrCancel) {
\r
287 delete []LineIndex;
\r
291 qCNot->SetTarget(LineIndex[CBTarget->ItemIndex]);
\r
293 delete [] LineIndex;
\r
296 //---------------------------------------------------------------------------
\r
301 TFParam::Execute(QCCNot *qCCNot,QManager *qManager) {
\r
303 int *LineIndex = new int[qManager->GetLineNumber()];
\r
306 CBTarget1->Items->Clear();
\r
307 CBTarget2->Items->Clear();
\r
309 for (int i=0;i<qManager->GetLineNumber();i++) {
\r
310 QCCNot testqc(qCCNot->GetX(), qCCNot->GetY());
\r
311 testqc.SetTarget1(i);
\r
312 testqc.SetTarget2(i);
\r
313 if (i != qCCNot->GetY() && qManager->CanPutCircuit(&testqc)) {
\r
314 CBTarget1->Items->Add("q"+IntToStr(i+1));
\r
315 CBTarget2->Items->Add("q"+IntToStr(i+1));
\r
316 LineIndex[index] = i;
\r
321 MessageBeep(MB_OK);
\r
322 delete []LineIndex;
\r
326 CBTarget1->ItemIndex = 0;
\r
327 for (int i=0;i<CBTarget1->Items->Count;i++) {
\r
328 if(qCCNot->GetTarget1()==LineIndex[i]){
\r
329 CBTarget1->ItemIndex = i;
\r
332 CBTarget2->ItemIndex = 0;
\r
333 for (int i=0;i<CBTarget2->Items->Count;i++) {
\r
334 if(qCCNot->GetTarget2()==LineIndex[i]){
\r
335 CBTarget2->ItemIndex = i;
\r
340 TSCCNot->TabVisible = true;
\r
343 if (mr == mrCancel) break;
\r
344 if (CBTarget1->ItemIndex == CBTarget2->ItemIndex) {
\r
345 ShowMessage("Select different lines.");
\r
350 TSCCNot->TabVisible = false;
\r
352 if (mr==mrCancel) {
\r
353 delete [] LineIndex;
\r
357 qCCNot->SetTarget1(LineIndex[CBTarget1->ItemIndex]);
\r
358 qCCNot->SetTarget2(LineIndex[CBTarget2->ItemIndex]);
\r
360 delete [] LineIndex;
\r
364 //---------------------------------------------------------------------------
\r
369 TFParam::Execute(QSwap *qSwap, QManager *qManager) {
\r
371 int *LineIndex = new int[qManager->GetLineNumber()];
\r
374 CBSwapTarget1->Items->Clear();
\r
375 CBSwapTarget2->Items->Clear();
\r
377 for (int i=0;i<qManager->GetLineNumber();i++) {
\r
378 if (qManager->GetCircuitInclude(qSwap->GetX(), i) == NULL) {
\r
379 CBSwapTarget1->Items->Add("q"+IntToStr(i+1));
\r
380 CBSwapTarget2->Items->Add("q"+IntToStr(i+1));
\r
381 LineIndex[index] = i;
\r
385 CBSwapTarget1->ItemIndex = qSwap->GetTarget1();
\r
386 CBSwapTarget2->ItemIndex = qSwap->GetTarget2();
\r
389 TSSwap->TabVisible = true;
\r
392 if (mr == mrCancel) break;
\r
393 QSwap testqc(qSwap->GetX(), qSwap->GetY());
\r
394 testqc.SetTarget(LineIndex[CBSwapTarget1->ItemIndex],LineIndex[CBSwapTarget2->ItemIndex]);
\r
395 if (!qManager->CanPutCircuit(&testqc)) {
\r
396 ShowMessage("Circuits are overlapped!");
\r
397 } else if (CBSwapTarget1->ItemIndex == CBSwapTarget2->ItemIndex) {
\r
398 ShowMessage("Select different lines.");
\r
404 TSSwap->TabVisible = false;
\r
406 if (mr==mrCancel) {
\r
407 delete [] LineIndex;
\r
411 qSwap->SetTarget(LineIndex[CBSwapTarget1->ItemIndex],LineIndex[CBSwapTarget2->ItemIndex]);
\r
413 delete [] LineIndex;
\r
416 //---------------------------------------------------------------------------
\r
418 * Controled Rotator
\r
421 TFParam::Execute(QCRot * qCRot, QManager * qManager) {
\r
423 EdCRotPhase->Text = FloatToStr(qCRot->GetPhase());
\r
424 int *LineIndex = new int[qManager->GetLineNumber()];
\r
427 CBCRTarget->Items->Clear();
\r
428 for (int i=0;i<qManager->GetLineNumber();i++) {
\r
429 QCRot testqc(qCRot->GetX(), qCRot->GetY());
\r
430 testqc.SetTarget(i);
\r
431 if (i != qCRot->GetY() && qManager->CanPutCircuit(&testqc)) {
\r
432 CBCRTarget->Items->Add("q"+IntToStr(i+1));
\r
433 LineIndex[index] = i;
\r
438 MessageBeep(MB_OK);
\r
439 delete []LineIndex;
\r
443 CBCRTarget->ItemIndex = 0;
\r
444 for (int i=0;i<CBCRTarget->Items->Count;i++) {
\r
445 if(qCRot->GetTarget()==LineIndex[i]){
\r
446 CBCRTarget->ItemIndex = i;
\r
450 qpcCRot->SetTheta(qCRot->GetPhase());
\r
451 TSCRot->TabVisible = true;
\r
453 while(mr == mrNone){
\r
456 TSCRot->TabVisible = false;
\r
457 delete []LineIndex;
\r
461 StrToFloat(EdCRotPhase->Text);
\r
462 } catch (EConvertError &e) {
\r
463 MessageBox(this->Handle,"Please input valid value.", "QCAD - Alert",MB_ICONERROR);
\r
468 TSCRot->TabVisible = false;
\r
469 qCRot->SetTarget(LineIndex[CBCRTarget->ItemIndex]);
\r
470 qCRot->SetPhase(StrToFloat(EdCRotPhase->Text));
\r
472 delete [] LineIndex;
\r
475 //---------------------------------------------------------------------------
\r
480 TFParam::Execute(QRot * qRot, QManager * qManager) {
\r
481 EdRotPhase->Text = FloatToStr(qRot->GetPhase());
\r
482 qpcRot->SetTheta(qRot->GetPhase());
\r
483 TSRot->TabVisible = true;
\r
485 while(mr == mrNone){
\r
488 TSRot->TabVisible = false;
\r
492 StrToFloat(EdRotPhase->Text);
\r
493 } catch (EConvertError &e) {
\r
494 MessageBox(this->Handle,"Please input valid value.", "QCAD - Alert",MB_ICONERROR);
\r
498 qRot->SetPhase(StrToFloat(EdRotPhase->Text));
\r
499 TSRot->TabVisible = false;
\r
502 //---------------------------------------------------------------------------
\r
503 void __fastcall TFParam::ImageRotPhaseMouseMove(TObject *Sender,
\r
504 TShiftState Shift, int X, int Y)
\r
506 if(!Shift.Contains(ssLeft)){
\r
509 EdRotPhase->Text = FloatToStr(qpcRot->GetTheta(X,Y));
\r
512 //---------------------------------------------------------------------------
\r
514 void __fastcall TFParam::ImageCRotPhaseMouseMove(TObject *Sender,
\r
515 TShiftState Shift, int X, int Y)
\r
517 if(!Shift.Contains(ssLeft)){
\r
520 EdCRotPhase->Text = FloatToStr(qpcCRot->GetTheta(X,Y));
\r
523 //---------------------------------------------------------------------------
\r