• 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 Design
  3. Layer Generation of Multiple Layers in Virtuoso

Stats

  • Locked Locked
  • Replies 10
  • Subscribers 125
  • Views 13887
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Layer Generation of Multiple Layers in Virtuoso

Tom Sawyer
Tom Sawyer over 4 years ago

Hi Cadence Forum,

On Virtuoso, is it possible to generate multiple layers based on an existing polygon?
For example, there is an existing prboundary boundary and I would like to generate m1block drawing, m2block drawing etc. with the same shape as the prboundary boundary.

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago

    Something like this SKILL could be used - it has a keyword argument, so you can also pass in the list of layers to copy to:

    procedure(CCFcopyPrBoundaryToLPPs(@key 
            (cvId geGetEditCellView())
            (lpps list(
                list("m1block" "drawing") list("m2block" "drawing") 
                list("m3block" "drawing") list("m4block" "drawing") 
                list("m5block" "drawing") list("m6block" "drawing") 
                )
            )
        )
        let((points)
            points=cvId~>prBoundary~>points
            unless(points
                error("CellView does not contain prBoundary\n")
            )
            foreach(lpp lpps
                dbCreatePolygon(cvId lpp points)
            )
            t
        )
    )
    

    For example: CCFcopyPrBoundaryToLPPs(?lpps list(list("M1nofill" "drawing") list("M2nofill" "drawing")))

    Change the code as you need to set suitable defaults.

    Andrew

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • Tom Sawyer
    Tom Sawyer over 4 years ago in reply to Andrew Beckett

    Thanks, Andrew. I will try this solution and see if it works.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tom Sawyer
    Tom Sawyer over 4 years ago in reply to Andrew Beckett

    Hi Andrew, Thanks it works perfectly.
    Just a follow-up question. What if I would like to change the reference polygon from prboundary "boundary" to for example M1 "drawing" how should I change your SKILL script?

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to Tom Sawyer

    Hi Perry,

    What would that mean if you have multiple M1 drawing shapes? Do you want to duplicate all of them? There's only ever one prBoundary object, so that's easy - but you could have many M1 drawing shapes...

    Andrew 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tom Sawyer
    Tom Sawyer over 4 years ago in reply to Andrew Beckett

    Hi Andrew,
    Sorry for the bad example.
    What I mean is I would also like to make a SKILL script that will also work with prboundary "drawing", currently it is working with prboundary "boundary".
    It would be great if it could work on both of these layers.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to Tom Sawyer

    prBoundary (in OpenAccess releases) is not a shape drawn on a layer-purpose-pair. It's an object in its own right - and does not have a layer or purpose. It's drawn using the packet for the prBoundary/boundary layer-purpose, but it's not stored in the database as a shape on a layer-purpose. Because it's a distinct object, there can only be a single prBoundary polygon in the cellView.

    It's created using Create->P&R Objects->P&R Boundary.

    So it doesn't really help - if you are talking about something on "prBoundary drawing" then that must be a shape, and a non-conventional way of describing the prBoundary (unless of course you're using IC5141, which would have been quite important to mention, since in IC5141 various special objects were drawn as shapes with special meaning). Shapes on prBoundary/drawing don't really mean anything, and there also could be many of them.

    To summarise, I'm not sure what you want - or whether you really do have shapes on prBoundary/drawing (if so, why?), or how it should deal with multiple such shapes?

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tom Sawyer
    Tom Sawyer over 4 years ago in reply to Andrew Beckett

    Hi Andrew, thanks for the detailed explanation.
    The thing is, I am working with multiple layouts and some of them are using prBoundary "drawing" and some are using prBoundary "boundary" (See attached image).
    I was wondering if it is possible to make the SKILL script work on both layers instead of changing all to prBoundary "boundary".

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 4 years ago in reply to Tom Sawyer

    Just because you see them in the layer palette doesn't necessarily mean the prBoundary/boundary is a normal shape - and if it is, it's probably not being used genuinely as a prBoundary because the tools won't recognise that.

    Anyway, this function would allow you to copy from an arbitrary layer-purpose pair to multiple layers:

    procedure(CCFcopyLPPtoLPPs(LPP @key
            (cvId geGetEditCellView())
            (lpps list(
                list("m1block" "drawing") list("m2block" "drawing") 
                list("m3block" "drawing") list("m4block" "drawing") 
                list("m5block" "drawing") list("m6block" "drawing") 
                )
            )
        )
        foreach(lpp lpps
            leLayerOr(cvId LPP LPP lpp)
        )
        t
    )

    Just use: CCFcopyLPPtoLPPs(list("prBoundary" "drawing")) or also pass ?lpps as with the other function above. I kept it simple and used leLayerOr to copy (and merge) all of the shapes from a layer-purpose to another.

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Tom Sawyer
    Tom Sawyer over 3 years ago

    Hi Andrew Beckett,
    Good morning

    I was looking for a similar SKILL script, but for deletion of layers.
    My idea is to replace

         dbCreatePolygon(cvId lpp points)

    with

         leHiDelete(cvId lpp points)

    But it is not working.

    Please help.

    Best regards,
    Tom

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 3 years ago in reply to Tom Sawyer

    Tom,

    That won't work, because leHiDelete takes a window id as an optional argument, not cvId, layer-purpose and points. It's intended to be an interactive function.

    I've no idea what you're trying to do here - the code is intended to create new shapes on a layer from the points on a prBoundary object. I don't know what you're trying to delete, or why you'd start from the points of the prBoundary.

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • 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