• 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 PCB Editor
  3. Soldermask Check

Stats

  • Replies 5
  • Subscribers 159
  • Views 15249
  • Members are here 0
More Content

Soldermask Check

VijiBala
VijiBala over 13 years ago

Hi,

I want to check whether the soldermask is provided for all the pads in the design. Is there a way to do this check automatically? Does anybody have the skill file to check the soldermask in the design?

It will be more appreciated if someone shares their thought.

Thanks in advance,

Viji

  • Sign in to reply
  • Cancel
Parents
  • lcanx2
    lcanx2 over 13 years ago

    For Solderpaste as well as Soldermask...

    I'm sure other routines exist that are written far more effeciently, as a SKILL novice I came up with this.

    Not fancy, but acomplishes what I believe you are looking for, and in 16.5.

    cut&paste from here.

    /*

    Bill.Munroe@Verizon.net

    PCB Editor 16.2 1.0 Initial              April 2010
    PCB Editor 16.3 1.1 Enhancement for through hole devices.  Group error types in log file.    March 2011

    Intended to Report Design Component Reference Designators and XY coordinates once their Soldermask and Solderpaste
    Pads have been analyzed and determined to not exist.

    Benefits: Reduce ODB++ creation cycles by catching issues earlier in the design flow as
    well as reducing time spent with the AutoSilk checking tools.  As of this writing, Pad Designer will; produce a warning for missing    Mask pads for Intrusives but will not generate a warning when Mask and Paste
    pads are missing from SMD padstack definitions.

    Limitations.. SMD pads cleared using Gang Mask on the Soldermask layers and Design level/Package Geometry; level Pastemask openings, often used for Heat slugs, are currently unsupported, these still require visual checking.; Intrusive Reflow pads (Intrusives requiring paste in-hole for assembly) are not used in our Assembly
    Process and that condition is deemed an error and passed to the log file.
    Pad SIZE checking is NOT done by this tool.

    Invoked with "mppads".

    */

    axlCmdRegister( "mppads" `mask_paste)

    defun( mask_paste ()

    ;
    ; selects TOP and BOTTOM pins.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    ;printing to the log and prepare to put results to screen
    axlDebug(t) ;debug on debug off->;axlDebug(nil)

    logfile = outfile("mask_paste.log")
     fprintf(logfile "         Verify Gang Mask Visually.\n")
    close(logfile)

    ; append to the log file
    logfile = outfile("mask_paste.log" "a")

    fprintf(logfile "\n    SMD's with Primary Mask Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(top_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ;Now select Pins for analyzing SMD Bottom pads.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n    SMD's with Secondary Mask Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_bottom_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(bot_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; selects TOP and BOTTOM pins.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0


    fprintf(logfile "\n  SMD's with Primary Paste Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(top_paste == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ;Now select Pins for analyzing SMD Bottom pads.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n  SMD's with Secondary Paste Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_bottom_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    bot_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(bot_paste == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole TOP pads.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;
    ;Intrusives Missing Mask Check.
    ;

    fprintf(logfile "\n  Through Hole with Primary Mask Pads Missing\n\n")


    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(top_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole BOTTOM pads.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;printing to the log and prepare to put results to screen
    axlDebug(t) ;debug on debug off->;axlDebug(nil)

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    fprintf(logfile "\n  Through Hole with Secondary Mask Pads Missing\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(bot_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through Paste Pads- Top side.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n  Through Hole WITH Primary Paste Pads\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(top_paste != "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole Paste pads - BOTTOM.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    fprintf(logfile "\n  Through Hole WITH Secondary Paste Pads\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    bot_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(bot_paste != "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ; Close the Log file then display to the screen
    close(logfile)

    logWindow = axlUIViewFileCreate("mask_paste.log" "            Missing Mask & Paste Pads Report" nil '(44 44) )
    )

     

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • lcanx2
    lcanx2 over 13 years ago

    For Solderpaste as well as Soldermask...

    I'm sure other routines exist that are written far more effeciently, as a SKILL novice I came up with this.

    Not fancy, but acomplishes what I believe you are looking for, and in 16.5.

    cut&paste from here.

    /*

    Bill.Munroe@Verizon.net

    PCB Editor 16.2 1.0 Initial              April 2010
    PCB Editor 16.3 1.1 Enhancement for through hole devices.  Group error types in log file.    March 2011

    Intended to Report Design Component Reference Designators and XY coordinates once their Soldermask and Solderpaste
    Pads have been analyzed and determined to not exist.

    Benefits: Reduce ODB++ creation cycles by catching issues earlier in the design flow as
    well as reducing time spent with the AutoSilk checking tools.  As of this writing, Pad Designer will; produce a warning for missing    Mask pads for Intrusives but will not generate a warning when Mask and Paste
    pads are missing from SMD padstack definitions.

    Limitations.. SMD pads cleared using Gang Mask on the Soldermask layers and Design level/Package Geometry; level Pastemask openings, often used for Heat slugs, are currently unsupported, these still require visual checking.; Intrusive Reflow pads (Intrusives requiring paste in-hole for assembly) are not used in our Assembly
    Process and that condition is deemed an error and passed to the log file.
    Pad SIZE checking is NOT done by this tool.

    Invoked with "mppads".

    */

    axlCmdRegister( "mppads" `mask_paste)

    defun( mask_paste ()

    ;
    ; selects TOP and BOTTOM pins.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    ;printing to the log and prepare to put results to screen
    axlDebug(t) ;debug on debug off->;axlDebug(nil)

    logfile = outfile("mask_paste.log")
     fprintf(logfile "         Verify Gang Mask Visually.\n")
    close(logfile)

    ; append to the log file
    logfile = outfile("mask_paste.log" "a")

    fprintf(logfile "\n    SMD's with Primary Mask Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(top_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ;Now select Pins for analyzing SMD Bottom pads.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n    SMD's with Secondary Mask Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_bottom_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(bot_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; selects TOP and BOTTOM pins.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0


    fprintf(logfile "\n  SMD's with Primary Paste Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(top_paste == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ;Now select Pins for analyzing SMD Bottom pads.
    ;

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

    ;setup for pad counts to be reported

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n  SMD's with Secondary Paste Pads Missing\n\n")

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    foreach(pp_top_db pp_bottom_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    bot_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "SMD") then
     if(bot_paste == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole TOP pads.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;
    ;Intrusives Missing Mask Check.
    ;

    fprintf(logfile "\n  Through Hole with Primary Mask Pads Missing\n\n")


    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(top_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole BOTTOM pads.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;printing to the log and prepare to put results to screen
    axlDebug(t) ;debug on debug off->;axlDebug(nil)

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    fprintf(logfile "\n  Through Hole with Secondary Mask Pads Missing\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(bot_mask == "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through Paste Pads- Top side.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    fprintf(logfile "\n  Through Hole WITH Primary Paste Pads\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_top" "regular")
    top_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_top" "regular")
    top_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(top_paste != "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ;
    ; Now select Pins for analyzing Through hole Paste pads - BOTTOM.
    ;

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

    ;reset pad counts

    smdcount=0
    intcount=0
    badcount=0

    ;Get the name and XY location of the Padstacks and prepare to write it to the log if a problem is found.

    fprintf(logfile "\n  Through Hole WITH Secondary Paste Pads\n\n")

    foreach(pp_top_db pp_top_list
    stack_dbid = pp_top_db->parent
    stack_name = axlDbidName(stack_dbid)
    location = stack_dbid->xy
    ts_pad = axlDBGetPad(pp_top_db "pin/soldermask_bottom" "regular")
    bot_mask = ts_pad-> figureName
    tp_pad = axlDBGetPad(pp_top_db "pin/pastemask_bottom" "regular")
    bot_paste = tp_pad-> figureName
     if(!(pp_top_db->isThrough) then
      pin_type = "SMD"
        smdcount++
       else
      pin_type = "INT"
        intcount++
       
     ) ;endif
    if((pin_type == "INT") then
     if(bot_paste != "NULL" then
      fprintf(logfile "\n %L, %L\n\n" stack_name location)
     ) ;endif
    ) ;endif

    ) ;end foreach

    ; Close the Log file then display to the screen
    close(logfile)

    logWindow = axlUIViewFileCreate("mask_paste.log" "            Missing Mask & Paste Pads Report" nil '(44 44) )
    )

     

    • 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