mirror of https://github.com/KLayout/klayout.git
Fixed an issue with 'align' in LVS scripts - with multiple layout cells assigned to one schematic, align won't give the right results.
This commit is contained in:
parent
2325e1bce4
commit
f8476bdf26
|
|
@ -2224,39 +2224,39 @@ NetlistComparer::unmatched_circuits (db::Netlist *a, db::Netlist *b, std::vector
|
||||||
// we need to create a copy because this method is supposed to be const.
|
// we need to create a copy because this method is supposed to be const.
|
||||||
db::CircuitCategorizer circuit_categorizer = *mp_circuit_categorizer;
|
db::CircuitCategorizer circuit_categorizer = *mp_circuit_categorizer;
|
||||||
|
|
||||||
std::map<size_t, std::pair<db::Circuit *, db::Circuit *> > cat2circuits;
|
std::map<size_t, std::pair<std::vector<db::Circuit *>, std::vector<db::Circuit *> > > cat2circuits;
|
||||||
|
|
||||||
for (db::Netlist::circuit_iterator i = a->begin_circuits (); i != a->end_circuits (); ++i) {
|
for (db::Netlist::circuit_iterator i = a->begin_circuits (); i != a->end_circuits (); ++i) {
|
||||||
size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ());
|
size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ());
|
||||||
if (cat) {
|
if (cat) {
|
||||||
cat2circuits[cat].first = i.operator-> ();
|
cat2circuits[cat].first.push_back (i.operator-> ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (db::Netlist::circuit_iterator i = b->begin_circuits (); i != b->end_circuits (); ++i) {
|
for (db::Netlist::circuit_iterator i = b->begin_circuits (); i != b->end_circuits (); ++i) {
|
||||||
size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ());
|
size_t cat = circuit_categorizer.cat_for_circuit (i.operator-> ());
|
||||||
if (cat) {
|
if (cat) {
|
||||||
cat2circuits[cat].second = i.operator-> ();
|
cat2circuits[cat].second.push_back (i.operator-> ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t na = 0, nb = 0;
|
size_t na = 0, nb = 0;
|
||||||
for (std::map<size_t, std::pair<db::Circuit *, db::Circuit *> >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) {
|
for (std::map<size_t, std::pair<std::vector<db::Circuit *>, std::vector<db::Circuit *> > >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) {
|
||||||
if (! i->second.first) {
|
if (i->second.first.empty ()) {
|
||||||
++nb;
|
nb += i->second.second.size ();
|
||||||
} else if (! i->second.second) {
|
} else if (i->second.second.empty ()) {
|
||||||
++na;
|
na += i->second.first.size ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
in_a.reserve (na);
|
in_a.reserve (na);
|
||||||
in_b.reserve (nb);
|
in_b.reserve (nb);
|
||||||
|
|
||||||
for (std::map<size_t, std::pair<db::Circuit *, db::Circuit *> >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) {
|
for (std::map<size_t, std::pair<std::vector<db::Circuit *>, std::vector<db::Circuit *> > >::const_iterator i = cat2circuits.begin (); i != cat2circuits.end (); ++i) {
|
||||||
if (! i->second.first) {
|
if (i->second.first.empty ()) {
|
||||||
in_b.push_back (i->second.second);
|
in_b.insert (in_b.end (), i->second.second.begin (), i->second.second.end ());
|
||||||
} else if (! i->second.second) {
|
} else if (i->second.second.empty ()) {
|
||||||
in_a.push_back (i->second.first);
|
in_a.insert (in_a.end (), i->second.first.begin (), i->second.first.end ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -101,9 +101,11 @@ db::Connectivity NetlistDeviceExtractorMOS3Transistor::get_connectivity (const d
|
||||||
|
|
||||||
// The layer definition is diff, gate
|
// The layer definition is diff, gate
|
||||||
db::Connectivity conn;
|
db::Connectivity conn;
|
||||||
|
if (false) { // @@@
|
||||||
// collect all connected diffusion shapes
|
// collect all connected diffusion shapes
|
||||||
conn.connect (sdiff, sdiff);
|
conn.connect (sdiff, sdiff);
|
||||||
conn.connect (ddiff, ddiff);
|
conn.connect (ddiff, ddiff);
|
||||||
|
} // @@@
|
||||||
// collect all connected gate shapes
|
// collect all connected gate shapes
|
||||||
conn.connect (gate, gate);
|
conn.connect (gate, gate);
|
||||||
// connect gate with diff to detect gate/diffusion boundary
|
// connect gate with diff to detect gate/diffusion boundary
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,6 @@ module LVS
|
||||||
@lvs.generator = @engine._generator
|
@lvs.generator = @engine._generator
|
||||||
|
|
||||||
@l2n = @lvs
|
@l2n = @lvs
|
||||||
@comparer = RBA::NetlistComparer::new
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -121,7 +120,9 @@ module LVS
|
||||||
|
|
||||||
nl = _ensure_two_netlists
|
nl = _ensure_two_netlists
|
||||||
|
|
||||||
unmatched_a = @comparer.unmatched_circuits_a(*nl)
|
comparer = self._comparer
|
||||||
|
|
||||||
|
unmatched_a = comparer.unmatched_circuits_a(*nl)
|
||||||
|
|
||||||
# check whether we're about to flatten away the internal top cell - that's bad
|
# check whether we're about to flatten away the internal top cell - that's bad
|
||||||
top_cell = l2n_data.internal_top_cell.name
|
top_cell = l2n_data.internal_top_cell.name
|
||||||
|
|
@ -136,7 +137,7 @@ module LVS
|
||||||
end
|
end
|
||||||
|
|
||||||
# flatten schematic circuits for which there is no corresponding layout cell
|
# flatten schematic circuits for which there is no corresponding layout cell
|
||||||
@comparer.unmatched_circuits_b(*nl).each do |c|
|
comparer.unmatched_circuits_b(*nl).each do |c|
|
||||||
@engine.info("Flatten schematic circuit (no layout): #{c.name}")
|
@engine.info("Flatten schematic circuit (no layout): #{c.name}")
|
||||||
nl[1].flatten_circuit(c)
|
nl[1].flatten_circuit(c)
|
||||||
end
|
end
|
||||||
|
|
@ -162,12 +163,20 @@ module LVS
|
||||||
nl = _ensure_two_netlists
|
nl = _ensure_two_netlists
|
||||||
lvs_data.reference = nl[1]
|
lvs_data.reference = nl[1]
|
||||||
|
|
||||||
|
lvs_data.compare(self._comparer)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def _comparer
|
||||||
|
|
||||||
|
comparer = RBA::NetlistComparer::new
|
||||||
|
|
||||||
# execute the configuration commands
|
# execute the configuration commands
|
||||||
@comparer_config.each do |cc|
|
@comparer_config.each do |cc|
|
||||||
cc.call
|
cc.call(comparer)
|
||||||
end
|
end
|
||||||
|
|
||||||
lvs_data.compare(@comparer)
|
return comparer
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -223,11 +232,11 @@ module LVS
|
||||||
n.is_a?(String) || n.is_a?(RBA::Net) || raise("Net arguments of 'same_nets' must be strings or Net objects")
|
n.is_a?(String) || n.is_a?(RBA::Net) || raise("Net arguments of 'same_nets' must be strings or Net objects")
|
||||||
end
|
end
|
||||||
|
|
||||||
@comparer_config << lambda { self._same_nets(ca, a, cb, b) }
|
@comparer_config << lambda { |comparer| self._same_nets(comparer, ca, a, cb, b) }
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def _same_nets(ca, a, cb, b)
|
def _same_nets(comparer, ca, a, cb, b)
|
||||||
|
|
||||||
( nl_a, nl_b ) = _ensure_two_netlists
|
( nl_a, nl_b ) = _ensure_two_netlists
|
||||||
|
|
||||||
|
|
@ -258,7 +267,7 @@ module LVS
|
||||||
end
|
end
|
||||||
|
|
||||||
if net_a && net_b
|
if net_a && net_b
|
||||||
@comparer.same_nets(net_a, net_b)
|
comparer.same_nets(net_a, net_b)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -283,11 +292,11 @@ module LVS
|
||||||
|
|
||||||
a.is_a?(String) || a == nil || b.is_a?(String) || b == nil || raise("Both arguments of 'same_circuits' need to be strings or nil")
|
a.is_a?(String) || a == nil || b.is_a?(String) || b == nil || raise("Both arguments of 'same_circuits' need to be strings or nil")
|
||||||
|
|
||||||
@comparer_config << lambda { self._same_circuits(a, b) }
|
@comparer_config << lambda { |comparer| self._same_circuits(comparer, a, b) }
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def _same_circuits(a, b)
|
def _same_circuits(comparer, a, b)
|
||||||
|
|
||||||
( nl_a, nl_b ) = _ensure_two_netlists
|
( nl_a, nl_b ) = _ensure_two_netlists
|
||||||
|
|
||||||
|
|
@ -295,7 +304,7 @@ module LVS
|
||||||
circuit_b = b && nl_b.circuit_by_name(b)
|
circuit_b = b && nl_b.circuit_by_name(b)
|
||||||
|
|
||||||
if circuit_a && circuit_b
|
if circuit_a && circuit_b
|
||||||
@comparer.same_circuits(circuit_a, circuit_b)
|
comparer.same_circuits(circuit_a, circuit_b)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -319,11 +328,11 @@ module LVS
|
||||||
|
|
||||||
a.is_a?(String) || a == nil || b.is_a?(String) || b == nil || raise("Both arguments of 'same_device_classes' need to be strings or nil")
|
a.is_a?(String) || a == nil || b.is_a?(String) || b == nil || raise("Both arguments of 'same_device_classes' need to be strings or nil")
|
||||||
|
|
||||||
@comparer_config << lambda { self._same_device_classes(a, b) }
|
@comparer_config << lambda { |comparer| self._same_device_classes(comparer, a, b) }
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def _same_device_classes(a, b)
|
def _same_device_classes(comparer, a, b)
|
||||||
|
|
||||||
( nl_a, nl_b ) = _ensure_two_netlists
|
( nl_a, nl_b ) = _ensure_two_netlists
|
||||||
|
|
||||||
|
|
@ -333,7 +342,7 @@ module LVS
|
||||||
# NOTE: a device class is allowed to be missing in the reference netlist because the
|
# NOTE: a device class is allowed to be missing in the reference netlist because the
|
||||||
# device may simply not be used there.
|
# device may simply not be used there.
|
||||||
if dc_b
|
if dc_b
|
||||||
@comparer.same_device_classes(dc_a, dc_b)
|
comparer.same_device_classes(dc_a, dc_b)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -371,11 +380,11 @@ module LVS
|
||||||
raise("All pin arguments of 'equivalent_pins' need to be strings or numbers")
|
raise("All pin arguments of 'equivalent_pins' need to be strings or numbers")
|
||||||
end
|
end
|
||||||
|
|
||||||
@comparer_config << lambda { self._equivalent_pins(circuit, *pins) }
|
@comparer_config << lambda { |comparer| self._equivalent_pins(comparer, circuit, *pins) }
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def _equivalent_pins(circuit, *pins)
|
def _equivalent_pins(comparer, circuit, *pins)
|
||||||
|
|
||||||
( nl_a, nl_b ) = _ensure_two_netlists
|
( nl_a, nl_b ) = _ensure_two_netlists
|
||||||
|
|
||||||
|
|
@ -394,7 +403,7 @@ module LVS
|
||||||
pin.id
|
pin.id
|
||||||
end
|
end
|
||||||
|
|
||||||
@comparer.equivalent_pins(circuit_b, pin_ids_b)
|
comparer.equivalent_pins(circuit_b, pin_ids_b)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -459,7 +468,8 @@ module LVS
|
||||||
|
|
||||||
def min_caps(value)
|
def min_caps(value)
|
||||||
lvs_data
|
lvs_data
|
||||||
@comparer.min_capacitance = value.to_f
|
v = value.to_f
|
||||||
|
@comparer_config << lambda { |comparer| comparer.min_capacitance = v }
|
||||||
end
|
end
|
||||||
|
|
||||||
# %LVS%
|
# %LVS%
|
||||||
|
|
@ -471,7 +481,8 @@ module LVS
|
||||||
|
|
||||||
def max_res(value)
|
def max_res(value)
|
||||||
lvs_data
|
lvs_data
|
||||||
@comparer.max_resistance = value.to_f
|
v = value.to_f
|
||||||
|
@comparer_config << lambda { |comparer| comparer.max_resistance = v }
|
||||||
end
|
end
|
||||||
|
|
||||||
# %LVS%
|
# %LVS%
|
||||||
|
|
@ -490,7 +501,8 @@ module LVS
|
||||||
|
|
||||||
def max_depth(value)
|
def max_depth(value)
|
||||||
lvs_data
|
lvs_data
|
||||||
@comparer.max_depth = value.to_i
|
v = value.to_i
|
||||||
|
@comparer_config << lambda { |comparer| comparer.max_depth = v }
|
||||||
end
|
end
|
||||||
|
|
||||||
# @name max_branch_complexity
|
# @name max_branch_complexity
|
||||||
|
|
@ -511,7 +523,8 @@ module LVS
|
||||||
|
|
||||||
def max_branch_complexity(value)
|
def max_branch_complexity(value)
|
||||||
lvs_data
|
lvs_data
|
||||||
@comparer.max_branch_complexity = value.to_i
|
v = value.to_i
|
||||||
|
@comparer_config << lambda { |comparer| comparer.max_branch_complexity = v }
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue