Home > Community > Forums > PCB SKILL > Soldermask Check

Email

* Required Fields

Recipients email * (separate multiple addresses with commas)

Your name *

Your email *

Message *

Contact Us

* Required Fields
First Name *

Last Name *

Email *

Company / Institution *

Comments: *

 Soldermask Check  

Last post Wed, May 9 2012 2:51 PM by VijiBala. 2 replies.
Started by VijiBala 08 May 2012 04:39 PM. Topic has 2 replies and 2050 views
Page 1 of 1 (3 items)
Sort Posts:
  • Tue, May 8 2012 4:39 PM

    • VijiBala
    • Not Ranked
    • Joined on Tue, May 8 2012
    • Mesa, AZ
    • Posts 2
    • Points 25
    Soldermask Check Reply

    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

    • Post Points: 20
  • Wed, May 9 2012 9:21 AM

    • lcanx2
    • Top 500 Contributor
    • Joined on Mon, Sep 15 2008
    • Marlborough, MA
    • Posts 20
    • Points 285
    Re: Soldermask Check Reply

    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) )
    )

     

    • Post Points: 20
  • Wed, May 9 2012 2:51 PM

    • VijiBala
    • Not Ranked
    • Joined on Tue, May 8 2012
    • Mesa, AZ
    • Posts 2
    • Points 25
    Re: Soldermask Check Reply

    Hi lcanx2,

    Thank you for your reply.

     I run the SKILL as stated in the file, but it gives me an error "Can't open file: */mask_paste.log".

    I think this SKILL file is to chek whether the soldermask & pastemask is present for the pad or not. But what I am looking for is to check the presence of the soldermask & also to check if the soldermask provided is "x" times more than the regular pad.

    Please help me.

    Thanks in advance,

    Viji

     

    • Post Points: 5
Page 1 of 1 (3 items)
Sort Posts:
Started by VijiBala at 08 May 2012 04:39 PM. Topic has 2 replies.