This article explains why PERC P2P can report only one CDM path even though the ESD protection cell is used multiple times and how this might be changed.
If the same ESD Protection cell is used for different pads, in some cases, depending on how the perc rule is written (For example, in GF55nm PERC deck) PERC P2P is reporting only one CDM Path.
For example, below in the screenshot you can see that the picio33x33rm6_5xealib_inout_mvst_st_pu_pd_t3p3_04s cell is instantiated as X7 & X8 but only the X7-related CDM path is getting reported:
The reason for this behavior is that the deck/perc rules are designed to exclude top-level nets from being selected.
Calibre is a hierarchical tool. Reporting problems at the cell level is usually preferred. In this case, each instance of the cell in the netlist needs to be referenced to different top-level connections.
The best approach to avoid this issue is to rewrite or ask the foundry to rewrite the rules to report these primitive CDM devices in an instance of the cell with respect to the top-level signal net.
The updated code can look like this:
Original code causing hierarchical reporting:
perc::define_net_type_by_device EsdRes -type R -cell
Modified Code fixing the issue by referencing Top Level net for net type definition:
set TopPortNum [llength [perc::expand_list lvsTopPorts -type net] ]
set counter 1
foreach topNet [perc::expand_list lvsTopPorts -type net] {
perc::define_net_type Top_$topNet $topNet
perc::define_net_type_by_device EsdRes_$topNet -type R -pin { pos } -pinNetType " neg Top_$topNet " -cell
perc::define_net_type_by_device EsdRes_$topNet -type R -pin { neg } -pinNetType " pos Top_$topNet "
if { $counter == 1 } {
set typeSetList EsdRes_$topNet
} else {
lappend typeSetList ||
lappend typeSetList EsdRes_$topNet
}
incr counter
}
perc::define_type_set EsdRes $typeSetList