1 //----------------------------------------------------------------------------
\r
3 // Compile intermediate code into native C++ code
\r
4 // $Date: 2003/02/20 00:24:16 $
\r
6 //----------------------------------------------------------------------------
\r
10 #endif //__BORLANDC__
\r
14 #include "QCompilerCode.h"
\r
17 #define M_PI 3.1415926535897932384626433832795028841971693993751
\r
20 //----------------------------------------------------------------------------
\r
22 #pragma package(smart_init)
\r
23 #endif //__BORLANDC__
\r
25 //----------------------------------------------------------------------------
\r
29 QCompilerCode::QCompilerCode(const char * const filename) : QCompiler() {
\r
30 mQParseInfo.clear();
\r
31 mTargetName = filename;
\r
34 //----------------------------------------------------------------------------
\r
36 * Constructor with input stream
\r
38 QCompilerCode::QCompilerCode(std::istream &is, const char * const filename)
\r
40 mQParseInfo.clear();
\r
41 mTargetName = filename;
\r
44 //----------------------------------------------------------------------------
\r
48 QCompilerCode::~QCompilerCode() {
\r
49 mQParseInfo.clear();
\r
52 //----------------------------------------------------------------------------
\r
54 * Save the compile result to output stream
\r
57 QCompilerCode::SaveToStream(std::ostream &os) {
\r
58 int vec_size = mQParseInfo.size();
\r
60 if (false == mState) {
\r
61 std::cerr << "QCompilerCode: compile has not been completed.\n";
\r
66 for (int i = 0; i < vec_size; i++) {
\r
67 const std::vector<int> &indices = mQParseInfo[i].getTargetIndices();
\r
68 switch (mQParseInfo[i].getOperator()) {
\r
70 WriteCNot(os, indices[0], indices[1]);
\r
73 WriteCRot(os, indices[0], indices[1],
\r
74 (double)180 / (double)mQParseInfo[i].getRotation() * M_PI);
\r
77 WriteHadam(os, indices[0]);
\r
98 WriteCCNot(os, indices[0], indices[1], indices[2]);
\r
101 WriteQBits(os, indices[0]);
\r
110 //----------------------------------------------------------------------------
\r
112 * Save the compile result to a file whose name is specified with 'filename'
\r
115 QCompilerCode::SaveToFile(const char * const filename) {
\r
116 std::ofstream ofs(filename);
\r
119 std::cerr << "QCompilerCode: failed in file open.\n";
\r
128 //----------------------------------------------------------------------------
\r
130 * Implementation of a virtual function
\r
133 QCompilerCode::CompileOneLine(const QParseInfo &pinfo) {
\r
134 if (false == pinfo.getParseResult()) return false;
\r
135 mQParseInfo.push_back(pinfo);
\r
139 //----------------------------------------------------------------------------
\r
141 * Implementation of a virtual function
\r
144 QCompilerCode::CatchError(const QParseInfo &pinfo, const int at) {
\r
145 std::cerr << "There is an error at line " << at << "\n";
\r
146 switch (pinfo.getErrorNo()) {
\r
147 case QParseInfo::er_syntax_error:
\r
148 std::cerr << "Syntax Error.\n";
\r
150 case QParseInfo::er_unknown_operation:
\r
151 std::cerr << "Unknown Operation.\n";
\r
153 case QParseInfo::er_lack_of_arguments:
\r
154 std::cerr << "Lack of Arguments.\n";
\r
156 case QParseInfo::er_too_many_arguments:
\r
157 std::cerr << "Too Many Arguments.\n";
\r
159 case QParseInfo::er_invalid_arguments:
\r
160 std::cerr << "Invalid Arguments.\n";
\r
163 std::cerr << "Unknown Error.\n";
\r
166 mQParseInfo.clear();
\r
169 //----------------------------------------------------------------------------
\r
171 * Subcontract function of SaveToStream()
\r
174 QCompilerCode::WriteHeader(std::ostream &os) {
\r
175 os << "//----------------------------------------------------------------------------\n"
\r
176 << "// QCAD compiled code\n"
\r
177 << "//----------------------------------------------------------------------------\n"
\r
178 << "#include <iostream>\n"
\r
179 << "#include \"QC_all.h\"\n"
\r
180 << "#include \"qclib.h\"\n\n"
\r
181 << "int main(void)\n{\n"
\r
182 << " std::cerr << \"\\nCopyright (c) 2003 QCAD project.\\n\"\n"
\r
183 << " << \"This application is automatically generated by qcc.\\n\""
\r
184 << " << \"The result will be stored into \\\""
\r
185 << mTargetName << "\\\".\\n\\n\";"
\r
189 //----------------------------------------------------------------------------
\r
191 * Subcontract function of SaveToStream()
\r
194 QCompilerCode::WriteQBits(std::ostream &os, const int &t1) {
\r
195 os << " QBits qbits(" << t1 << ");\n"
\r
196 << " std::cerr << \"Calcuate with " << t1 << " qubits.\\n\";\n"
\r
197 << " qc::allocWith(qbits);\n";
\r
200 //----------------------------------------------------------------------------
\r
202 * Subcontract function of SaveToStream()
\r
205 QCompilerCode::WriteFooter(std::ostream &os) {
\r
206 os << " qc::getQBits()->SaveToFile(\"" << mTargetName << "\");\n"
\r
207 << " qc::release();\n\n"
\r
208 << " std::cerr << \"done.\\n\";\n"
\r
209 << " return 0;\n}\n";
\r
212 //----------------------------------------------------------------------------
\r
214 * Subcontract function of SaveToStream()
\r
217 QCompilerCode::WriteCNot(std::ostream &os, const int &t1, const int &c1) {
\r
218 os << " QC_cnot::calc(" << t1 << ", " << c1 << ",qbits.GetBitsR(),qbits.GetBitsI(),qbits.GetNumberOfQBits());\n"
\r
219 << " std::cerr << \"Controlled-Not(" << t1 << ", " << c1 << ")\\n\";\n";
\r
222 //----------------------------------------------------------------------------
\r
224 * Subcontract function of SaveToStream()
\r
227 QCompilerCode::WriteCCNot (std::ostream &os, const int &t1,
\r
228 const int &c1, const int &c2) {
\r
229 os << " QC_ccnot::calc(" << t1 << ", " << c1 << ", " << c2 << ",qbits.GetBitsR(),qbits.GetBitsI(),qbits.GetNumberOfQBits());\n"
\r
230 << " std::cerr << \"Toffoli("
\r
231 << t1 << ", " << c1 << ", " << c2 << ")\\n\";\n";
\r
234 //----------------------------------------------------------------------------
\r
236 * Subcontract function of SaveToStream()
\r
239 QCompilerCode::WriteCRot (std::ostream &os, const int &t1,
\r
240 const int &c1, const double rad) {
\r
241 os << " QC_crot::calc(" << t1 << ", " << c1 << ", " << rad << ",qbits.GetBitsR(),qbits.GetBitsI(),qbits.GetNumberOfQBits());\n"
\r
242 << " std::cerr << \"Controlled-Rot("
\r
243 << t1 << ", " << c1 << ")\\n\";\n";
\r
246 //----------------------------------------------------------------------------
\r
248 * Subcontract function of SaveToStream()
\r
251 QCompilerCode::WriteHadam (std::ostream &os, const int &t1) {
\r
252 os << " QC_hadamard::calc(" << t1 << ",qbits.GetBitsR(),qbits.GetBitsI(),qbits.GetNumberOfQBits());\n"
\r
253 << " std::cerr << \"Hadamard(" << t1 << ")\\n\";\n";
\r