From 0fa9bc6e2b8c06206878f4c9610b65892eaad4f1 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 26 Feb 2023 23:30:17 +0100 Subject: [PATCH] Fixed issue #1304 (terminal order for MOS devices) --- src/db/db/dbNetlistSpiceReader.cc | 17 +++++++++++++++-- src/db/db/dbNetlistSpiceWriter.cc | 9 ++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/db/db/dbNetlistSpiceReader.cc b/src/db/db/dbNetlistSpiceReader.cc index 04e8d94e8..9c69cf065 100644 --- a/src/db/db/dbNetlistSpiceReader.cc +++ b/src/db/db/dbNetlistSpiceReader.cc @@ -420,6 +420,7 @@ void NetlistSpiceReaderDelegate::parse_element (const std::string &s, const std: bool NetlistSpiceReaderDelegate::element (db::Circuit *circuit, const std::string &element, const std::string &name, const std::string &model, double value, const std::vector &nets, const std::map &pv) { std::map params = pv; + std::vector terminal_order; double mult = 1.0; std::map::const_iterator mp = params.find ("M"); @@ -595,6 +596,12 @@ bool NetlistSpiceReaderDelegate::element (db::Circuit *circuit, const std::strin p->second *= mult; } + // issue #1304 + terminal_order.push_back (DeviceClassMOS4Transistor::terminal_id_D); + terminal_order.push_back (DeviceClassMOS4Transistor::terminal_id_G); + terminal_order.push_back (DeviceClassMOS4Transistor::terminal_id_S); + terminal_order.push_back (DeviceClassMOS4Transistor::terminal_id_B); + } else { error (tl::sprintf (tl::to_string (tr ("Not a known element type: '%s'")), element)); } @@ -607,8 +614,14 @@ bool NetlistSpiceReaderDelegate::element (db::Circuit *circuit, const std::strin db::Device *device = new db::Device (cls, name); circuit->add_device (device); - for (std::vector::const_iterator t = td.begin (); t != td.end (); ++t) { - device->connect_terminal (t->id (), nets [t - td.begin ()]); + if (terminal_order.empty ()) { + for (auto t = td.begin (); t != td.end (); ++t) { + device->connect_terminal (t->id (), nets [t - td.begin ()]); + } + } else { + for (auto t = terminal_order.begin (); t != terminal_order.end (); ++t) { + device->connect_terminal (*t, nets [t - terminal_order.begin ()]); + } } size_t defp = std::numeric_limits::max (); diff --git a/src/db/db/dbNetlistSpiceWriter.cc b/src/db/db/dbNetlistSpiceWriter.cc index dd6818478..0185ea9d6 100644 --- a/src/db/db/dbNetlistSpiceWriter.cc +++ b/src/db/db/dbNetlistSpiceWriter.cc @@ -160,7 +160,14 @@ void NetlistSpiceWriterDelegate::write_device (const db::Device &dev) const os << "M"; os << format_name (dev.expanded_name ()); - os << format_terminals (dev); + + // issue #1304 + os << " "; + os << net_to_string (dev.net_for_terminal (db::DeviceClassMOS3Transistor::terminal_id_D)); + os << " "; + os << net_to_string (dev.net_for_terminal (db::DeviceClassMOS3Transistor::terminal_id_G)); + os << " "; + os << net_to_string (dev.net_for_terminal (db::DeviceClassMOS3Transistor::terminal_id_S)); if (! mos4) { // we assume for the MOS3 type the bulk is connected to Source