OSDN Git Service

Initial Commit
[qcad/qcad.git] / compiler / QCompilerCode.cpp
1 //----------------------------------------------------------------------------\r
2 //  CompilerCode.cpp\r
3 //  Compile intermediate code into native C++ code\r
4 //  $Date: 2003/02/20 00:24:16 $\r
5 //  $Revision: 1.4 $\r
6 //----------------------------------------------------------------------------\r
7 #ifdef __BORLANDC__\r
8 #include <vcl.h>\r
9 #pragma hdrstop\r
10 #endif //__BORLANDC__\r
11 \r
12 #include <iostream>\r
13 #include <fstream>\r
14 #include "QCompilerCode.h"\r
15 \r
16 #ifndef M_PI\r
17 #define M_PI 3.1415926535897932384626433832795028841971693993751\r
18 #endif//M_PI\r
19 \r
20 //----------------------------------------------------------------------------\r
21 #ifdef __BORLANDC__\r
22 #pragma package(smart_init)\r
23 #endif //__BORLANDC__\r
24 \r
25 //----------------------------------------------------------------------------\r
26 /**\r
27  *  Constructor\r
28  */\r
29 QCompilerCode::QCompilerCode(const char * const filename) : QCompiler() {\r
30   mQParseInfo.clear();\r
31   mTargetName = filename;\r
32 }\r
33 \r
34 //----------------------------------------------------------------------------\r
35 /**\r
36  *  Constructor with input stream\r
37  */\r
38 QCompilerCode::QCompilerCode(std::istream &is, const char * const filename)\r
39     : QCompiler(is) {\r
40   mQParseInfo.clear();\r
41   mTargetName = filename;\r
42 }\r
43 \r
44 //----------------------------------------------------------------------------\r
45 /**\r
46  *  Destructor\r
47  */\r
48 QCompilerCode::~QCompilerCode() {\r
49   mQParseInfo.clear();\r
50 }\r
51 \r
52 //----------------------------------------------------------------------------\r
53 /**\r
54  *  Save the compile result to output stream\r
55  */\r
56 void\r
57 QCompilerCode::SaveToStream(std::ostream &os) {\r
58   int vec_size = mQParseInfo.size();\r
59 \r
60   if (false == mState) {\r
61     std::cerr << "QCompilerCode: compile has not been completed.\n";\r
62     return;\r
63   }\r
64 \r
65   WriteHeader(os);\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
69     case cn_cnot:\r
70       WriteCNot(os, indices[0], indices[1]);\r
71       break;\r
72     case cn_crot:\r
73       WriteCRot(os, indices[0], indices[1],\r
74                 (double)180 / (double)mQParseInfo[i].getRotation() * M_PI);\r
75       break;\r
76     case cn_h:\r
77       WriteHadam(os, indices[0]);\r
78       break;\r
79     case cn_m:\r
80       // do nothing\r
81       break;\r
82     case cn_swap:\r
83       //TODO:\r
84       break;\r
85     case cn_x:\r
86       //TODO:\r
87       break;\r
88     case cn_y:\r
89       //TODO:\r
90       break;\r
91     case cn_z:\r
92       //TODO:\r
93       break;\r
94     case cn_not:\r
95       //TODO:\r
96       break;\r
97     case cn_ccnot:\r
98       WriteCCNot(os, indices[0], indices[1], indices[2]);\r
99       break;\r
100     case cn_init:\r
101       WriteQBits(os, indices[0]);\r
102       break;\r
103     default:\r
104       break;\r
105     }\r
106   }\r
107   WriteFooter(os);\r
108 }\r
109 \r
110 //----------------------------------------------------------------------------\r
111 /**\r
112  *  Save the compile result to a file whose name is specified with 'filename'\r
113  */\r
114 void\r
115 QCompilerCode::SaveToFile(const char * const filename) {\r
116   std::ofstream   ofs(filename);\r
117 \r
118   if (!ofs) {\r
119     std::cerr << "QCompilerCode: failed in file open.\n";\r
120     return;\r
121   }\r
122 \r
123   SaveToStream(ofs);\r
124 \r
125   ofs.close();\r
126 }\r
127 \r
128 //----------------------------------------------------------------------------\r
129 /**\r
130  *  Implementation of a virtual function\r
131  */\r
132 bool\r
133 QCompilerCode::CompileOneLine(const QParseInfo &pinfo) {\r
134   if (false == pinfo.getParseResult()) return false;\r
135   mQParseInfo.push_back(pinfo);\r
136   return true;\r
137 }\r
138 \r
139 //----------------------------------------------------------------------------\r
140 /**\r
141  *  Implementation of a virtual function\r
142  */\r
143 void\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
149     break;\r
150   case QParseInfo::er_unknown_operation:\r
151     std::cerr << "Unknown Operation.\n";\r
152     break;\r
153   case QParseInfo::er_lack_of_arguments:\r
154     std::cerr << "Lack of Arguments.\n";\r
155     break;\r
156   case QParseInfo::er_too_many_arguments:\r
157     std::cerr << "Too Many Arguments.\n";\r
158     break;\r
159   case QParseInfo::er_invalid_arguments:\r
160     std::cerr << "Invalid Arguments.\n";\r
161     break;\r
162   default:\r
163     std::cerr << "Unknown Error.\n";\r
164     break;\r
165   }\r
166   mQParseInfo.clear();\r
167 }\r
168 \r
169 //----------------------------------------------------------------------------\r
170 /**\r
171  *  Subcontract function of SaveToStream()\r
172  */\r
173 void\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
186   << "\n";\r
187 }\r
188 \r
189 //----------------------------------------------------------------------------\r
190 /**\r
191  *  Subcontract function of SaveToStream()\r
192  */\r
193 void\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
198 }\r
199 \r
200 //----------------------------------------------------------------------------\r
201 /**\r
202  *  Subcontract function of SaveToStream()\r
203  */\r
204 void\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
210 }\r
211 \r
212 //----------------------------------------------------------------------------\r
213 /**\r
214  *  Subcontract function of SaveToStream()\r
215  */\r
216 void\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
220 }\r
221 \r
222 //----------------------------------------------------------------------------\r
223 /**\r
224  *  Subcontract function of SaveToStream()\r
225  */\r
226 void\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
232 }\r
233 \r
234 //----------------------------------------------------------------------------\r
235 /**\r
236  *  Subcontract function of SaveToStream()\r
237  */\r
238 void\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
244 }\r
245 \r
246 //----------------------------------------------------------------------------\r
247 /**\r
248  *  Subcontract function of SaveToStream()\r
249  */\r
250 void\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
254 }\r
255 \r