• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Cadence Virtuoso Layout SKILL placement of multi point 45...

Stats

  • Replies 3
  • Subscribers 143
  • Views 628
  • Members are here 0

Cadence Virtuoso Layout SKILL placement of multi point 45 degree wire (not path) that passes off-grid DRC

AleksandrV
AleksandrV 16 days ago

Hi everyone,

I'm trying to automate some layout segment synthesis in Cadence Virtuoso using SKILL programming language.

1) The goal:
Create a multi-point trace with 45 degree bends using SKILL that passes DRC.

2) The problem:
The created path using dbCreatePath command for the top (no. 1 on the figure below) trace doesn't pass DRC check because of off grid errors in the parts where the path bends - specifically the outer points the value of which I can't edit. The track start, intermediate and end points are on grid, ex. (0 0) -> (1 0) -> (2 1) -> (3 1). The code example is given below (the synthesis part works fine, the coordinates here are just a bunch of variables, their value doesn't really matter...).


myPathSeg1n = dbCreatePath(cellID list(metalBot "drawing") list(startXn:startYn (midPointX - offsetX):startYn (midPointX + offsetX):stopYn (stopXn + singleViaSize):stopYn) trackWidth_um "squareFlush")


There is also a command to manually create a shape called Geometric wire (create-shape-geometric wire. The path to the command is different for new IC version, I believe it's just called Wire), which is the bottom trace (no 2 on the figure above). In this figure, this wire is has been created by hand and consists of multiple path segments (there was also an old post where Andrew Beckett mentioned that the layout wire is just a set of straight paths...), which are obviously chamfered (green arrows in the above figure). As far as I know, there is no direct SKILL command synthesize this the shape called "Wire" or "Geometric Wire" (in older versions), whereas LeHiCreateGeometricWire() simply calls up the geometric wire tool in the layout window to the mouse pointer (the placement is further done by hand).

I've also tried to recreate the a single bend of a drawn by hand geometric wire with two SKILL code lines for creating separate path segments
dbCreatePathSeg(cellID "M1" 0:0 0:1 .85 "variable" "variable" list(0 0))
dbCreatePathSeg(cellID "M1" 0:1 1:2 .85*sqrt(2) "chamfer" "chamfer" )

I managed to get the result in the figure below, but the chamfer is not flush with the edge of the first segment. The width of the chamfered segment is the same as the first one, the multiplication by sqrt(2) is required for 45 degree bent traces as mentioned in the documentation...

3) The question(s):
3.1) Maybe anybody dealt with synthesizing 45 degree traces in Cadence Virtuoso SKILL and avoiding the off grid error on the edges where the trace specifically bends?
3.2) Or maybe there is a way to recreate a wire placement using a specific SKILL command?
3.3) Or maybe there is a solution on how to make the chamfer in the second figure be flush with the track?

Any intake might help, as no further ideas on how to deal with this according to the available command description in the documentation and the problem actually feels like it's trivial...

  • Cancel
  • Sign in to reply
Parents
  • Andrew Beckett
    Andrew Beckett 16 days ago

    Creating the pathSegs correctly so that everything lines up can be a little challenging, so if you're OK with using an le* function (i.e. you're not trying to do this within a PCell), then I suggest that the simplest approach is to start by drawing a path (your code), since this is simple to construct:

    myPath = dbCreatePath(cellID list(metalBot "drawing") list(startXn:startYn (midPointX - offsetX):startYn (midPointX + offsetX):stopYn (stopXn + singleViaSize):stopYn) trackWidth_um "squareFlush")

    and then convert this to pathSegs:

    myPathSegs = leConvertShapeToPathSeg(myPath)

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • AleksandrV
    AleksandrV 15 days ago in reply to Andrew Beckett

    Hi Andrew,

    thanks for the lightning reply and the solution, everything works as intended.

    One short follow-up question for backward compatibility between different IC versions - I assume that  leConvertShapeToPathSeg is only available in the newer Virtuoso releases, I believe IC6.15 version didn't have this command available. Just wondering if there is a simple (or simple'ish) solution to run the same layout script on older versions.

    Thanks,
    Aleksandr

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • AleksandrV
    AleksandrV 15 days ago in reply to Andrew Beckett

    Hi Andrew,

    thanks for the lightning reply and the solution, everything works as intended.

    One short follow-up question for backward compatibility between different IC versions - I assume that  leConvertShapeToPathSeg is only available in the newer Virtuoso releases, I believe IC6.15 version didn't have this command available. Just wondering if there is a simple (or simple'ish) solution to run the same layout script on older versions.

    Thanks,
    Aleksandr

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
  • Andrew Beckett
    Andrew Beckett 13 days ago in reply to AleksandrV

    I'm not sure why you would need to support such old versions; this function was added in a hotfix of IC6.1.6 somewhere between ISR3 and ISR7 (I didn't have all available to test), but given that IC616 ISR7 is over 11 years old now and we've had (depending on how you count) 4 major releases since then (IC617,IC618,IC231,IC251), it seems excessive to have to support such an old obsolete version. 

    The simple answer is that it's not simple - you'd have to write code to deal with creating all the 45 degree segments and ends. There's an article on the support portal, but this doesn't handle 45-degree segments properly either (that was not what it was intended for).

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information