Branch data Line data Source code
1 : : /*
2 : : * circuit.h - circuit class definitions
3 : : *
4 : : * Copyright (C) 2003-2008 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 : : /*! \file circuit.h
26 : : * \brief The circuit class header file.
27 : : *
28 : : * Contains the circuit class definition.
29 : : */
30 : :
31 : : #ifndef __CIRCUIT_H__
32 : : #define __CIRCUIT_H__
33 : :
34 : : #include "characteristic.h"
35 : : #include "operatingpoint.h"
36 : :
37 : : #define NODE_1 0
38 : : #define NODE_2 1
39 : : #define NODE_3 2
40 : : #define NODE_4 3
41 : : #define NODE_5 4
42 : : #define NODE_6 5
43 : : #define VSRC_1 0
44 : : #define VSRC_2 1
45 : : #define VSRC_3 2
46 : : #define VSRC_4 3
47 : : #define VSRC_5 4
48 : :
49 : : #define MODFLAG(val,bit) if (val) flag |= (bit); else flag &= ~(bit);
50 : : #define RETFLAG(bit) ((flag & (bit)) != 0)
51 : :
52 : : #define CREATOR(val) \
53 : : val (); \
54 : : static qucs::circuit * create (void) { return new val (); } \
55 : : static struct define_t cirdef; \
56 : : static struct define_t * definition (void) { return &cirdef; }
57 : :
58 : : #include <map>
59 : : #include "integrator.h"
60 : : #include "valuelist.h"
61 : :
62 : : namespace qucs {
63 : :
64 : : enum circuit_flag {
65 : : CIRCUIT_ENABLED = 1,
66 : : CIRCUIT_LINEAR = 2,
67 : : CIRCUIT_ORIGINAL = 4,
68 : : CIRCUIT_VSOURCE = 8,
69 : : CIRCUIT_ISOURCE = 16,
70 : : CIRCUIT_INTVSOURCE = 32,
71 : : CIRCUIT_VARSIZE = 64,
72 : : CIRCUIT_PROBE = 128,
73 : : CIRCUIT_HISTORY = 256,
74 : : };
75 : :
76 : : class node;
77 : : class property;
78 : : class substrate;
79 : : class matrix;
80 : : class net;
81 : : class environment;
82 : : class history;
83 : :
84 : : /*! \class circuit
85 : : * \brief base class for qucs circuit elements.
86 : : *
87 : : * This is the base class for all circuit elements and provides the
88 : : * the functionality required for all simulation types. It has a number
89 : : * of virtual functions intended to be overridden by the inheiriting
90 : : * class
91 : : *
92 : : */
93 : : class circuit : public object, public integrator
94 : : {
95 : : public:
96 : : // constructor and destructor set
97 : : circuit ();
98 : : circuit (int);
99 : : circuit (const circuit &);
100 : : ~circuit ();
101 : :
102 : : // functionality to be overloaded by real, derived circuit element
103 : : // implementations
104 : : /*! \fn initSP
105 : : * \brief placehoder for S-Parameter initialisation function
106 : : *
107 : : * Virtual function intended to be overridden by the
108 : : * inheiriting circuit element's S-Parameter initialisation
109 : : * function. initSP is called before commencing the simulation
110 : : * to set up the S-Parameter matrix.
111 : : */
112 : 124831 : virtual void initSP (void) { allocMatrixS (); }
113 : 76656 : virtual void calcSP (nr_double_t) { }
114 : 22460 : virtual void initDC (void) { allocMatrixMNA (); }
115 : 240703 : virtual void calcDC (void) { }
116 : 648 : virtual void restartDC (void) { }
117 : 9170 : virtual void initNoiseSP (void) { allocMatrixN (); }
118 : 7103 : virtual void calcNoiseSP (nr_double_t) { }
119 : 282 : virtual void initNoiseAC (void) { allocMatrixN (vsources); }
120 : 14469 : virtual void calcNoiseAC (nr_double_t) { }
121 : 151 : virtual void initAC (void) { allocMatrixMNA (); }
122 : 22418 : virtual void calcAC (nr_double_t) { }
123 : 122 : virtual void initTR (void) { allocMatrixMNA (); }
124 : 1256326 : virtual void calcTR (nr_double_t) { }
125 : 0 : virtual void initHB (void) { allocMatrixMNA (); }
126 : 18 : virtual void calcHB (nr_double_t) { }
127 : 0 : virtual void initHB (int) { allocMatrixMNA (); }
128 : 0 : virtual void calcHB (int) { }
129 : 0 : virtual void calcOperatingPoints (void) { }
130 : 7 : virtual void saveOperatingPoints (void) { }
131 : 0 : virtual void calcCharacteristics (nr_double_t) { }
132 : 0 : virtual void saveCharacteristics (nr_double_t) { }
133 : :
134 : : // basic circuit element functionality
135 : : void setNode (int, const char *, int intern = 0);
136 : : node * getNode (int);
137 : : void setType (int t) { type = t; }
138 : 243987 : int getType (void) { return type; }
139 : : /*! \fn getSize
140 : : * \brief Get the number of ports the circuit element has.
141 : : *
142 : : * Gets the number of ports the circuit element has
143 : : */
144 : 22567361 : int getSize (void) { return size; }
145 : : /*! \fn setSize
146 : : * \brief Set the number of ports the circuit element has.
147 : : * \param s integer representing the number of ports
148 : : *
149 : : * Sets/changes the number of ports the circuit element has.
150 : : * On setting this value, previously stored node and matrix
151 : : * information is completely lost unless the new size equals
152 : : * the original size
153 : : */
154 : : void setSize (int);
155 : : /*! \fn isEnabled
156 : : * \brief Reports if circuit element is enabled.
157 : : *
158 : : * Returns true if the circuit element is enabled or false
159 : : * otherwise.
160 : : */
161 : 0 : bool isEnabled (void) { return RETFLAG (CIRCUIT_ENABLED); }
162 : : /*! \fn setEnabled
163 : : * \brief Set a circuit element to be enabled or diabled.
164 : : * \param e boolean indicating whether to enable or disable
165 : : *
166 : : * Sets the circuit element to be enabled or disabled.
167 : : */
168 [ + + ]: 485811 : void setEnabled (bool e) { MODFLAG (e, CIRCUIT_ENABLED); }
169 : 933 : bool isVariableSized (void) { return RETFLAG (CIRCUIT_VARSIZE); }
170 [ # # ]: 0 : void setVariableSized (bool v) { MODFLAG (v, CIRCUIT_VARSIZE); }
171 : 652260 : bool isProbe (void) { return RETFLAG (CIRCUIT_PROBE); }
172 [ + - ]: 15 : void setProbe (bool p) { MODFLAG (p, CIRCUIT_PROBE); }
173 : 485811 : void setNet (net * n) { subnet = n; }
174 : 728780 : net * getNet (void) { return subnet; }
175 : :
176 : : // subcircuitry
177 : 170813 : char * getSubcircuit (void) { return subcircuit; }
178 : : void setSubcircuit (char *);
179 : :
180 : : // environment specific
181 : 0 : environment * getEnv (void) { return env; }
182 : 933 : void setEnv (environment * e) { env = e; }
183 : :
184 : : // nodal analyses helpers
185 [ + - ]: 810 : void setInternalVoltageSource (bool i) { MODFLAG (i, CIRCUIT_INTVSOURCE); }
186 : 233232 : bool isInternalVoltageSource (void) { return RETFLAG (CIRCUIT_INTVSOURCE); }
187 : 31223 : void setVoltageSource (int s) { vsource = s; }
188 : 311375441 : int getVoltageSource (void) { return vsource; }
189 : : int getVoltageSources (void);
190 : : void setVoltageSources (int);
191 : : void voltageSource (int, int, int, nr_double_t value = 0.0);
192 : 1030857 : bool isVSource (void) { return RETFLAG (CIRCUIT_VSOURCE); }
193 [ + - ]: 200 : void setVSource (bool v) { MODFLAG (v, CIRCUIT_VSOURCE); }
194 : 8714481 : bool isISource (void) { return RETFLAG (CIRCUIT_ISOURCE); }
195 [ + + ]: 273 : void setISource (bool i) { MODFLAG (i, CIRCUIT_ISOURCE); }
196 : : int getNoiseSources (void);
197 : : void setNoiseSources (int);
198 : :
199 : : // transient analyses helpers
200 : : void transientCapacitance (int, int, int, nr_double_t, nr_double_t,
201 : : nr_double_t);
202 : : void transientCapacitance (int, int, nr_double_t, nr_double_t, nr_double_t);
203 : : void transientCapacitanceQ (int, int, int, nr_double_t);
204 : : void transientCapacitanceQ (int, int, nr_double_t);
205 : : void transientCapacitanceC (int, int, int, int, nr_double_t, nr_double_t);
206 : : void transientCapacitanceC (int, int, nr_double_t, nr_double_t);
207 : : void transientCapacitanceC2V (int, int, int, nr_double_t, nr_double_t);
208 : : void transientCapacitanceC2Q (int, int, int, nr_double_t, nr_double_t);
209 : 740 : void setDelta (nr_double_t * d) { deltas = d; }
210 : 6984 : nr_double_t * getDelta (void) { return deltas; }
211 : :
212 : : // history specific functionality
213 : 1790107 : bool hasHistory (void) { return RETFLAG (CIRCUIT_HISTORY); }
214 [ - + ]: 126018 : void setHistory (bool h) { MODFLAG (h, CIRCUIT_HISTORY); }
215 : : void initHistory (nr_double_t);
216 : : void deleteHistory (void);
217 : : void truncateHistory (nr_double_t);
218 : : void appendHistory (int, nr_double_t);
219 : : void applyHistory (history *);
220 : : nr_double_t getV (int, nr_double_t);
221 : : nr_double_t getV (int, int);
222 : : nr_double_t getJ (int, nr_double_t);
223 : : nr_double_t getHistoryAge (void);
224 : : void setHistoryAge (nr_double_t);
225 : : int getHistorySize (void);
226 : : nr_double_t getHistoryTFromIndex (int);
227 : :
228 : : // s-parameter helpers
229 : 13647660 : int getPort (void) { return pacport; }
230 : 40 : void setPort (int p) { pacport = p; }
231 : 4438 : int getInserted (void) { return inserted; }
232 : 204 : void setInserted (int i) { inserted = i; }
233 : 377596 : bool isOriginal (void) { return RETFLAG (CIRCUIT_ORIGINAL); }
234 [ - + ]: 124879 : void setOriginal (bool o) { MODFLAG (o, CIRCUIT_ORIGINAL); }
235 : :
236 : : // microstrip helpers
237 : : substrate * getSubstrate (void);
238 : : void setSubstrate (substrate *);
239 : :
240 : : // matrix entry modificators
241 : : nr_complex_t getS (int, int);
242 : : nr_complex_t getN (int, int);
243 : : nr_complex_t getY (int, int);
244 : : nr_complex_t getB (int, int);
245 : : nr_complex_t getC (int, int);
246 : : nr_complex_t getD (int, int);
247 : : nr_complex_t getQV (int, int);
248 : : nr_complex_t getGV (int);
249 : : nr_complex_t getCV (int);
250 : : nr_complex_t getE (int);
251 : : nr_complex_t getI (int);
252 : : nr_complex_t getJ (int);
253 : : nr_complex_t getV (int);
254 : : nr_complex_t getQ (int);
255 : : nr_double_t getG (int, int);
256 : : void setS (int, int, nr_complex_t);
257 : : void setN (int, int, nr_complex_t);
258 : : void setY (int, int, nr_complex_t);
259 : : void setB (int, int, nr_complex_t);
260 : : void setC (int, int, nr_complex_t);
261 : : void setD (int, int, nr_complex_t);
262 : : void setQV (int, int, nr_complex_t);
263 : : void setGV (int, nr_complex_t);
264 : : void setCV (int, nr_complex_t);
265 : : void setE (int, nr_complex_t);
266 : : void setI (int, nr_complex_t);
267 : : void setJ (int, nr_complex_t);
268 : : void setV (int, nr_complex_t);
269 : : void setQ (int, nr_complex_t);
270 : : void setG (int, int, nr_double_t);
271 : : void clearB (void);
272 : : void clearC (void);
273 : : void clearD (void);
274 : : void clearE (void);
275 : : void clearI (void);
276 : : void clearJ (void);
277 : : void clearV (void);
278 : : void clearY (void);
279 : : void addY (int, int, nr_complex_t);
280 : : void addY (int, int, nr_double_t);
281 : : void addI (int, nr_complex_t);
282 : : void addI (int, nr_double_t);
283 : :
284 : : // operating point functionality
285 : : void addOperatingPoint (const char *, nr_double_t);
286 : : nr_double_t getOperatingPoint (const char *);
287 : : void setOperatingPoint (const char *, nr_double_t);
288 : : int hasOperatingPoint (char *);
289 : 0 : valuelist<operatingpoint> & getOperatingPoints (void) { return oper; }
290 : :
291 : : // characteristics functionality
292 : : void addCharacteristic (const char *, nr_double_t);
293 : : nr_double_t getCharacteristic (char *);
294 : : void setCharacteristic (const char *, nr_double_t);
295 : : int hasCharacteristic (char *);
296 : 0 : valuelist<characteristic> & getCharacteristics (void) { return charac; }
297 : :
298 : : // differentiate between linear and non-linear circuits
299 [ + + ]: 933 : void setNonLinear (bool l) { MODFLAG (!l, CIRCUIT_LINEAR); }
300 : 8028504 : bool isNonLinear (void) { return !RETFLAG (CIRCUIT_LINEAR); }
301 : :
302 : : // miscellaneous functionality
303 : : void print (void);
304 : : static char * createInternal (const char *, const char *);
305 : : void setInternalNode (int, const char *);
306 : :
307 : : // matrix operations
308 : : void allocMatrixS (void);
309 : : void allocMatrixN (int sources = 0);
310 : : void allocMatrixMNA (void);
311 : : void freeMatrixMNA (void);
312 : : void allocMatrixHB (void);
313 : : void freeMatrixHB (void);
314 : : void setMatrixS (matrix);
315 : : matrix getMatrixS (void);
316 : : void setMatrixN (matrix);
317 : : matrix getMatrixN (void);
318 : : void setMatrixY (matrix);
319 : : matrix getMatrixY (void);
320 : :
321 : : static const nr_double_t z0;
322 : :
323 : : protected:
324 : : int type;
325 : : int pol;
326 : :
327 : : private:
328 : : int size;
329 : : int pacport;
330 : : int vsource;
331 : : int vsources;
332 : : int nsources;
333 : : int inserted;
334 : : int flag;
335 : : nr_complex_t * MatrixS;
336 : : nr_complex_t * MatrixN;
337 : : nr_complex_t * MatrixY;
338 : : nr_complex_t * MatrixB;
339 : : nr_complex_t * MatrixC;
340 : : nr_complex_t * MatrixD;
341 : : nr_complex_t * VectorE;
342 : : nr_complex_t * VectorI;
343 : : nr_complex_t * VectorV;
344 : : nr_complex_t * VectorJ;
345 : : nr_complex_t * VectorQ;
346 : : nr_complex_t * MatrixQV;
347 : : nr_complex_t * VectorGV;
348 : : nr_complex_t * VectorCV;
349 : : char * subcircuit;
350 : : node * nodes;
351 : : substrate * subst;
352 : : valuelist<operatingpoint> oper;
353 : : valuelist<characteristic> charac;
354 : : net * subnet;
355 : : environment * env;
356 : : nr_double_t * deltas;
357 : : int nHistories;
358 : : history * histories;
359 : : };
360 : :
361 : : } // namespace qucs
362 : :
363 : : // typedef to make it easier to set up our factory
364 : : typedef qucs::circuit *maker_t();
365 : : // function typdefs to make it easier to set up our factories
366 : : typedef qucs::circuit *creator_t();
367 : : typedef struct define_t *defs_t();
368 : :
369 : : // our global factories defined in module.cpp
370 : : extern "C" {
371 : : extern std::map<std::string, creator_t *, std::less<std::string> > factorycreate;
372 : : extern std::map<std::string, defs_t *, std::less<std::string> > factorydef;
373 : :
374 : : }
375 : :
376 : : #endif /* __CIRCUIT_H__ */
|