Branch data Line data Source code
1 : : /*
2 : : * ucs.cpp - main program implementation
3 : : *
4 : : * Copyright (C) 2003-2009 Stefan Jahn <stefan@lkcc.org>
5 : : *
6 : : * This is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2, or (at your option)
9 : : * any later version.
10 : : *
11 : : * This software is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this package; see the file COPYING. If not, write to
18 : : * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
19 : : * Boston, MA 02110-1301, USA.
20 : : *
21 : : * $Id$
22 : : *
23 : : */
24 : :
25 : : #if HAVE_CONFIG_H
26 : : # include <config.h>
27 : : #endif
28 : :
29 : : #include <stdio.h>
30 : : #include <stdlib.h>
31 : : #include <assert.h>
32 : : #include <string.h>
33 : : #include <time.h>
34 : : #include <list>
35 : : #include <iostream>
36 : : #include <fstream>
37 : :
38 : : #include "logging.h"
39 : : #include "precision.h"
40 : : #include "component.h"
41 : : #include "components.h"
42 : : #include "net.h"
43 : : #include "input.h"
44 : : #include "dataset.h"
45 : : #include "equation.h"
46 : : #include "environment.h"
47 : : #include "exceptionstack.h"
48 : : #include "check_netlist.h"
49 : : #include "module.h"
50 : :
51 : : #if HAVE_UNISTD_H
52 : : #include <unistd.h>
53 : : #endif
54 : :
55 : : using namespace qucs;
56 : :
57 : : /*! \todo replace environement name root by "/" in order to be filesystem compatible */
58 : 107 : int main (int argc, char ** argv) {
59 : :
60 : 107 : char * infile = NULL;
61 : 107 : char * outfile = NULL;
62 : 107 : char * projPath = NULL;
63 : : net * subnet;
64 : : input * in;
65 : : circuit * gnd;
66 : : dataset * out;
67 : : environment * root;
68 : 107 : int listing = 0;
69 : 107 : int ret = 0;
70 : 107 : int dynamicLoad = 0;
71 : :
72 [ + - ]: 107 : std::list<std::string> vamodules;
73 : :
74 [ + - ]: 107 : loginit ();
75 : 107 : ::srand (::time (NULL));
76 : :
77 : : // check program arguments
78 [ + + ]: 275 : for (int i = 1; i < argc; i++) {
79 [ + + ][ - + ]: 171 : if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--version")) {
80 : : fprintf (stdout,
81 : : #ifdef GIT
82 : : "Qucsator " PACKAGE_VERSION " (" GIT ") \n"
83 : : #else
84 : : "Qucsator " PACKAGE_VERSION "\n"
85 : : #endif
86 : : "Copyright (C) 2003-2009 "
87 : : "Stefan Jahn <stefan@lkcc.org>\n"
88 : : "Copyright (C) 2006 Helene Parruitte <parruit@enseirb.fr>\n"
89 : : "Copyright (C) 2006 Bastien Roucaries <roucaries.bastien@gmail.com>\n"
90 : : "\nThis is free software; see the source for copying "
91 : : "conditions. There is NO\n"
92 : : "warranty; not even for MERCHANTABILITY or FITNESS FOR A "
93 [ + - ]: 3 : "PARTICULAR PURPOSE.\n");
94 : 3 : return 0;
95 : : }
96 [ + - ][ - + ]: 168 : if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help")) {
97 : : fprintf (stdout,
98 : : "Usage: %s [OPTION]...\n\n"
99 : : " -h, --help display this help and exit\n"
100 : : " -v, --version display version information and exit\n"
101 : : " -i FILENAME use file as input netlist (default stdin)\n"
102 : : " -o FILENAME use file as output dataset (default stdout)\n"
103 : : " -b, --bar enable textual progress bar\n"
104 : : " -g, --gui special progress bar used by gui\n"
105 : : " -c, --check check the input netlist and exit\n"
106 : : #if DEBUG
107 : : " -l, --listing emit C-code for available definitions\n"
108 : : #endif
109 : : " -p, --path project path (or location of dynamic modules)\n"
110 : : " -m, --module list of dynamic loaded modules (base names separated by space)\n"
111 [ # # ]: 0 : "\nReport bugs to <" PACKAGE_BUGREPORT ">.\n", argv[0]);
112 : 0 : return 0;
113 : : }
114 [ + + ]: 168 : else if (!strcmp (argv[i], "-i")) {
115 : 103 : infile = argv[++i];
116 : : }
117 [ + + ]: 65 : else if (!strcmp (argv[i], "-o")) {
118 : 64 : outfile = argv[++i];
119 : 64 : file_status = stdout;
120 : : }
121 [ + - ][ - + ]: 1 : else if (!strcmp (argv[i], "-b") || !strcmp (argv[i], "--bar")) {
122 : 0 : progressbar_enable = 1;
123 : : }
124 [ + - ][ - + ]: 1 : else if (!strcmp (argv[i], "-g") || !strcmp (argv[i], "--gui")) {
125 : 0 : progressbar_gui = 1;
126 : : }
127 [ + - ][ - + ]: 1 : else if (!strcmp (argv[i], "-c") || !strcmp (argv[i], "--check")) {
128 : 0 : netlist_check = 1;
129 : : }
130 [ - + ][ # # ]: 1 : else if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--listing")) {
131 : 1 : listing = 1;
132 : : }
133 : : // \todo remove command arguments
134 [ # # ][ # # ]: 0 : else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--path")) {
135 : 0 : projPath = argv[++i];
136 : : }
137 [ # # ][ # # ]: 0 : else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--module")) {
138 : 0 : dynamicLoad = 1;
139 : : }
140 : : else {
141 [ # # ]: 0 : if (dynamicLoad) {
142 [ # # ][ # # ]: 0 : vamodules.push_back(argv[i]);
143 : : }
144 : : }
145 : : }
146 : :
147 : : // create static modules
148 [ + - ]: 104 : module::registerModules ();
149 : :
150 : : #if DEBUG
151 : : // emit C-code for available definitions if requested and exit
152 [ + + ]: 104 : if (listing) {
153 [ + - ]: 1 : module::print ();
154 : 1 : return ret;
155 : : }
156 : : #endif /* DEBUG */
157 : :
158 : : // look for dynamic libs, load and register them
159 : : // \todo, keep this way of loading or keep only annotated netlist?
160 [ - + ]: 103 : if (dynamicLoad) {
161 [ # # ][ # # ]: 0 : module::registerDynamicModules (projPath, vamodules);
162 : : }
163 : :
164 : : else { //no argument, look into netlist
165 : :
166 [ + - ]: 103 : std::string sLine = "";
167 [ + - ]: 103 : std::ifstream file;
168 : :
169 [ + - ]: 103 : std::string projPathNet ="";
170 [ + - ]: 103 : std::string projVaMoules = "";
171 : :
172 [ + - ]: 103 : file.open(infile);
173 : :
174 [ + - ][ + + ]: 1609 : while (!file.eof()) {
175 [ + - ]: 1506 : getline(file, sLine);
176 : :
177 [ + - ][ - + ]: 1506 : if (sLine.find("--path") != std::string::npos) {
178 [ # # ][ # # ]: 0 : std::cout << sLine << std::endl;
179 : :
180 : 0 : size_t pos = 0;
181 [ # # ]: 0 : pos = sLine.find("=");
182 [ # # ]: 0 : sLine.erase(0, pos + 1);
183 [ # # ][ # # ]: 0 : std::cout << sLine << std::endl;
184 : :
185 : : // projPath = const_cast<char*>(sLine.c_str());
186 : : // projPath = (char*)sLine.c_str();
187 : :
188 : : // std::cout << "inside" << projPath << std::endl;
189 : :
190 [ # # ]: 0 : projPathNet = sLine;
191 : :
192 : : }
193 : :
194 [ + - ][ - + ]: 1506 : if (sLine.find("--module") != std::string::npos) {
195 [ # # ][ # # ]: 0 : std::cout << sLine << std::endl;
196 : :
197 : 0 : size_t pos = 0;
198 [ # # ]: 0 : pos = sLine.find("=");
199 [ # # ]: 0 : sLine.erase(0, pos + 1);
200 : : //std::cout << sLine << std::endl;
201 [ # # ]: 0 : projVaMoules = sLine;
202 : :
203 : : // put module names into list
204 [ # # ]: 0 : std::istringstream ss(sLine);
205 [ # # ]: 0 : std::string token;
206 : :
207 [ # # ][ # # ]: 0 : while(std::getline(ss, token, ' ')) {
[ # # ]
208 [ # # ][ # # ]: 0 : std::cout << token << '\n';
209 : :
210 [ # # ]: 0 : vamodules.push_back(token);
211 [ # # ]: 0 : }
212 : : }
213 : : }
214 : :
215 [ + - ][ + - ]: 103 : module::registerDynamicModules ((char*)projPathNet.c_str(), vamodules);
216 [ + - ][ + - ]: 103 : file.close();
217 : : }
218 : :
219 : :
220 : : // create root environment
221 [ + - ][ + - ]: 103 : root = new environment (std::string("root"));
[ + - ]
222 : :
223 : : // create netlist object and input
224 [ + - ][ + - ]: 103 : subnet = new net ("subnet");
225 [ + - ][ + - ]: 103 : in = infile ? new input (infile) : new input ();
[ + - ][ # # ]
[ # # ]
226 : :
227 : : // pass root environment to netlist object and input
228 : 103 : subnet->setEnv (root);
229 : 103 : in->setEnv (root);
230 : :
231 : : // get input netlist
232 [ + - ][ - + ]: 103 : if (in->netlist (subnet) != 0) {
233 [ # # ]: 0 : if (netlist_check) {
234 [ # # ]: 0 : logprint (LOG_STATUS, "checker notice, netlist check FAILED\n");
235 : : }
236 : 0 : return -1;
237 : : }
238 [ - + ]: 103 : if (netlist_check) {
239 [ # # ]: 0 : logprint (LOG_STATUS, "checker notice, netlist OK\n");
240 : 0 : return 0;
241 : : }
242 : :
243 : : // attach a ground to the netlist
244 [ + - ][ + - ]: 103 : gnd = new ground ();
245 [ + - ]: 103 : gnd->setNode (0, "gnd");
246 [ + - ]: 103 : gnd->setName ("GND");
247 [ + - ]: 103 : subnet->insertCircuit (gnd);
248 : :
249 : : // analyse the netlist
250 : 103 : int err = 0;
251 [ + - ]: 103 : out = subnet->runAnalysis (err);
252 : 103 : ret |= err;
253 : :
254 : : // evaluate output dataset
255 [ + - ]: 103 : ret |= root->equationSolver (out);
256 [ + - ]: 103 : out->setFile (outfile);
257 [ + - ]: 103 : out->print ();
258 : :
259 [ + - ]: 103 : estack.print ("uncaught");
260 : :
261 [ + - ][ + - ]: 103 : delete subnet;
262 [ + - ][ + - ]: 103 : delete in;
263 [ + - ][ + - ]: 103 : delete out;
264 [ + - ][ + - ]: 103 : delete root;
265 : :
266 : : // delete static modules and dynamic modules
267 [ + - ]: 103 : module::unregisterModules ();
268 : :
269 : : // close all the dynamic libs if any opened
270 [ + - ]: 103 : module::closeDynamicLibs();
271 : :
272 [ + - ]: 103 : netlist_destroy_env ();
273 : 107 : return ret;
274 [ + - ][ + - ]: 321 : }
|