Product Documentation
Virtuoso Layout Suite SKILL Reference
Product Version IC23.1, November 2023

lxChain

lxChain(
l_insts
l_point
[ ?groups l_groups ]
[ ?preserveExistingChains { t | nil } ]
[ ?useDeviceOrder { t | nil } ]
[ ?interdigitateChains { t | nil } ]
[ ?mirror { t | nil } ]
[ ?permute { t | nil } ]
[ ?allowSingleBulk { t | nil } ]
[ ?dummyFlexBothEndNets { t | nil } ]
[ ?syncChains { t | nil } ]
[ ?mirrorEquivOrients { t | nil } ]
[ ?preserveRows { t | nil } ]
[ ?useAbutSpacing { t | nil } ]
[ ?maxChainSize x_maxChainSize ]
[ ?contacts { 0 | 1 | 2 } ]
[ ?chainAlignPMOS { Top | Center | Bottom } ]
[ ?chainAlignNMOS { Top | Center | Bottom } ]
[ ?chainLeftNet { Source | Drain | Either } ]
[ ?abutStrategy { sdFirst | dummyFirst } ]
[ ?optimize { Tracks | Abutments | Both } ]
[ ?multiRow { NP | PN | NPPN | PNNP } ]
[ ?effort { Minimal | Nominal | Maximal } ]
)
=> l_chains / nil

Description

Chains a list of instances and places the generated chains at the specified position in the layout. Using the optional arguments will override the existing settings of the environment variables: chainPreserveExistingChains, chainUseDeviceOrder, lxAllowPseudoParallelNets, chainMirror, chainPermutePins, chainAllowSingleBulk, chainDummyFlexBothEndNets, chainSyncChains, chainMirrorEquivOrients, chainPreserveRows,chainUseAbutSpacing, lxChainAlignPMOS, lxChainAlignNMOS, chainLeftNet and chainAbutStrategy.

Arguments

l_insts

Database IDs of the instances to be chained.

l_point

Defines the position of the first instance in the generated chain.

For more information about this argument, see Positioning of Chains.

?groups

List of groups where each group is a list of instances. Builds a group chain for each group. The group chains can be mirrored and are always preserved.

The default is nil.

?preserveExistingChains

Prevents existing chains from being broken.

The default value is nil.

If useDeviceOrder and preserveExistingChains arguments are both set, the SKILL function maintains the existing abutments.

?useDeviceOrder

Maintains the relative starting positions of the specified instances when forming the chain. Instances are sorted in XY order of their origins (from lowest to highest) and the resultant list used to abut the devices from right to left.

The default value is nil.

Note:

- If useDeviceOrder is set to t, devices are chained even if their S/D pins are on different nets. In this case, the devices are abutted on dummy pins. In addition, when all the advanced node devices have the same bulk, all the individual chains created using these devices are merged into a single chain.

- If useDeviceOrder is set to t, the lxChain() function supports abutment of instances that have different values set for the abutClass property but have their abutClass values defined as equivalent. If useDeviceOrder is set to nil, these equivalentAbutClasses are ignored.

- If useDeviceOrder and preserveExistingChains arguments are both set, the SKILL function maintains the existing abutments.

?interdigitateChains

Identifies and defines the pseudo parallel nets.

The default value is nil.

?mirror

Mirrors instances.

The default value is t.

For more information about the behavior of this argument, see Mirroring and Permutation.

?permute

Permutes instances.

The default value is t.

For more information about the behavior of this argument, see Mirroring and Permutation.

?allowSingleBulk

Abuts devices if only one of the devices has a bulk and the ?useDeviceOrder argument is set to t.

The default value is t.

The value of the ?allowSingleBulk argument defaults to the value of the chainAllowSingleBulk environment variable.

?dummyFlexBothEndNets

(IC6.1.8 Only) Controls whether the dummy devices can have different source/drain connectivity.

The default value is t.

?syncChains

Synchronizes chains by abutting the specified instances by columns. The instances are first arranged into rows and then abutted row-wise from right to left in each column pair.

  • For columns that have no instances in the row being abutted, abutment does not take place. Such columns are spaced out.
  • When set to nil, instances are abutted by row, irrespective of the number of instances in each row.

The ?syncChains argument uses the row bBox-Y overlaps to determine the rows that need to considered for synchronizing the chains.

The ?syncChains argument does not support groups. However, in case of a single row, groups are supported by calling the non-syncChains algorithm with ?useDeviceOrder set to t if groups exist, and the number of rows is 1.

The value of the ?syncChains argument defaults to the value of the chainSyncChains environment variable. By default, the value of chainSyncChains is nil.

For more information, see Synchronized Chaining.

?mirrorEquivOrients

Mirrors to equivalent orientations. which means that Chaining mirrors R0 to MY or vice versa.

The default value is t.

When set to nil, Chaining mirrors MX to R180 and vice versa.

?preserveRows

Accepts multiple rows as input and chains each row using the optional parameters supplied and with useDeviceOrder set.

  • If flat instance list is supplied, the instances are sorted into rows.
  • If list of rows is supplied, the rows are used as specified.
The supplied position defines the lower left of the bottom row.

?useAbutSpacing

Controls how chains are spaced.

If set to t, chains are spaced using the abutment spacing value. If set to nil, chains are spaced using the value of the lxPositionMinSep environment variable.

The default value is nil.

?maxChainSize x_maxChainSize

Defines the maximum chain size, specified using any integer value between 1 to INT_MAX.

The default value is INT_MAX.

?contacts

Controls whether abutment will delete or keep contacts.

  • 0 means abutment will automatically determine if contacts should be deleted or kept.
  • 1 means abutment will delete contacts.
  • 2 means abutment will keep contacts.

The default value is 0.

?chainAlignPMOS

Controls PMOS chaining alignment using values: "Top", "Center", and "Bottom". The values should be enclosed in quotation marks.

The default value is "Top".

?chainAlignNMOS

Controls NMOS chaining alignment using values: "Top", "Center", and "Bottom". The values should be enclosed in quotation marks.

The default value is "Bottom".

?chainLeftNet

Controls whether source or drain nets are optimized to the left of the generated chains. Set to "Either" if you have no preference (and to maintain the default behavior from previous releases). The values should be enclosed in quotation marks.

The default value is "Source", which means the generated chain is optimized so that one of its source nets is on the left-hand side of the chain if possible.

Note:

  • Source and drain refer to schematic source and drain nets, not layout source and drain nets, which may have been permuted.
  • ?chainLeftNet is an optional argument, which, if set, will override the existing setting of the chainLeftNet environment variable.

?abutStrategy

Abuts on source/drain or dummy shapes first.

The default value is sdFirst.

  • If set to sdFirst, abuts on source/drain first. If this fails, tries abutting on dummy shapes.
  • If set to dummyFirst, abuts on dummy shapes first. If this fails, tries abutting on source/drain.

?optimize

Optimizes the chains by minimizing the number of tracks or maximizing the number abutments or both.

The default value is "Both".

?multiRow

Controls the row order from bottom to top for multi-row placement.

The default is "".

?effort

Controls the effort applied during chaining. Increased effort can improve the quality of results, but it can be time-consuming.

The default is Nominal.

Value Returned

l_chains

List of chains generated where each chain is identified as a list of database IDs.

nil

The specified instances were not chained.

All arguments that take a string value must have their values enclosed in quotation marks.

Examples

Example 1

lxChain(list(p0 p1 p2) 0:0 ?useDeviceOrder t ?mirror t ?permute t ?chainAlignPMOS “Center” ?chainLeftNet “Source”)

Chains devices “|P0”, “|P1” and “|P2” in XY order with odd devices mirrored and even devices permuted. The generated chains are placed at position 0:0 and are center-aligned with source nets optimized to the left.

Example 2

lxChain(list(n0 n1 n2) 5:5 ?preserveExistingChains t ?mirror nil ?permute t ?chainAlignNMOS “Top” ?chainLeftNet “Drain”)

Chains devices “N0”, “|N1” and “|N2” with all devices permuted and existing chains preserved. The generated chains are placed at position 5:5 and are top-aligned with drain nets optimized to the left.

Example 3

lxChain(list(p0 p1 p2 n0 n1 n2) 10:10 ?useDeviceOrder t ?mirror t ?permute nil ?multiRow “NPPN” ?optimize “Abutments” ?effort “Maximal”)

Chains devices “|P0”, “|P1”, “|P2” “N0”, “|N1” and “|N2” in XY order with odd devices mirrored and even devices not permuted. The generated chains are placed in multi-row pattern NPPN with the bottom row at position 10:10. Abutments are maximized with effort set to maximal for best quality of results.

Example 4

lxChain(geGetSelSet() 0:0 ?preserveRows t)

Sorts the selected set into row order and then chains each row using the default optional parameters with useDeviceOrder set. The lower left of the bottom row is positioned at 0:0.

lxChain(list(list(I0 I1) list(I2 I3 I4)) 0:0 ?preserveRows t)

Chains rows (I0 I1) and (I2 I3 I4) using the default optional parameters with useDeviceOrder set. The lower left of I2 is positioned at 0:0.

Example 5

lxChain(list(p0 p1 p2) 0:0 ?useAbutSpacing t)

Chains the named devices and spaces each chain using the abutment spacing value.

Example 6

lxChain(geGetSelSet() 0:0 ?useDeviceOrder t ?groups list(list(dbId1 dbId2) list(dbId3 dbId4 dbId5)))

Chains a list of instances into a group.

Additional Information

Positioning of Chains

The lxChain SKILL function uses the l_point argument to position the first instance of the generated chains.

Mirroring and Permutation

For mirroring and permutation, lxChain depends on the state of the ?mirror and ?permute arguments:

Synchronized Chaining

Synchronized chaining using the syncChains argument can help make a design more routable by allowing each column to be aligned on the same net for all the rows. Abutment in this case is performed in column pairs, not rows—abutting the specified instances from right to left, starting from the bottom most row in the column pair to the top most row, and using the specified mirror and permute options.

The abutment begins with looking for the common net that applies to instances in all the rows within the column pair.

If the common net is found:

For a column pair that abuts, the contacts are consistently either dropped or kept for a column. Therefore, in a column pair, you can have one column with contacts dropped and the other with contacts kept. But, you cannot have a column that has one pair with contacts dropped and the other with contacts kept.
For situations, where any column pair cannot abut on any net and abutment using the dummyFirst abutStrategy is not possible, the column pair is unabutted.

Example: SyncChaining

lxChain(list(list(dbId1, dbId2) list(dbId3, dbId4, dbId5)) 0:0 ?syncChains t)
where,
row1 = list(dbId1, dbId2)
row2 = list(dbId3, dbId4, dbId5)

Illustrates how the rows are used, if the list of rows is specified.

lxChain(list(dbId1, …, dbIdN) 0:0 ?syncChains t)
Illustrates how the instances are sorted into rows using the Y co-ordinate of the instance origin, if the flat instance list is specified.

Chaining Photonic Waveguide Instances and Top-Level Photonic Pins

To use the lxChain SKILL function for chaining waveguide instances and top-level photonic pins, you must have the Virtuoso_Photonics_Option license checked out to run the Virtuoso Photonics Solution.

None of the optional arguments of the lxChain SKILL function are supported for the Virtuoso Photonics Solution. For information on obtaining the required license, contact your local Cadence representative.

Related Topics

Layout XL Environment Variables


Return to top
 ⠀
X