1 //----------------------------------------------------------------------------
\r
2 // Compile intermediates into list of the calc units
\r
3 //----------------------------------------------------------------------------
\r
7 #endif //__BORLANDC__
\r
11 #include "QCompiler.h"
\r
12 #include "QCompilerCntl.h"
\r
13 #include "QParseInfo.h"
\r
14 #include "QCalcUnit.h"
\r
17 #include "QC_hadamard.h"
\r
18 #include "QC_cnot.h"
\r
19 #include "QC_crot.h"
\r
21 #include "QC_ccnot.h"
\r
22 #include "QC_pauliX.h"
\r
23 #include "QC_pauliY.h"
\r
24 #include "QC_pauliZ.h"
\r
25 #include "QC_swap.h"
\r
26 #include "QC_measure.h"
\r
28 // ---------------------------------------------------------------------------
\r
30 #pragma package(smart_init)
\r
31 #endif //__BORLANDC__
\r
33 //----------------------------------------------------------------------------
\r
37 QCompilerCntl::QCompilerCntl(void) : QCompiler() {
\r
39 mQParseInfo.clear();
\r
41 //----------------------------------------------------------------------------
\r
45 QCompilerCntl::QCompilerCntl(std::istream &is) : QCompiler(is) {
\r
47 mQParseInfo.clear();
\r
49 //----------------------------------------------------------------------------
\r
53 QCompilerCntl::~QCompilerCntl() {
\r
54 mQParseInfo.clear();
\r
56 //----------------------------------------------------------------------------
\r
61 QCompilerCntl::AllocateControl(const unsigned int index) {
\r
62 if (index >= mQParseInfo.size()) {
\r
63 return NULL; // Error
\r
65 QCalcUnit *cu = NULL;
\r
66 const std::vector<int> &targets = mQParseInfo[index].QParseInfo::getTargetIndices();
\r
67 switch (mQParseInfo[index].getOperator()) {
\r
69 cu = new QC_cnot(targets[0], targets[1]);
\r
72 cu = new QC_crot(targets[0], targets[1], mQParseInfo[index].getRotation());
\r
75 cu = new QC_rot(targets[0], mQParseInfo[index].getRotation());
\r
78 cu = new QC_hadamard(targets[0]);
\r
81 cu = new QC_measure(targets[0]);
\r
84 cu = new QC_swap(targets[0], targets[1]);
\r
87 cu = new QC_pauliX(targets[0]);
\r
90 cu = new QC_pauliY(targets[0]);
\r
93 cu = new QC_pauliZ(targets[0]);
\r
96 cu = new QC_not(targets[0]);
\r
99 cu = new QC_ccnot(targets[0], targets[1], targets[2]);
\r
102 mNumOfQBits = targets[0];
\r
108 //----------------------------------------------------------------------------
\r
113 QCompilerCntl::CompileOneLine(const QParseInfo &pinfo) {
\r
114 if (!pinfo.getParseResult()) {
\r
117 mQParseInfo.push_back(pinfo);
\r
120 //----------------------------------------------------------------------------
\r
125 QCompilerCntl::CatchError(const QParseInfo &pinfo, const int at) {
\r
126 #ifdef __BORLANDC__
\r
127 //ShowMessage(IntToStr(pinfo.getErrorNo()));
\r
129 std::cerr << "Parse error occurred at line " << at << "\n"
\r
130 << "Error code = " << pinfo.getErrorNo() << "\n";
\r
131 #endif //__BORLANDC__
\r
134 //----------------------------------------------------------------------------
\r