• 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. help with branch decision on layout heirarchy and DbCon...

Stats

  • Locked Locked
  • Replies 3
  • Subscribers 143
  • Views 13232
  • 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

help with branch decision on layout heirarchy and DbConcatTransform

malcolm70
malcolm70 over 4 years ago

Hi Cadence - 

need help with layout heirarchy.  I have a layout cell where I have bunch of labels, and I am using dbGetOverlaps() for locating the underneath rectangle.

I'm using cadence 18. 

My current flow is something like:

labelgroup=selectedSet()

foreach(label labelgroup

   overlapShape=dbGetOverlaps(cvID label~>bBox layerUnderneath 3)  ; look 3 levels down

  ) ; foreach

step1=dbConcatTransform(car(list) car(cadr(list))

step2 =dbConcatTransform(step1 car(cadr(cadr(list))))

shapePoints=dbTransformBBox(shape~>bBox step2)

the problem is "SOMETIMES" the shape I want isn't 3 levels down, it's actually 2 levels down.

The return list is *USUALLY* something like (db:xxxxxxx  (db:xxxxx (dbxxxx dbxxxx)))  the final pair is of course the rectangle and it's instance location

The problem is that I have *TWO* hardcoded concatTransform statements and then transformBBOX.

When the heirarchy level is 2 the second time I call concattransform I should be calling dbTransformBBox() and so the loop crashes. 

I can't figure out , I need some sort of test for the structure (dbxxxx dbxxxx)  , perhaps can I put concat transform in a while loop to check the list

length to find out  if that rectangle db id  is still down only one level.   Thanks in advance.  Malcolm  

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 4 years ago

    Hi Malcolm,

    I think you probably just need to use dbGetHierPathTransform to get the overall transformation from the overlap list, and abGetHierShape from this post to get the shape itself. That post also shows using dbGetHierPathTransform.

    Does that help?

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 4 years ago

    Hi Malcolm,

    I think you probably just need to use dbGetHierPathTransform to get the overall transformation from the overlap list, and abGetHierShape from this post to get the shape itself. That post also shows using dbGetHierPathTransform.

    Does that help?

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
  • malcolm70
    malcolm70 over 4 years ago in reply to Andrew Beckett

    Hi Andrew - thanks for the idea - I have success with the 3rd level down coordinate transform , but the defun abGetHeirPathShape gives an error.

    I loaded in the defun as this:

    (defun abGetHierPathShape (overlaps)
    (if (listp overlaps)
    (abGetHierPathShape (cadr overlaps))
    overlaps))

    then one at a time I added these lines :

    cv=geGetEditCellView()
    label=css()
    overlaps=dbGetTrueOverlaps(cv label~>bBox layer~>lpp 3 t)  ; layer is particular to my pdk...
    shape=abGetHierPathShape(overlaps)

    error message on CIW is :

    *Error* abGetHierPathShape: Runtime stack overflow caused by too deep recursion. Decrease the call stack level.
    <<< Stack Trace >>>
    abGetHierPathShape(cadr(overlaps))
    if(listp(overlaps) abGetHierPathShape(cadr(overlaps)) overlaps)
    abGetHierPathShape(cadr(overlaps))
    if(listp(overlaps) abGetHierPathShape(cadr(overlaps)) overlaps)
    abGetHierPathShape(cadr(overlaps))
    if(listp(overlaps) abGetHierPathShape(cadr(overlaps)) overlaps)
    ...

    If I use the statement : shape=cadr(car(reverse(car(overlaps))))  

    that seems to get the database key id for the shape, just wondering how to use the defun you mentioned.

    please advise, thank you.

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

    Malcolm,

    The issue is that dbGetTrueOverlaps/dbGetOverlaps returns a list of overlaps, each of which is a list. So you would need to loop over the result of dbGetTrueOverlaps to deal with each individual match. If there was only one, then you could do:

    shape=abGetHierPathShape(car(overlaps))

    Or you would do something (as in the post I referenced earlier) like this:

    foreach(overlap overlaps
      shape=abGetHierPathShape(overlap)
      transform=dbGetHierPathTransform(overlap)
      printf("transformed bbox is %L\n" dbTransformBBox(shape~>bBox transform))
    )

    You changed the argument name in the implementation of abGetHierPathShape, which doesn't affect anything, but confuses the meaning - in the original code the argument was called "overlap" which expressed better that it was dealing with a single overlap.

    Regards,

    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