mirror of https://github.com/KLayout/klayout.git
Trying to improve must-connect error messages
* Avoid repetitions * Include geometry for nets if possible * Better wording * All joined nets tested together - leaner code
This commit is contained in:
parent
994b23abf6
commit
14b1fddcc5
|
|
@ -508,12 +508,37 @@ void LayoutToNetlist::do_join_nets (db::Circuit &c, const std::vector<db::Net *>
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_must_connect (c, nets);
|
||||||
|
|
||||||
for (auto n = nets.begin () + 1; n != nets.end (); ++n) {
|
for (auto n = nets.begin () + 1; n != nets.end (); ++n) {
|
||||||
check_must_connect (c, *nets [0], **n);
|
|
||||||
c.join_nets (nets [0], *n);
|
c.join_nets (nets [0], *n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LayoutToNetlist::check_must_connect (const db::Circuit &c, const std::vector<db::Net *> &nets)
|
||||||
|
{
|
||||||
|
std::vector<const db::Net *> unique_nets;
|
||||||
|
unique_nets.reserve (nets.size ());
|
||||||
|
std::set<const db::Net *> seen;
|
||||||
|
for (auto n = nets.begin (); n != nets.end (); ++n) {
|
||||||
|
if (seen.find (*n) == seen.end ()) {
|
||||||
|
seen.insert (*n);
|
||||||
|
unique_nets.push_back (*n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (unique_nets.size () < size_t (2)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool same_names = true;
|
||||||
|
for (auto n = unique_nets.begin () + 1; n != unique_nets.end () && same_names; ++n) {
|
||||||
|
same_names = (unique_nets.front ()->expanded_name () == (*n)->expanded_name ());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<const db::SubCircuit *> path;
|
||||||
|
check_must_connect_impl (c, unique_nets, c, unique_nets, path, same_names);
|
||||||
|
}
|
||||||
|
|
||||||
static std::string subcircuit_to_string (const db::SubCircuit &sc)
|
static std::string subcircuit_to_string (const db::SubCircuit &sc)
|
||||||
{
|
{
|
||||||
if (! sc.name ().empty ()) {
|
if (! sc.name ().empty ()) {
|
||||||
|
|
@ -533,14 +558,31 @@ static db::DPolygon subcircuit_geometry (const db::SubCircuit &sc, const db::Lay
|
||||||
return db::DPolygon (sc.trans () * dbox);
|
return db::DPolygon (sc.trans () * dbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LayoutToNetlist::check_must_connect (const db::Circuit &c, const db::Net &a, const db::Net &b)
|
static db::DBox net_geometry_box (const db::Circuit &c, const db::Net *net, const db::Layout *layout, const db::hier_clusters<db::NetShape> &net_clusters)
|
||||||
{
|
{
|
||||||
if (&a == &b) {
|
if (! layout || ! net) {
|
||||||
return;
|
return db::DBox ();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<const db::SubCircuit *> path;
|
auto nc = net_clusters.clusters_per_cell (c.cell_index ());
|
||||||
check_must_connect_impl (c, a, b, c, a, b, path);
|
auto lc = nc.cluster_by_id (net->cluster_id ());
|
||||||
|
|
||||||
|
return db::CplxTrans (layout->dbu ()) * lc.bbox ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static db::DPolygon net_geometry (const db::Circuit &c, const db::Net *net, const db::Layout *layout, const db::hier_clusters<db::NetShape> &net_clusters)
|
||||||
|
{
|
||||||
|
auto box = net_geometry_box (c, net, layout, net_clusters);
|
||||||
|
return box.empty () ? db::DPolygon () : db::DPolygon (box);
|
||||||
|
}
|
||||||
|
|
||||||
|
static db::DPolygon net_geometry (const db::Circuit &c, const std::vector<const db::Net *> &nets, const db::Layout *layout, const db::hier_clusters<db::NetShape> &net_clusters)
|
||||||
|
{
|
||||||
|
db::DBox box;
|
||||||
|
for (auto n = nets.begin (); n != nets.end (); ++n) {
|
||||||
|
box += net_geometry_box (c, *n, layout, net_clusters);
|
||||||
|
}
|
||||||
|
return box.empty () ? db::DPolygon () : db::DPolygon (box);
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string path_msg (const std::vector<const db::SubCircuit *> &path)
|
static std::string path_msg (const std::vector<const db::SubCircuit *> &path)
|
||||||
|
|
@ -562,46 +604,98 @@ static std::string path_msg (const std::vector<const db::SubCircuit *> &path)
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LayoutToNetlist::check_must_connect_impl (const db::Circuit &c, const db::Net &a, const db::Net &b, const db::Circuit &c_org, const db::Net &a_org, const db::Net &b_org, std::vector<const db::SubCircuit *> &path)
|
static bool all_nets_are_same (const std::vector<const db::Net *> &nets)
|
||||||
|
{
|
||||||
|
for (auto n = nets.begin () + 1; n != nets.end (); ++n) {
|
||||||
|
if (*n != nets.front ()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool no_pins_on_any_net (const std::vector<const db::Net *> &nets)
|
||||||
|
{
|
||||||
|
for (auto n = nets.begin (); n != nets.end (); ++n) {
|
||||||
|
if ((*n)->begin_pins () == (*n)->end_pins ()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string net_names_msg (const std::vector<const db::Net *> &nets)
|
||||||
|
{
|
||||||
|
std::set<std::string> names;
|
||||||
|
for (auto n = nets.begin (); n != nets.end (); ++n) {
|
||||||
|
names.insert ((*n)->expanded_name ());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string msg;
|
||||||
|
size_t num = names.size ();
|
||||||
|
size_t i = 0;
|
||||||
|
for (auto n = names.begin (); n != names.end (); ++n, ++i) {
|
||||||
|
if (i > 0) {
|
||||||
|
if (i + 1 < num) {
|
||||||
|
msg += ", ";
|
||||||
|
} else {
|
||||||
|
msg += tl::to_string (tr (" and "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg += *n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LayoutToNetlist::check_must_connect_impl (const db::Circuit &c, const std::vector<const db::Net *> &nets, const db::Circuit &c_org, const std::vector<const db::Net *> &nets_org, std::vector<const db::SubCircuit *> &path, bool same_names)
|
||||||
{
|
{
|
||||||
if (c.begin_refs () != c.end_refs () && path.empty ()) {
|
if (c.begin_refs () != c.end_refs () && path.empty ()) {
|
||||||
|
|
||||||
if (a.begin_pins () == a.end_pins ()) {
|
for (auto n = nets.begin (); n != nets.end (); ++n) {
|
||||||
db::LogEntryData error (db::Error, tl::sprintf (tl::to_string (tr ("Must-connect net %s is not connected to outside")), a_org.expanded_name ()));
|
|
||||||
error.set_cell_name (c.name ());
|
if ((*n)->begin_pins () == (*n)->end_pins ()) {
|
||||||
error.set_category_name ("must-connect");
|
std::string msg;
|
||||||
log_entry (error);
|
if (same_names) {
|
||||||
}
|
msg = tl::sprintf (tl::to_string (tr ("Must-connect subnet of %s does not have any pin at all")), (*n)->expanded_name ());
|
||||||
if (b.begin_pins () == b.end_pins ()) {
|
} else {
|
||||||
db::LogEntryData error (db::Error, tl::sprintf (tl::to_string (tr ("Must-connect net %s is not connected to outside")), a_org.expanded_name ()));
|
msg = tl::sprintf (tl::to_string (tr ("Must-connect net %s does not have any pin at all")), (*n)->expanded_name ());
|
||||||
error.set_cell_name (c.name ());
|
}
|
||||||
error.set_category_name ("must-connect");
|
db::LogEntryData error (db::Error, msg);
|
||||||
log_entry (error);
|
error.set_cell_name (c.name ());
|
||||||
|
error.set_geometry (net_geometry (c, *n, internal_layout (), net_clusters ()));
|
||||||
|
error.set_category_name ("must-connect");
|
||||||
|
log_entry (error);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (c.begin_refs () == c.end_refs () || a.begin_pins () == a.end_pins () || b.begin_pins () == b.end_pins ()) {
|
} else if (c.begin_refs () == c.end_refs () || no_pins_on_any_net (nets)) {
|
||||||
|
|
||||||
if (a_org.expanded_name () == b_org.expanded_name ()) {
|
if (same_names) {
|
||||||
if (path.empty ()) {
|
if (path.empty ()) {
|
||||||
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s must be connected further up in the hierarchy - this is an error at chip top level")), a_org.expanded_name ()) + path_msg (path));
|
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect subnets of %s must be connected further up in the hierarchy - this is an error at chip top level")), nets_org.front ()->expanded_name ()) + path_msg (path));
|
||||||
warn.set_cell_name (c.name ());
|
warn.set_cell_name (c.name ());
|
||||||
|
warn.set_geometry (net_geometry (c, nets, internal_layout (), net_clusters ()));
|
||||||
warn.set_category_name ("must-connect");
|
warn.set_category_name ("must-connect");
|
||||||
log_entry (warn);
|
log_entry (warn);
|
||||||
} else {
|
} else {
|
||||||
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s of circuit %s must be connected further up in the hierarchy - this is an error at chip top level")), a_org.expanded_name (), c_org.name ()) + path_msg (path));
|
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect subnets of %s of circuit %s must be connected further up in the hierarchy - this is an error at chip top level")), nets_org.front ()->expanded_name (), c_org.name ()) + path_msg (path));
|
||||||
warn.set_cell_name (c.name ());
|
warn.set_cell_name (c.name ());
|
||||||
warn.set_geometry (subcircuit_geometry (*path.back (), internal_layout ()));
|
warn.set_geometry (subcircuit_geometry (*path.back (), internal_layout ()));
|
||||||
warn.set_category_name ("must-connect");
|
warn.set_category_name ("must-connect");
|
||||||
log_entry (warn);
|
log_entry (warn);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
std::string net_names = net_names_msg (nets_org);
|
||||||
if (path.empty ()) {
|
if (path.empty ()) {
|
||||||
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s and %s must be connected further up in the hierarchy - this is an error at chip top level")), a_org.expanded_name (), b_org.expanded_name ()) + path_msg (path));
|
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s must be connected further up in the hierarchy - this is an error at chip top level")), net_names) + path_msg (path));
|
||||||
warn.set_cell_name (c.name ());
|
warn.set_cell_name (c.name ());
|
||||||
|
warn.set_geometry (net_geometry (c, nets, internal_layout (), net_clusters ()));
|
||||||
warn.set_category_name ("must-connect");
|
warn.set_category_name ("must-connect");
|
||||||
log_entry (warn);
|
log_entry (warn);
|
||||||
} else {
|
} else {
|
||||||
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s and %s of circuit %s must be connected further up in the hierarchy - this is an error at chip top level")), a_org.expanded_name (), b_org.expanded_name (), c_org.name ()) + path_msg (path));
|
db::LogEntryData warn (m_top_level_mode ? db::Error : db::Warning, tl::sprintf (tl::to_string (tr ("Must-connect nets %s of circuit %s must be connected further up in the hierarchy - this is an error at chip top level")), net_names, c_org.name ()) + path_msg (path));
|
||||||
warn.set_cell_name (c.name ());
|
warn.set_cell_name (c.name ());
|
||||||
warn.set_geometry (subcircuit_geometry (*path.back (), internal_layout ()));
|
warn.set_geometry (subcircuit_geometry (*path.back (), internal_layout ()));
|
||||||
warn.set_category_name ("must-connect");
|
warn.set_category_name ("must-connect");
|
||||||
|
|
@ -611,35 +705,49 @@ void LayoutToNetlist::check_must_connect_impl (const db::Circuit &c, const db::N
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a.begin_pins () != a.end_pins () && b.begin_pins () != b.end_pins ()) {
|
if (! no_pins_on_any_net (nets)) {
|
||||||
|
|
||||||
for (auto ref = c.begin_refs (); ref != c.end_refs (); ++ref) {
|
for (auto ref = c.begin_refs (); ref != c.end_refs (); ++ref) {
|
||||||
|
|
||||||
const db::SubCircuit &sc = *ref;
|
const db::SubCircuit &sc = *ref;
|
||||||
|
|
||||||
// TODO: consider the case of multiple pins on a net (rare)
|
// TODO: consider the case of multiple pins on a net (rare)
|
||||||
const db::Net *net_a = sc.net_for_pin (a.begin_pins ()->pin_id ());
|
std::vector<const db::Net *> new_nets;
|
||||||
const db::Net *net_b = sc.net_for_pin (b.begin_pins ()->pin_id ());
|
new_nets.reserve (nets.size ());
|
||||||
|
|
||||||
|
bool failed = false;
|
||||||
|
std::set<const db::Net *> seen;
|
||||||
|
size_t i = 0;
|
||||||
|
for (auto n = nets.begin (); n != nets.end (); ++n, ++i) {
|
||||||
|
|
||||||
|
if (seen.find (*n) != seen.end ()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
seen.insert (*n);
|
||||||
|
|
||||||
|
const db::Net *new_net = sc.net_for_pin ((*n)->begin_pins ()->pin_id ());
|
||||||
|
new_nets.push_back (new_net);
|
||||||
|
|
||||||
|
if (new_net == 0) {
|
||||||
|
failed = true;
|
||||||
|
std::string msg;
|
||||||
|
if (same_names) {
|
||||||
|
msg = tl::sprintf (tl::to_string (tr ("Must-connect subnet of %s of circuit %s has no outside connection at all%s")), nets_org[i]->expanded_name (), c_org.name (), subcircuit_to_string (sc)) + path_msg (path);
|
||||||
|
} else {
|
||||||
|
msg = tl::sprintf (tl::to_string (tr ("Must-connect net %s of circuit %s has no outside connection at all%s")), nets_org[i]->expanded_name (), c_org.name (), subcircuit_to_string (sc)) + path_msg (path);
|
||||||
|
}
|
||||||
|
db::LogEntryData error (db::Error, msg);
|
||||||
|
error.set_cell_name (sc.circuit ()->name ());
|
||||||
|
error.set_geometry (subcircuit_geometry (sc, internal_layout ()));
|
||||||
|
error.set_category_name ("must-connect");
|
||||||
|
log_entry (error);
|
||||||
|
}
|
||||||
|
|
||||||
if (net_a == 0) {
|
|
||||||
db::LogEntryData error (db::Error, tl::sprintf (tl::to_string (tr ("Must-connect net %s of circuit %s is not connected at all%s")), a_org.expanded_name (), c_org.name (), subcircuit_to_string (sc)) + path_msg (path));
|
|
||||||
error.set_cell_name (sc.circuit ()->name ());
|
|
||||||
error.set_geometry (subcircuit_geometry (sc, internal_layout ()));
|
|
||||||
error.set_category_name ("must-connect");
|
|
||||||
log_entry (error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (net_b == 0) {
|
if (! failed && ! all_nets_are_same (new_nets)) {
|
||||||
db::LogEntryData error (db::Error, tl::sprintf (tl::to_string (tr ("Must-connect net %s of circuit %s is not connected at all%s")), b_org.expanded_name (), c_org.name (), subcircuit_to_string (sc)) + path_msg (path));
|
|
||||||
error.set_cell_name (sc.circuit ()->name ());
|
|
||||||
error.set_geometry (subcircuit_geometry (sc, internal_layout ()));
|
|
||||||
error.set_category_name ("must-connect");
|
|
||||||
log_entry (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (net_a && net_b && net_a != net_b) {
|
|
||||||
path.push_back (&sc);
|
path.push_back (&sc);
|
||||||
check_must_connect_impl (*sc.circuit (), *net_a, *net_b, c_org, a_org, b_org, path);
|
check_must_connect_impl (*sc.circuit (), new_nets, c_org, nets_org, path, same_names);
|
||||||
path.pop_back ();
|
path.pop_back ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1109,8 +1109,8 @@ private:
|
||||||
void do_soft_connections ();
|
void do_soft_connections ();
|
||||||
void join_nets_from_pattern (db::Circuit &c, const tl::GlobPattern &p);
|
void join_nets_from_pattern (db::Circuit &c, const tl::GlobPattern &p);
|
||||||
void join_nets_from_pattern (db::Circuit &c, const std::set<std::string> &p);
|
void join_nets_from_pattern (db::Circuit &c, const std::set<std::string> &p);
|
||||||
void check_must_connect (const db::Circuit &c, const db::Net &a, const db::Net &b);
|
void check_must_connect (const db::Circuit &c, const std::vector<Net *> &nets);
|
||||||
void check_must_connect_impl (const db::Circuit &c, const db::Net &a, const db::Net &b, const db::Circuit &c_org, const db::Net &a_org, const db::Net &b_org, std::vector<const db::SubCircuit *> &path);
|
void check_must_connect_impl (const db::Circuit &c, const std::vector<const Net *> &nets, const db::Circuit &c_org, const std::vector<const Net *> &nets_org, std::vector<const db::SubCircuit *> &path, bool same_names);
|
||||||
|
|
||||||
// for debugging and testing
|
// for debugging and testing
|
||||||
void place_soft_connection_diodes ();
|
void place_soft_connection_diodes ();
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ TEST(20_private)
|
||||||
|
|
||||||
TEST(21_private)
|
TEST(21_private)
|
||||||
{
|
{
|
||||||
run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_4.lvsdb");
|
run_test (_this, "test_21.lylvs", "test_21.cir.gz", "test_21.gds.gz", true, "test_21_5.lvsdb");
|
||||||
}
|
}
|
||||||
|
|
||||||
// issue #1021
|
// issue #1021
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,9 @@ J(
|
||||||
C(l2 l6 l2)
|
C(l2 l6 l2)
|
||||||
C(l5 l6 l5)
|
C(l5 l6 l5)
|
||||||
G(l14 SUBSTRATE)
|
G(l14 SUBSTRATE)
|
||||||
H(W B('Must-connect nets GND must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect'))
|
H(W B('Must-connect subnets of GND must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect') Q('(0.27,0.8;0.27,8.4;0.32,8.4;0.32,0.8)'))
|
||||||
H(W B('Must-connect nets R must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect'))
|
H(W B('Must-connect subnets of R must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect') Q('(1.48,2.37;1.48,7.46;2.61,7.46;2.61,2.37)'))
|
||||||
H(W B('Must-connect nets R of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$1') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
H(W B('Must-connect subnets of R of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$1') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
||||||
K(PMOS MOS3)
|
K(PMOS MOS3)
|
||||||
K(NMOS MOS3)
|
K(NMOS MOS3)
|
||||||
D(D$PMOS PMOS
|
D(D$PMOS PMOS
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,9 @@ J(
|
||||||
C(l2 l6 l2)
|
C(l2 l6 l2)
|
||||||
C(l5 l6 l5)
|
C(l5 l6 l5)
|
||||||
G(l14 SUBSTRATE)
|
G(l14 SUBSTRATE)
|
||||||
H(W B('Must-connect nets GND must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect'))
|
H(W B('Must-connect subnets of GND must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect') Q('(0.27,0.8;0.27,8.4;0.32,8.4;0.32,0.8)'))
|
||||||
H(W B('Must-connect nets R must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect'))
|
H(W B('Must-connect subnets of R must be connected further up in the hierarchy - this is an error at chip top level') C(INVCHAIN) X('must-connect') Q('(1.48,2.37;1.48,7.46;2.61,7.46;2.61,2.37)'))
|
||||||
H(W B('Must-connect nets R of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$1') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
H(W B('Must-connect subnets of R of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$1') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
||||||
K(PMOS MOS3)
|
K(PMOS MOS3)
|
||||||
K(NMOS MOS3)
|
K(NMOS MOS3)
|
||||||
D(D$PMOS PMOS
|
D(D$PMOS PMOS
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ J(
|
||||||
C(l2 l6 l2)
|
C(l2 l6 l2)
|
||||||
C(l5 l6 l5)
|
C(l5 l6 l5)
|
||||||
G(l14 SUBSTRATE)
|
G(l14 SUBSTRATE)
|
||||||
H(W B('Must-connect nets VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect'))
|
H(W B('Must-connect subnets of VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect') Q('(3.61,0.7;3.61,8.89;11.365,8.89;11.365,0.7)'))
|
||||||
K(PMOS MOS3)
|
K(PMOS MOS3)
|
||||||
K(NMOS MOS3)
|
K(NMOS MOS3)
|
||||||
D(D$PMOS PMOS
|
D(D$PMOS PMOS
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ J(
|
||||||
C(l2 l6 l2)
|
C(l2 l6 l2)
|
||||||
C(l5 l6 l5)
|
C(l5 l6 l5)
|
||||||
G(l14 SUBSTRATE)
|
G(l14 SUBSTRATE)
|
||||||
H(E B('Must-connect nets VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect'))
|
H(E B('Must-connect subnets of VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect') Q('(3.61,0.7;3.61,8.89;11.365,8.89;11.365,0.7)'))
|
||||||
K(PMOS MOS3)
|
K(PMOS MOS3)
|
||||||
K(NMOS MOS3)
|
K(NMOS MOS3)
|
||||||
D(D$PMOS PMOS
|
D(D$PMOS PMOS
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,9 @@ J(
|
||||||
C(l2 l6 l2)
|
C(l2 l6 l2)
|
||||||
C(l5 l6 l5)
|
C(l5 l6 l5)
|
||||||
G(l14 SUBSTRATE)
|
G(l14 SUBSTRATE)
|
||||||
H(W B('Must-connect nets VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect'))
|
H(W B('Must-connect subnets of VSSTOP must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect') Q('(3.61,0.7;3.61,8.89;11.365,8.89;11.365,0.7)'))
|
||||||
H(W B('Must-connect nets VDD must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect'))
|
H(W B('Must-connect subnets of VDD must be connected further up in the hierarchy - this is an error at chip top level') C(TOP) X('must-connect') Q('(2.595,4.725;2.595,4.805;11.865,4.805;11.865,4.725)'))
|
||||||
H(W B('Must-connect nets VSS of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$2') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
H(W B('Must-connect subnets of VSS of circuit INV2 must be connected further up in the hierarchy - this is an error at chip top level.\nInstance path: INVCHAIN/INV2[r0 0,0]:$2') C(INVCHAIN) X('must-connect') Q('(0,0;0,9.2;3,9.2;3,0)'))
|
||||||
K(PMOS MOS3)
|
K(PMOS MOS3)
|
||||||
K(NMOS MOS3)
|
K(NMOS MOS3)
|
||||||
D(D$PMOS PMOS
|
D(D$PMOS PMOS
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ layout(
|
||||||
global(l10 SUBSTRATE)
|
global(l10 SUBSTRATE)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets VDD must be connected further up in the hierarchy - this is an error at chip top level') cell(RINGO) cat('must-connect'))
|
message(warning description('Must-connect subnets of VDD must be connected further up in the hierarchy - this is an error at chip top level') cell(RINGO) cat('must-connect') polygon('(2.95,7.25;2.95,7.4;25.1,7.4;25.1,7.25)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(PMOS MOS4)
|
class(PMOS MOS4)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ layout(
|
||||||
global(l10 SUBSTRATE)
|
global(l10 SUBSTRATE)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets VDD must be connected further up in the hierarchy - this is an error at chip top level') cell(RINGO) cat('must-connect'))
|
message(warning description('Must-connect subnets of VDD must be connected further up in the hierarchy - this is an error at chip top level') cell(RINGO) cat('must-connect') polygon('(2.95,7.25;2.95,7.4;25.1,7.4;25.1,7.25)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(PMOS MOS4)
|
class(PMOS MOS4)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l6 vss)
|
global(l6 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.385,-0.305;-0.385,5.855;9.105,5.855;9.105,-0.305)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l6 vss)
|
global(l6 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.385,-0.305;-0.385,5.855;9.105,5.855;9.105,-0.305)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l6 vss)
|
global(l6 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.385,-0.305;-0.385,5.855;9.105,5.855;9.105,-0.305)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l6 vss)
|
global(l6 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.385,-0.305;-0.385,5.855;9.105,5.855;9.105,-0.305)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l1 vss)
|
global(l1 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.16,-0.13;-0.16,5.68;8.88,5.68;8.88,-0.13)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l1 vss)
|
global(l1 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.16,-0.13;-0.16,5.68;8.88,5.68;8.88,-0.13)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l1 vss)
|
global(l1 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.16,-0.13;-0.16,5.68;8.88,5.68;8.88,-0.13)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l1 vss)
|
global(l1 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.16,-0.13;-0.16,5.68;8.88,5.68;8.88,-0.13)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ layout(
|
||||||
global(l1 vss)
|
global(l1 vss)
|
||||||
|
|
||||||
# Log entries
|
# Log entries
|
||||||
message(warning description('Must-connect nets vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect'))
|
message(warning description('Must-connect subnets of vdd must be connected further up in the hierarchy - this is an error at chip top level') cell(SP6TArray_2X4) cat('must-connect') polygon('(-0.16,-0.13;-0.16,5.68;8.88,5.68;8.88,-0.13)'))
|
||||||
|
|
||||||
# Device class section
|
# Device class section
|
||||||
class(active_res RES)
|
class(active_res RES)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue