• 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. Scanning through symbol db

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 143
  • Views 13626
  • 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

Scanning through symbol db

HDar
HDar over 8 years ago

HI, I am new to skill. I am trying to write a program that checks if there exist an ellipse shape (a bubble) near a negated pin (pins that are negated, it will have "N" at the end). To do this I am trying to get coordinates of both the pin and the bubble, check if the bubble is on the left side of the pin or not (for output pin, the bubble should exist on the right hand side of the pin text).

How do I scan through the symbol view db.

symView = dbOpenCellViewByType( "scratch" "DFF" "symbol" "" "r" ) ; <-- opening the symbol view to a variable 

I am able to get the coordinates of all the bubbles that exist in the symbol, Also coordinates of all the negated pins, but in a separate loop. I want to try doing it in efficient manner ( using one loop ). Thank you for your help.

PS: If there is any document listing out sample scripts, if would be great help to me :)

-HD

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    I'm not sure this is going to solve your problem. You could find all the shapes matching that pattern by doing:

    endInN(pcreCompile("N$"))
    shapesOnNegatedNet=setof(shape symView~>shapes pcreExecute(endInN shape~>net~>name))

    Oh, you've edited your post since  you first sent it. Anyway, this is unlikely to help because the bubble is not going to be on the net - it's just graphics in the symbol. Presumably you'd have to use the proximity of the shape to the pin figure for the negated terminals? Hard to know without seeing the style of symbols you've got (and even then, I don't think I have the bandwidth to write this for you).

    BTW, there are huge numbers of SKILL samples on these forums and also on Cadence Online Support.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • HDar
    HDar over 8 years ago

    HI Andrew,

    Thanks for you reply.

    Yes, I edited my first post to be more clear as to what I am looking for.

    Here is a screenshot of my symbol (the area that I am interested in). Here SN port has a bubble, which is a negated port and that's expected.

    If the bubble is on R port then its wrong and I should be able to detect it. Thank you for your time. I will try to look for some sample scripts in cadence community and try to find a way around.

    Thanks,

    Himanshu

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

    Himanshu,

    I threw together this example to show one way that you could potentially do this check. It may not be exactly what you want, but it shows one way of approaching it.

    /* CCFcheckBubbles.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Aug 07, 2017 
    Modified   
    By         
    
    Example function for checking a symbol to see if it has
    bubbles on non-negated pins and vice versa
    
    Returns a list of the violating pins
    
    ***************************************************
    
    SCCS Info: @(#) CCFcheckBubbles.il 08/07/17.18:05:43 1.1
    
    */
    
    procedure(CCFcheckBubbles(@key (cvId geGetEditCellView()) (suffix "N"))
      let((negatedPinPattern negatedPin anyBubbles
            (badPins makeTable('badPins t)))
        negatedPinPattern=pcreCompile(strcat(suffix "$"))
        foreach(term cvId~>terminals
          negatedPin=pcreExecute(negatedPinPattern term~>name)
          foreach(pin term~>pins
            foreach(pinFig pin~>figs
              ;--------------------------------------------------------------
              ; Find lines on the device layer which overlap the pin
              ;--------------------------------------------------------------
              foreach(shape dbGetOverlaps(cvId pinFig~>bBox "device" 0)
                ;------------------------------------------------------------
                ; This (destructuringBind) is a convenient way of accessing 
                ; the numbers in a bounding box
                ;------------------------------------------------------------
                destructuringBind(((llx lly) (urx ury)) pinFig~>bBox
                  when(shape~>objType=="line"
                    ;--------------------------------------------------------
                    ; just pick first and last point, which is probably overkill
                    ; as most likely this is just the leg of the devicee
                    ;--------------------------------------------------------
                    anyBubbles=nil
                    foreach(point cons(car(shape~>points) last(shape~>points))
                      destructuringBind((x y) point
                        ;----------------------------------------------------
                        ; If the point is not within the pin box (i.e. the other
                        ; end) then check if it overlaps an ellipse
                        ;----------------------------------------------------
                        unless(x>=llx && x<=urx && y>=lly && y<=ury
                          anyBubbles=exists(nextShape 
                            dbGetOverlaps(cvId list(point point) "device" 0)
                            nextShape~>objType=="ellipse"
                          )
                        )
                      )
                    )
                    ;--------------------------------------------------------
                    ; If the pin ends with the negated suffix and doesn't have
                    ; a bubble, or isn't negated and does have a bubble store
                    ; this in the table
                    ;--------------------------------------------------------
                    when(negatedPin && !anyBubbles || !negatedPin && anyBubbles
                      badPins[term~>name]=t
                    )
                  )
                )
              )
            )
          )
        )
        ;--------------------------------------------------------------------
        ; Return the list of pin names which break the rules
        ;--------------------------------------------------------------------
        badPins~>?
      )
    )
    
    

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • HDar
    HDar over 8 years ago
    Hi Andrew,

    Thanks a lot for the example script. It helped a lot.

    Regards,
    Himanshu
    • 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