• 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. Skill for DFT Check - Checks for Testpoint to Assembly outline...

Stats

  • Replies 14
  • Subscribers 160
  • Views 6531
  • Members are here 0
More Content

Skill for DFT Check - Checks for Testpoint to Assembly outline based on PACKAGE_HEIGHT_MAX

Fadi81
Fadi81 over 8 years ago

Hi All,

I am new to skill programming and I am trying to create a skill file that does the following:

Purpose:

DFT Audit, to check for clearance between testpoints ( any pin or via that is assigned as a testpoint by TestPrep) and components based on max component height attached to PLACEBOUND TOP or BOTTOM.

Description:

I have the following rules for testpoint to components ASSEMBLY TOP or BOTTOM

1. For components placed on the TOP side

if component height is < 50 then testpoint to assembly TOP outline spacing should be >=47 mils

if component height is > 50 and < 250 then testpoint to assembly TOP outline spacing should be >=68 mils

if component height is > 250 then testpoint to assembly TOP outline spacing should be >=132 mils

2. For components placed on the BOTTOM side

if component height is < 50 then testpoint to assembly BOTTOM outline spacing should be >=27 mils

if component height is > 50 and < 250 then testpoint to assembly BOTTOM outline spacing should be >=48 mils

if component height is > 250 then testpoint to assembly BOTTOM outline spacing should be >=112 mils

Thanks

Fadi

  • Sign in to reply
  • Cancel
  • eDave
    eDave over 8 years ago
    defun( DE_checkTestPoints ()
    let((result, results)
    axlClearSelSet()
    axlSetFindFilter(?enabled '("noall", "invisible", "pins", "vias"), ?onButtons '("noall", "pins", "vias"))
    axlAddSelectAll()
    foreach(tpObj, setof(obj, axlGetSelSet(), obj ->testPoint)
    result = DE_checkTestPoint(tpObj)
    when(result, results = cons(result, results))
    )
    results
    ))

    defun( DE_checkTestPoint (testPtObj)
    let((tpLoc, side, symLines, placebounds, result, proplemTestpoints)
    tpLoc = testPtObj ->xy
    side = cadr(parseString(testPtObj ->testPoint, "/")); "BOTTOM",
    foreach(sym, setof(s, axlDBGetDesign() ->symbols, if(side == "TOP", !s ->isMirrored, s ->isMirrored))
    symLines = setof(child, sym ->children, child ->objType == "path" && child ->layer == strcat("PACKAGE GEOMETRY/ASSEMBLY_", side))
    placebounds = setof(child, sym ->children, child ->layer == strcat("PACKAGE GEOMETRY/PLACE_BOUND_", side))
    result = cond(
    (exists(pb, placebounds, axlGeoPointInShape(tpLoc, pb))
    "under "
    )
    (exists(pb, placebounds, and(
    pbHeight = axlMKS2UU(pb ->prop ->PACKAGE_HEIGHT_MAX || "0.0")
    cond(
    (side == "TOP" && pbHeight < axlMKSConvert( 50, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert( 47, "mils")))
    (side == "TOP" && pbHeight < axlMKSConvert(250, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert( 68, "mils")))
    (side == "TOP" && pbHeight >= axlMKSConvert(250, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert(132, "mils")))
    (side == "BOTTOM" && pbHeight < axlMKSConvert( 50, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert( 27, "mils")))
    (side == "BOTTOM" && pbHeight < axlMKSConvert(250, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert( 48, "mils")))
    (side == "BOTTOM" && pbHeight >= axlMKSConvert(250, "mils"), exists(obj, symLines, DE_TPlineDist(tpLoc, obj) < axlMKSConvert(112, "mils")))
    )
    ))
    "too close to "
    )
    )
    when(result, proplemTestpoints = cons(sprintf(nil, "%s side test point at %L is %s %s", side, tpLoc, result, sym ->refdes), proplemTestpoints))
    )
    proplemTestpoints
    ))

    defun( DE_TPlineDist (pt, obj), apply('min mapcar(lambda((segment), emiGetPoint2SegMinDist(segment, pt)), obj ->segments)))
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Fadi81
    Fadi81 over 8 years ago
    Thank you Dave for the code. I appreciate it your help.
    I copied the code and saved it as "dft.il" file and I loaded it it using SKILL LOAD "dft.il" but what is the command that I should type to run the script?

    Thanks
    Fadi
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • eDave
    eDave over 8 years ago
    This wasn't intended as final code - just a starting point for you. However, if you want to run it in it's current form, type "skill DE_checkTestPoints" on the command line after loading it.
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Fadi81
    Fadi81 over 8 years ago
    Understood. Thank you Dave.
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • DavidJHutchins
    DavidJHutchins over 8 years ago
    Dave,
    is there any documentation for the function emiGetPoint2SegMinDist() ?
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
>
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