<?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>Sat, 31 Oct 2026 14:35:49 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>It Worked the First Time! Why Does My SKILL Code Fail on the Second Run?</title><link>https://community.cadence.com/thread/74760?ContentTypeID=0</link><pubDate>Sat, 31 Oct 2026 14:35:49 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:af85a1d9-ef55-4c28-9401-1e0876dd4a91</guid><dc:creator>JuanCR</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/74760?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/74760/it-worked-the-first-time-why-does-my-skill-code-fail-on-the-second-run/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Have you ever run a SKILL function successfully, only to find that running it again produces an error or unexpected behaviour?&lt;/p&gt;
&lt;p&gt;One common cause is that the first execution changes the database or application state that the code assumes will still be available on the next run. For example, your code may keep references to database objects that have since been deleted, replaced, or modified.&lt;/p&gt;
&lt;p&gt;A useful troubleshooting technique is to avoid relying on database object IDs stored globally between executions. Instead, retrieve the objects you need each time the function runs and validate the returned values before operating on them.&lt;/p&gt;
&lt;p&gt;For instance:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;code&gt;procedure(processSelectedObject()&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; let((obj)&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;code&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;obj = car(axlGetSelSet())&lt;/code&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;code&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;if(obj then&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;printf(&amp;quot;Current object: %L\n&amp;quot; obj)&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;; Process obj here&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;else&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;printf(&amp;quot;No object is currently selected.\n&amp;quot;)&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;)&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;This also demonstrates another useful habit: &lt;strong&gt;check the result before using it&lt;/strong&gt;. For example:&lt;/div&gt;
&lt;div style="padding-left:30px;"&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-family:inherit;"&gt;obj = car(axlGetSelSet())&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div style="padding-left:30px;"&gt;&lt;br /&gt;&lt;code&gt;when(obj&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;printf(&amp;quot;Selected object type: %L\n&amp;quot; obj-&amp;gt;objType)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;)&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;"&gt;Database objects aren&amp;#39;t the only thing to consider. A SKILL script can also change session state such as the current selection or Find Filter. If your function depends on a particular state, the second execution may start under different conditions than the first.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;"&gt;When debugging this kind of problem, try this approach:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run the function once.&lt;/li&gt;
&lt;li&gt;Check what changed in the design or session.&lt;/li&gt;
&lt;li&gt;Run it again and identify the first operation that behaves differently.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;printf()&lt;/code&gt; statements around&amp;nbsp;your operations.&lt;/li&gt;
&lt;li&gt;Inspect database objects and return values instead of assuming they are valid.&lt;/li&gt;
&lt;li&gt;Where appropriate, reacquire database objects rather than relying on references retained from an earlier execution.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;These steps are crucial specially when you&amp;#39;re testing loose SKILL commands, where moving the canvas, zooming in or modifying the position of the elements might change the dbIDs of the objects.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;The important question isn&amp;#39;t always &lt;strong&gt;&amp;quot;Why did my SKILL code fail?&amp;quot;&lt;/strong&gt; Sometimes the better question is:&lt;/p&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;What did the first execution change that the second execution wasn&amp;#39;t expecting?&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That small shift in troubleshooting approach can make intermittent SKILL problems much easier to isolate.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;Have you encountered a SKILL function that behaves differently on its second execution? What was the root cause, and how did you track it down?&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id="gtx-trans" style="left:346px;position:absolute;top:373px;"&gt;
&lt;div class="gtx-trans-icon"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to calculate Actual Value in Allegro skill?</title><link>https://community.cadence.com/thread/74721?ContentTypeID=0</link><pubDate>Tue, 20 Oct 2026 02:21:07 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:2dbfe394-0bb8-4574-a7ef-8eeacf61ea0f</guid><dc:creator>SK202607205032</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/74721?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/74721/how-to-calculate-actual-value-in-allegro-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi All,&lt;/p&gt;
&lt;p&gt;I am trying to calculate the actual distance between a pin and silkscreen text. Although I am using axlAirGap(), the returned value doesn&amp;#39;t match the actual value shown in the DRC.&lt;br /&gt;Instead, it returns &amp;#39;No Air Gap&amp;#39;, which is consistent with the Measure tool&amp;#39;s result.&lt;br /&gt;Is there a way to accurately calculate this &amp;#39;Actual Value&amp;#39;?&lt;/p&gt;
&lt;p&gt;Thanks!!&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:260px;max-width:685px;" height="260" src="https://community.cadence.com/resized-image/__size/1370x520/__key/communityserver-discussions-components-files/137/pastedimage1792462831101v1.png" width="685" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Extract areas on the FPCB that do not contain arcs.(Season2)</title><link>https://community.cadence.com/thread/74336?ContentTypeID=0</link><pubDate>Wed, 30 Sep 2026 02:36:21 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:6f4c138c-0f78-409e-ac57-11e8e32b1294</guid><dc:creator>SG20260713408</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/74336?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/74336/extract-areas-on-the-fpcb-that-do-not-contain-arcs-season2/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello, everyone.&lt;br /&gt;I am reposting this with the finalized code,&lt;br /&gt;which builds upon the code shared by &amp;quot;Hoangkhoipcb&amp;quot;.&lt;br /&gt;Once again, I would like to thank &amp;quot;Hoangkhoipcb&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;Note : Changed on 26Y/10M/16D (;; Change Here)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Enabled execution by layer within APD.&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;br /&gt;/* &lt;br /&gt;================================================================================&lt;/p&gt;
&lt;p&gt;*&lt;span&gt;(26Y/09M/30D)&lt;/span&gt;&lt;br /&gt;* Command&amp;nbsp; &amp;nbsp;: create_arc_chk&lt;br /&gt;* Function&amp;nbsp; &amp;nbsp; &amp;nbsp; : Checks for bent corners (sharp angles) without arcs on CLINES.&lt;br /&gt;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Highlights detected segments and generates a report log.&lt;br /&gt;*&lt;br /&gt;* [How to Use]&lt;br /&gt;* 1. Modified to allow checking of individual layers or all layers.&lt;br /&gt;* 2. When the window appears after execution:&lt;br /&gt;* 3. Select the layer you wish to check and click the OK button.&lt;br /&gt;* - All_Layer : Checks clines on all layers.&lt;br /&gt;* - Others&amp;nbsp; &amp;nbsp; &amp;nbsp;: Checks clines only on the specific layer.&lt;br /&gt;* 4. Clicking the Cancel button stops the operation.&lt;br /&gt;*&lt;br /&gt;* Output File : create_arc_chk.log&lt;br /&gt;================================================================================&lt;br /&gt;*/&lt;/p&gt;
&lt;p&gt;axlCmdRegister(&amp;quot;create_arc_chk&amp;quot; &amp;#39;create_arc_chk)&lt;/p&gt;
&lt;p&gt;(defun create_arc_chk ()&lt;br /&gt; (let (all_layers sel_layer clines seg_list Out_file segs seg next_seg angle pt_corner error_count)&lt;br /&gt; &lt;br /&gt; all_layers = append(list(&amp;quot;All_Layer&amp;quot;) axlSubclassRoute(?field &amp;#39;isEtch))&lt;br /&gt; sel_layer = nth(axlUIMultipleChoice(&amp;quot;Select a Layer&amp;quot; all_layers &amp;quot;All Etch Layer&amp;quot;) all_layers)&lt;/p&gt;
&lt;p&gt;when(sel_layer&lt;br /&gt; if(sel_layer == &amp;quot;All_Layer&amp;quot; then&lt;br /&gt; axlSetFindFilter(?enabled &amp;#39;(&amp;quot;noall&amp;quot; &amp;quot;CLINES&amp;quot; &amp;quot;INVISIBLE&amp;quot;) ?onButtons &amp;#39;(&amp;quot;all&amp;quot;))&lt;br /&gt; axlAddSelectAll()&lt;br /&gt; clines = axlGetSelSet()&lt;br /&gt; else&lt;br /&gt; axlVisibleDesign(nil)&lt;br /&gt;axlVisibleLayer(strcat(axlMapClassName(&amp;quot;ETCH&amp;quot;) &amp;quot;/&amp;quot; sel_layer) t)&amp;nbsp; &lt;span style="color:#ff0000;"&gt;;; Changed here.&lt;/span&gt;&lt;br /&gt; axlVisibleLayer(strcat(&amp;quot;PIN/&amp;quot; sel_layer) t)&lt;br /&gt; axlVisibleLayer(strcat(&amp;quot;VIA CLASS/&amp;quot; sel_layer) t)&lt;br /&gt; axlVisibleLayer(&amp;quot;BOARD GEOMETRY/OUTLINE&amp;quot; t)&lt;br /&gt; axlVisibleUpdate(t)&lt;br /&gt; axlSetFindFilter(?enabled &amp;#39;(&amp;quot;noall&amp;quot; &amp;quot;CLINES&amp;quot;) ?onButtons &amp;#39;(&amp;quot;all&amp;quot;))&lt;br /&gt; axlAddSelectAll()&lt;br /&gt; clines = axlGetSelSet()&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;axlClearSelSet()&lt;br /&gt; &lt;br /&gt; seg_list = nil&lt;br /&gt; error_count = 0&lt;/p&gt;
&lt;p&gt;Out_file = outfile(&amp;quot;create_arc_chk.log&amp;quot; &amp;quot;w&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Out_file &amp;quot;%-5s %-7s %-10s %s\n&amp;quot; &amp;quot;No&amp;quot; &amp;quot;Angle&amp;quot; &amp;quot;Layer&amp;quot; &amp;quot;Location&amp;quot;)&lt;/p&gt;
&lt;p&gt;foreach(cline clines&lt;br /&gt; segs = cline-&amp;gt;segments&lt;br /&gt; while(cdr(segs)&lt;br /&gt; seg = car(segs)&lt;br /&gt; next_seg = cadr(segs)&lt;/p&gt;
&lt;p&gt;/* Proceed only if both segments are straight lines */&lt;br /&gt; if(seg-&amp;gt;xy == nil &amp;amp;&amp;amp; next_seg-&amp;gt;xy == nil then&lt;br /&gt; &lt;br /&gt; /* Find the intersection point of two consecutive line segments */&lt;br /&gt; if(axlGeoPointsEqual(car(seg-&amp;gt;startEnd) car(next_seg-&amp;gt;startEnd)) || axlGeoPointsEqual(car(seg-&amp;gt;startEnd) cadr(next_seg-&amp;gt;startEnd)) then&lt;br /&gt; pt_corner = car(seg-&amp;gt;startEnd)&lt;br /&gt; else&lt;br /&gt; pt_corner = cadr(seg-&amp;gt;startEnd)&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;angle = abs(axlRadToDeg(axlGeoAngleBetweenLines(seg-&amp;gt;startEnd next_seg-&amp;gt;startEnd)))&lt;br /&gt; &lt;br /&gt; if(!axlGeoEqual(angle 0.0) &amp;amp;&amp;amp; !axlGeoEqual(angle 180.0) then&lt;br /&gt; error_count = error_count + 1&lt;br /&gt; &lt;br /&gt; fprintf(Out_file &amp;quot;%-5d %-7.2f %-10s %L\n&amp;quot; error_count angle cadr(parseString(seg-&amp;gt;layer &amp;quot;/&amp;quot;)) pt_corner)&lt;br /&gt; &lt;br /&gt; seg_list = cons(seg seg_list)&lt;br /&gt; seg_list = cons(next_seg seg_list)&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt; segs = cdr(segs)&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt; close(Out_file)&lt;/p&gt;
&lt;p&gt;if(error_count &amp;gt; 0 then&lt;br /&gt; axlHighlightObject(seg_list)&lt;br /&gt; axlUIViewFileCreate(&amp;quot;create_arc_chk.log&amp;quot; &amp;quot;Arc Segments Check&amp;quot; nil)&lt;br /&gt; printf(&amp;quot;### Errors : %d ###\n&amp;quot; error_count)&lt;br /&gt; else&lt;br /&gt; printf(&amp;quot;### No arc-less corners found. ###\n&amp;quot;)&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>SKILL: "*Error* if: too many arguments (missing then?)" error on running "if" command</title><link>https://community.cadence.com/thread/70342?ContentTypeID=0</link><pubDate>Mon, 28 Sep 2026 10:08:01 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:2bea1d7b-56bc-4cca-9fa0-7401389821f8</guid><dc:creator>JuanCR</dc:creator><slash:comments>4</slash:comments><comments>https://community.cadence.com/thread/70342?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/70342/skill-error-if-too-many-arguments-missing-then-error-on-running-if-command/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Check out the&amp;nbsp;following statement:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( order&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters = foreach( mapcar param order (get cdfgData param))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters = (getq cdfgData parameters)&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It seems&amp;nbsp;&lt;span&gt;a &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;then &lt;/span&gt;keyword is missing, and&amp;nbsp;the tool&amp;nbsp;&lt;strong&gt;does not&lt;/strong&gt;&amp;nbsp;complain&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Now let&amp;#39;s say you add&amp;nbsp;a &lt;strong&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;printf &lt;/span&gt;&lt;/strong&gt;command like:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( order&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters = foreach( mapcar param order (get cdfgData param))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parameters = (getq cdfgData parameters)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;printf(&amp;quot;%L&amp;quot; parameters~&amp;gt;values)&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this case,&amp;nbsp;you&amp;#39;ll get&amp;nbsp;the following error:&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;*Error* if: too many arguments (missing then?) -&amp;nbsp;&lt;br /&gt;(order (parameters = foreach(mapcar param order get(cdfgData param)))&amp;nbsp;&lt;br /&gt;(parameters = (cdfgData-&amp;gt;parameters)) printf(&amp;quot;%L&amp;quot; (parameters~&amp;gt;values)))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Why did&amp;nbsp;you get this error, and how can you fix it? I&amp;#39;ll show you:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="solSection"&gt;
&lt;p&gt;&lt;span&gt;Consider a simpler example. In the command line, type:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;x = 2&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Then enter&amp;nbsp;this expression:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( (x &amp;gt; 5) 1 0)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The tool will evaluate whether x &amp;gt; 5; if so, a &amp;quot;1&amp;quot; will be returned; otherwise, a &amp;quot;0&amp;quot; will be returned. Since 2 is less than 5, you will see the returned value as follows:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;=&amp;gt; 0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This is because&amp;nbsp;the &amp;quot;if&amp;quot; command falls into the following syntax:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( g_condition g_thenExpression [ g_elseExpression ] )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Now, if a fourth argument is added&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&amp;quot;3&amp;quot; in this case)&amp;nbsp;&lt;/span&gt;&lt;span&gt;as follows:&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( (x &amp;gt; 5) 1 0 &lt;strong&gt;3&lt;/strong&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;You will now see the following error:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;*Error* if: too many arguments (missing then?) - ((x &amp;gt; 5) 1 0 3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;You get it because the &amp;#39;&lt;strong&gt;compact&lt;/strong&gt;&amp;#39; form of&amp;nbsp;the if&amp;nbsp;command is no longer applied.&amp;nbsp;The syntax now becomes:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( g_condition then g_thenExpr1 ... [ else g_elseExpr1 ... ] )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Thus, you&amp;nbsp;need to add a &amp;quot;&lt;em&gt;then&lt;/em&gt;&amp;quot; for&amp;nbsp;a complete &amp;quot;if&amp;quot; command. If it is not present, the tool will generate an error message.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It is&amp;nbsp;&lt;span&gt;recommended to use the &amp;quot;&lt;em&gt;then&lt;/em&gt;&amp;quot;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&amp;quot;&lt;em&gt;else&lt;/em&gt;&amp;quot; keywords to avoid such syntax errors and reduce confusion.&amp;nbsp;There are times when the &amp;#39;compact&amp;#39;&amp;nbsp;form is handy without the bloat of &lt;span&gt;then...else&lt;/span&gt;, but it is generally&amp;nbsp;&lt;span&gt;recommended to add these keywords.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Check the &lt;em&gt;&lt;a href="https://support.cadence.com/apex/techpubDocViewerPage?xmlName=sklanguser.xml&amp;amp;title=Cadence%20SKILL%20Language%20User%20Guide%20--%20Getting%20Started%20-%20The%20if%20Function&amp;amp;hash=pgfId-1008931&amp;amp;c_version=ICADVM18.1&amp;amp;path=sklanguser/sklanguserICADVM18.1/chap1.html#pgfId-1008931" rel="noopener noreferrer" target="_blank"&gt;SKILL Language Reference&lt;/a&gt;&lt;/em&gt;&amp;nbsp;for details. Here&amp;#39;s an excerpt&amp;nbsp;from the input for the if conditional:&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This command selectively evaluates two groups of one or more expressions. The syntax is as follows:&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;if( g_condition g_thenExpression [ g_elseExpression ] )&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;=&amp;gt; g_result&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &amp;quot;if&amp;quot; form evaluates &lt;span&gt;g_condition&lt;/span&gt;, typically a relational expression, and executes &lt;span&gt;g_thenExpression&lt;/span&gt; if the&amp;nbsp;condition is true (that is, its value is non-nil); otherwise, &lt;span&gt;g_elseExpression&lt;/span&gt; is executed. The value returned by &amp;quot;if&amp;quot; is the value of the corresponding expression evaluated. The &amp;quot;if&amp;quot; form can therefore be used to evaluate expressions&amp;nbsp;conditionally.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;if( g_condition then g_thenExpr1 ... [ else g_elseExpr1 ... ] )&amp;nbsp;&lt;br /&gt;=&amp;gt; g_result&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The second form of &amp;quot;if&amp;quot; uses the keywords &amp;quot;then&amp;quot; and &amp;quot;else&amp;quot; to group expressions into a conditional execution sequence.&amp;nbsp;If the condition is true, the sequence of expressions between &amp;quot;then&amp;quot; and &amp;quot;else&amp;quot; (or the end of the if form) is evaluated,&amp;nbsp;with the value of the last expression evaluated returned as the value of the form. If the condition is nil instead,&amp;nbsp;the sequence of expressions following the &amp;quot;else&amp;quot; keyword (if any) is evaluated instead. Again, the value of the last&amp;nbsp;expression evaluated is returned as the value of the form.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Extract areas on the FPCB that do not contain arcs.</title><link>https://community.cadence.com/thread/66340?ContentTypeID=0</link><pubDate>Sat, 19 Sep 2026 04:48:27 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1cfef0c1-1dfd-440a-a7a1-b41e7c7b27ff</guid><dc:creator>SG20260713408</dc:creator><slash:comments>8</slash:comments><comments>https://community.cadence.com/thread/66340?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66340/extract-areas-on-the-fpcb-that-do-not-contain-arcs/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;When designing an FPCB (Flexible Printed Circuit Board), corners are often rounded using arcs.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This script extracts the coordinates of connection points between cline segments where no arc has been generated.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;In other words, assuming that all corners should be rounded with arcs, it identifies the locations where arcs are missing.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Therefore, you can verify the design by running the test after applying arcs to all corners.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;GoodBye~~&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;axlCmdRegister(&amp;quot;find_napoc&amp;quot; &amp;#39;Find_No_Arc_Point_Of_Clines ?cmdType &amp;quot;interactive&amp;quot;)&lt;/p&gt;
&lt;p&gt;procedure(Find_No_Arc_Point_Of_Clines()&lt;/p&gt;
&lt;p&gt;let((theta_lists check_list check_lists cline_seg_count all_cline_seg_count&lt;br /&gt; sel_nets sel_net_name sel_net_branches sel_net_branches_childrens pin_via_dbs cline_dbs&lt;br /&gt; cline_db_segments first_seg_in_pin_via_value layer first_startend&lt;br /&gt; first_start_xy first_end_xy first_find_pin_via_db first_find_pin_via_db_poly first_start_xy_in_db_result first_end_xy_in_db_result&lt;br /&gt; last_startend last_start_xy last_end_xy last_find_pin_via_db last_find_pin_via_db_poly&lt;br /&gt; segment_objtype segment_layer segment_start_end_xy segment_start_xy segment_start_x segment_start_y&lt;br /&gt; segment_end_xy segment_end_x segment_end_y delta_x delta_y&lt;br /&gt; theta theta_lists seg_start_xy_in_first_db_result seg_start_xy_in_last_db_result)&lt;/p&gt;
&lt;p&gt;theta_lists = list(nil)&lt;/p&gt;
&lt;p&gt;check_lists = list()&lt;/p&gt;
&lt;p&gt;axlClearSelSet()&lt;/p&gt;
&lt;p&gt;sel_nets = axlDBGetDesign() -&amp;gt; nets&lt;/p&gt;
&lt;p&gt;foreach(sel_net sel_nets&lt;/p&gt;
&lt;p&gt;sel_net_name = sel_net -&amp;gt; name&lt;/p&gt;
&lt;p&gt;sel_net_branches = sel_net -&amp;gt; branches&lt;/p&gt;
&lt;p&gt;when(sel_net_branches&lt;/p&gt;
&lt;p&gt;foreach(sel_net_branche sel_net_branches&lt;/p&gt;
&lt;p&gt;sel_net_branches_childrens = sel_net_branche -&amp;gt; children&lt;/p&gt;
&lt;p&gt;pin_via_dbs = setof(db sel_net_branches_childrens db -&amp;gt; objType == &amp;quot;pin&amp;quot; || db -&amp;gt; objType == &amp;quot;via&amp;quot;)&lt;/p&gt;
&lt;p&gt;cline_dbs = setof(db sel_net_branches_childrens db -&amp;gt; objType == &amp;quot;path&amp;quot;)&lt;/p&gt;
&lt;p&gt;when(cline_dbs&lt;/p&gt;
&lt;p&gt;foreach(cline_db cline_dbs&lt;/p&gt;
&lt;p&gt;cline_db_segments = cline_db -&amp;gt; segments&lt;/p&gt;
&lt;p&gt;when(cline_db_segments&lt;/p&gt;
&lt;p&gt;cline_db_segments_length = length(cline_db_segments)&lt;/p&gt;
&lt;p&gt;cline_seg_count = 0&lt;/p&gt;
&lt;p&gt;all_cline_seg_count = 0&lt;/p&gt;
&lt;p&gt;first_seg_in_pin_via_value = nil&lt;/p&gt;
&lt;p&gt;layer = car(cline_db_segments) -&amp;gt; layer&lt;/p&gt;
&lt;p&gt;first_startend = car(cline_db_segments) -&amp;gt; startEnd&lt;/p&gt;
&lt;p&gt;first_start_xy = car(first_startend)&lt;/p&gt;
&lt;p&gt;first_end_xy = cadr(first_startend)&lt;/p&gt;
&lt;p&gt;first_find_pin_via_db = car(setof(db pin_via_dbs axlGeoPointsEqual(db -&amp;gt; xy first_start_xy)))&lt;/p&gt;
&lt;p&gt;if(first_find_pin_via_db then&lt;/p&gt;
&lt;p&gt;first_find_pin_via_db_poly = car(axlPolyFromDB(first_find_pin_via_db ?layer layer ?padType &amp;#39;REGULAR))&lt;/p&gt;
&lt;p&gt;first_start_xy_in_db_result = axlGeoPointInShape(first_start_xy first_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;first_end_xy_in_db_result = axlGeoPointInShape(first_end_xy first_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;when(first_start_xy_in_db_result &amp;amp;&amp;amp; first_end_xy_in_db_result first_seg_in_pin_via_value = t)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;first_find_pin_via_db_poly = nil&lt;/p&gt;
&lt;p&gt;first_seg_in_pin_via_value = nil&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;last_startend = lastelem(cline_db_segments) -&amp;gt; startEnd&lt;/p&gt;
&lt;p&gt;last_start_xy = car(last_startend)&lt;/p&gt;
&lt;p&gt;last_end_xy = cadr(last_startend)&lt;/p&gt;
&lt;p&gt;last_find_pin_via_db = car(setof(db pin_via_dbs axlGeoPointsEqual(db -&amp;gt; xy last_end_xy)))&lt;/p&gt;
&lt;p&gt;if(last_find_pin_via_db then&lt;/p&gt;
&lt;p&gt;last_find_pin_via_db_poly = car(axlPolyFromDB(last_find_pin_via_db ?layer layer ?padType &amp;#39;REGULAR))&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;last_find_pin_via_db_poly = nil&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;foreach(segment cline_db_segments&lt;/p&gt;
&lt;p&gt;cline_seg_count = ++cline_seg_count&lt;/p&gt;
&lt;p&gt;all_cline_seg_count = ++all_cline_seg_count&lt;/p&gt;
&lt;p&gt;segment_objtype = segment -&amp;gt; objType&lt;/p&gt;
&lt;p&gt;segment_layer = cadr(parseString(segment -&amp;gt; layer &amp;quot;/&amp;quot;))&lt;/p&gt;
&lt;p&gt;segment_start_end_xy = segment -&amp;gt; startEnd&lt;/p&gt;
&lt;p&gt;segment_start_xy = car(segment_start_end_xy)&lt;/p&gt;
&lt;p&gt;segment_start_x = car(segment_start_xy)&lt;/p&gt;
&lt;p&gt;segment_start_y = cadr(segment_start_xy)&lt;/p&gt;
&lt;p&gt;segment_end_xy = cadr(segment_start_end_xy)&lt;/p&gt;
&lt;p&gt;segment_end_x = car(segment_end_xy)&lt;/p&gt;
&lt;p&gt;segment_end_y = cadr(segment_end_xy)&lt;/p&gt;
&lt;p&gt;delta_x = segment_start_x - segment_end_x&lt;/p&gt;
&lt;p&gt;delta_y = segment_start_y - segment_end_y&lt;/p&gt;
&lt;p&gt;if(oddp(cline_seg_count) then&lt;/p&gt;
&lt;p&gt;theta = axlRadToDeg(atan2(delta_y delta_x))&lt;/p&gt;
&lt;p&gt;theta_lists = cons(theta theta_lists)&lt;/p&gt;
&lt;p&gt;when(all_cline_seg_count == 1 &amp;amp;&amp;amp; first_seg_in_pin_via_value cline_seg_count = 1)&lt;/p&gt;
&lt;p&gt;when(segment_objtype == &amp;quot;arc&amp;quot; cline_seg_count = 0)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;if(zerop(cline_seg_count) &amp;amp;&amp;amp; evenp(cline_seg_count) then&lt;/p&gt;
&lt;p&gt;theta = axlRadToDeg(atan2(delta_y delta_x))&lt;/p&gt;
&lt;p&gt;theta_lists = cons(theta theta_lists)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;when(!zerop(cline_seg_count) &amp;amp;&amp;amp; evenp(cline_seg_count)&lt;/p&gt;
&lt;p&gt;seg_start_xy_in_first_db_result = axlGeoPointInShape(segment_start_xy first_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;;;seg_end_xy_in_first_db_result = axlGeoPointInShape(segment_end_xy first_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;seg_start_xy_in_last_db_result = axlGeoPointInShape(segment_start_xy last_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;;;seg_end_xy_in_last_db_result = axlGeoPointInShape(segment_end_xy last_find_pin_via_db_poly)&lt;/p&gt;
&lt;p&gt;before_theta = car(theta_lists)&lt;br /&gt; &lt;br /&gt; if(segment_objtype != &amp;quot;arc&amp;quot; then&lt;/p&gt;
&lt;p&gt;theta = axlRadToDeg(atan2(delta_y delta_x))&lt;/p&gt;
&lt;p&gt;if(axlGeoEqual(before_theta theta) then&lt;/p&gt;
&lt;p&gt;cline_seg_count = 1&lt;/p&gt;
&lt;p&gt;theta_lists = cons(theta theta_lists)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;if(seg_start_xy_in_first_db_result || seg_start_xy_in_last_db_result then&lt;/p&gt;
&lt;p&gt;cline_seg_count = 1&lt;/p&gt;
&lt;p&gt;theta_lists = cons(theta theta_lists)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;check_list = list(segment_layer segment_start_xy sel_net_name)&lt;/p&gt;
&lt;p&gt;check_lists = cons(check_list check_lists)&lt;/p&gt;
&lt;p&gt;cline_seg_count = 1&lt;/p&gt;
&lt;p&gt;theta_lists = cons(theta theta_lists)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;cline_seg_count = 0&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;theta_lists = list(car(theta_lists))&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;)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;check_lists = sortcar(check_lists &amp;#39;axlStrcmpAlpNum)&lt;/p&gt;
&lt;p&gt;if(zerop(length(check_lists)) then&lt;/p&gt;
&lt;p&gt;;;printf(&amp;quot;### Error Count = 0 ###\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;axlUIConfirm(&amp;quot;Error Count Zero(0)&amp;quot; &amp;#39;info)&lt;/p&gt;
&lt;p&gt;else&lt;/p&gt;
&lt;p&gt;Create_Find_No_Arc_Point_Of_Clines_log_File(check_lists)&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(Create_Find_No_Arc_Point_Of_Clines_log_File(checking_result_infor_lists)&lt;/p&gt;
&lt;p&gt;let((total_all_error_count Date)&lt;/p&gt;
&lt;p&gt;total_all_error_count = 0&lt;br /&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;br /&gt; &lt;br /&gt; Find_No_Arc_Point_Of_Clines_Log_File = outfile(&amp;quot;./Find_No_Arc_Point_Of_Clines.log&amp;quot; &amp;quot;w&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;\nDATE : %s\n&amp;quot; Date)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;\nSyntax : Layer, Point_XY, Net_Name\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;\n=========================================================================\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;\n ## REPORT OF NO ARC BETWEEN TWO CLINE SEGS ##\n\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;foreach(checking_result_infor_list checking_result_infor_lists&lt;/p&gt;
&lt;p&gt;total_all_error_count = ++total_all_error_count&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;%d.%s, %L, %s\n&amp;quot; total_all_error_count car(checking_result_infor_list) cadr(checking_result_infor_list) caddr(checking_result_infor_list))&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;\n=========================================================================\n\n&amp;quot;)&lt;/p&gt;
&lt;p&gt;fprintf(Find_No_Arc_Point_Of_Clines_Log_File &amp;quot;Total Error Count = %d ea.\n&amp;quot; total_all_error_count)&lt;/p&gt;
&lt;p&gt;close(Find_No_Arc_Point_Of_Clines_Log_File)&lt;/p&gt;
&lt;p&gt;axlShell(&amp;quot;viewlog ./Find_No_Arc_Point_Of_Clines.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>Extraction of RLC  Values for Cline using skill</title><link>https://community.cadence.com/thread/66332?ContentTypeID=0</link><pubDate>Wed, 16 Sep 2026 12:26:31 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:d564b994-8d45-4d81-95af-7249f4a5e85b</guid><dc:creator>ABIKRISHNA</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/66332?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/pcb-design/f/allegro-x-scripting-skill/66332/extraction-of-rlc-values-for-cline-using-skill/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Is it possible&amp;nbsp; to extract or calculate the following parameters for a selected cline using Allegro SKILL code?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Resistance&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Inductance&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Capacitance&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Could you please provide some guidance on the relevant SKILL APIs or approach?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><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;Note: On September 25, 2026,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 27.0 was changed to 270.0&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 270.0) then&amp;nbsp; &amp;nbsp; &amp;nbsp; ;;Changed here.&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>4</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></channel></rss>