diff --git a/src/db/db/dbLayoutToNetlistReader.cc b/src/db/db/dbLayoutToNetlistReader.cc index 2ef9ed8fd..d809398d1 100644 --- a/src/db/db/dbLayoutToNetlistReader.cc +++ b/src/db/db/dbLayoutToNetlistReader.cc @@ -632,6 +632,9 @@ LayoutToNetlistStandardReader::read_pin (db::Netlist * /*netlist*/, db::LayoutTo } size_t pin_id = circuit->add_pin (pin).id (); + // NOTE: because we identify pins by their order and not by ID we need to ensure the pin IDs are + // generated sequentially. + tl_assert (circuit->pin_count () == pin_id + 1); if (net) { circuit->connect_pin (pin_id, net); } diff --git a/src/db/db/dbLayoutToNetlistWriter.cc b/src/db/db/dbLayoutToNetlistWriter.cc index bdeeebb91..4dc227ae4 100644 --- a/src/db/db/dbLayoutToNetlistWriter.cc +++ b/src/db/db/dbLayoutToNetlistWriter.cc @@ -561,7 +561,8 @@ void std_writer_impl::write (const db::SubCircuit &subcircuit, std::mapfirst.to_parsable_string () << " " << p->second.to_parsable_string () << ")" << endl; } - for (db::Circuit::const_pin_iterator p = subcircuit.circuit_ref ()->begin_pins (); p != subcircuit.circuit_ref ()->end_pins (); ++p) { + unsigned int pin_id = 0; + for (db::Circuit::const_pin_iterator p = subcircuit.circuit_ref ()->begin_pins (); p != subcircuit.circuit_ref ()->end_pins (); ++p, ++pin_id) { const db::Net *net = subcircuit.net_for_pin (p->id ()); if (net) { if (separate_lines) { @@ -569,7 +570,7 @@ void std_writer_impl::write (const db::SubCircuit &subcircuit, std::mapid ()) << " " << net2id [net] << ")"; + *mp_stream << Keys::pin_key << "(" << tl::to_string (pin_id) << " " << net2id [net] << ")"; if (separate_lines) { *mp_stream << endl; } diff --git a/src/db/db/dbLayoutVsSchematicWriter.cc b/src/db/db/dbLayoutVsSchematicWriter.cc index 251afb60e..14a2b1c13 100644 --- a/src/db/db/dbLayoutVsSchematicWriter.cc +++ b/src/db/db/dbLayoutVsSchematicWriter.cc @@ -146,7 +146,7 @@ std::string ion_to_s (const Obj *obj) } } -std::string net_id_to_s (const db::Net *net, const std::map &net2id) +static std::string net_id_to_s (const db::Net *net, const std::map &net2id) { if (net) { std::map::const_iterator i = net2id.find (net); @@ -157,6 +157,25 @@ std::string net_id_to_s (const db::Net *net, const std::map &pin2index) +{ + size_t pi = 0; + for (db::Circuit::const_pin_iterator p = c->begin_pins (); p != c->end_pins (); ++p, ++pi) { + pin2index.insert (std::make_pair (p.operator-> (), pi)); + } +} + +static std::string pin_id_to_s (const db::Pin *pin, const std::map &pin2index) +{ + if (pin) { + std::map::const_iterator i = pin2index.find (pin); + tl_assert (i != pin2index.end ()); + return tl::to_string (i->second); + } else { + return "()"; + } +} + template std::string std_writer_impl::message_to_s (const std::string &msg) { @@ -200,8 +219,12 @@ void std_writer_impl::write (const db::NetlistCrossReference *xref) stream () << indent1 << indent2 << Keys::net_key << "(" << net_id_to_s (n->pair.first, m_net2id_per_circuit_a [c->first]) << " " << net_id_to_s (n->pair.second, m_net2id_per_circuit_b [c->second]) << status_to_s (n->status) << message_to_s (n->msg) << ")" << endl; } + std::map pin2index_a, pin2index_b; + build_pin_index_map (c->first, pin2index_a); + build_pin_index_map (c->second, pin2index_b); + for (db::NetlistCrossReference::PerCircuitData::pin_pairs_const_iterator n = pcd->pins.begin (); n != pcd->pins.end (); ++n) { - stream () << indent1 << indent2 << Keys::pin_key << "(" << ion_to_s (n->pair.first) << " " << ion_to_s (n->pair.second) << status_to_s (n->status) << message_to_s (n->msg) << ")" << endl; + stream () << indent1 << indent2 << Keys::pin_key << "(" << pin_id_to_s (n->pair.first, pin2index_a) << " " << pin_id_to_s (n->pair.second, pin2index_b) << status_to_s (n->status) << message_to_s (n->msg) << ")" << endl; } for (db::NetlistCrossReference::PerCircuitData::device_pairs_const_iterator n = pcd->devices.begin (); n != pcd->devices.end (); ++n) {