• 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. How to get all the really used layer in the cellview .

Stats

  • Locked Locked
  • Replies 9
  • Subscribers 143
  • Views 17476
  • 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

How to get all the really used layer in the cellview .

Charley Chen
Charley Chen over 14 years ago

Hi All,

How to get all the really used layer in the cellview .

I use geGetEditCellView()~>lpps , it shows some layers that not really exists when stream out gdsii file from PIPO.LOG.

foreach(lpp geGetEditCellView()~>lpps

         printf("Layer is %L\n"  lpp)

 )

Thank you,

Charley

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    Charley,

    The ~>lpps attribute gives you a list of all the layer purpose pairs either in this cellView or anything instantiated below (providing the lower levels have been loaded into memory). To get just those in this cellView you could do:

    lppsInThisCellView=setof(lpp geGetEditCellView()~>lpps plusp(lpp~>nShapes))

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Charley Chen
    Charley Chen over 14 years ago

    Hi Andrew,

    If cellview has shapes , it return (db:222231123) ..)  ==>  lppsInThisCellView=setof(lpp geGetEditCellView()~>lpps plusp(lpp~>nShapes))

    If cellview only has instances (include pcell ....), it return nil

    Cound you help it ?

    Thank you,

    Charley

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    Charley,

    If the cellView only has instances, no layers are actually used in that cellView, so it should return nil! If you want to see what is used down in the hierarchy, cv~>lpps tells you that already.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Charley Chen
    Charley Chen over 14 years ago

    Hi Andrew,

    Yes, cv~>lpps tell me , but when I stream out , all layers in PIPO.LOG not same as cv~>lpps.

    ;;cv~>lpps  >  PIPO.LOG layers

    If lppAll = cv~>lpps

    foreach(lpp lppAll

             printf("Layer is %L,%L\n" lpp~>layerName layer~>purpose)  ;;It shows the layer is not really in PIPO.LOG

    )

    I use leHiSearch() , it also can not find the layer , I want to filter cv~>lpps that not really exists

     

    Thank you,

    Charley

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    I'd have to see an example of where this does not work. I can imagine that stream out might not show it because the layer has been marked to not translate to stream. leHiSearch may not find something that's inside a pcell (I'm guessing).

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • dmay
    dmay over 14 years ago

    I have seen this before. What is probably happening is that you have a layer used in your pcells when all parameters are defaults, but that layer is not used when your pcell instance parameters are changed.

    For example, let's say you have a pcell called "nmos". If you place a default "nmos", maybe it has an implant layer. However, in the cellview you are describing you have placements of "nmos", but all of them have the implant layer turned off. The lpps attribute of the top cellview will show you the layers in all of the cells in the hierarchy, but for pcells, it is looking at their default representation in the library. Open each of your pcells directly from the pcell library and you should see the layer you are describing in one of those pcell masters.

    The only way around this is to traverse the hierarchy of your cellview, visiting every master once (including pcell submasters) and look at the lpps with nShapes as Andrew mentioned earlier.

    procedure( myGetLppsUsed(cv)
      let((masterTbl lppTable )
        masterTbl = makeTable("masterTbl" nil)
        lppTable = makeTable("table" nil)
        myGetLppsUsedHierTraversal(cv masterTbl lppTable)
        lppTable->?
      )
    )

    procedure(myGetLppsUsedHierTraversal(@optional (cv geGetTopLevelCellView()) masterTbl lppTable)
        foreach(masterList list(cv~>instanceMasters cv~>viaHeaders)
            foreach(master masterList
                unless(masterTbl[master]
                    unless(master~>isParamCell
                        masterTbl[master]=t
                        mapcar(
                            lambda((x)
                                lppTable[list(x~>layerName x~>purpose)] = t
                            )
                            setof(x master~>lpps x~>nShapes > 0)
                        )
                        myGetLppsUsedHierTraversal(master masterTbl lppTable)
                    )
                )
            )
        )
        t
    ) ;proc

    Derek

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    Derek raises a good point - although to clarify you will get the lpps used for both the pcell superMaster (which is effectively the layout corresponding to the default parameters) and all pcell subMasters (i.e. all variants that exist).

    This means that if you have layers used in the default, but in none of the actual variants used, then cv~>lpps will list these too. It errs on the side of too many lpps rather than too few.

    If you really need to filter out which are truly not used, you'd have to use an approach such as Derek suggests.

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Charley Chen
    Charley Chen over 14 years ago

    Hi Derek,

     It works. It is very helpful.

    Thank you very much,

    Charley

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Charley Chen
    Charley Chen over 14 years ago

    Hi Andrew,

    Thank you for explanation.

    Charley

    • 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