There is not an easy way to do this in Skill. It can be done, but the code could get complicated depending on whether you are dealing with multiple levels of hierarchy or not. It is not difficult to calculate the length of a path by traversing its points and summing the point to point deltas. You also need to be able to trace the net by going from the metal2 path through the via23 to metal3. Cadence markNet will highlight this for you, but will not return any shapes.
So the short answer is no, there isn't any simple skill to do this.
In reply to dmay:
These types of traces are usually done with analysis tools such as a DRC/LVS tool. They have a ruleset which describes the layer relationship and can trace the circuit through the various levels and metals. The circuit length is then extracted. If you want to persue it in SKILL, the command you will want to use is dbGetTrueOverlaps. It can find anything in the hierarchy within a bounding box.You can make some assumptions about vias, that they do connect from one level to the next, without having to analyze them.
In reply to Austin CAD Guy:
can i get the length in um..? Is that possible.. this will help me in caluculating the current flow...
In reply to bharath2k4er:
This will depend on the extraction tool you are using and how the routing is created. If it is centerline paths, you can probably get the length but if it is polygons, the length calculation is much harder.
requirement goes like this...
wanted to find the length of a net(it may switch from any layers metal1
to 2 or metal2 to 3...etc)..
from source to destination.. I dont want any caluculations.. just the length in um
In reply to skillUser:
I have worked on the above script.. It is able to give me length of the path..
Path length: 14.88
But, we expect it to give us the length if the metal is switching( say i have metal1 running for 10um and switched to metal2 for other 10um, output should be total drawn length 20um )
Also it is not able to give the length of rectangles and polygons.. Will it be possible to find the length of shapes..?
Lawrence indicated that you will have to do some extra work to handle layer changes. This is not trivial and depends on whether your shapes are all at the top level or spread across multiple levels of hierarchy. It can actually be quite simple if your shapes are all at the top level and you are using VXL. In this case, all shapes on a given net will have the net attribute.
netShapes = setof(x geGetEditCellView()~>shapes x~>net~>name=="myNet")
If this is not the case, then you could expand Lawrence's script and run dbGetTrueOverlaps for the bounding box of each segment of the path. You could look for vias or contacts that transition to the next metal layer.
Here is some pseudo code (assuming only paths and all shapes/vias at top level of hierarchy):
shp = shape under the point ; Lawrence does this with enterPointshpList = list(shp)totL = 0while shp = car(shpList) unless visited[shp] visited[shp] = t shpList = cdr(shpList) foreach segment on path ; Lawrence does this by looping through obj~>points L = length of segment bbox = bounding box of segment totL = totL + L connectedShapes = dbGetTrueOverlaps using shp~>lpp and bbox at level 0; find overlapping shapes on same layer foreach newShp connectedShapes unless visited[newShp] shpList = cons(newShp shpList) overlappingVias = dbGetTrueOverlaps using nil for the layer to only get instances at level 0 foreach via overlappingVias check for overlapping shapes on the connecting metal (if shp is metal1 and via connects to metal2, look for overlapping metal2) add new shapes to shpList unless they have already been visited
This is a very basic idea, but gives you an idea of the complexity involved. You mentioned that you wanted lengths of polygons and rectangles. This is very subjective. The length of a rectangle can be either its width or its height, but you really want to measure based on the direction of current flow which is not always the longer distance. A reasonable approximation for the length of a polygon might be taking the perimeter and dividing by two.
Keep in mind, this is a forum to help answer questions and provide help and ideas. It is by no means a design services group. For a complex request like this, don't expect to get a complete piece of working code.
Thank you Derek, you are kinder than I would have been :-)
It might be possible to guess which direction the path was traveling (for a segment?) and from this you might be able to work out which dimension of a rectangular shape to take into consideration for the path length. I believe that Derek's pseudo-code shows how to"walk the shapes" in a similar fashion to the way that Mark Net does. I was just looking to see if Mark Net used hilight objects or probes to mark the shapes and if these are available in SKILL, but I could not find the objects associated with the marked net - this would have been a nice way to get the shapes involved, and then the task might have been easier. Even without Mark Net, you can use Derek's example to find the shapes involved, and even copy and merge these in a scratch cellview so that you only have one path/polygon to work with, then it would be a fairly straightforward thing to find the length of such a shape.
Another approach is to use extraction tools such as Diva or Assura to follow a path and measure the length, but I do not work with these tools enough to really be able to help in that direction.
Apart from this, as Derek mentions, this is not a trivial undertaking, and unlikely to be answered in full in such a forum.
When I wrote this code I made the users select the entire net, tough not intuitive it is more than enough for most chips we do. But if You want the tool to traverse the path then one way is to ivDRC to trace the entire net and save it a cell ( I'm guessing ivDRC save the result in a view) then just calculate the length of individual metals ( I hope its easy to differentiate which are metals and which are vias) and sum it.
Corrections are welcome.
In reply to babji:
When you wrote what code? The only code I saw is what I posted. It is difficult to comment or correct on invisible code.
I meant the code that I wrote when I was given the same spec. I did not post the code here but I just gave the suggestion.
Do it as an offset subpath rather than an enclosure subpath. Then you can specify ?sep and ?width to control the separation (sideways offset) and width of the path.
In reply to Andrew Beckett: