<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.cadence.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Allegro X Scripting - Skill - Recent Threads</title><link>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill</link><description>Allegro X Scripting - Skill</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Sun, 30 Aug 2026 20:22:55 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill" /><item><title>How to write a simple CMXL code that retrieves or edits data from Constraint Manager</title><link>https://community.cadence.com/thread/66295?ContentTypeID=0</link><pubDate>Sun, 30 Aug 2026 20:22:55 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:4255e892-a6f8-48c6-a01a-071b918c9eee</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66295?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66295/how-to-write-a-simple-cmxl-code-that-retrieves-or-edits-data-from-constraint-manager/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Imagine you&amp;nbsp;want to access some constraint values using SKILL. I know there are AXL functions available; However, what if you want to use&amp;nbsp;CMXL because it dives deeper into the Constraint Manager capabilities.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s show an example. Let&amp;#39;s&amp;nbsp;&lt;span&gt;set&amp;nbsp;static&amp;nbsp;phase values of a differential pair&amp;nbsp;configuration. This is how the code would look like:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlCMDBInit()&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;dsn = cmxlFindObject(ACNS_DESIGN);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;when(dsn&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; cmxlDBSkillInit(dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; cset = cmxlFindObject(ACNS_ECSET, &amp;quot;DIFF&amp;quot;, dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; when(cset &lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; println(cmxlPutAttribute(cset &amp;quot;DIFFP_PHASE_TOL&amp;quot; ACNS_STRING list(&amp;quot;0.5&amp;quot;)))&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; println(car(cmxlGetAttribute(cset &amp;quot;DIFFP_PHASE_TOL&amp;quot; ACNS_STRING))); should return 0.5mm&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;code&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;cmxlDBSkillExit(dsn);&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Here&amp;#39;s a brief explanation of what each section is doing:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:385px;max-width:874px;" height="385" src="https://community.cadence.com/resized-image/__size/1748x770/__key/communityserver-discussions-components-files/137/pastedimage1788120954175v1.png" width="874" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If the same logic is used with any other attribute name, you can construct the new code to edit a different constraint. Make sure you use the right Object type with cmxlFindObject. You can find all the object types and definitions at the end of the CMXL Reference Manual.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Feel free to ask any questions!&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Skill script for checking BGA pitch</title><link>https://community.cadence.com/thread/66279?ContentTypeID=0</link><pubDate>Fri, 21 Aug 2026 10:17:44 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:e2982056-b941-4937-836d-0845778b72c0</guid><dc:creator>SG20260713408</dc:creator><slash:comments>6</slash:comments><comments>https://community.cadence.com/thread/66279?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66279/skill-script-for-checking-bga-pitch/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;This is a skill for inspecting the pitch of BGAs on a board.&lt;/p&gt;
&lt;p&gt;If you know of a more concise and elegant code than this, please let me know. (SKILL++, OOP...)&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/*&lt;br /&gt;============================================================================================&lt;br /&gt;* Tool Name : min_pitch_bga (Enhanced Version)&lt;br /&gt;* Description : Automatically checks the minimum pitch of BGA components to prevent fine-pitch routing defects.&lt;br /&gt;* Features : &lt;br /&gt;* 1. Support multiple symbol filtering cases (Property, SymType)&lt;br /&gt;* 2. Performance Optimization: Auto-bounding box shrinkage for &lt;br /&gt;* high pin-count components to prevent computation lag.&lt;br /&gt;* 3. Auto-sorting and reporting with an interactive .log viewer.&lt;br /&gt;* Command : min_pitch_bga [Optional Pitch Value, default "0.5"]&lt;br /&gt;* To change the pitch value, simply apply the desired pitch value after the command. (min_pitch_bga 1.0 or min_pitch_bga 0.5 .......)&lt;br /&gt;============================================================================================&lt;br /&gt;*/&lt;/p&gt;
&lt;p&gt;axlCmdRegister(&amp;quot;min_pitch_bga&amp;quot; &amp;#39;min_pitch_bga ?cmdType &amp;quot;interactive&amp;quot;)&lt;/p&gt;
&lt;p&gt;procedure(min_pitch_bga(@optional (argu_bga_pitch &amp;quot;0.5&amp;quot;) &amp;quot;S&amp;quot;)&lt;/p&gt;
&lt;p&gt;let((min_bga_pitch symbols loop sym_pins_locs obj1 objPairs pitch_datas min_pitch_data&lt;/p&gt;
&lt;p&gt;pair_count var_x var_y delta_x delta_y refdes sym_xy layer sym_rot all_x_loc all_y_loc min_x min_y max_x max_y sym_pins total_results)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; min_bga_pitch = atof(argu_bga_pitch)&lt;/p&gt;
&lt;p&gt;when(min_bga_pitch&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;;;Comment : Please select and use the case that fits the situation.&lt;/p&gt;
&lt;p&gt;;;Comment(Case1) : Use when a symbol(footprint) is given a property name(&amp;quot;DFA_DEV_CLASS&amp;quot;) and a property value(&amp;quot;bga&amp;quot;).&lt;/p&gt;
&lt;p&gt;;; Property values are entered by the user, so they are case-sensitive.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;DFA_DEV_CLASS&amp;quot; &amp;quot;bga&amp;quot;) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;DFA_DEV_CLASS&amp;quot; &amp;quot;bg*&amp;quot; t) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;symbols = foreach(mapcan item axlSelectByProperty(&amp;quot;symdef&amp;quot; &amp;quot;REF_PATTERN_NAME&amp;quot; &amp;quot;BGA*&amp;quot; t) ~&amp;gt; instances item) ;; Use if applicable to Case 1&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;;; Comment(Case2) : The name given when generating the symbol(footprint).&lt;/p&gt;
&lt;p&gt;;; In other words, when the symbol name(footprint name) starts with &amp;quot;BGAXXXXXXXX_XXX_XXX&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; ;;symbols = axlSelectByName(&amp;quot;SYMTYPE&amp;quot; &amp;quot;BGA*&amp;quot; t) ;; Use if applicable to Case 2, Delete &amp;quot;;;&amp;quot; and use&lt;/p&gt;
&lt;p&gt;;;========================================================================================&lt;/p&gt;
&lt;p&gt;axlClearSelSet()&lt;/p&gt;
&lt;p&gt;if(symbols then&lt;/p&gt;
&lt;p&gt;foreach(symbol symbols&lt;/p&gt;
&lt;p&gt;loop = t&lt;/p&gt;
&lt;p&gt;sym_rot = nil&lt;/p&gt;
&lt;p&gt;sym_pins = nil&lt;/p&gt;
&lt;p&gt;sym_pins_locs = nil&lt;/p&gt;
&lt;p&gt;all_x_loc = nil&lt;/p&gt;
&lt;p&gt;all_y_loc = nil&lt;/p&gt;
&lt;p&gt;objPairs = nil&lt;/p&gt;
&lt;p&gt;pitch_datas = nil&lt;/p&gt;
&lt;p&gt;min_pitch_data = nil&lt;/p&gt;
&lt;p&gt;pair_count = nil&lt;/p&gt;
&lt;p&gt;var_x = nil&lt;/p&gt;
&lt;p&gt;var_y = nil&lt;/p&gt;
&lt;p&gt;delta_x = nil&lt;/p&gt;
&lt;p&gt;delta_y = nil&lt;/p&gt;
&lt;p&gt;sym_xy = symbol -&amp;gt; xy&lt;/p&gt;
&lt;p&gt;refdes = symbol -&amp;gt; refdes&lt;/p&gt;
&lt;p&gt;unless(refdes refdes = &amp;quot;No RefDes&amp;quot;)&lt;/p&gt;
&lt;p&gt;layer = if(symbol -&amp;gt; isMirrored then &amp;quot;BOTTOM&amp;quot; else &amp;quot;TOP&amp;quot;)&lt;/p&gt;
&lt;p&gt;sym_pins = setof(e symbol -&amp;gt; pins e -&amp;gt; number != &amp;quot;&amp;quot; || e -&amp;gt; isMech != t)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; when(sym_pins &amp;amp;&amp;amp; length(sym_pins) &amp;gt; 1&lt;/p&gt;
&lt;p&gt;sym_rot = symbol -&amp;gt; rotation&lt;/p&gt;
&lt;p&gt;if(axlGeoEqual(sym_rot 0.0) || axlGeoEqual(sym_rot 90.0) || axlGeoEqual(sym_rot 180.0) || axlGeoEqual(sym_rot 27.0) then&lt;/p&gt;
&lt;p&gt;sym_pins_locs = sym_pins ~&amp;gt; xy&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;foreach(sym_pin sym_pins&lt;/p&gt;
&lt;p&gt;sym_pin_xy = sym_pin -&amp;gt; xy&lt;/p&gt;
&lt;p&gt;rot_pin = axlGeoRotatePt(minus(sym_rot) car(sym_pin_xy):cadr(sym_pin_xy) car(sym_xy):cadr(sym_xy))&lt;/p&gt;
&lt;p&gt;sym_pins_locs = cons(rot_pin sym_pins_locs)&lt;br /&gt; &lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; all_x_loc = foreach(mapcar item sym_pins_locs car(item))&lt;/p&gt;
&lt;p&gt;all_y_loc = foreach(mapcar item sym_pins_locs cadr(item))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; var_x = apply(&amp;#39;min all_x_loc)&lt;/p&gt;
&lt;p&gt;sym_x = apply(&amp;#39;max all_x_loc)&lt;/p&gt;
&lt;p&gt;var_y = apply(&amp;#39;min all_y_loc)&lt;/p&gt;
&lt;p&gt;sym_y = apply(&amp;#39;max all_y_loc)&lt;/p&gt;
&lt;p&gt;delta_x = abs(sym_x - var_x)&lt;/p&gt;
&lt;p&gt;delta_y = abs(sym_y - var_y)&lt;/p&gt;
&lt;p&gt;sym_xy = list((sym_x - (delta_x / 2)) (sym_y - (delta_y / 2)))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; delta_x = delta_x / 30&lt;/p&gt;
&lt;p&gt;delta_y = delta_y / 30&lt;/p&gt;
&lt;p&gt;sym_pins_locs = setof(e sym_pins_locs axlIsPointInsideBox(e list(sym_xy list(var_x var_y))))&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; when(length(sym_pins_locs) &amp;gt; 1&lt;/p&gt;
&lt;p&gt;pair_count = (length(sym_pins_locs) * (length(sym_pins_locs) - 1)) / 2&lt;/p&gt;
&lt;p&gt;when(pair_count &amp;gt; 1500&lt;/p&gt;
&lt;p&gt;while(loop&lt;/p&gt;
&lt;p&gt;var_x = var_x + delta_x&lt;/p&gt;
&lt;p&gt;var_y = var_y + delta_y&lt;/p&gt;
&lt;p&gt;delta_x = (car(sym_xy) - var_x) / 30&lt;/p&gt;
&lt;p&gt;delta_y = (cadr(sym_xy) - var_y) / 30&lt;/p&gt;
&lt;p&gt;sym_pins_locs = setof(e sym_pins_locs axlIsPointInsideBox(e list(sym_xy list(var_x var_y))))&lt;/p&gt;
&lt;p&gt;pair_count = (length(sym_pins_locs) * (length(sym_pins_locs) - 1)) / 2&lt;/p&gt;
&lt;p&gt;when(pair_count &amp;lt; 1500 loop = nil)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(sym_pins_locs&lt;/p&gt;
&lt;p&gt;while(sym_pins_locs&lt;/p&gt;
&lt;p&gt;obj1 = car(sym_pins_locs)&lt;/p&gt;
&lt;p&gt;sym_pins_locs = cdr(sym_pins_locs)&lt;/p&gt;
&lt;p&gt;foreach(obj2 sym_pins_locs objPairs = cons(list(obj1, obj2), objPairs))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(objPairs&lt;/p&gt;
&lt;p&gt;foreach(objPair objPairs&lt;/p&gt;
&lt;p&gt;pitch_datas = cons(axlDistance(car(objPair) cadr(objPair)) pitch_datas)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;min_pitch_data = car(sort(pitch_datas &amp;#39;lessp))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;when(min_pitch_data&lt;/p&gt;
&lt;p&gt;when(min_pitch_data &amp;lt; min_bga_pitch&lt;/p&gt;
&lt;p&gt;axlHighlightObject(symbol)&lt;/p&gt;
&lt;p&gt;total_results = cons(list(layer refdes min_pitch_data symbol -&amp;gt; xy symbol -&amp;gt; name) total_results)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;total_results = reverse(sortcar(total_results &amp;#39;axlStrcmpAlpNum))&lt;/p&gt;
&lt;p&gt;MPB_Create_log_File(total_results min_bga_pitch)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;printf(&amp;quot;###### BGA cannot be found. !! ######\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;procedure(MPB_Create_log_File(total_results min_bga_pitch)&lt;/p&gt;
&lt;p&gt;let((err_count Date Min_Pitch_BGA_Log_File)&lt;/p&gt;
&lt;p&gt;err_count = 0&lt;/p&gt;
&lt;p&gt;Date = (getCurrentTime)&lt;br /&gt; Date = parseString(Date &amp;quot; &amp;quot;)&lt;br /&gt; Date = strcat(nth(3 Date) &amp;quot; &amp;quot; nth(0 Date) &amp;quot; &amp;quot; nth(1 Date) &amp;quot; &amp;quot; nth(2 Date))&lt;/p&gt;
&lt;p&gt;Min_Pitch_BGA_Log_File = outfile(&amp;quot;./Min_Pitch_BGA.log&amp;quot; &amp;quot;w&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nDATE : %s\n&amp;quot; Date)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nTarGet Pitch : %f\n&amp;quot; min_bga_pitch)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nSyntax : nIndex, Layer, RefDes, Pitch, Symbol_XY, Symbol_Name\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;if(length(total_results) == 0 then&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n Total Error Count = 0\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\nIndex, Layer, RefDes, Pitch, Symbol_XY, Symbol_Name\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;foreach(total_result total_results&lt;/p&gt;
&lt;p&gt;err_count = ++err_count&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n%d, %s, %s, %f, %L, %s\n&amp;quot; err_count nth(0 total_result) nth(1 total_result) nth(2 total_result) nth(3 total_result) nth(4 total_result))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Min_Pitch_BGA_Log_File &amp;quot;\n Total Error Count = %d.\n&amp;quot; err_count)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;close(Min_Pitch_BGA_Log_File)&lt;/p&gt;
&lt;p&gt;axlShell(&amp;quot;viewlog ./Min_Pitch_BGA.log&amp;quot;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Skill to open Custom Variables  Window in Allegro x 25.1 PCB Editor</title><link>https://community.cadence.com/thread/66274?ContentTypeID=0</link><pubDate>Wed, 19 Aug 2026 12:40:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:30cee9d2-12de-483f-b033-8602e28ab01e</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>5</slash:comments><comments>https://community.cadence.com/thread/66274?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66274/skill-to-open-custom-variables-window-in-allegro-x-25-1-pcb-editor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear all,&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;i can use Command tbx customvar update to open the custom variables window.&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" alt=" " src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1787143332363v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;I can also use axlShell(&amp;quot;tbx customvar update&amp;quot;) to open the same window but My current Problem is that:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;after giving axlShell&lt;/span&gt;(&amp;quot;tbx customvar update&amp;quot;) I do not get the&amp;nbsp;&lt;span&gt;Skill &amp;gt; for the next skill&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Skill &amp;gt; axlShell(&amp;quot;tbx customvar update&amp;quot;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Reading file &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/output/251_demo/physical/customvar.cfg&amp;quot;&lt;/p&gt;
&lt;p&gt;Info: Reading custom variables from &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/251_demo.cpm&amp;quot;&lt;/p&gt;
&lt;p&gt;It missing the&amp;nbsp;&lt;span&gt;Skill &amp;gt; after&amp;nbsp;Info: Reading custom variables from &amp;quot;C:/Users/emp8124501/ECAD/projects/251_demo/251_demo.cpm&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;May i ask how could i solve this issue or are there any other skill to use instead of&amp;nbsp;&lt;span&gt;axlShell&amp;nbsp;in allegro x pcb editor such as&amp;nbsp;&lt;/span&gt;axlCmd,&amp;nbsp;&lt;span style="font-family:inherit;"&gt;axlUIWExecuteCommand or&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:inherit;"&gt;axlDBCmd?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Many thanks&lt;/p&gt;
&lt;p&gt;Moyan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to remove an element from a group without deleting or disbanding the group using SKILL</title><link>https://community.cadence.com/thread/66206?ContentTypeID=0</link><pubDate>Mon, 27 Jul 2026 15:37:01 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:8e4e5e96-e0c1-44b4-a0f9-9107538ce6bc</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66206?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66206/how-to-remove-an-element-from-a-group-without-deleting-or-disbanding-the-group-using-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Let&amp;#39;s say you have a specific group of elements in a brd file and you want to remove one element from this group.&amp;nbsp;How can you remove it&amp;nbsp;without disbanding the group or deleting the element?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The SKILL function&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;axlDBRemoveGroupObjects&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;can be used to remove database objects from the specified group. Group members, though removed, are not deleted.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlDBRemoveGroupObjects(o_group lo_members)&amp;nbsp;&amp;rArr;&amp;nbsp;t/nil&lt;/span&gt;&lt;/p&gt;
&lt;div data-level="answer-heading-3"&gt;Arguments:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;o_group&lt;/strong&gt;: The database ID of the group from which objects will be removed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;o_members&lt;/strong&gt;: A list of database objects to be removed from the group. A single database ID can be substituted for a list.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This function removes the selected objects (&lt;strong&gt;&lt;span&gt;lo_members&lt;/span&gt;&lt;/strong&gt;) from the specified group (&lt;span&gt;&lt;strong&gt;o_group&lt;/strong&gt;&lt;/span&gt;). Neither the group nor the member is deleted.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The following SKILL code can be used to remove an object from multiple groups at the same time:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;procedure(&amp;nbsp;removeObjectFromGroup()&lt;br /&gt;&amp;nbsp; &amp;nbsp; let((objects_dbid&amp;nbsp;group_dbd&amp;nbsp;group_bibliotec&amp;nbsp;elemnt&amp;nbsp;group)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;axlSetFindFilter(?enabled list(&amp;quot;all&amp;quot;) ?onButtons&amp;nbsp;list(&amp;quot;noall&amp;quot; &amp;quot;symbols&amp;quot; &amp;quot;shapes&amp;quot;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;axlClearSelSet()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;axlSingleSelectPoint()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; objects_dbid=axlGetSelSet()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; group_bibliotec=makeTable(&amp;quot;groups&amp;quot; nil)&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;foreach(elemnt&amp;nbsp;objects_dbid&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;foreach(group&amp;nbsp;elemnt-&amp;gt;parentGroups&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(group then group_bibliotec[group]=append(group_bibliotec[group] list(elemnt)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;foreach(group_dbd&amp;nbsp;group_bibliotec&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;axlDBRemoveGroupObjects(group_dbd&amp;nbsp;group_bibliotec[group_dbd])&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;br /&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explanation of the SKILL code:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first step in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;removeObjectFromGroup()&lt;/span&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;function is to set the Find filter:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlSetFindFilter(?enabled list(&amp;quot;noall&amp;quot; &amp;quot;symbols&amp;quot; &amp;quot;shapes&amp;quot;) ?onButtons&amp;nbsp;list(&amp;quot;noall&amp;quot; &amp;quot;symbols&amp;quot; &amp;quot;shapes&amp;quot;))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This will decide what kind of objects you can select on the canvas. In this case, from all possible objects, only &amp;ldquo;symbols&amp;rdquo; and &amp;ldquo;shapes&amp;rdquo; are selectable;&amp;nbsp;&amp;ldquo;symbols&amp;rdquo; and &amp;ldquo;shapes&amp;rdquo; are already set to &amp;quot;on&amp;quot;.&lt;/p&gt;
&lt;p&gt;Then, selection of the objects can be done using the following function. Note that there are many functions that let&amp;nbsp;you select objects in different ways.&amp;nbsp;You can read more about it in&amp;nbsp;&lt;em&gt;Allegro SKILL&amp;nbsp;Reference 22.1 &amp;gt;&amp;nbsp;Select and Finds Functions&lt;/em&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlSingleSelectPoint()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This function allows you to select&amp;nbsp;a single point on the screen. When this&amp;nbsp;function is called, it will wait for an action from the user to pick a point. Everything that matches the Find filter will be selected. To get all&amp;nbsp;objects selected, use:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;objects_dbid=axlGetSelSet()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The variable&amp;nbsp;&lt;span&gt;objects_dbid&lt;/span&gt;&amp;nbsp;can have multiple objects, and each one of these objects can belong to a different group.&amp;nbsp;To classify which object belongs to each group, use a table (&lt;span&gt;group_bibliotec&lt;/span&gt;):&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;group_bibliotec=makeTable(&amp;quot;groups&amp;quot; nil)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the below code,&amp;nbsp;&lt;strong&gt;foreach&lt;/strong&gt;&lt;span&gt;&amp;nbsp;is used to pass by each element of the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;objects_dbid&lt;/span&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;span&gt;list. Then,&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;foreach&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;is used again to pass by all parent groups that this element can belong to.&amp;nbsp;The code then&amp;nbsp;checks&amp;nbsp;if the object does belong to any group. If it does, the current element is appended to the&amp;nbsp;&lt;/span&gt;&lt;span&gt;group_bibliotec&lt;/span&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;span&gt;with the matching key.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;foreach(elemnt&amp;nbsp;objects_dbid&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach(group&amp;nbsp;elemnt-&amp;gt;parentGroups&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(group then group_bibliotec[group]=append(group_bibliotec[group] list(elemnt)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To remove the components from the groups:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;foreach(group_dbd&amp;nbsp;list_groups_dbid&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; axlDBRemoveGroupObjects(group_dbd&amp;nbsp;objects_dbid)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to use skill code to check pin to pin mark air gap?</title><link>https://community.cadence.com/thread/66189?ContentTypeID=0</link><pubDate>Wed, 22 Jul 2026 08:21:37 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:05cdf907-5d0c-43a0-8261-b16707bf01b8</guid><dc:creator>SK202607205032</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66189?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66189/how-to-use-skill-code-to-check-pin-to-pin-mark-air-gap/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;I would like to get the air gap value between the first pin and the pin-1 marker (silkscreen text such as &amp;quot;*&amp;quot; or &amp;quot;&amp;gt;&amp;quot;), as shown below.&lt;/p&gt;
&lt;p&gt;I found the API &lt;code&gt;axlAirGap()&lt;/code&gt;, but I&amp;#39;m not sure how to implement it.&lt;/p&gt;
&lt;p&gt;Could anyone provide an example or some guidance?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Thanks!!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1784708098142v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to merge excel cell in Allgero SKILL using axlSpreadsheet API</title><link>https://community.cadence.com/thread/66183?ContentTypeID=0</link><pubDate>Tue, 21 Jul 2026 05:56:35 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3976fc55-309a-4b96-8d2b-14f73d75362f</guid><dc:creator>SK202607205032</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66183?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66183/how-to-merge-excel-cell-in-allgero-skill-using-axlspreadsheet-api/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I just using&amp;nbsp;&lt;span&gt;axlSpreadsheetInit&lt;/span&gt;&lt;span&gt;() to write excel file, but I don&amp;#39;t know how to merge cell,example as the picture below.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1784613139502v1.png" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Is there any suggestion? Thanks a lot.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to check BGA minimum pitch using Allegro Skill language</title><link>https://community.cadence.com/thread/66158?ContentTypeID=0</link><pubDate>Mon, 13 Jul 2026 06:33:23 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f3e25ee6-3bd5-41cf-a121-043c8ef935b3</guid><dc:creator>BZ202408076026</dc:creator><slash:comments>7</slash:comments><comments>https://community.cadence.com/thread/66158?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66158/how-to-check-bga-minimum-pitch-using-allegro-skill-language/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I want to check&amp;nbsp;BGA minimum pitch. If BGA pitch is less than 0.5mm, need to highlight these BGA in PCB layout. Does anyone have experience to write script to do the check?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Shape Degassing parameters extraction using SKILL in allegro APD</title><link>https://community.cadence.com/thread/66149?ContentTypeID=0</link><pubDate>Wed, 08 Jul 2026 23:02:08 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:fc82f7a0-54dc-4782-bf33-d356d80fb82a</guid><dc:creator>AnanthVedalaLM</dc:creator><slash:comments>4</slash:comments><comments>https://community.cadence.com/thread/66149?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66149/shape-degassing-parameters-extraction-using-skill-in-allegro-apd/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;#39;m trying to extract the values set for a specific degassing pattern using skill , but instead of name , i&amp;#39;m unable to get anything else , is there any way we can extract the void array parameters and void spacing constraints that we set in the shape degassing tool, instead of using GUI, is there any other option to set those parameters for a pattern and also extract them&amp;nbsp;&lt;br /&gt;&lt;br /&gt;usually i&amp;#39;m getting the pattern name in this way&lt;br /&gt;&lt;br /&gt;shapedbId-&amp;gt;shapeBoundary-&amp;gt;prop-&amp;gt;&lt;span&gt;DEGAS_SHAPE_PROPERTIES&lt;br /&gt;&lt;br /&gt;which just leaves me with the name of the pattern used on the shape, but unable to figure out how do we actually get these parameters using skill&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;other questions i have ,&lt;br /&gt;&lt;br /&gt;Are these parameters for the dynamic shapes global or local ? and how are these parameters stored in the database&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>axlOpenDesignForBatch( works differently between 22.1 and 25.1 ( appears broken )</title><link>https://community.cadence.com/thread/66141?ContentTypeID=0</link><pubDate>Tue, 07 Jul 2026 13:05:43 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:a6aa6e00-b9ce-4d28-a96c-cd6976be4393</guid><dc:creator>Mhawley1</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/66141?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66141/axlopendesignforbatch-works-differently-between-22-1-and-25-1-appears-broken/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I just found something interesting today and would be nice for someone to test.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It would seem like&amp;nbsp;axlOpenDesignForBatch( no longer runs without a save prompt in 25.1 under the WF mode . Can someone try this out . Try out the example and see if you can batch open two dra&amp;#39;s without the prompt coming up .&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;axlOpenDesignForBatch(&amp;quot;u.dra&amp;quot; &amp;quot;wf&amp;quot;)&amp;nbsp; ( tested in 25.1 S 30 )&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Should I make a ticket ?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to import a techfile through SKILL</title><link>https://community.cadence.com/thread/66129?ContentTypeID=0</link><pubDate>Thu, 02 Jul 2026 12:30:33 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:724bfde6-78c7-4dad-b6b3-f16d0f02e3c6</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66129?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66129/how-to-import-a-techfile-through-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlRunBatchDBProgram&lt;/span&gt; can be used to import a techfile.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the design in Allegro X PCB Editor or Package Designer and type skill at the command line:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp;&amp;nbsp;Command &amp;gt; skill&lt;/span&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;The command line changes to the Skill prompt:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; Skill &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;The following skill code&amp;nbsp;will create a log file and import a techfile. In the following skill code, replace&amp;nbsp;mytechfile.tcfx&amp;nbsp;with your own&amp;nbsp;techfile name including the .tcfx extension:&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="padding-left:60px;"&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;font-size:150%;"&gt;Skill &amp;gt; axlRunBatchDBProgram(&amp;quot;techfile&amp;quot; &amp;quot;techfile -$ -r mytechfile.tcfx %s&amp;quot; ?reloadDB t ?logfile &amp;quot;techfile&amp;quot;)&lt;/span&gt;&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Wait while the techfile (apd) runs:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1782995317444v1.png" alt=" " /&gt;&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;The view of the&amp;nbsp;techfile UI will appear.&amp;nbsp;Scroll to view the summary.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Close the file.&lt;/li&gt;
&lt;li&gt;In the database, to exit from the skill prompt, type&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;exit&lt;/span&gt;:&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp;Skill &amp;gt; exit&lt;/span&gt;&lt;/p&gt;
&lt;ol start="8"&gt;
&lt;li&gt;The Command window changes from&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Skill &amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&amp;nbsp;&lt;span&gt;Command &amp;gt;&lt;/span&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Command &amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>axlDesignFlip()</title><link>https://community.cadence.com/thread/66107?ContentTypeID=0</link><pubDate>Fri, 26 Jun 2026 10:06:26 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ff66850c-769d-4776-a93b-dfc093d486e7</guid><dc:creator>DavidAhl</dc:creator><slash:comments>5</slash:comments><comments>https://community.cadence.com/thread/66107?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66107/axldesignflip/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Im using the&amp;nbsp;&lt;span&gt;axlDesignFlip() in a script. In version 23.1 it worked great but when i run the script in version 25.1 it wont flip back the design. From the documentation i cant see that anything has changed. Is this a known bug in 25.1 or have i missed if something changed?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I tried this in both 23.1 and 25.1, both gave the same print out but in 25.1 the design doesnt flip back..&lt;img src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1782468170907v2.png" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;best regards&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;david&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to start SKILL IDE from APD or Allegro in Linux?</title><link>https://community.cadence.com/thread/66046?ContentTypeID=0</link><pubDate>Fri, 05 Jun 2026 23:35:51 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:046b6cba-5a0d-4373-b1da-0d9de9dc069c</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66046?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66046/how-to-start-skill-ide-from-apd-or-allegro-in-linux/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;The debugger environment is not so convenient for&amp;nbsp;APD / Allegro&amp;nbsp;debug. It is&amp;nbsp;more oriented for SKILL DFII development. SKILL Debugger is incapable to debug the axlSKILL (Allegro specific) functions.&lt;/p&gt;
&lt;p&gt;There is no graphical debugger for axlSKILL, but you can set the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;telskill&amp;nbsp;&lt;/span&gt;environment variable to open a SKILL development window.&lt;/p&gt;
&lt;p&gt;If you are looking for line debugger with Allegro, there are some command line debugging options available to you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;installDebugger()&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;axlDebug()&amp;nbsp;&lt;/span&gt;are functions you can use to set debug mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The following is an extract from the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;axlIsDebug()&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;function description in cdnshelp, which describes what axlDebug enables:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;When this mode is set, AXL may print additional AXL API argument warnings when arguments to AXL functions are incorrect. Many warnings do not obey this variable because they are considered serious or edge conditions. Warnings supported are less serious and are known from user feedback to be troublesome to program around.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Typically, when an AXL API function encounters an argument error, it will print a warning and return nil.&lt;br /&gt;When unset, the code runs in development mode and eliminates many of these warnings. You should have this mode enabled when developing SKILL code.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Another function&amp;nbsp;available to you is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;sstatus&lt;/span&gt;. Refer to the online documentation to get the full list of the internal variable names and switch values available to you through this command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;sstatus(&lt;br /&gt;s_name&lt;br /&gt;g_switchValue&lt;br /&gt;)&lt;br /&gt;=&amp;gt; g_switchValue&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Sets the internal system variable named to a given value. This is a syntax form. Internal variables are typically Boolean switches that accept only the Boolean values of&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp;t&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;nil&lt;/span&gt;. Efficiency and security are the reasons why these system variables are stored as internal variables, which can only be set by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;sstatus&lt;/span&gt;, rather than as SKILL variables you can set directly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Other things you can do are set breakpoints with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;breakpt&amp;nbsp;&lt;/span&gt;and then progress through your code with step and continue etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;The online document,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;SKILL Development Functions Reference&lt;/em&gt;, is helpful for describing the functions. However,&amp;nbsp;you&amp;nbsp;must be aware that any reference to a graphical interface for debugging does not apply to axlSKILL. As with any programming language, you can set a debug variable and then make conditional checks for it. If set, you can have your code print values of variables from your code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The other way to check the code before delivery is to launch the SKLINT tool and to try to solve all warnings, errors given by this tool.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Steps to use SKLINT on UNIX:&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Run&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;setenv &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;TELSKILL&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp;&lt;/span&gt;in your local env file.&lt;/li&gt;
&lt;li&gt;Run Allegro and then keep Allegro iconified.&lt;/li&gt;
&lt;li&gt;In the current shell window, the prompt becomes&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;SKILL&amp;gt;&lt;/span&gt;. Launch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;SKILL&amp;gt; sklint ?file &amp;quot;filetodebug.il&amp;quot;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;filetodebug.il&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the file name you want to debug.&lt;/li&gt;
&lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>customized GUI to control artwork film</title><link>https://community.cadence.com/thread/66019?ContentTypeID=0</link><pubDate>Mon, 01 Jun 2026 05:45:19 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:7a793bfc-6373-49b3-b7d0-0e48a6ad3a8a</guid><dc:creator>MZ20250602835</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66019?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66019/customized-gui-to-control-artwork-film/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear all,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;i would like to use film_domain.form as the base to create a customized GUI in which the user/Layouter can assign specific artwork films for Artwork and PDF domains(the Domains IPC2581 and Visibility will not be displayed).&lt;/p&gt;
&lt;p&gt;may i ask in my case which skill should i used to achieve the expected function?&lt;/p&gt;
&lt;p&gt;Many thanks&lt;/p&gt;
&lt;p&gt;Moyan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to use Stack in Allegro SKILL</title><link>https://community.cadence.com/thread/65934?ContentTypeID=0</link><pubDate>Thu, 16 Apr 2026 21:46:08 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:56b6a6b2-ae94-4ef4-81be-551c73a2696f</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/65934?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65934/how-to-use-stack-in-allegro-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p dir="ltr"&gt;Stack is a popular data structure in programming languages. It is like a real-world stack such as piles of papers,&amp;nbsp;where papers are usually added to the top of the pile and removed from the top. So, in a&amp;nbsp;stack&amp;nbsp;data structure, you can add or remove elements from the top of the stack&amp;nbsp;using the&amp;nbsp;LIFO (Last-In-First-Out)&amp;nbsp;principle.&lt;/p&gt;
&lt;p&gt;Stack in Allegro SKILL is a list that&amp;nbsp;works like a stack using APIs/functions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;pushf&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;popf&lt;/span&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;pushf&amp;nbsp;&lt;/span&gt;adds an element to the top of the stack, that is,&amp;nbsp;adds the first element to&amp;nbsp;the list.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;popf&amp;nbsp;&lt;/span&gt;removes an element from the top of the stack, that is, the&amp;nbsp;first element of the list.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code is as shown below:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;myStack=list(3 4 5 6)&lt;br /&gt;printf(&amp;quot;Stack is %L\n&amp;quot;&amp;nbsp;myStack)&lt;br /&gt;pushf(2&amp;nbsp;myStack)&lt;br /&gt;printf(&amp;quot;After pushing 2 Stack is %L\n&amp;quot;&amp;nbsp;myStack)&lt;br /&gt;pushf(1&amp;nbsp;myStack)&lt;br /&gt;printf(&amp;quot;After pushing 1 Stack is %L\n&amp;quot;&amp;nbsp;myStack)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;printf(&amp;quot;Before popping Stack is %L\n&amp;quot;&amp;nbsp;myStack)&lt;br /&gt;elem=popf(myStack)&lt;br /&gt;printf(&amp;quot;After popping: Element removed from stack is %L and&amp;nbsp;Stack is %L\n&amp;quot;&amp;nbsp;elem&amp;nbsp;myStack)&lt;br /&gt;elem=popf(myStack)&lt;br /&gt;printf(&amp;quot;After popping again: Element removed from stack is %L and&amp;nbsp;Stack is %L\n&amp;quot;&amp;nbsp;elem&amp;nbsp;myStack)&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;The following image shows its output:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1776375939091v1.png" alt=" " /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to get all voids on conductor layer?</title><link>https://community.cadence.com/thread/65911?ContentTypeID=0</link><pubDate>Wed, 08 Apr 2026 22:39:22 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f3318bc6-1265-4661-8685-93b4dead6c0e</guid><dc:creator>khuranav007</dc:creator><slash:comments>4</slash:comments><comments>https://community.cadence.com/thread/65911?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65911/how-to-get-all-voids-on-conductor-layer/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;What is the best way or methodology to obtain all voids (lack of metal) on a conductor layer?&lt;/p&gt;
&lt;p&gt;I tried to use the following polygon-&amp;gt;holes like shown below but it does not get all voids (lack of metal).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;shpAbovePoly = car(axlPolyFromDB(shpAbove)) &lt;/code&gt;&lt;br /&gt;&lt;code&gt; shpAbovePolyHoles = shpAbovePoly-&amp;gt;holes&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;img style="max-height:480px;max-width:640px;" src="https://community.cadence.com/resized-image/__size/1280x960/__key/communityserver-discussions-components-files/137/pastedimage1775687921710v1.png" alt=" " /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;Voids in orange box are desired.&lt;/p&gt;
&lt;p&gt;Thanks for help.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Need the Skill files</title><link>https://community.cadence.com/thread/65874?ContentTypeID=0</link><pubDate>Thu, 26 Mar 2026 06:40:05 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3042713b-b741-4d9c-b996-17080aeddbd4</guid><dc:creator>PK202511125928</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/65874?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65874/need-the-skill-files/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi Every one,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Please for allegro 23.1 any skill files ther please give me.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Like checklist runner for.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Interactive Form</title><link>https://community.cadence.com/thread/65869?ContentTypeID=0</link><pubDate>Wed, 25 Mar 2026 07:20:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ae9e01b5-3a2d-4cb2-97e5-08e1af737c84</guid><dc:creator>AA202603241137</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/65869?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65869/interactive-form/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am planning to create a script but this needs to have a form that is interactive.&amp;nbsp; The form changes depend on the number of layers in the PCB.&amp;nbsp; My idea to list all the layers of the PCB in the form and also have a checkbox beside each layer name.&amp;nbsp; But my knowledge on the form is basic only. I only use TEXT, GROUP, MENUBOTTON, STRFILLIN.&amp;nbsp; Can somebody guide or educate me.&amp;nbsp; Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>how to Fetch parameters of  the Options window</title><link>https://community.cadence.com/thread/65845?ContentTypeID=0</link><pubDate>Wed, 18 Mar 2026 07:32:09 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3c8d048e-cea4-4e98-8322-ea2de97ff9d1</guid><dc:creator>Hoangkhoipcb</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/65845?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65845/how-to-fetch-parameters-of-the-options-window/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Methods for identifying form handles and fetching parameters from the dynamic Options sidebar in Cadence Allegro&lt;/p&gt;
&lt;p&gt;Any code snippets or references to the documentation would be greatly appreciated.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to use regular expressions in SKILL</title><link>https://community.cadence.com/thread/65759?ContentTypeID=0</link><pubDate>Fri, 20 Feb 2026 07:55:52 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:b2a3bc2c-c8bb-459c-b2d5-aa5aa9b53c5a</guid><dc:creator>SaiPavanl</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/65759?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65759/how-to-use-regular-expressions-in-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p dir="ltr"&gt;&lt;span&gt;Often, you need to match strings or symbols against a pattern. A regular expression is an object that describes a pattern of characters. Regular expressions are a way to match patterns with sequences of characters. They are used in every programming language like C++, Java, and Python. SKILL also provides a number of pattern-matching functions like&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexMatchp&lt;/span&gt;,&amp;nbsp;&lt;span&gt;rexCompile&lt;/span&gt;,&amp;nbsp;and&amp;nbsp;&lt;span&gt;rexExecute&lt;/span&gt;.&lt;/p&gt;
&lt;p dir="ltr"&gt;SKILL also supports&amp;nbsp;&lt;span&gt;pcreCompile&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;span&gt;pcreExecute&lt;/span&gt;&amp;nbsp;for&lt;span&gt;&amp;nbsp;Perl-Compatible Regular Expressions (PCRE).&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;strong&gt;rexMatchp&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;If you want to see whether the string matches a regular expression, you can use&amp;nbsp;rexMatchp. For example, to check if a string has only numbers with a decimal point, you can use&amp;nbsp;rexMatchp,&amp;nbsp;as shown below:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Rules for constructing patterns or regular expressions are given later in this&amp;nbsp;article.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;strong&gt;Note:&lt;/strong&gt;&amp;nbsp;Here, the output of the SKILL&amp;nbsp;command is shown&amp;nbsp;after the&amp;nbsp;=&amp;gt;&amp;nbsp;symbol:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp(&amp;quot;[0-9]*[.][0-9][0-9]*&amp;quot; &amp;quot;100.001&amp;quot;)&amp;nbsp; &amp;nbsp; =&amp;gt; t&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp(&amp;quot;[0-9]*[.][0-9]+&amp;quot; &amp;quot;.001&amp;quot;)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; t&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp(&amp;quot;[0-9]*[.][0-9]+&amp;quot; &amp;quot;.&amp;quot;) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp(&amp;quot;[0-9]*[.][0-9][0-9]*&amp;quot; &amp;quot;10.&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp(&amp;quot;[0-9&amp;quot; &amp;quot;100&amp;quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;*Error*&amp;nbsp;rexMatchp: Missing ] - &amp;quot;[0-9&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexMatchp( t_pattern S_target&amp;nbsp;)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;This function matches&amp;nbsp;&lt;/span&gt;&lt;span&gt;S_target&amp;nbsp;against the&amp;nbsp;&lt;/span&gt;&lt;span&gt;t_pattern&amp;nbsp;&lt;/span&gt;regular&amp;nbsp;&lt;span&gt;expression&amp;nbsp;&lt;/span&gt;&lt;span&gt;and returns&amp;nbsp;&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;&amp;nbsp;if a match is found;&amp;nbsp;&lt;/span&gt;&lt;span&gt;otherwise, it returns&amp;nbsp;&lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;An error occurs if the given pattern is ill-formed.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;&lt;span&gt;rexCompile&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span&gt;rexExecute&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;For greater efficiency when matching a number of targets against a single pattern, use the&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexCompile&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span&gt;and&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexExecute&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span&gt;functions. For example,&amp;nbsp;if you need to work on nets that match a pattern, use&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexCompile&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span&gt;and&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexExecute&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span&gt;instead of using&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexMatchp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexExecute&amp;nbsp;matches a string or symbol against the previously compiled pattern that was set up by the last&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexCompile&amp;nbsp;call.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;To check if the name of the nets that can be alphanumeric begins with alphabets, use the following command:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexCompile(&amp;quot;^[a-zA-Z][a-zA-Z0-9]*&amp;quot;)&amp;nbsp; &amp;nbsp; =&amp;gt; t&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexExecute(&amp;#39;Net123) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; t&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;rexExecute(&amp;quot;123 Nets&amp;quot;)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;strong&gt;Note:&lt;/strong&gt;&amp;nbsp;Calls to&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexMatchp&amp;nbsp;&lt;/span&gt;&lt;span&gt;reset the pattern set up by&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexCompile&lt;/span&gt;&lt;span&gt;. If any calls to&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexMatchP&amp;nbsp;have been made,&amp;nbsp;rexExecute&amp;nbsp;&lt;/span&gt;&lt;span&gt;will not&amp;nbsp;match the pattern set by&amp;nbsp;&lt;/span&gt;&lt;span&gt;rexCompile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;PCRE&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;The&amp;nbsp;PCRE&amp;nbsp;library provides functions for&amp;nbsp;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;at&lt;/span&gt;&lt;span&gt;tern match&lt;/span&gt;&lt;span&gt;ing using&lt;/span&gt;&lt;span&gt;&amp;nbsp;Perl-compatible regular expressions. For more details, refer to&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;a href="https://www.pcre.org/" rel="noopener noreferrer" target="_blank"&gt;&lt;span&gt;https://www.pcre.org&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreCompile&amp;nbsp;&lt;/span&gt;&lt;span&gt;compiles a regular expression string pattern&lt;/span&gt;&lt;span&gt;(t_pattern&lt;/span&gt;&lt;span&gt;) into an internal representation that you can use in a&amp;nbsp;pcreExecute&amp;nbsp;function call. The compilation method is&amp;nbsp;PCRE or Perl-compatible. You can use a second (optional) argument to specify independent option bits for controlling the pattern compilation.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreCompile(&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;t_pattern&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;[ x_options ]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;=&amp;gt; o_comPatObj&amp;nbsp;/ nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;For example,&amp;nbsp;the&amp;nbsp;&lt;/span&gt;&lt;span&gt;[12[:^digit:]]&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;PCRE&amp;nbsp;pattern&amp;nbsp;&lt;span&gt;matches&amp;nbsp;1,&amp;nbsp;2, or any non-&lt;/span&gt;digit.&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;comPat1 =&amp;nbsp;pcreCompile( &amp;quot;[12[:^digit:]]&amp;quot; ) =&amp;gt;&amp;nbsp;pcreobj@0x27d150&amp;nbsp;(Note that your object&amp;nbsp;will&amp;nbsp;be different)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat1 &amp;quot;abc&amp;quot; ) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; t&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat1 &amp;quot;12a&amp;quot;)&amp;nbsp; &amp;nbsp;=&amp;gt;t&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat1 &amp;quot;3&amp;quot;) =&amp;gt;nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;Here is another example:&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;comPat5 = pcreCompile( &amp;quot;^\\d?\\d(jan|feb|mar|apr|may|jun)\\d\\d$/&amp;quot; )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat5 &amp;quot;25jun3&amp;quot; ) =&amp;gt; nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat5 &amp;quot;25jun3&amp;quot;&amp;nbsp;pcreGenExecOptBits(?anchored t) ) =&amp;gt; nil&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;pcreExecute( comPat5 &amp;quot;25jun3&amp;quot;&amp;nbsp;pcreGenExecOptBits(?partial t) ) =&amp;gt; t&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Rules for constructing pattern or regular expressions&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;Regular expressions can contain both special and ordinary characters. Most ordinary characters, like&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&amp;nbsp;&lt;span&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, or&lt;span&gt;&amp;nbsp;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span&gt;, are the simplest regular expressions; they simply match themselves.&amp;nbsp;You can concatenate ordinary characters, so that&amp;nbsp;&lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt;&amp;nbsp;matches the&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;last&amp;#39;&lt;/span&gt;&amp;nbsp;string.&amp;nbsp;&lt;span&gt;There are also special symbols like&amp;nbsp;*,&amp;nbsp;+,&amp;nbsp;and so on, which you can see in detail here:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;\&amp;nbsp;&amp;nbsp;&amp;nbsp; General escape character with several uses&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;^&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert start of the string (or line, in&amp;nbsp;multi-line&amp;nbsp;mode)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;$&amp;nbsp; &amp;nbsp; Assert end of the string (or line, in&amp;nbsp;multi-line&amp;nbsp;mode)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;.&amp;nbsp;&amp;nbsp;Match any character except new line (by default)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;[&amp;nbsp; &amp;nbsp; Start character class definition&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;|&amp;nbsp; &amp;nbsp; Start of alternative branch&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;(&amp;nbsp;&amp;nbsp;&amp;nbsp;Start&amp;nbsp;subpattern&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;End&amp;nbsp;subpattern&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;?&amp;nbsp; &amp;nbsp;&amp;nbsp;Matches&amp;nbsp;0 or 1 quantifier&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;Matches 0 or more&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;M&lt;/span&gt;&lt;span&gt;atches&amp;nbsp;&lt;/span&gt;&lt;span&gt;1 or more&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;The part of a pattern that is in square brackets is called a &amp;quot;character class&amp;quot;. In a character class, the only&amp;nbsp;metacharacters&amp;nbsp;are:&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;\&amp;nbsp; &amp;nbsp; General escape character&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;^&amp;nbsp; &amp;nbsp; Negates the class, but only if the first character&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;-&amp;nbsp; &amp;nbsp; Indicates character range&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;[&amp;nbsp;&amp;nbsp;&amp;nbsp;POSIX&amp;nbsp;character class (only if followed by&amp;nbsp;POSIX&amp;nbsp;syntax)&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;]&amp;nbsp; &amp;nbsp; Terminates the character class&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Asterisk symbol (&lt;span&gt;*&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;While matching, it checks if the preceding character (or set of characters) repeats for 0 or more times (up to infinite).&lt;/span&gt;&lt;br /&gt;Example:&lt;span&gt;&amp;nbsp;The&amp;nbsp;ab*c&amp;nbsp;&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;gul&lt;/span&gt;&lt;span&gt;ar&amp;nbsp;&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;xpressio&lt;/span&gt;&lt;span&gt;n&amp;nbsp;&lt;/span&gt;&lt;span&gt;matches with&amp;nbsp;ac,&amp;nbsp;abc,&amp;nbsp;abbc,&amp;nbsp;abbbc, and&amp;nbsp;so on.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;Plus symbol (&lt;span&gt;+&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;While matching, it checks if the preceding character (or set of characters) repeats for at least one or more times (up to infinite).&lt;/span&gt;&lt;br /&gt;Example:&lt;span&gt;&amp;nbsp;The&amp;nbsp;ab+c&amp;nbsp;&lt;/span&gt;&lt;span&gt;regular&amp;nbsp;&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;n&amp;nbsp;&lt;/span&gt;&lt;span&gt;matches with&amp;nbsp;abc,&amp;nbsp;abbc,&amp;nbsp;&lt;/span&gt;&lt;span&gt;abbbc&lt;/span&gt;&lt;span&gt;,&amp;nbsp;and so on.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;Wildcard (&lt;span&gt;.&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;The dot symbol can match any character; hence. it is called the wildcard character.&lt;/span&gt;&lt;br /&gt;Example:&lt;span&gt;&amp;nbsp;The&amp;nbsp;.*&amp;nbsp;&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;eg&lt;/span&gt;&lt;span&gt;ular&amp;nbsp;&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;xp&lt;/span&gt;&lt;span&gt;ress&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;n&amp;nbsp;&lt;/span&gt;&lt;span&gt;matches with any character any number of times.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;Optional character (&lt;span&gt;?&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;While matching, the preceding character may or may not be present in the string to be matched.&lt;/span&gt;&lt;br /&gt;Example:&lt;span&gt;&amp;nbsp;In&amp;nbsp;docx?,&amp;nbsp;the&amp;nbsp;?&amp;nbsp;character tells the computer that&amp;nbsp;x&amp;nbsp;may or may not be present in the name of file format.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;Caret symbol (&lt;span&gt;^&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;The match must start at the&amp;nbsp;&lt;strong&gt;beginning&amp;nbsp;&lt;/strong&gt;of the string or line.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Example:&amp;nbsp;^abc&amp;nbsp;matches&amp;nbsp;abcd&amp;nbsp;but not&amp;nbsp;zabc.&lt;/span&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;br /&gt;&lt;strong&gt;Dollar symbol (&lt;span&gt;$&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;The match&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span&gt;must occur at the&amp;nbsp;&lt;strong&gt;end&amp;nbsp;&lt;/strong&gt;of the string or before&amp;nbsp;&lt;strong&gt;\n&lt;/strong&gt;&amp;nbsp;at the end of the line or string.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Example:&amp;nbsp;333$&amp;nbsp;matches&amp;nbsp;901-333&amp;nbsp;but not&amp;nbsp;333-901&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>What do you know about RAVEL versus SKILL ?</title><link>https://community.cadence.com/thread/65730?ContentTypeID=0</link><pubDate>Tue, 10 Feb 2026 17:30:25 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:54673396-a9e0-4e57-a717-cdcfecf88687</guid><dc:creator>John T</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/65730?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65730/what-do-you-know-about-ravel-versus-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-size:150%;"&gt;&lt;strong&gt;Show what you know! Can you answer these quick fire questions:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;img style="max-height:480px;max-width:640px;" alt=" " src="https://community.cadence.com/cfs-file/__key/communityserver-discussions-components-files/137/Accelerate-Learning.bmp" /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size:150%;"&gt;&lt;strong&gt;True or False:&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;RAVEL is &amp;ldquo;declarative&amp;rdquo; while SKILL is &amp;ldquo;procedural/functional&amp;rdquo;?&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;span style="font-size:150%;"&gt;&lt;strong&gt;True or False:&amp;nbsp;&lt;/strong&gt;&lt;strong style="font-family:inherit;"&gt;RAVEL violations can be cross‑probed in the layout via the DRC Browser?&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;span style="font-size:150%;"&gt;&lt;strong&gt;Choose the best option, &amp;ldquo;when to use&amp;rdquo;:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;&lt;span&gt;A.&amp;nbsp;&lt;/span&gt;&lt;strong&gt;SKILL&lt;/strong&gt; to create new database objects; &lt;strong&gt;RAVEL&lt;/strong&gt; to check rules/flag violations&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt; B. &lt;strong&gt;RAVEL&lt;/strong&gt; to create symbols; &lt;strong&gt;SKILL&lt;/strong&gt; to list DRCs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt; C. &lt;strong&gt;SKILL&lt;/strong&gt; only for DFM checks; &lt;strong&gt;RAVEL&lt;/strong&gt; only for routing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt; D. They&amp;rsquo;re interchangeable&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to run batch IDX files</title><link>https://community.cadence.com/thread/65723?ContentTypeID=0</link><pubDate>Mon, 09 Feb 2026 16:21:14 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:c9ae3093-5608-48bf-87c1-ddbfee320176</guid><dc:creator>Mhawley1</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/65723?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65723/how-to-run-batch-idx-files/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Has anybody sucessfully exported a IDX file using the external EXE that came with the install . -&amp;gt; see the code below which ,... doesnt work .&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;file_name = axlCurrentDesign()&lt;br /&gt;whole_board_name = strcat(file_name &amp;quot;.brd&amp;quot;)&lt;br /&gt;working_directory = getWorkingDir()&lt;br /&gt;all_of_it = strcat(working_directory &amp;quot;/&amp;quot; whole_board_name)&lt;br /&gt;whole_idx_command = strcat(all_of_it -o base &amp;quot;)&lt;/p&gt;
&lt;p&gt;exe_path = &amp;quot;C:/Cadence/SPB_22.1/tools/bin/idx_out.exe&amp;quot;&lt;br /&gt;;C:\Cadence\SPB_22.1\tools\bin so this is where that idx_out.exe is .&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;; so its not a shell command its a exe command you need to do .&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;axlRunBatchDBProgram(exe_path &lt;span&gt;whole_idx_command&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;; so this doesnt work .&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>menu creation in orcad pcb skill</title><link>https://community.cadence.com/thread/65718?ContentTypeID=0</link><pubDate>Sun, 08 Feb 2026 12:31:44 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:4133b376-a37d-40e4-893d-0dd950058c5a</guid><dc:creator>digital1</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/65718?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65718/menu-creation-in-orcad-pcb-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi i have created a routine in skill to run in pcb editor this code runs and does its thing however i now want to code a menu so the menu is inserted at startup.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;i have inserted the file to load in my allegro.ilinit as&amp;nbsp;&amp;nbsp;(load &amp;quot;net_short.il&amp;quot;)&lt;/p&gt;
&lt;p&gt;the top of my net_short.il file is&amp;nbsp;&lt;/p&gt;
&lt;p&gt;q = axlUIMenuFind(nil -1)&lt;br /&gt;z = axlUIMenuInsert( q &amp;#39;popup &amp;quot;TDR Electronics&amp;quot;)&lt;br /&gt;axlUIMenuInsert(z &amp;quot;Net Short&amp;quot; &amp;quot;net_short&amp;quot;)&lt;/p&gt;
&lt;p&gt;axlCmdRegister(&amp;quot;net_short&amp;quot; `_net_short)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;however there is no menu at the top of the pcb editor and it should be left of the help menu the code has been loaded because when i type net_short in the command window the code runs&lt;/p&gt;
&lt;p&gt;however i can type in the command window skill load &amp;quot;net_short.il&amp;quot; and the menu has my updated menu in it and i can then run the code from that menu.&lt;/p&gt;
&lt;p&gt;I believe it is a timing issue but i dont know how to get any further I am running orcad pcb version 24.1&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;can any one help&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to use Allegro Skill language to check if the height of bottom components are more than 4mm and highlight them</title><link>https://community.cadence.com/thread/65690?ContentTypeID=0</link><pubDate>Wed, 28 Jan 2026 01:48:18 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:2bca9403-7d80-418d-a023-48c48841a8ae</guid><dc:creator>BZ202408076026</dc:creator><slash:comments>6</slash:comments><comments>https://community.cadence.com/thread/65690?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65690/how-to-use-allegro-skill-language-to-check-if-the-height-of-bottom-components-are-more-than-4mm-and-highlight-them/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am newcomer for Cadence Skill language and I am learning on how to develop programing to check what I want in Cadence Allegro.&lt;/p&gt;
&lt;p&gt;Now I want to check if the height of bottom components are more than 4mm and highlight them if existed. But I&amp;nbsp;don&amp;#39;t know where to start. Does anybody have the experience to write the Skill?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Running ODB++ without GUI</title><link>https://community.cadence.com/thread/65573?ContentTypeID=0</link><pubDate>Tue, 16 Dec 2025 14:48:43 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:8afb90a5-8746-4c41-bbcd-aac1b1f5cdd2</guid><dc:creator>Uri Chaplin</dc:creator><slash:comments>4</slash:comments><comments>https://community.cadence.com/thread/65573?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65573/running-odb-without-gui/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;I try to create ODB++ files without a GUI.&amp;nbsp; I used ODB++ Inside&amp;nbsp; board and checked that no warning to brd file I going to use.&lt;/div&gt;
&lt;div&gt;First I created a BAT file to check if all parameters are good.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;I run this file :&lt;/div&gt;
&lt;div&gt;-----------------------------------------------------------&lt;/div&gt;
&lt;div&gt;SET ALLEGRO_BOARD=&amp;quot;c:\ODB\test.brd&amp;quot;&lt;br /&gt;SET OUTPUT_DIR=&amp;quot;c:\ODB\odb_export&amp;quot;&lt;br /&gt;SET ALLEGRO_BRD2ODB=&amp;quot;c:\ODB\brd2odb_2510\&amp;quot;&lt;br /&gt;&lt;br /&gt;%ALLEGRO_BRD2ODB%brd2odb.exe -ijp %ALLEGRO_BOARD% &amp;nbsp;-jp %OUTPUT_DIR% -jn allegro_1&amp;nbsp; -no_view -noDPW&lt;br /&gt;pause&lt;/div&gt;
&lt;div&gt;
&lt;div class="gmail_signature" dir="ltr" data-smartmail="gmail_signature"&gt;
&lt;div dir="ltr"&gt;
&lt;div&gt;
&lt;div dir="ltr"&gt;
&lt;div&gt;----------------------------------------------------------------&lt;/div&gt;
&lt;div&gt;But it always open GUI and report error: Translation filed ! Some required&amp;nbsp;files are missing ( elf_cadence-583004)&lt;/div&gt;
&lt;div&gt;What is wrong ?&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>axlDBChangeDesignOrigin issue</title><link>https://community.cadence.com/thread/65550?ContentTypeID=0</link><pubDate>Mon, 08 Dec 2025 18:58:50 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:140b80f9-cdf8-4e98-9763-aa1b1fb5d7df</guid><dc:creator>DG20250828451</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/65550?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/65550/axldbchangedesignorigin-issue/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Has anyone had this happen...?&lt;/p&gt;
&lt;p&gt;When I issue the&amp;nbsp;axlDBChangeDesignOrigin command on my laptop, there is no issue. The origin will change.&lt;/p&gt;
&lt;p&gt;When I issue it on my desktop, it fails to change the origin.&lt;/p&gt;
&lt;p&gt;I am using Allegro 23.1 S007&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>