No he visto el código fuente de SPICE, pero he visto GNUCAP varias veces.
En general, habrá una clase base (o estructura) para cualquier componente que pondría en un circuito. Luego, componentes como resistencias y fuentes de voltaje pueden heredar de esta clase base.
Esto es lo que podría parecer en C ++
#include <vector>
// circuit base
// ctk is a common abbreviation in GNUCAP
class CtkBase
{
std::vector<int> inputs;
std::vector<int> outputs;
public:
CtkBase (void);
virtual ~CtkBase (void);
virtual add_input (int n);
virtual add_output (int n);
};
class Resistor final : public CtkBase
{
double value;
public:
Resistor (void);
~Resistor (void);
void set_value (double value);
};
class VoltageSource final : public CtkBase
{
double value;
public:
VoltageSource (void);
~VoltageSource (void);
void set_value (double value);
};
class Ctk final
{
std::vector <CtkBase*> components;
public:
Ctk (void);
~Ctk (void);
void add_component (CtkBase *base);
};
int
main (void)
{
auto r1 = new Resistor;
r1->set_value(200.00);
r1->add_input(1);
r1->add_output(0);
auto vcc = new VolatageSource();
vcc->set_value(5.00);
vcc->add_input(0);
vcc->add_output(1);
Ctk ctk;
ctk.add_component(r1);
ctk.add_component(vcc);
// do stuff here
return 0;
}
Y la sección de "hacer cosas" depende completamente de ti.
Recomendaría aprender sobre el patrón de diseño del Visitante, si va a analizar o modificar la estructura del circuito de alguna manera.
Probablemente podría agregar otra clase base llamada Component
, que será heredada por Resistor
y VoltageSource
que contiene el miembro value
, y recortar algunas líneas de código (si lo desea).