From 9820e570310a961ee24c50b0c2498bda2a8f0e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=B6fferlein?= Date: Mon, 15 Jul 2019 23:19:03 +0200 Subject: [PATCH] Don't write third terminal for R or C (WithBulk variants) --- src/db/db/dbNetlistSpiceWriter.cc | 11 +- src/db/db/dbNetlistSpiceWriter.h | 2 +- src/db/unit_tests/dbNetlistWriterTests.cc | 150 +++++++++++++++++----- 3 files changed, 126 insertions(+), 37 deletions(-) diff --git a/src/db/db/dbNetlistSpiceWriter.cc b/src/db/db/dbNetlistSpiceWriter.cc index 6f5d18471..ff70636d7 100644 --- a/src/db/db/dbNetlistSpiceWriter.cc +++ b/src/db/db/dbNetlistSpiceWriter.cc @@ -106,7 +106,7 @@ void NetlistSpiceWriterDelegate::write_device (const db::Device &dev) const os << "C"; os << format_name (dev.expanded_name ()); - os << format_terminals (dev); + os << format_terminals (dev, size_t (2)); os << " "; os << tl::sprintf ("%.12g", dev.parameter_value (db::DeviceClassCapacitor::param_id_C)); @@ -114,7 +114,7 @@ void NetlistSpiceWriterDelegate::write_device (const db::Device &dev) const os << "L"; os << format_name (dev.expanded_name ()); - os << format_terminals (dev); + os << format_terminals (dev, size_t (2)); os << " "; os << tl::sprintf ("%.12g", dev.parameter_value (db::DeviceClassInductor::param_id_L)); @@ -122,7 +122,7 @@ void NetlistSpiceWriterDelegate::write_device (const db::Device &dev) const os << "R"; os << format_name (dev.expanded_name ()); - os << format_terminals (dev); + os << format_terminals (dev, size_t (2)); os << " "; os << tl::sprintf ("%.12g", dev.parameter_value (db::DeviceClassResistor::param_id_R)); @@ -180,12 +180,13 @@ void NetlistSpiceWriterDelegate::write_device (const db::Device &dev) const emit_line (os.str ()); } -std::string NetlistSpiceWriterDelegate::format_terminals (const db::Device &dev) const +std::string NetlistSpiceWriterDelegate::format_terminals (const db::Device &dev, size_t nmax) const { std::ostringstream os; const std::vector &td = dev.device_class ()->terminal_definitions (); - for (std::vector::const_iterator i = td.begin (); i != td.end (); ++i) { + size_t n = 0; + for (std::vector::const_iterator i = td.begin (); i != td.end () && n < nmax; ++i, ++n) { os << " " << net_to_string (dev.net_for_terminal (i->id ())); } diff --git a/src/db/db/dbNetlistSpiceWriter.h b/src/db/db/dbNetlistSpiceWriter.h index 62d2417c4..a44c5531d 100644 --- a/src/db/db/dbNetlistSpiceWriter.h +++ b/src/db/db/dbNetlistSpiceWriter.h @@ -62,7 +62,7 @@ public: void emit_line (const std::string &line) const; void emit_comment (const std::string &comment) const; std::string format_name (const std::string &s) const; - std::string format_terminals (const db::Device &dev) const; + std::string format_terminals (const db::Device &dev, size_t max_terminals = std::numeric_limits::max ()) const; std::string format_params (const db::Device &dev, size_t without_id = std::numeric_limits::max ()) const; private: diff --git a/src/db/unit_tests/dbNetlistWriterTests.cc b/src/db/unit_tests/dbNetlistWriterTests.cc index b6e1b5182..35d019267 100644 --- a/src/db/unit_tests/dbNetlistWriterTests.cc +++ b/src/db/unit_tests/dbNetlistWriterTests.cc @@ -39,8 +39,10 @@ static void compare_netlists (tl::TestBase *_this, const std::string &path, cons std::string netlist_au = is_au.read_all (); // normalize "1.0e-005" to "1.0e-05" for compatibility + netlist = tl::replaced (netlist, "\r\n", "\n"); // for Windows netlist = tl::replaced (netlist, "e-00", "e-0"); netlist = tl::replaced (netlist, "e-0", "e-"); + netlist_au = tl::replaced (netlist_au, "\r\n", "\n"); // for Windows netlist_au = tl::replaced (netlist_au, "e-00", "e-0"); netlist_au = tl::replaced (netlist_au, "e-0", "e-"); @@ -56,25 +58,9 @@ TEST(1_WriterResistorDevices) db::Netlist nl; db::DeviceClass *rcls = new db::DeviceClassResistor (); - db::DeviceClass *ccls = new db::DeviceClassCapacitor (); - db::DeviceClass *lcls = new db::DeviceClassInductor (); - db::DeviceClass *dcls = new db::DeviceClassDiode (); - db::DeviceClass *m3cls = new db::DeviceClassMOS3Transistor (); - db::DeviceClass *m4cls = new db::DeviceClassMOS4Transistor (); - rcls->set_name ("RCLS"); - lcls->set_name ("LCLS"); - ccls->set_name ("CCLS"); - dcls->set_name ("DCLS"); - m3cls->set_name ("M3CLS"); - m4cls->set_name ("M4CLS"); nl.add_device_class (rcls); - nl.add_device_class (lcls); - nl.add_device_class (ccls); - nl.add_device_class (dcls); - nl.add_device_class (m3cls); - nl.add_device_class (m4cls); db::Circuit *circuit1 = new db::Circuit (); circuit1->set_name ("C1"); @@ -123,30 +109,73 @@ TEST(1_WriterResistorDevices) compare_netlists (_this, path, au_path); } +TEST(1_WriterResistorDevicesWithBulk) +{ + db::Netlist nl; + + db::DeviceClass *rcls = new db::DeviceClassResistorWithBulk (); + rcls->set_name ("RCLS"); + + nl.add_device_class (rcls); + + db::Circuit *circuit1 = new db::Circuit (); + circuit1->set_name ("C1"); + nl.add_circuit (circuit1); + + db::Net *n1, *n2, *n3; + n1 = new db::Net (); + n1->set_name ("n1"); + circuit1->add_net (n1); + n2 = new db::Net (); + n2->set_name ("n2"); + circuit1->add_net (n2); + n3 = new db::Net (); + n3->set_name ("n3"); + circuit1->add_net (n3); + + db::Device *rdev1 = new db::Device (rcls); + rdev1->set_parameter_value (db::DeviceClassResistor::param_id_R, 1.7); + db::Device *rdev2 = new db::Device (rcls); + rdev2->set_parameter_value (db::DeviceClassResistor::param_id_R, 42e-6); + circuit1->add_device (rdev1); + circuit1->add_device (rdev2); + + size_t pid1 = circuit1->add_pin ("p1").id (); + size_t pid2 = circuit1->add_pin ("p2").id (); + + circuit1->connect_pin (pid1, n1); + circuit1->connect_pin (pid2, n2); + + rdev1->connect_terminal (rdev1->device_class ()->terminal_id_for_name ("A"), n1); + rdev1->connect_terminal (rdev1->device_class ()->terminal_id_for_name ("B"), n3); + rdev1->connect_terminal (rdev1->device_class ()->terminal_id_for_name ("W"), n3); + rdev2->connect_terminal (rdev2->device_class ()->terminal_id_for_name ("A"), n3); + rdev2->connect_terminal (rdev2->device_class ()->terminal_id_for_name ("B"), n2); + rdev2->connect_terminal (rdev2->device_class ()->terminal_id_for_name ("W"), n3); + + // verify against the input + + std::string path = tmp_file ("tmp_nwriter1.txt"); + { + tl::OutputStream stream (path); + db::NetlistSpiceWriter writer; + writer.write (stream, nl, "written by unit test"); + } + + std::string au_path = tl::combine_path (tl::combine_path (tl::combine_path (tl::testsrc (), "testdata"), "algo"), "nwriter1_au.txt"); + + compare_netlists (_this, path, au_path); +} + TEST(2_WriterCapacitorDevices) { db::Netlist nl; - db::DeviceClass *rcls = new db::DeviceClassResistor (); db::DeviceClass *ccls = new db::DeviceClassCapacitor (); - db::DeviceClass *lcls = new db::DeviceClassInductor (); - db::DeviceClass *dcls = new db::DeviceClassDiode (); - db::DeviceClass *m3cls = new db::DeviceClassMOS3Transistor (); - db::DeviceClass *m4cls = new db::DeviceClassMOS4Transistor (); - rcls->set_name ("RCLS"); - lcls->set_name ("LCLS"); ccls->set_name ("CCLS"); - dcls->set_name ("DCLS"); - m3cls->set_name ("M3CLS"); - m4cls->set_name ("M4CLS"); - nl.add_device_class (rcls); - nl.add_device_class (lcls); nl.add_device_class (ccls); - nl.add_device_class (dcls); - nl.add_device_class (m3cls); - nl.add_device_class (m4cls); db::Circuit *circuit1 = new db::Circuit (); circuit1->set_name ("C1"); @@ -195,6 +224,65 @@ TEST(2_WriterCapacitorDevices) compare_netlists (_this, path, au_path); } +TEST(2_WriterCapacitorDevicesWithBulk) +{ + db::Netlist nl; + + db::DeviceClass *ccls = new db::DeviceClassCapacitorWithBulk (); + + ccls->set_name ("CCLS"); + + nl.add_device_class (ccls); + + db::Circuit *circuit1 = new db::Circuit (); + circuit1->set_name ("C1"); + nl.add_circuit (circuit1); + + db::Net *n1, *n2, *n3; + n1 = new db::Net (); + n1->set_name ("n1"); + circuit1->add_net (n1); + n2 = new db::Net (); + n2->set_name ("n2"); + circuit1->add_net (n2); + n3 = new db::Net (); + n3->set_name ("n3"); + circuit1->add_net (n3); + + db::Device *cdev1 = new db::Device (ccls); + cdev1->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 1.7e-12); + db::Device *cdev2 = new db::Device (ccls); + cdev2->set_parameter_value (db::DeviceClassCapacitor::param_id_C, 42e-15); + circuit1->add_device (cdev1); + circuit1->add_device (cdev2); + + size_t pid1 = circuit1->add_pin ("p1").id (); + size_t pid2 = circuit1->add_pin ("p2").id (); + + circuit1->connect_pin (pid1, n1); + circuit1->connect_pin (pid2, n2); + + cdev1->connect_terminal (cdev1->device_class ()->terminal_id_for_name ("A"), n1); + cdev1->connect_terminal (cdev1->device_class ()->terminal_id_for_name ("B"), n3); + cdev1->connect_terminal (cdev1->device_class ()->terminal_id_for_name ("W"), n3); + cdev2->connect_terminal (cdev2->device_class ()->terminal_id_for_name ("A"), n3); + cdev2->connect_terminal (cdev2->device_class ()->terminal_id_for_name ("B"), n2); + cdev2->connect_terminal (cdev2->device_class ()->terminal_id_for_name ("W"), n3); + + // verify against the input + + std::string path = tmp_file ("tmp_nwriter2.txt"); + { + tl::OutputStream stream (path); + db::NetlistSpiceWriter writer; + writer.write (stream, nl, "written by unit test"); + } + + std::string au_path = tl::combine_path (tl::combine_path (tl::combine_path (tl::testsrc (), "testdata"), "algo"), "nwriter2_au.txt"); + + compare_netlists (_this, path, au_path); +} + TEST(3_WriterInductorDevices) { db::Netlist nl;