How to find floating metals (metals that are not connected to diffusion or poly or pins) in layout using SVRF?
The answer to this depends on what you mean by "not connected." If it simply means to find something like metal1 that doesn't touch diffusion or poly, then you could do this:
metal1_nodiff = metal1 NOT INTERACT diffusion
metal1_iso = metal1_nodiff NOT INTERACT poly
If it means to find something like metal1 that has no diffusion or poly on the same net, then you could do this:
metal1_iso = NET AREA RATIO metal1 OVER diffusion poly == 0
As for pins, it would depend on what the pin layers are, but these could be added to the operations above.
Thanks for the solution.
What would be the solution if metal1(M1) connected to metal2(M2) through via1 segment are not connected to diffusion?
I assume what you mean is M1 and M2 that mutually intersect a VIA1 shape do not touch diffusion or are not on the same net as diffusion.
If we are talking purely geometric connectivity (not electrical), you could do something like this:
// get metals outside of diffusionm1_outside_diff = M1 OUTSIDE DIFF
m2_outside_diff = M2 OUTSIDE DIFF
// get vias inside both metals and outside diffusion
v1_in_m2_m1 = (VIA1 INSIDE m2_outside_diff) INSIDE m1_outside_diff
// get metals outside diffusion that enclose appropriate vias
m2_enc = m2_outside_diff ENCLOSE v1_in_m2_m1
m1_enc = m1_outside_diff ENCLOSE v1_in_m2_m1
// desired metals on the same layer
m1_m2_not_diff = m1_enc OR m2_enc
If we are talking shapes on the same net, then let's assume this is specified:
CONNECT M1 M2 BY VIA1
and that is the only way M1 and M2 are connected electrically. Then you could do something like this:
// the following also finds M1 shapes not intersecting M2
m1_not_diff = NET AREA RATIO M1 DIFF == 0
// ensure m1_not_diff intersects M2
m1_not_diff_with_m2 = m1_not_diff NOT OUTSIDE M2
// the following finds M2 on the same net as m1_not_diff
m2_not_diff = NET AREA RATIO M2 m1_not_diff > 0
// metals not on the same node as diffusion
m2_m1_not_diff = m2_not_diff OR m1_not_diff_with_m2
Retrieving data ...