Get email delivery of the Cadence blog featured here
Have you ever found yourself in a situation where all the wire segments in a bus are on different metal layers? Did you ever think about interactively routing a bus on two metal layers at the same time, for example M1 and M3, to gain productivity and achieve tighter spacing than would be possible on a single metal layer?
Until now, interactive routing did not support bus creation on multiple metal layers at the same time, just one metal layer at a time. You can start a single-layer bus from pins, wires, or vias. But when you start a multi-layer bus from pins, wires, and vias on different metal layers, it becomes difficult to route multiple nets on different metal layers. The methodology required is to manually split the bus into alternating parts (such as odd and even parts) and then route them in two passes. This method is cumbersome and it is difficult to get good results.
So, have there been any improvements in this area and is it now possible to create and route a bus on several metal layers simultaneously?
Yes, indeed! The multi-layer bus feature is the answer.
Now, with the new multi-layer bus feature, you can create and digitize bus bits on different metal layers. At the same time, you can also adjust the spacing between the bus bits based on default constraints, source and target objects, and spread.
A multi-layer bus can be created from the following starting points:
When you create a multi-layer bus from an empty space, you can create the multi-layer bus with a customized layer pattern. In a customized layer pattern, each bus bit is defined with a layer name or a layer-purpose pair.
The custom layer pattern is a string. The syntax to define a custom layer pattern is:
(layerName1 [purposeName1] layerName2 [purposeName2] ...) [(layerName3 [purposename3]) ...]
Here are some examples of how a multi-layer bus is created when started from an empty space, based on the defined custom layer patterns.
To create a multi-layer bus from an existing source, such as pins, wire, and vias, enable the Multi Layer Bus Selection option in the Create Bus context-sensitive menu. The figure below shows how a multi-layer bus is created when starting from pins on different metal layers.
In a multi-layer bus, you can switch bus bits between layers by moving up or down one or multiple layers at a time. You can also move all the bus bits to the same layer, and then switch back to a multi-layer configuration. But this can be done only after inserting the appropriate vias.
Switching the bus bits between a multi-layer configuration provides an easy way to tunnel the bus on one layer and then quickly and easily switch back to the multi-layer configuration. The example here shows how the bus bits transition from multiple metal layers to the same metal layer and then revert back to the multi-layer bus configuration.
Is it possible to start a single-layer bus and easily switch to a multi-layer bus configuration? Yes, indeed it is.
To maximize the flexibility and power of the multi-layer bus feature, you can define SKILL procedures for creating complex multi-layer bus transition patterns, which makes the feature highly customizable. The steps involved to customize multi-layer bus transition are shown in the figure below.
Write a SKILL procedure in the Command Interpreter Window (CIW). You can also write the SKILL procedure in a .il file and then load the file in CIW. The defined procedure can also be saved into a local directory as <filename>.il. To load the procedure from the saved file into Virtuoso, specify the following command in CIW.
The following example defines a procedure that alternates the bus bits from Metal1 to Metal4 and from Metal2 to Metal5 and the reverse. This transition of bus bits is applied to the complete bus whatever its size.
(procedure (St14 cellViewId args)
(let (techFileId netLayerPair layerNum newLayerName newLayerNum layerName result)
result = nil
techFileId = (techGetTechFile cellViewId)
foreach netLayerPair args
layerNum = (cadr netLayerPair)
layerName = (techGetLayerName techFileId layerNum)
newLayerName = layerName
newLayerName = "Metal4"
newLayerName = "Metal5"
newLayerName = "Metal1"
newLayerName = "Metal2"
result = (tconc result newLayerName)
The following figure shows the output when the above SKILL procedure is run.
All bits on Metal1 move up to Metal4
All bits on Metal2 move up to Metal5
All bits on Metal4 move to Metal1
All bits on Metal5 move to Metal2
Bus bits on other metal layers remain unchanged.
Include the defined SKILL procedure as a menu item on the Via submenu in the Create Bus context-sensitive menu and assign a bindkey to it. To add the SKILL procedure as a menu option on the Via submenu, use the weAddCustomTransitionMenuItem SKILL API. You can then quickly access and run the SKILL procedure by using the bindkey or by clicking the associated menu option from the submenu.
The defined procedure is called by the system when you click the associated menu option from the Via submenu or use the assigned bindkey.
The How to define custom transitions option available on the Via submenu provides information about how you can customize the multi-layer bus functionality.
Multi-layer Bus Support in Wire Editing
Customizing Multi-Layer Bus Transition
Note: For more information on routing related Cadence products and services, visit www.cadence.com.
Virtuosity has been our most viewed and admired blog series for a long time that has brought to fore some lesser known, yet very useful software and documentation improvements, and also shed light on some exciting new offerings in Virtuoso. We are now expanding the scope of this series by broadcasting the voice of different bloggers and experts, who would continue to preserve the legacy of Virtuosity, and try to give new dimensions to it by covering topics across the length and breadth of Virtuoso, and a lot more… Click Subscribe to visit the Subscription box at the top of the page in which you can submit your email address to receive notifications about our latest Virtuosity posts. Happy Reading!