WIP: more device classes - unit tests for classes

This commit is contained in:
Matthias Koefferlein 2019-06-14 20:41:38 +02:00
parent a979b669db
commit 020b874083
18 changed files with 1217 additions and 23 deletions

View File

@ -278,6 +278,7 @@ void DeviceClassInductor::serial (Device *a, Device *b) const
// DeviceClassInductor implementation
DB_PUBLIC size_t DeviceClassDiode::param_id_A = 0;
DB_PUBLIC size_t DeviceClassDiode::param_id_P = 1;
DB_PUBLIC size_t DeviceClassDiode::terminal_id_A = 0;
DB_PUBLIC size_t DeviceClassDiode::terminal_id_C = 1;
@ -288,6 +289,7 @@ DeviceClassDiode::DeviceClassDiode ()
add_terminal_definition (db::DeviceTerminalDefinition ("C", "Cathode"));
add_parameter_definition (db::DeviceParameterDefinition ("A", "Area (square micrometer)", 0.0));
add_parameter_definition (db::DeviceParameterDefinition ("P", "Perimeter (micrometer)", 0.0));
}
bool DeviceClassDiode::combine_devices (Device *a, Device *b) const
@ -301,6 +303,7 @@ bool DeviceClassDiode::combine_devices (Device *a, Device *b) const
if (na1 == nb1 && na2 == nb2) {
a->set_parameter_value (0, a->parameter_value (0) + b->parameter_value (0));
a->set_parameter_value (1, a->parameter_value (1) + b->parameter_value (1));
a->join_terminals (0, b, 0);
a->join_terminals (1, b, 1);

View File

@ -193,6 +193,7 @@ public:
DeviceClassDiode ();
static size_t param_id_A;
static size_t param_id_P;
static size_t terminal_id_A;
static size_t terminal_id_C;

View File

@ -521,7 +521,7 @@ Device *NetlistDeviceExtractor::create_device ()
return device;
}
void NetlistDeviceExtractor::define_terminal (Device *device, size_t terminal_id, size_t layer_index, const db::Region &region)
void NetlistDeviceExtractor::define_terminal (Device *device, size_t terminal_id, size_t geometry_index, const db::Region &region)
{
tl_assert (mp_layout != 0);
tl_assert (geometry_index < m_layers.size ());

View File

@ -504,4 +504,78 @@ void NetlistDeviceExtractorBipolarTransistor::extract_devices (const std::vector
}
}
// ---------------------------------------------------------------------------------
// NetlistDeviceExtractorDiode implementation
NetlistDeviceExtractorDiode::NetlistDeviceExtractorDiode (const std::string &name)
: db::NetlistDeviceExtractor (name)
{
// .. nothing yet ..
}
void NetlistDeviceExtractorDiode::setup ()
{
define_layer ("P", "P region"); // #0
define_layer ("N", "N region"); // #1
define_layer ("tA", 0, "A terminal output"); // #2 -> P
define_layer ("tC", 1, "C terminal output"); // #3 -> N
register_device_class (new db::DeviceClassDiode ());
}
db::Connectivity NetlistDeviceExtractorDiode::get_connectivity (const db::Layout & /*layout*/, const std::vector<unsigned int> &layers) const
{
tl_assert (layers.size () >= 2);
unsigned int pregion = layers [0];
unsigned int nregion = layers [1];
// The layer definition is plate1, plate2
db::Connectivity conn;
// collect all connected plate 1 shapes
conn.connect (pregion, pregion);
// collect all connected plate 1 shapes
conn.connect (nregion, nregion);
// connect the plates (NOTE that this is a logical, not a physical connection)
conn.connect (pregion, nregion);
return conn;
}
void NetlistDeviceExtractorDiode::extract_devices (const std::vector<db::Region> &layer_geometry)
{
size_t pregion_geometry_index = 0;
size_t nregion_geometry_index = 1;
size_t a_terminal_geometry_index = 2;
size_t c_terminal_geometry_index = 3;
const db::Region &pregion = layer_geometry [pregion_geometry_index];
const db::Region &nregion = layer_geometry [nregion_geometry_index];
db::Region overlap (pregion);
overlap.set_base_verbosity (pregion.base_verbosity ());
overlap &= nregion;
for (db::Region::const_iterator p = overlap.begin_merged (); !p.at_end (); ++p) {
db::Device *device = create_device ();
device->set_trans (db::DCplxTrans ((p->box ().center () - db::Point ()) * dbu ()));
double area = p->area () * dbu () * dbu ();
device->set_parameter_value (db::DeviceClassDiode::param_id_A, area);
device->set_parameter_value (db::DeviceClassDiode::param_id_P, dbu () * p->perimeter ());
define_terminal (device, db::DeviceClassDiode::terminal_id_A, a_terminal_geometry_index, *p);
define_terminal (device, db::DeviceClassDiode::terminal_id_C, c_terminal_geometry_index, *p);
// allow derived classes to modify the device
modify_device (*p, layer_geometry, device);
// output the device for debugging
device_out (device, db::Region (*p));
}
}
}

View File

@ -108,6 +108,10 @@ private:
* The device class produced by this extractor is DeviceClassResistor.
* The extractor extracts the three parameters of this class: R, A and P.
* A is the area of the wire and P is the perimeter.
*
* The layers are R for the "wire" and "C" for the two contacts and the
* end of the wire. "tA" and "tB" are the layers on which the A and B
* terminals are produced.
*/
class DB_PUBLIC NetlistDeviceExtractorResistor
: public db::NetlistDeviceExtractor
@ -171,7 +175,7 @@ public:
* The extractor extracts the three parameters of this class: C, A and P.
* A is the area of the overlap area and P is the perimeter.
*
* The layers are P1 and P2 for the plates. A and B are layers where
* The layers are P1 and P2 for the plates. tA and tB are layers where
* the terminals for A and B are produced respectively.
*/
class DB_PUBLIC NetlistDeviceExtractorCapacitor
@ -273,6 +277,51 @@ protected:
}
};
/**
* @brief A device extractor for a planar diode
*
* This class supplies the generic extractor for a planar diode.
* The diode is defined by two layers whose overlap area forms
* the diode. The p-type layer forms the anode, the n-type layer
* the cathode.
*
* The device class produced by this extractor is DeviceClassDiode.
* The extractor extracts the two parameters of this class: A and P.
* A is the area of the overlap area and P is the perimeter.
*
* The layers are "P" and "N" for the p and n region respectively.
* The terminal output layers are "tA" and "tC" for anode and
* cathode respectively.
*/
class DB_PUBLIC NetlistDeviceExtractorDiode
: public db::NetlistDeviceExtractor
{
public:
NetlistDeviceExtractorDiode (const std::string &name);
virtual void setup ();
virtual db::Connectivity get_connectivity (const db::Layout &layout, const std::vector<unsigned int> &layers) const;
virtual void extract_devices (const std::vector<db::Region> &layer_geometry);
protected:
/**
* @brief A callback when the device is produced
* This callback is provided as a debugging port
*/
virtual void device_out (const db::Device * /*device*/, const db::Region & /*diode_area*/)
{
// .. no specific implementation ..
}
/**
* @brief Allow derived classes to modify the device
*/
virtual void modify_device (const db::Polygon & /*diode_area*/, const std::vector<db::Region> & /*layer_geometry*/, db::Device * /*device*/)
{
// .. no specific implementation ..
}
};
}
namespace tl
@ -320,6 +369,12 @@ template<> struct type_traits<db::NetlistDeviceExtractorBipolarTransistor> : pub
typedef tl::false_tag has_default_constructor;
};
template<> struct type_traits<db::NetlistDeviceExtractorDiode> : public tl::type_traits<void>
{
typedef tl::false_tag has_copy_constructor;
typedef tl::false_tag has_default_constructor;
};
}
#endif

View File

@ -622,4 +622,34 @@ Class<db::NetlistDeviceExtractorBipolarTransistor> decl_NetlistDeviceExtractorBi
"This class has been introduced in version 0.26."
);
db::NetlistDeviceExtractorDiode *make_diode_extractor (const std::string &name)
{
return new db::NetlistDeviceExtractorDiode (name);
}
Class<db::NetlistDeviceExtractorDiode> decl_NetlistDeviceExtractorDiode (decl_dbNetlistDeviceExtractor, "db", "DeviceExtractorDiode",
gsi::constructor ("new", &make_diode_extractor, gsi::arg ("name"),
"@brief Creates a new device extractor with the given name."
),
"@brief A device extractor for a planar diode\n"
"\n"
"This class supplies the generic extractor for a planar diode.\n"
"The diode is defined by two layers whose overlap area forms\n"
"the diode. The p-type layer forms the anode, the n-type layer\n"
"the cathode.\n"
"\n"
"The device class produced by this extractor is DeviceClassDiode.\n"
"The extractor extracts the two parameters of this class: A and P.\n"
"A is the area of the overlap area and P is the perimeter.\n"
"\n"
"The layers are \"P\" and \"N\" for the p and n region respectively.\n"
"The terminal output layers are \"tA\" and \"tC\" for anode and \n"
"cathode respectively.\n"
"\n"
"This class is a closed one and methods cannot be reimplemented. To reimplement "
"specific methods, see \\DeviceExtractor.\n"
"\n"
"This class has been introduced in version 0.26."
);
}

View File

@ -840,12 +840,10 @@ TEST(15_SerialDiodes)
db::Device *d1 = new db::Device (diode, "d1");
d1->set_parameter_value (db::DeviceClassDiode::param_id_A, 2.0);
d1->set_parameter_value (db::DeviceClassResistor::param_id_A, 5.0);
d1->set_parameter_value (db::DeviceClassResistor::param_id_P, 10.0);
d1->set_parameter_value (db::DeviceClassDiode::param_id_P, 5.0);
db::Device *d2 = new db::Device (diode, "d2");
d2->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 3.0);
d2->set_parameter_value (db::DeviceClassResistor::param_id_A, 1.0);
d2->set_parameter_value (db::DeviceClassResistor::param_id_P, 2.0);
d2->set_parameter_value (db::DeviceClassDiode::param_id_A, 3.0);
d2->set_parameter_value (db::DeviceClassDiode::param_id_P, 1.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
@ -873,8 +871,8 @@ TEST(15_SerialDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3);\n"
" device '' d1 (A=n1,C=n2) (A=2);\n"
" device '' d2 (A=n2,C=n3) (A=3);\n"
" device '' d1 (A=n1,C=n2) (A=2,P=5);\n"
" device '' d2 (A=n2,C=n3) (A=3,P=1);\n"
"end;\n"
);
@ -885,8 +883,8 @@ TEST(15_SerialDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3);\n"
" device '' d1 (A=n1,C=n2) (A=2);\n"
" device '' d2 (A=n2,C=n3) (A=3);\n"
" device '' d1 (A=n1,C=n2) (A=2,P=5);\n"
" device '' d2 (A=n2,C=n3) (A=3,P=1);\n"
"end;\n"
);
}
@ -900,8 +898,10 @@ TEST(16_ParallelDiodes)
db::Device *d1 = new db::Device (diode, "d1");
d1->set_parameter_value (db::DeviceClassDiode::param_id_A, 1.0);
d1->set_parameter_value (db::DeviceClassDiode::param_id_P, 5.0);
db::Device *d2 = new db::Device (diode, "d2");
d2->set_parameter_value (db::DeviceClassDiode::param_id_A, 3.0);
d2->set_parameter_value (db::DeviceClassDiode::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
@ -926,8 +926,8 @@ TEST(16_ParallelDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2);\n"
" device '' d1 (A=n1,C=n2) (A=1);\n"
" device '' d2 (A=n1,C=n2) (A=3);\n"
" device '' d1 (A=n1,C=n2) (A=1,P=5);\n"
" device '' d2 (A=n1,C=n2) (A=3,P=2);\n"
"end;\n"
);
@ -936,7 +936,7 @@ TEST(16_ParallelDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2);\n"
" device '' d1 (A=n1,C=n2) (A=4);\n"
" device '' d1 (A=n1,C=n2) (A=4,P=7);\n"
"end;\n"
);
}
@ -950,8 +950,10 @@ TEST(17_AntiParallelDiodes)
db::Device *d1 = new db::Device (diode, "d1");
d1->set_parameter_value (db::DeviceClassDiode::param_id_A, 1.0);
d1->set_parameter_value (db::DeviceClassDiode::param_id_P, 5.0);
db::Device *d2 = new db::Device (diode, "d2");
d2->set_parameter_value (db::DeviceClassDiode::param_id_A, 3.0);
d2->set_parameter_value (db::DeviceClassDiode::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
@ -976,8 +978,8 @@ TEST(17_AntiParallelDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2);\n"
" device '' d1 (A=n1,C=n2) (A=1);\n"
" device '' d2 (A=n2,C=n1) (A=3);\n"
" device '' d1 (A=n1,C=n2) (A=1,P=5);\n"
" device '' d2 (A=n2,C=n1) (A=3,P=2);\n"
"end;\n"
);
@ -988,8 +990,8 @@ TEST(17_AntiParallelDiodes)
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2);\n"
" device '' d1 (A=n1,C=n2) (A=1);\n"
" device '' d2 (A=n2,C=n1) (A=3);\n"
" device '' d1 (A=n1,C=n2) (A=1,P=5);\n"
" device '' d2 (A=n2,C=n1) (A=3,P=2);\n"
"end;\n"
);
}
@ -1662,3 +1664,402 @@ TEST(34_ParallelMOS4TransistorsDifferentLength)
);
}
TEST(35_SerialCapacitorsWithBulk)
{
db::DeviceClassCapacitorWithBulk *cap = new db::DeviceClassCapacitorWithBulk ();
db::Netlist nl;
nl.add_device_class (cap);
db::Device *c1 = new db::Device (cap, "c1");
c1->set_parameter_value (db::DeviceClassCapacitorWithBulk::param_id_C, 2.0);
c1->set_parameter_value (db::DeviceClassResistor::param_id_A, 5.0);
c1->set_parameter_value (db::DeviceClassResistor::param_id_P, 10.0);
db::Device *c2 = new db::Device (cap, "c2");
c2->set_parameter_value (db::DeviceClassCapacitorWithBulk::param_id_C, 3.0);
c2->set_parameter_value (db::DeviceClassResistor::param_id_A, 1.0);
c2->set_parameter_value (db::DeviceClassResistor::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
db::Pin pin_a = circuit->add_pin ("A");
db::Pin pin_b = circuit->add_pin ("B");
db::Pin pin_bulk = circuit->add_pin ("BULK");
circuit->add_device (c1);
circuit->add_device (c2);
db::Net *nb = new db::Net ("nb");
circuit->add_net (nb);
circuit->connect_pin (pin_bulk.id (), nb);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, nb);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
circuit->connect_pin (pin_a.id (), n1);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_A, n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_A, n2);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_B, n3);
circuit->connect_pin (pin_b.id (), n3);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=2,A=5,P=10);\n"
" device '' c2 (A=n2,B=n3,W=n2) (C=3,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
// no combination because bulk terminals are connected differently
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=2,A=5,P=10);\n"
" device '' c2 (A=n2,B=n3,W=n2) (C=3,A=1,P=2);\n"
"end;\n"
);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, nb);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=2,A=5,P=10);\n"
" device '' c2 (A=n2,B=n3,W=nb) (C=3,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' c1 (A=n1,B=n3,W=nb) (C=1.2,A=6,P=12);\n"
"end;\n"
);
}
TEST(36_ParallelCapacitorsWithBulk)
{
db::DeviceClassCapacitorWithBulk *cap = new db::DeviceClassCapacitorWithBulk ();
db::Netlist nl;
nl.add_device_class (cap);
db::Device *c1 = new db::Device (cap, "c1");
c1->set_parameter_value (db::DeviceClassCapacitorWithBulk::param_id_C, 1.0);
c1->set_parameter_value (db::DeviceClassResistor::param_id_A, 5.0);
c1->set_parameter_value (db::DeviceClassResistor::param_id_P, 10.0);
db::Device *c2 = new db::Device (cap, "c2");
c2->set_parameter_value (db::DeviceClassCapacitorWithBulk::param_id_C, 3.0);
c2->set_parameter_value (db::DeviceClassResistor::param_id_A, 1.0);
c2->set_parameter_value (db::DeviceClassResistor::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
db::Pin pin_a = circuit->add_pin ("A");
db::Pin pin_b = circuit->add_pin ("B");
db::Pin pin_bulk = circuit->add_pin ("BULK");
circuit->add_device (c1);
circuit->add_device (c2);
db::Net *nb = new db::Net ("nb");
circuit->add_net (nb);
circuit->connect_pin (pin_bulk.id (), nb);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, nb);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
circuit->connect_pin (pin_a.id (), n1);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_A, n1);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_A, n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
circuit->connect_pin (pin_b.id (), n2);
c1->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_B, n2);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, n2);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=1,A=5,P=10);\n"
" device '' c2 (A=n1,B=n2,W=n2) (C=3,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
// devices are not combined as the bulk terminals are connected differently
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=1,A=5,P=10);\n"
" device '' c2 (A=n1,B=n2,W=n2) (C=3,A=1,P=2);\n"
"end;\n"
);
c2->connect_terminal (db::DeviceClassCapacitorWithBulk::terminal_id_W, nb);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=1,A=5,P=10);\n"
" device '' c2 (A=n1,B=n2,W=nb) (C=3,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' c1 (A=n1,B=n2,W=nb) (C=4,A=6,P=12);\n"
"end;\n"
);
}
TEST(37_SerialResistorsWithBulk)
{
db::DeviceClassResistorWithBulk *cap = new db::DeviceClassResistorWithBulk ();
db::Netlist nl;
nl.add_device_class (cap);
db::Device *r1 = new db::Device (cap, "r1");
r1->set_parameter_value (db::DeviceClassResistorWithBulk::param_id_R, 2.0);
r1->set_parameter_value (db::DeviceClassResistor::param_id_A, 5.0);
r1->set_parameter_value (db::DeviceClassResistor::param_id_P, 10.0);
db::Device *r2 = new db::Device (cap, "r2");
r2->set_parameter_value (db::DeviceClassResistorWithBulk::param_id_R, 0.5);
r2->set_parameter_value (db::DeviceClassResistor::param_id_A, 1.0);
r2->set_parameter_value (db::DeviceClassResistor::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
db::Pin pin_a = circuit->add_pin ("A");
db::Pin pin_b = circuit->add_pin ("B");
db::Pin pin_bulk = circuit->add_pin ("BULK");
circuit->add_device (r1);
circuit->add_device (r2);
db::Net *nb = new db::Net ("nb");
circuit->add_net (nb);
circuit->connect_pin (pin_bulk.id (), nb);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, nb);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
circuit->connect_pin (pin_a.id (), n1);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_A, n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_B, n2);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_A, n2);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_B, n3);
circuit->connect_pin (pin_b.id (), n3);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n2,B=n3,W=n2) (R=0.5,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
// no combination because bulk terminals are connected differently
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n2,B=n3,W=n2) (R=0.5,A=1,P=2);\n"
"end;\n"
);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, nb);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n2,B=n3,W=nb) (R=0.5,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n3,BULK=nb);\n"
" device '' r1 (A=n1,B=n3,W=nb) (R=2.5,A=6,P=12);\n"
"end;\n"
);
}
TEST(38_ParallelResistorsWithBulk)
{
db::DeviceClassResistorWithBulk *cap = new db::DeviceClassResistorWithBulk ();
db::Netlist nl;
nl.add_device_class (cap);
db::Device *r1 = new db::Device (cap, "r1");
r1->set_parameter_value (db::DeviceClassResistorWithBulk::param_id_R, 2.0);
r1->set_parameter_value (db::DeviceClassResistor::param_id_A, 5.0);
r1->set_parameter_value (db::DeviceClassResistor::param_id_P, 10.0);
db::Device *r2 = new db::Device (cap, "r2");
r2->set_parameter_value (db::DeviceClassResistorWithBulk::param_id_R, 0.5);
r2->set_parameter_value (db::DeviceClassResistor::param_id_A, 1.0);
r2->set_parameter_value (db::DeviceClassResistor::param_id_P, 2.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
db::Pin pin_a = circuit->add_pin ("A");
db::Pin pin_b = circuit->add_pin ("B");
db::Pin pin_bulk = circuit->add_pin ("BULK");
circuit->add_device (r1);
circuit->add_device (r2);
db::Net *nb = new db::Net ("nb");
circuit->add_net (nb);
circuit->connect_pin (pin_bulk.id (), nb);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, nb);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
circuit->connect_pin (pin_a.id (), n1);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_A, n1);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_A, n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
circuit->connect_pin (pin_b.id (), n2);
r1->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_B, n2);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_B, n2);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, n2);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n1,B=n2,W=n2) (R=0.5,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
// devices are not combined as the bulk terminals are connected differently
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n1,B=n2,W=n2) (R=0.5,A=1,P=2);\n"
"end;\n"
);
r2->connect_terminal (db::DeviceClassResistorWithBulk::terminal_id_W, nb);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=2,A=5,P=10);\n"
" device '' r2 (A=n1,B=n2,W=nb) (R=0.5,A=1,P=2);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,BULK=nb);\n"
" device '' r1 (A=n1,B=n2,W=nb) (R=0.4,A=6,P=12);\n"
"end;\n"
);
}
TEST(39_ParallelBipolarTransistors)
{
db::DeviceClassBipolarTransistor *cls = new db::DeviceClassBipolarTransistor ();
db::Netlist nl;
nl.add_device_class (cls);
db::Device *d1 = new db::Device (cls, "d1");
d1->set_parameter_value (db::DeviceClassBipolarTransistor::param_id_AE, 2.0);
d1->set_parameter_value (db::DeviceClassBipolarTransistor::param_id_PE, 12.0);
db::Device *d2 = new db::Device (cls, "d2");
d2->set_parameter_value (db::DeviceClassBipolarTransistor::param_id_AE, 3.0);
d2->set_parameter_value (db::DeviceClassBipolarTransistor::param_id_PE, 13.0);
db::Circuit *circuit = new db::Circuit ();
nl.add_circuit (circuit);
db::Pin pin_a = circuit->add_pin ("A");
db::Pin pin_b = circuit->add_pin ("B");
db::Pin pin_c = circuit->add_pin ("C");
circuit->add_device (d1);
circuit->add_device (d2);
db::Net *n1 = new db::Net ("n1");
circuit->add_net (n1);
circuit->connect_pin (pin_a.id (), n1);
d1->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_C, n1);
d2->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_C, n1);
db::Net *n2 = new db::Net ("n2");
circuit->add_net (n2);
circuit->connect_pin (pin_b.id (), n2);
d1->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_B, n2);
d2->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_B, n2);
d2->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_E, n2);
db::Net *n3 = new db::Net ("n3");
circuit->add_net (n3);
circuit->connect_pin (pin_c.id (), n3);
d1->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_E, n3);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,C=n3);\n"
" device '' d1 (C=n1,B=n2,E=n3) (AE=2,PE=12);\n"
" device '' d2 (C=n1,B=n2,E=n2) (AE=3,PE=13);\n"
"end;\n"
);
nl.combine_devices ();
// no combination as emitters are connected differently
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,C=n3);\n"
" device '' d1 (C=n1,B=n2,E=n3) (AE=2,PE=12);\n"
" device '' d2 (C=n1,B=n2,E=n2) (AE=3,PE=13);\n"
"end;\n"
);
d2->connect_terminal (db::DeviceClassBipolarTransistor::terminal_id_E, n3);
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,C=n3);\n"
" device '' d1 (C=n1,B=n2,E=n3) (AE=2,PE=12);\n"
" device '' d2 (C=n1,B=n2,E=n3) (AE=3,PE=13);\n"
"end;\n"
);
nl.combine_devices ();
EXPECT_EQ (nl.to_string (),
"circuit '' (A=n1,B=n2,C=n3);\n"
" device '' d1 (C=n1,B=n2,E=n3) (AE=5,PE=25);\n"
"end;\n"
);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

View File

@ -25,9 +25,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="346.93569"
inkscape:cy="970.66949"
inkscape:zoom="1"
inkscape:cx="-37.273909"
inkscape:cy="695.91553"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
@ -39,7 +39,9 @@
inkscape:window-height="991"
inkscape:window-x="34"
inkscape:window-y="51"
inkscape:window-maximized="0">
inkscape:window-maximized="0"
inkscape:snap-global="true"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid4136"
@ -2401,5 +2403,609 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_conn_light_16.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4407"
width="48"
height="48"
x="5"
y="297.36221"
inkscape:export-filename="icon_device_bjt_48.png" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="4.8499999"
y="357.19971"
id="text4409"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4411"
x="4.8499999"
y="357.19971"
style="font-size:5px">icon_device_bjt_48.png</tspan></text>
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4413"
width="32"
height="32"
x="65"
y="297.36221"
inkscape:export-filename="icon_device_bjt_32.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4415"
width="24"
height="24"
x="115"
y="297.36221"
inkscape:export-filename="icon_device_bjt_24.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4417"
width="16"
height="16"
x="155"
y="297.36221"
inkscape:export-filename="icon_device_bjt_16.png" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 14,310.3622 2,-0.99999 5,16.99999 -2,1 z"
id="rect4419"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_48.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="309.36221"
x="42"
height="1.9999992"
width="10"
id="rect4421"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_48.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="306.36218"
x="66"
height="0.99999923"
width="5"
id="rect4423"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_32.png" />
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="72"
x="-320.36218"
height="17"
width="3"
id="rect4425"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_32.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="306.36218"
x="90"
height="0.99999923"
width="5"
id="rect4427"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_32.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="303.36218"
x="116"
height="1.0000221"
width="5"
id="rect4429"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_24.png" />
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="121"
x="-314.36218"
height="11"
width="3"
id="rect4431"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_24.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="303.36221"
x="132"
height="0.99997789"
width="5"
id="rect4433"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_24.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="301.36218"
x="156"
height="0.99999923"
width="2"
id="rect4435"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_16.png" />
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="158"
x="-309.36218"
height="9"
width="2"
id="rect4437"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_16.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="301.36218"
x="167"
height="0.99999923"
width="2"
id="rect4439"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_16.png" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="69.684998"
y="346.12219"
id="text4442"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4444"
x="69.684998"
y="346.12219"
style="font-size:5px">icon_device_bjt_32.png</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="111.88164"
y="336.12219"
id="text4446"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4448"
x="111.88164"
y="336.12219"
style="font-size:5px">icon_device_bjt_24.png</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="156.88164"
y="326.12219"
id="text4450"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4452"
x="156.88164"
y="326.12219"
style="font-size:5px">icon_device_bjt_16.png</tspan></text>
<rect
transform="matrix(0,-1,1,0,0,0)"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="16"
x="-331.36221"
height="26"
width="5"
id="rect4454"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_48.png" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 42,309.36218 2,1.00002 -5,17 -2,-1 z"
id="rect4456"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_48.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="309.36221"
x="6"
height="1.9999992"
width="10"
id="rect4458"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_48.png" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="331.36221"
x="28"
height="12"
width="2"
id="rect4460"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_48.png" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 70,306.36218 1,0 3,11.00002 -1,0 z"
id="rect4464"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 90,306.36218 1,0 -3,11.00002 -1,0 z"
id="rect4466"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="319.36218"
x="80"
height="9"
width="1"
id="rect4468"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_32.png" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 120,303.36218 1,0 2,8.00002 -1,0 z"
id="rect4470"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_24.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 132,303.36218 1,0 -2,8.00002 -1,0 z"
id="rect4472"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_24.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="313.36218"
x="126"
height="7.0000067"
width="1"
id="rect4474"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_24.png" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 157,301.36218 1,0 2,6.00002 -1,0 z"
id="rect4476"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 167,301.3622 1,0 -2,6.00002 -1,0 z"
id="rect4478"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
inkscape:export-filename="icon_device_bjt_16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="307.36218"
x="162"
height="5"
width="1"
id="rect4480"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-filename="icon_device_bjt_16.png" />
<path
style="fill:#5a5a5a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 38,313.3622 7,2 -7,11 0,-13"
id="path4484"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_bjt_48.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#5a5a5a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 87.397748,308.75995 4.734835,1.17677 -4.569321,7.15511 -0.165514,-8.33188"
id="path4484-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_bjt_32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#5a5a5a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 130.32766,304.9247 3.67234,0.90922 -3.54396,5.52828 -0.12838,-6.4375"
id="path4484-3-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_bjt_24.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#5a5a5a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 165.3125,302.4247 3,0.74276 -2.89512,4.51615 -0.10488,-5.25891"
id="path4484-3-9-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_bjt_16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
y="367.36221"
x="5"
height="48"
width="48"
id="rect4537"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_48.png" />
<text
sodipodi:linespacing="125%"
id="text4539"
y="427.19971"
x="4.8499999"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:5px"
y="427.19971"
x="4.8499999"
id="tspan4541"
sodipodi:role="line">icon_device_diode_48.png</tspan></text>
<rect
y="367.36221"
x="65"
height="32"
width="32"
id="rect4543"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_32.png" />
<rect
y="367.36221"
x="115"
height="24"
width="24"
id="rect4545"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_24.png" />
<rect
y="367.36221"
x="155"
height="16"
width="16"
id="rect4547"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_16.png" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4549"
width="13"
height="1.9999992"
x="37"
y="390.36218"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_48.png" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4555"
width="9"
height="0.99999923"
x="67"
y="383.36218"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_32.png" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4559"
width="8"
height="0.99999923"
x="87"
y="383.36218"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_32.png" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4567"
width="5"
height="0.99999923"
x="156"
y="375.36218"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_16.png" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4573"
width="4"
height="0.99999923"
x="166"
y="375.36218"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_16.png" />
<text
sodipodi:linespacing="125%"
id="text4575"
y="416.12219"
x="69.684998"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:5px"
y="416.12219"
x="69.684998"
id="tspan4577"
sodipodi:role="line">icon_device_diode_32.png</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4579"
y="406.12219"
x="111.88164"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:5px"
y="406.12219"
x="111.88164"
id="tspan4581"
sodipodi:role="line">icon_device_diode_24.png</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4583"
y="396.12219"
x="156.88164"
style="font-style:normal;font-variant:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Gothic L';-inkscape-font-specification:'URW Gothic L Book';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:5px"
y="396.12219"
x="156.88164"
id="tspan4585"
sodipodi:role="line">icon_device_diode_16.png</tspan></text>
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4587"
width="2"
height="21.999992"
x="36"
y="380.36221"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_48.png" />
<path
style="fill:none;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 36.948638,391.35876 -14.967118,-11.0117 0,22.0234 14.967118,-11.0117"
id="path4593"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_diode_48.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-filename="icon_device_diode_48.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="390.36218"
x="8"
height="1.9999992"
width="14"
id="rect4595"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4587-7"
width="1"
height="12.999991"
x="86"
y="377.36221"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_32.png" />
<path
style="fill:none;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 86.512079,383.81863 -10.017905,-6.96932 0,14.01293 10.017905,-7.03183"
id="path4593-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_diode_32.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-filename="icon_device_diode_24.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="379.36221"
x="116"
height="0.99999923"
width="7"
id="rect4615"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<rect
inkscape:export-filename="icon_device_diode_24.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="379.36221"
x="132"
height="0.99999923"
width="6"
id="rect4617"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<rect
inkscape:export-filename="icon_device_diode_24.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
y="375.36221"
x="131"
height="9"
width="1"
id="rect4619"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="icon_device_diode_24.png"
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path4621"
d="m 131.49186,379.84749 -7.99186,-4.98533 0,10.02381 7.99186,-5.03005"
style="fill:none;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5a5a5a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4623"
width="1"
height="9"
x="166"
y="371.36221"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="icon_device_diode_16.png" />
<path
style="fill:none;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 166.73101,375.84372 -6.24596,-3.98824 0,8.019 6.24596,-4.02401"
id="path4625"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:export-filename="icon_device_diode_16.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 213 KiB

View File

@ -1510,17 +1510,33 @@ static QIcon icon_for_pin ()
static QIcon icon_for_device (const db::DeviceClass *dc)
{
QIcon icon;
// TODO: diode, inductor, generic device ...
// TODO: inductor, generic device ...
if (dynamic_cast<const db::DeviceClassResistor *> (dc)) {
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
} else if (dynamic_cast<const db::DeviceClassInductor *> (dc)) {
// fake ...
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_32.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_24.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_res_16.png")));
} else if (dynamic_cast<const db::DeviceClassCapacitor *> (dc)) {
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_32.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_24.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_cap_16.png")));
} else if (dynamic_cast<const db::DeviceClassDiode *> (dc)) {
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_32.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_24.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_diode_16.png")));
} else if (dynamic_cast<const db::DeviceClassBipolarTransistor *> (dc)) {
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_32.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_24.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_bjt_16.png")));
} else {
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_48.png")));
icon.addPixmap (QPixmap (QString::fromUtf8 (":/images/icon_device_mos_32.png")));

View File

@ -36,5 +36,13 @@
<file>images/icon_conn_light_24.png</file>
<file>images/icon_conn_light_32.png</file>
<file>images/icon_conn_light_48.png</file>
<file>images/icon_device_diode_16.png</file>
<file>images/icon_device_diode_24.png</file>
<file>images/icon_device_diode_32.png</file>
<file>images/icon_device_diode_48.png</file>
<file>images/icon_device_bjt_48.png</file>
<file>images/icon_device_bjt_32.png</file>
<file>images/icon_device_bjt_24.png</file>
<file>images/icon_device_bjt_16.png</file>
</qresource>
</RCC>