mirror of https://github.com/KLayout/klayout.git
debugging pin shape generation - not sure if that solution makes sense.
This commit is contained in:
parent
09a690f5f6
commit
7388aa13a6
|
|
@ -538,22 +538,25 @@ public:
|
||||||
(*mp_interacting_this) [l1].insert (s1);
|
(*mp_interacting_this) [l1].insert (s1);
|
||||||
}
|
}
|
||||||
if (mp_interacting_other) {
|
if (mp_interacting_other) {
|
||||||
(*mp_interacting_this) [l2].insert (s2);
|
(*mp_interacting_other) [l2].insert (s2);
|
||||||
}
|
}
|
||||||
if (soft == 0 || (m_soft_mode != 0 && m_soft_mode != soft)) {
|
if (soft == 0 || (m_soft_mode != 0 && m_soft_mode != soft)) {
|
||||||
m_soft_mode = 0;
|
m_soft_mode = 0;
|
||||||
if (! mp_interacting_other && ! mp_interacting_this) {
|
m_any = true;
|
||||||
m_any = true;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
m_soft_mode = soft;
|
m_soft_mode = soft;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool any () const
|
||||||
|
{
|
||||||
|
return m_any || m_soft_mode != 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool stop () const
|
bool stop () const
|
||||||
{
|
{
|
||||||
return m_any;
|
return m_any && ! mp_interacting_other && ! mp_interacting_this;
|
||||||
}
|
}
|
||||||
|
|
||||||
int soft_mode () const
|
int soft_mode () const
|
||||||
|
|
@ -715,8 +718,9 @@ local_cluster<T>::interacts (const local_cluster<T> &other, const db::ICplxTrans
|
||||||
std::map<unsigned int, std::set<const T *> > *p_is_other = interacting_other ? &is_other : 0;
|
std::map<unsigned int, std::set<const T *> > *p_is_other = interacting_other ? &is_other : 0;
|
||||||
|
|
||||||
hnp_interaction_receiver<T> rec (conn, trans, p_is_this, p_is_other);
|
hnp_interaction_receiver<T> rec (conn, trans, p_is_this, p_is_other);
|
||||||
|
scanner.process (rec, 1 /*==touching*/, bc, bc_t);
|
||||||
|
|
||||||
if (! scanner.process (rec, 1 /*==touching*/, bc, bc_t) || rec.soft_mode () != 0) {
|
if (rec.any ()) {
|
||||||
|
|
||||||
if (p_is_this) {
|
if (p_is_this) {
|
||||||
collect_interactions_in_original_order (m_shapes, *p_is_this, *interacting_this);
|
collect_interactions_in_original_order (m_shapes, *p_is_this, *interacting_this);
|
||||||
|
|
|
||||||
|
|
@ -1311,9 +1311,43 @@ static bool deliver_shapes_of_net (bool recursive, const db::Netlist *nl, const
|
||||||
std::map<unsigned int, db::Region>
|
std::map<unsigned int, db::Region>
|
||||||
LayoutToNetlist::shapes_of_pin (const db::NetSubcircuitPinRef &pin, const db::ICplxTrans &trans) const
|
LayoutToNetlist::shapes_of_pin (const db::NetSubcircuitPinRef &pin, const db::ICplxTrans &trans) const
|
||||||
{
|
{
|
||||||
|
std::map<unsigned int, db::Region> result;
|
||||||
|
|
||||||
// @@@
|
const db::Net *net = pin.net ();
|
||||||
|
if (! net || ! net->circuit () || ! pin.subcircuit () || ! pin.subcircuit ()->circuit_ref ()) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cc = m_net_clusters.clusters_per_cell (net->circuit ()->cell_index ());
|
||||||
|
auto c = cc.cluster_by_id (net->cluster_id ());
|
||||||
|
|
||||||
|
double dbu = internal_layout ()->dbu ();
|
||||||
|
db::ICplxTrans sc_trans = db::CplxTrans (dbu).inverted () * pin.subcircuit ()->trans () * db::CplxTrans (dbu);
|
||||||
|
|
||||||
|
const db::Net *other_net = pin.subcircuit ()->circuit_ref ()->net_for_pin (pin.pin_id ());
|
||||||
|
if (! other_net) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cc_other = m_net_clusters.clusters_per_cell (pin.subcircuit ()->circuit_ref ()->cell_index ());
|
||||||
|
auto c_other = cc_other.cluster_by_id (other_net->cluster_id ());
|
||||||
|
|
||||||
|
std::map<unsigned int, std::vector<const db::NetShape *> > interacting;
|
||||||
|
int soft = 0;
|
||||||
|
if (! c.interacts (c_other, sc_trans, m_conn, soft, 0, &interacting)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto t = trans * sc_trans;
|
||||||
|
|
||||||
|
for (auto i = interacting.begin (); i != interacting.end (); ++i) {
|
||||||
|
db::Region &r = result [i->first];
|
||||||
|
for (auto s = i->second.begin (); s != i->second.end (); ++s) {
|
||||||
|
deliver_shape (**s, r, t, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LayoutToNetlist::shapes_of_net (const db::Net &net, const db::Region &of_layer, bool recursive, db::Shapes &to, db::properties_id_type propid, const ICplxTrans &trans) const
|
void LayoutToNetlist::shapes_of_net (const db::Net &net, const db::Region &of_layer, bool recursive, db::Shapes &to, db::properties_id_type propid, const ICplxTrans &trans) const
|
||||||
|
|
|
||||||
|
|
@ -692,6 +692,8 @@ Class<db::LayoutToNetlist> decl_dbLayoutToNetlist ("db", "LayoutToNetlist",
|
||||||
"also by touching subcircuits. In that case, the nets do not have shapes of their own and this function cannot detect\n"
|
"also by touching subcircuits. In that case, the nets do not have shapes of their own and this function cannot detect\n"
|
||||||
"the pin shapes.\n"
|
"the pin shapes.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"The call of this method is not cheap, specificially if large nets are involved.\n"
|
||||||
|
"\n"
|
||||||
"This method has been introduced in version 0.29.2."
|
"This method has been introduced in version 0.29.2."
|
||||||
) +
|
) +
|
||||||
gsi::factory ("shapes_of_net", (db::Region *(db::LayoutToNetlist::*) (const db::Net &, const db::Region &, bool, const db::ICplxTrans &) const) &db::LayoutToNetlist::shapes_of_net, gsi::arg ("net"), gsi::arg ("of_layer"), gsi::arg ("recursive", true), gsi::arg ("trans", db::ICplxTrans (), "unity"),
|
gsi::factory ("shapes_of_net", (db::Region *(db::LayoutToNetlist::*) (const db::Net &, const db::Region &, bool, const db::ICplxTrans &) const) &db::LayoutToNetlist::shapes_of_net, gsi::arg ("net"), gsi::arg ("of_layer"), gsi::arg ("recursive", true), gsi::arg ("trans", db::ICplxTrans (), "unity"),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue