report parasitic annotation resistor loops
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
85507b7a6e
commit
904cecf988
|
|
@ -1652,7 +1652,9 @@ ConcreteParasitics::checkAnnotation1(const Pin *drvr_pin,
|
||||||
delete pin_iter;
|
delete pin_iter;
|
||||||
|
|
||||||
ParasiticNodeSet visited_nodes;
|
ParasiticNodeSet visited_nodes;
|
||||||
checkAnnotation2(drvr_pin, drvr_node, nullptr, loads, visited_nodes);
|
ParasiticDeviceSet loop_resistors;
|
||||||
|
checkAnnotation2(drvr_pin, drvr_node, nullptr, loads,
|
||||||
|
visited_nodes, loop_resistors);
|
||||||
return loads;
|
return loads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1661,7 +1663,8 @@ ConcreteParasitics::checkAnnotation2(const Pin *drvr_pin,
|
||||||
ParasiticNode *node,
|
ParasiticNode *node,
|
||||||
ParasiticDevice *from_res,
|
ParasiticDevice *from_res,
|
||||||
PinSet &loads,
|
PinSet &loads,
|
||||||
ParasiticNodeSet &visited_nodes)
|
ParasiticNodeSet &visited_nodes,
|
||||||
|
ParasiticDeviceSet &loop_resistors)
|
||||||
{
|
{
|
||||||
const Pin *pin = parasitics_->connectionPin(node);
|
const Pin *pin = parasitics_->connectionPin(node);
|
||||||
if (pin)
|
if (pin)
|
||||||
|
|
@ -1671,13 +1674,19 @@ ConcreteParasitics::checkAnnotation2(const Pin *drvr_pin,
|
||||||
ParasiticDeviceIterator *device_iter = parasitics_->deviceIterator(node);
|
ParasiticDeviceIterator *device_iter = parasitics_->deviceIterator(node);
|
||||||
while (device_iter->hasNext()) {
|
while (device_iter->hasNext()) {
|
||||||
ParasiticDevice *device = device_iter->next();
|
ParasiticDevice *device = device_iter->next();
|
||||||
if (parasitics_->isResistor(device)) {
|
if (parasitics_->isResistor(device)
|
||||||
|
&& loop_resistors.find(device) == loop_resistors.end()) {
|
||||||
ParasiticNode *onode = parasitics_->otherNode(device, node);
|
ParasiticNode *onode = parasitics_->otherNode(device, node);
|
||||||
// One commercial extractor creates resistors with identical from/to nodes.
|
// One commercial extractor creates resistors with identical from/to nodes.
|
||||||
if (onode != node
|
if (onode != node
|
||||||
&& device != from_res
|
&& device != from_res) {
|
||||||
&& visited_nodes.find(onode) == visited_nodes.end())
|
if (visited_nodes.find(onode) == visited_nodes.end())
|
||||||
checkAnnotation2(drvr_pin, onode, device, loads, visited_nodes);
|
checkAnnotation2(drvr_pin, onode, device, loads,
|
||||||
|
visited_nodes, loop_resistors);
|
||||||
|
else
|
||||||
|
// resistor loop
|
||||||
|
loop_resistors.insert(device);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete device_iter;
|
delete device_iter;
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ class ConcreteParasiticDevice;
|
||||||
typedef Map<const Pin*, ConcreteParasitic**> ConcreteParasiticMap;
|
typedef Map<const Pin*, ConcreteParasitic**> ConcreteParasiticMap;
|
||||||
typedef Map<const Net*, ConcreteParasiticNetwork**> ConcreteParasiticNetworkMap;
|
typedef Map<const Net*, ConcreteParasiticNetwork**> ConcreteParasiticNetworkMap;
|
||||||
typedef Set<ParasiticNode*> ParasiticNodeSet;
|
typedef Set<ParasiticNode*> ParasiticNodeSet;
|
||||||
|
typedef Set<ParasiticDevice*> ParasiticDeviceSet;
|
||||||
|
|
||||||
// This class acts as a BUILDER for all parasitics.
|
// This class acts as a BUILDER for all parasitics.
|
||||||
class ConcreteParasitics : public Parasitics, public EstimateParasitics
|
class ConcreteParasitics : public Parasitics, public EstimateParasitics
|
||||||
|
|
@ -221,7 +222,8 @@ protected:
|
||||||
ParasiticNode *node,
|
ParasiticNode *node,
|
||||||
ParasiticDevice *from_res,
|
ParasiticDevice *from_res,
|
||||||
PinSet &loads,
|
PinSet &loads,
|
||||||
ParasiticNodeSet &visited_nodes);
|
ParasiticNodeSet &visited_nodes,
|
||||||
|
ParasiticDeviceSet &loop_resistors);
|
||||||
|
|
||||||
// Driver pin to array of parasitics indexed by analysis pt index
|
// Driver pin to array of parasitics indexed by analysis pt index
|
||||||
// and transition.
|
// and transition.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue