• 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. Allegro X Scripting - Skill
  3. Examining Soldermask pads and Symbol Soldermask definitions...

Stats

  • Replies 2
  • Subscribers 18
  • Views 9845
  • Members are here 0
More Content

Examining Soldermask pads and Symbol Soldermask definitions.

lcan
lcan over 6 years ago

No Venture license for Advanced DFx checking -  So, as a novice at SKILL I am writing a Soldermask check to look for padstacks that have inaccurate mask openings. I am further trying to see if "tented" padstack definitions are cleared by Symbol shape definitions on the mask layer(s) within the Symbol. However I am having trouble as I loop through each symbol pin - how do I find out if it has a mask shape above or below it?  I see the axlGeoPointInShape command, but I first have to get the shape.  I have gone through manuals, examples and publicly released code but my efforts have failed me.  What i've done so far isnt pretty but it works for the most part.... I'm doing testing with Place Bounds as a shape because I know all symbols have them, but I also know I am going at it wrong. Any help would be greatly appreciated. Thanks in Advance!

Bill

axlClearSelSet()
vis_list = axlVisibleGet()
axlVisibleDesign(nil)
axlVisibleLayer("PIN/TOP" t)
axlSetFindFilter(?enabled list("noall" "pins")
?onButtons list("noall" "pins"))
axlAddSelectAll()
pselect_list = axlGetSelSet()
axlClearSelSet()
axlVisibleSet(vis_list)

foreach(pin_db pselect_list
unless(pin_db->isMech ;must be doing it wrong - Mechanical pins still getting through
if(pin_db->isThrough
then
symbol_dbid = pin_db->parent
symbol_name = axlDbidName(symbol_dbid )
IsShape = pin_db->objType
shape_layer = pin_db->layer
if( equal(IsShape "shape") then
if( equal(shape_layer "PACKAGE GEOMETRY/PLACE_BOUND_TOP") then
println( "has a shape" )
);endif
);endif
location = pin_db->xy
tsm_pad = axlDBGetPad(pin_db "pin/soldermask_top" "regular")
cur_box = tsm_pad->bBox
tsm_box = tsm_pad->bBox
ComputeBBoxHeight( )
top_pad = axlDBGetPad(pin_db "etch/top" "regular")
cur_box = top_pad->bBox
top_box = top_pad->bBox
ComputeBBoxHeight( )
if(tsm_box == top_box
then
top_mask_same = "true"
else
println( symbol_name ); <-testing
println( shape_layer ); <- testing
);endif
bot_pad = axlDBGetPad(pin_db "etch/bottom" "regular")
cur_box = bot_pad->bBox
bot_box = bot_pad->bBox
ComputeBBoxHeight( )
bsm_pad = axlDBGetPad(pin_db "pin/soldermask_bottom" "regular")
cur_box = bsm_pad->bBox
bsm_box = bsm_pad->bBox
ComputeBBoxHeight( )
if(bsm_box == bot_box
then
bot_mask_same = "true"
else
println( location )
);endif
else
pin_type = "smd"
);endif
);unless
);foreach
);

procedure( ComputeBBoxHeight( )
bBox = cur_box
ll = car( bBox )
ur = cadr( bBox )
lly = yCoord( ll )
ury = yCoord( ur )
ury - lly

) ;procedure

  • Cancel
  • Sign in to reply
Parents
  • B Bruekers
    B Bruekers over 6 years ago

    I'm not entirely sure what you want to achieve, but perhaps this will help you:

    Each pin in the design has a definition: padstack. So if you need to check if a certain padstack contains a mask definition then just go over each padstack definition. This makes the initial check much faster. 

    In a small design it is 'ok' to iterate over all (user) mask shapes and test them with poly operations. But with a large board i would not do this, it takes too much computing time. 

    The best approach for doing such is something like this:

    1. Get all pins
    2. Get all user mask shapes (so not the ones defined in the padstack but on board or package geometry class)
    3. foreach pin determine if the pin bBox is overlapping with a mask shape bBox.
      1. Overlapping bBox does not mean that the shapes/figures are overlapping. To check this get the poly of the pin and shape.
      2. If you need a certain mask oversize then expand the pinpad poly with this value.
      3. Then do a poly operation on the padpoly and mask shape. By using 'AND you get a resulting poly. If everything is correct then poly area (property of the poly) is _nearly_ equal to the mask poly area. If area is smaller: then pad was smaller, or mask was larger then required.
      4. By doing an 'OR you can check if the resulting area is larger than the original mask area -> if so then the mask opening is too small.
      5. If you are programming it smart then remove the checked (and matched!) shape from the list so you don't check it against all remaining pins.

    Bram

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • lcan
    lcan over 6 years ago in reply to B Bruekers

    Thank you Bram!  I am going to attempt some of what you described here. I will post results for reference.  One of the errors I am trying to catch with this check are "tented" vias that are defined as Pins in a symbol which are supplied by Vendors that have inaccurate padstacks ie: not relieved of soldermask. The Vendor I am sure believes that a Soldermask shape solves the problem - however the padstack is still wrong and if used elsewhere.... So, I almost punted on this part of the check but these Vendor supplied symbols are happening more frequently, along with their errors. Your response has helped keep me moving in the proper direction, thanks!

    Bill

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • lcan
    lcan over 6 years ago in reply to B Bruekers

    Thank you Bram!  I am going to attempt some of what you described here. I will post results for reference.  One of the errors I am trying to catch with this check are "tented" vias that are defined as Pins in a symbol which are supplied by Vendors that have inaccurate padstacks ie: not relieved of soldermask. The Vendor I am sure believes that a Soldermask shape solves the problem - however the padstack is still wrong and if used elsewhere.... So, I almost punted on this part of the check but these Vendor supplied symbols are happening more frequently, along with their errors. Your response has helped keep me moving in the proper direction, thanks!

    Bill

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
No Data
Cadence Guidelines

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