<?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>Custom IC SKILL - Recent Threads</title><link>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill</link><description>[b]Moderator:[/b] Andrew Beckett.</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 25 Aug 2026 13:24:58 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill" /><item><title>How do I create connectivity through derived layers?</title><link>https://community.cadence.com/thread/66286?ContentTypeID=0</link><pubDate>Tue, 25 Aug 2026 13:24:58 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:9dbeca32-6088-4b6e-9f4d-90decf2452e2</guid><dc:creator>MSchuldt</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66286?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66286/how-do-i-create-connectivity-through-derived-layers/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;I&amp;#39;m writing the techfile for a process, and I have a very special via that has a known top metal, known via layer, but it can land on any of six metal layers.&amp;nbsp; I have defined the top metal, via, and the six lower metals in my techfile, and I&amp;#39;m now trying to create the via definition.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;techDerivedLayers(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ( BM1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1001&amp;nbsp; &amp;nbsp; (M1 &amp;#39;or M2) ) ; M1-M6 are standard layers, defined in layerDefinitions&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ( BM2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1002&amp;nbsp; &amp;nbsp; (M3 &amp;#39;or M4) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ( BM3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1003&amp;nbsp; &amp;nbsp; (M5 &amp;#39;or M6) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ( BM4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1004&amp;nbsp; &amp;nbsp; (BM1 &amp;#39;or BM2) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ( BOTMET&amp;nbsp; &amp;nbsp; 1000&amp;nbsp; &amp;nbsp; (BM4 &amp;#39;or BM3) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ) ; end techDerivedLayers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;viaDefs(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; standardViaDefs(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ( TETHER&amp;nbsp; &amp;nbsp; &amp;nbsp; BOTMET&amp;nbsp; TOPMET&amp;nbsp; (VIA 5.0 5.0) ; TOPMET and VIA are standard layers, defined in layerDefinitions&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ( 1 1 (1.0 1.0) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (0.0 0.0) (0.0 0.0) (0.0 0.0) (0.0 0.0) (0.0 0.0) )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) ; end standardViaDefs&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ) ; end viaDefs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;When I try to load my techfile, I see:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;*WARNING* (TECH-2000212): techCreateStdViaDef: Invalid layers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;And it does not define the via.&amp;nbsp; If I replace BOTMET in the via definition with a standard layer, everything is defined properly.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;What is the correct way to create a via using a derived layer, or a via which connects to multiple things in different contexts?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;M1-6 are local interconnect-ish layers.&amp;nbsp; The TOPMET and VIA layers are a bit like a staple - TOPMET does not ever touch anything but VIA.&amp;nbsp; This via is being defined for connectivity (use in virtuosoDefaultExtractorSetup), not for use in actual layout.&amp;nbsp; Layout will use a staple pcell which is not constrained to Manhattan geometries.&amp;nbsp; One side of the staple might land on M1, and the other side might land on M6.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Or maybe I&amp;#39;m asking the wrong question entirely.&amp;nbsp; How do I define the connectivity of this staple that can land on six different metals?&amp;nbsp; Or do I need to stop being lazy and create six different via definitions for every flavor of staple?&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Any node - Skill for the automatic ruler creation of user-defined lengths ( Working Fine)</title><link>https://community.cadence.com/thread/66285?ContentTypeID=0</link><pubDate>Tue, 25 Aug 2026 04:22:59 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:0ff5a92b-06fa-4b34-b103-60e93cee0460</guid><dc:creator>yogeshjaiswalCAD</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66285?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66285/any-node---skill-for-the-automatic-ruler-creation-of-user-defined-lengths-working-fine/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;Greetings&lt;span&gt;&amp;nbsp;&lt;/span&gt;All,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I am grateful for your assistance whenever I am in need. I aspire to contribute by enriching our community, as we consistently work to strengthen our connections.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After a detailed assessment of this code, I can affirm that it is an exemplary GUI-focused solution. It requires only the entry of the specified ruler length through the GUI and the binding key to be established just one time&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;/***************************************************************&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* YOGI_PRULER&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* 1. Load code in CIW followed by the procdeure name&amp;nbsp;&lt;span&gt;yogi_pruler_dim()&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* 2. Dimension GUI appears&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* 3. Enter exact dimension in um&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;* 4&amp;nbsp; Click exact&lt;span&gt;&amp;nbsp;&lt;/span&gt;first point&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;(Start Point)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* 5&amp;nbsp;&amp;nbsp;&lt;span&gt;Click anywhere for the second point in the direction you want to create the ruler ( X-Dir or Y-Dir)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;* 6. Exact measurement is created&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp;***************************************************************/&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; =============================================================================&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; MAIN ACTION CALLBACK: This handles drawing the ruler based on the form&amp;#39;s value&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; =============================================================================&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;procedure(yogi_pruler_action_cb(form)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; let((win cv dim p1 p2)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Get the current active window and its layout cellview content&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; win = hiGetCurrentWindow()&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cv &amp;nbsp;= geGetWindowCellView(win)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Extract the target numeric dimension value directly from the user form&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dim = form-&amp;gt;dimField-&amp;gt;value&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; STEP 1: Ask the user to click the initial starting point of the ruler&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p1 = enterPoint(?prompts list(&amp;quot;Click the starting point for your ruler&amp;quot;))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when(p1&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Convert the raw screen cursor coordinates to actual layout canvas coordinates&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p1 = geWindowToEditPoint(win p1)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; STEP 2: Ask the user to click a second point to determine the drawing direction&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p2 = enterPoint(?prompts list(&amp;quot;Click any point to indicate drawing direction&amp;quot;))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when(p2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Convert the second screen coordinates to layout canvas coordinates&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p2 = geWindowToEditPoint(win p2)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; STEP 3: Identify whether the user moved more Horizontally or Vertically&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( abs(car(p2) - car(p1)) &amp;gt;= abs(cadr(p2) - cadr(p1)) then&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; --- HORIZONTAL ROUTE ---&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; If second click is to the right, project rightward. Otherwise, project leftward.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(car(p2) &amp;gt;= car(p1) then&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&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; p2 = list(car(p1) + dim cadr(p1))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&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; p2 = list(car(p1) - dim cadr(p1))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; --- VERTICAL ROUTE ---&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; If second click is higher, project upward. Otherwise, project downward.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(cadr(p2) &amp;gt;= cadr(p1) then&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&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; p2 = list(car(p1) cadr(p1) + dim)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&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; p2 = list(car(p1) cadr(p1) - dim)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; STEP 4: Draw the fixed-dimension measurement ruler on the active layout canvas&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; leCreateMeasurement(cv list(p1 p2))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; =============================================================================&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; MAIN EXECUTION FORM: Creates the user interface dialog box and displays it&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;;; =============================================================================&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;procedure(yogi_pruler_dim()&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; let((dimField)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Create a clean text box field specifically meant for decimal/float entries&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dimField = hiCreateFloatField(&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?name &amp;#39;dimField&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?prompt &amp;quot;Ruler Dimension:&amp;quot;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?value 1.0&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Construct the overall graphical user interface window wrapper&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hiCreateAppForm(&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?name &amp;#39;yogiPrulerForm&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?formTitle &amp;quot;Yogi Precision Ruler&amp;quot;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Places the input box at dynamic positioning layout coordinates&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?fields list(list(dimField 0:10 300:30 110))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Automatically triggers our simplified callback function when user clicks OK/Apply&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?callback &amp;quot;yogi_pruler_action_cb(hiGetCurrentForm())&amp;quot;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?buttonLayout &amp;#39;OKCancelApply&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; Pop the completed dialog interface onto the user&amp;#39;s workspace screen&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hiDisplayForm(yogiPrulerForm)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; )&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&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/48/pastedimage1787631772215v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I will wait for your response ,&lt;/strong&gt;&lt;strong&gt;Once again thanks for warm gesture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have a pleasant day!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cheers &amp;amp; regards,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yogesh Jaiswal&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-11d2po8"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-11d2po8"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-11d2po8"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-11d2po8"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-fs1aka"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-fs1aka"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-fs1aka"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;</description></item><item><title>RE: Any node - Skill for the automatic ruler creation of user-defined lengths ( Working Fine)</title><link>https://community.cadence.com/thread/1409242?ContentTypeID=1</link><pubDate>Tue, 25 Aug 2026 09:27:26 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:2d94fc57-b2b0-47bc-9029-f2bfe2c4504c</guid><dc:creator>yogeshjaiswalCAD</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409242?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66285/any-node---skill-for-the-automatic-ruler-creation-of-user-defined-lengths-working-fine/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;Greetings Andrew,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It means a lot when you take time from your busy schedule to reply :)&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The code is functioning as expected, thank you for reviewing it. I will take note of your suggestions to become more efficient with keyword usage...&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Have a pleasant day!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cheers &amp;amp; regards,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yogesh Jaiswal&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;
&lt;div class="MuiBox-root css-12m0k8p" data-userid="userid"&gt;
&lt;div class="MuiBox-root css-2ao4fl"&gt;
&lt;div class="MuiBox-root css-wwi9pm"&gt;
&lt;div class="MuiBox-root css-1ms9mel"&gt;
&lt;div class="MuiBox-root css-xnqsmy"&gt;
&lt;div class="MuiBox-root css-13dtm9z"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="clevertype-extension-root"&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Any node - Skill for the automatic ruler creation of user-defined lengths ( Working Fine)</title><link>https://community.cadence.com/thread/1409241?ContentTypeID=1</link><pubDate>Tue, 25 Aug 2026 08:45:32 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:aeb57b7d-ef35-4abb-9233-fc92194ac8f8</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409241?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66285/any-node---skill-for-the-automatic-ruler-creation-of-user-defined-lengths-working-fine/rss?ContentTypeId=0</wfw:commentRss><description>[quote userid="633818" url="~/cadence_technology_forums/f/custom-ic-skill/66285/any-node---skill-for-the-automatic-ruler-creation-of-user-defined-lengths-working-fine"]&lt;strong&gt;I will wait for your response ,&lt;/strong&gt;&lt;strong&gt;Once again thanks for warm gesture&lt;/strong&gt;[/quote]
&lt;p&gt;There wasn&amp;#39;t a question in your&amp;nbsp;post, so I&amp;#39;m not sure what response you want?&lt;/p&gt;
&lt;p&gt;I would say that you can pretty much do this with built-in functionality. Simply start creating a ruler (Tools-&amp;gt;Create Measurement, usually the &amp;quot;k&amp;quot; bind key), click on the first point (if you don&amp;#39;t have infix enabled) and then press shift-N (that&amp;#39;s the usual bind key). This pops up a form:&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/48/shiftN.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;If you check the &amp;quot;Use Relative XY&amp;quot; you can then enter 2 0 or 0 2 (or whichever direction you want it to go in) as the relative offset of the second point. Hit OK and then the ruler will be drawn.&lt;/p&gt;
&lt;p&gt;The shfit-N functionality can be used to enter points via a coordinate for anything where you are prompted to enter a point.&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409218?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 08:38:19 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:a3cd8070-bc64-438b-943f-eccabc24a03d</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409218?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Thank you so much for the revised code and the explanatory comments. I will go through it carefully to understand the changes.&lt;/p&gt;
&lt;p&gt;I totally agree with your suggestion about adding custom prefixes to my functions to prevent naming conflicts.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I will test the logic for recreating dock windows. I may come back with further questions if I run into any issues.&lt;/p&gt;
&lt;p&gt;Thanks again for your great help!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/66275?ContentTypeID=0</link><pubDate>Thu, 20 Aug 2026 09:07:56 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:4b349ab0-addb-4d80-b813-fb0ace26d583</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>8</slash:comments><comments>https://community.cadence.com/thread/66275?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-size:150%;"&gt;I want to set a variable name that can change over time. For example: &lt;br /&gt;item=&amp;quot;&amp;quot; &lt;br /&gt;lists=setof(i parseString(getCurrentTime() &amp;quot;&amp;quot;) i!) =&amp;quot; &amp;quot;&amp;amp;&amp;amp;i! =&amp;quot;:&amp;quot;) &lt;br /&gt;foreach(elem lists&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;item=strcat(item elem)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;)&lt;br /&gt;I received the item with the code &amp;quot;Aug201706212026&amp;quot;. &lt;br /&gt;I want to replace the &amp;quot;item&amp;quot; in the variable name &amp;quot;a_item&amp;quot; with &amp;quot;Aug201706212026&amp;quot;, so that the final variable name becomes &amp;quot;a_Aug201706212026&amp;quot;. How can I do this? I tried using `setq(stringToSymbol(strcat(&amp;quot;a_&amp;quot; item)) 5)`, but this caused an error. How should I proceed?&lt;/span&gt;&lt;/p&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409215?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 08:18:39 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:52fb3285-da07-4ec9-bf5b-fd04e8959769</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409215?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;OK, here&amp;#39;s the new code. This copes with multiple windows and (slightly) alters the initial form so that you can force the dock windows to be recreated (you may or may not want this). I&amp;#39;ve added AB comments in various places to try to explain the key differences (but there may be subtle differences here and there that I&amp;#39;ve glossed over; hopefully they are obvious though).&lt;/p&gt;
&lt;p&gt;BTW, you should really use a prefix for your functions to avoid clashing with others - AddMosM1 is not that unique... (the new functions I added also didn&amp;#39;t have prefixes - I left that as an exercise for you).&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;load_form.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;; AB: removed the local vars which weren&amp;#39;t local

procedure(load_form()

  layoutForm_pte~&amp;gt;loadpte_button~&amp;gt;enabled = t
  layoutForm_pte~&amp;gt;reloadpte_button~&amp;gt;enabled = t

  hiDisplayForm(&amp;#39;layoutForm_pte)
)
&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;load_procedure.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;; AB: completely rewrote. Don&amp;#39;t really need a reload, but 
; in case you need it, added an optional argument to force
; recreation of the dock window and form
procedure(loadpte(form @optional force_recreate)
  let((sess_win_list dock_W)
    hiFormClose(form)
    sess_win_list=hiGetWindowList(&amp;#39;session)
    foreach( sess_win sess_win_list
      dock_W=sess_win~&amp;gt;myDockWin
      if(dock_W &amp;amp;&amp;amp; !force_recreate then
        hiDockWindow(
          ?window dock_W
          ?session sess_win
        )
      else
        ; need to ensure that if there was an existing dock window
        ; we close it otherwise you&amp;#39;ll end up with more than one!
        when(dock_W
          hiCloseWindow(dock_W)
        )
        CreateDockWinForm(sess_win)
      )
    )
    t
  )
)&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;gui_contain.il. (I didn&amp;#39;t put this inside a procedure because there&amp;#39;s only one top level form)&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;; AB: removed unused variabls and stopped setting dock_W here
(let (load_en reload_en loadpte_button reloadpte_button boxLayout_ver )

  load_en = t
  reload_en = nil

  loadpte_button = hiCreateButton(
    ?name &amp;#39;loadpte_button
    ?buttonText &amp;quot;Press this button for initial loading:&amp;quot;
    ?callback &amp;quot;loadpte(hiGetCurrentForm())&amp;quot;
    ?enabled load_en
  )


  reloadpte_button = hiCreateButton(
    ?name &amp;#39;reloadpte_button
    ?buttonText &amp;quot;Click to Reload: &amp;quot;
    ?callback &amp;quot;loadpte(hiGetCurrentForm() t)&amp;quot;
    ?enabled reload_en
  )

  boxLayout_ver = hiCreateVerticalBoxLayout(
    &amp;#39;boxLayout_ver
    ?items list(loadpte_button reloadpte_button)
  )

  layoutForm_pte = hiCreateLayoutForm(
    &amp;#39;layoutForm_pte &amp;quot;LOAD PTE&amp;quot; boxLayout_ver
  )

)&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;test_layout_demand.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;; AB: put the form and dock creation code within a function
; also removed unused local vars
procedure(CreateDockWinForm(sess_win)
  let((addMosW_string addMosW_button gridLayout dock_W theForm boxLayout formName)

    formName=gensym(&amp;#39;appForm)

    addMosW_string = hiCreateStringField(
      ?name &amp;#39;addMosW_string
      ?prompt &amp;quot;M1_width: &amp;quot;
      ?defValue &amp;quot;1.5&amp;quot;
    )

    addMosW_button = hiCreateButton(
      ?name &amp;#39;addMosW_button
      ?buttonText &amp;quot;apply&amp;quot;
      ?callback lsprintf(&amp;quot;AddMosM1(%s)&amp;quot; formName)
    )

    gridLayout = hiCreateGridLayout( &amp;#39;gridLayout
      ?items (list
        list( addMosW_string &amp;#39;row 0 &amp;#39;col 0 )
        list( addMosW_button &amp;#39;row 0 &amp;#39;col 1 )
        list( &amp;#39;col_stretch 0 1)
        list( &amp;#39;col_stretch 1 0)
      )
    )

    boxLayout = hiCreateHorizontalBoxLayout(
      &amp;#39;boxLayout
      ?items list(gridLayout)
    )

    theForm = hiCreateLayoutForm(
      formName &amp;quot;LAYOUT_PTE&amp;quot; boxLayout
    )

    dock_W=hiCreateDockWindow(
      ?appType &amp;quot;layout&amp;quot;
      ?widgetType &amp;quot;form&amp;quot;
      ?form theForm
    )

    hiDockWindow(
      ?window dock_W
      ?session sess_win
    )
    ; AB: record it as a property on the window in case we need it later?
    sess_win-&amp;gt;myDockWin=dock_W

    ; AB: return the dock window
    dock_W

  )
)

; AB: pass the form to the callback
procedure(AddMosM1(form)
  let((cv objs metal1 temp shapes x y ux uy xy row column transform M1_width)
    ; don&amp;#39;t use evalstring. Imagine what happens if somebody types in exit() in the field!
    ;M1_width = evalstring(appForm~&amp;gt;addMosW_string~&amp;gt;value)
    M1_width = atof(form~&amp;gt;addMosW_string~&amp;gt;value)
    cv = geGetEditCellView()
    objs = geGetSelSet()
    foreach(obj objs
      transform = nil
      if(obj~&amp;gt;objType == &amp;quot;inst&amp;quot; then transform = list(obj~&amp;gt;transform));end if
      if(obj~&amp;gt;objType == &amp;quot;mosaic&amp;quot; then
        x = xCoord(obj~&amp;gt;xy)
        y = yCoord(obj~&amp;gt;xy)
        ux = obj~&amp;gt;uX
        uy = obj~&amp;gt;uY
        row = obj~&amp;gt;rows
        column = obj~&amp;gt;columns
        for(a 0 row-1
          for(b 0 column-1
            ; AB: you can&amp;#39;t use or within a case and you have duplicate values
            ; I changed the || to correct syntax (a list of candidates), but you&amp;#39;ll need to fix the logic
            ; if &amp;quot;R0&amp;quot; or &amp;quot;MXR90&amp;quot; is found, only the first row will be chosen
            case(car(obj~&amp;gt;tileArray)
              ((&amp;quot;R0&amp;quot; &amp;quot;MXR90&amp;quot;) xy = list(x+a*ux : y+b*uy))
              ((&amp;quot;R90&amp;quot; &amp;quot;MY&amp;quot;)   xy = list(x-a*ux : y+b*uy))
              ((&amp;quot;R0&amp;quot; &amp;quot;MXR90&amp;quot;) xy = list(x+a*ux : y-b*uy))
              ((&amp;quot;R0&amp;quot; &amp;quot;MXR90&amp;quot;) xy = list(x-a*ux : y-b*uy))
            );end case
            transform = append1(transform list(car(xy) car(obj~&amp;gt;tileArray) 1.0))
          );end for
        );enf for
      );end if
      shapes = obj~&amp;gt;master~&amp;gt;shapes
      foreach(shape shapes
        ; Andrew changed M1 to Metal1 for testing
        if(car(shape~&amp;gt;lpp) == &amp;quot;Metal1&amp;quot; &amp;amp;&amp;amp; cadr(shape~&amp;gt;lpp) == &amp;quot;drawing&amp;quot;
          then
            foreach(trans transform
              metal1 = dbCopyFig(shape cv trans)
              temp = leConvertPolygonToPath(metal1)
              temp~&amp;gt;width = M1_width
            );foreach
        );if
      );foreach
    );foreach
  );let
);proc&lt;/pre&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409214?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 07:35:29 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1ab9dc81-460c-48ac-bfab-d1d65cab0a0a</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409214?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Thank you very much. I will take some time to go through this and get my head around it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409213?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 07:29:28 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ccfb93d4-f4d0-4055-be63-1edf581086da</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409213?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I reformatted the code to make it easier to understand (without the indentation it&amp;#39;s nigh on impossible):&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;load_form.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;(let (load_en reload_en)

  procedure(load_form()
    cond(
      (dock_W
        load_en = nil
        reload_en = t
      )
      (t
        load_en = t
        reload_en = nil
      )
    )

    layoutForm_pte~&amp;gt;loadpte_button~&amp;gt;enabled = load_en
    layoutForm_pte~&amp;gt;reloadpte_button~&amp;gt;enabled = reload_en

    hiDisplayForm(&amp;#39;layoutForm_pte)
  )

)&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;load_procedure.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;(let (a b ns)

  procedure(loadpte(a)
    load(&amp;quot;test_layout_demand.il&amp;quot;)
    hiFormClose(a)
    layoutForm_pte~&amp;gt;loadpte_button~&amp;gt;enabled = nil
    layoutForm_pte~&amp;gt;reloadpte_button~&amp;gt;enabled = t
  )

  procedure(reloadpte(a)
    b=hiDockWindow(
      ?window dock_W
    )

    if(b==t then
      hiFormClose(a)
    else
      dock_W=hiCreateDockWindow(
	?appType &amp;quot;layout&amp;quot;
	?widgetType &amp;quot;form&amp;quot;
	?form appForm
      )

      ns=hiGetWindowList(&amp;#39;session)

      foreach( n ns
	hiDockWindow(
	  ?window dock_W
	  ?session n
	)
      )
    )
  )
)
&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;gui_contain.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;(let (load_en reload_en loadpte_button reloadpte_button loadpte reloadpte boxLayout_ver )

  dock_W = nil
  load_en = t
  reload_en = nil


  loadpte_button = hiCreateButton(
    ?name &amp;#39;loadpte_button
    ?buttonText &amp;quot;Press this button for initial loading:&amp;quot;
    ?callback &amp;quot;loadpte(layoutForm_pte)&amp;quot;
    ?enabled load_en
  )


  reloadpte_button = hiCreateButton(
    ?name &amp;#39;reloadpte_button
    ?buttonText &amp;quot;Click to Reload: &amp;quot;
    ?callback &amp;quot;reloadpte(layoutForm_pte)&amp;quot;
    ?enabled reload_en
  )

  boxLayout_ver = hiCreateVerticalBoxLayout(
    &amp;#39;boxLayout_ver
    ?items list(loadpte_button reloadpte_button)
  )

  layoutForm_pte = hiCreateLayoutForm(
    &amp;#39;layoutForm_pte &amp;quot;LOAD PTE&amp;quot; boxLayout_ver
  )

)&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;test_layout_demand.il&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;(let (addMosW_string addMosW_button gridLayout boxLayout loadpte_button reloadpte_button boxLayout_ver ns)


  addMosW_string = hiCreateStringField(
    ?name &amp;#39;addMosW_string
    ?prompt &amp;quot;M1_width: &amp;quot;
    ?defValue &amp;quot;1.5&amp;quot;
  )


  addMosW_button = hiCreateButton(
    ?name &amp;#39;addMosW_button
    ?buttonText &amp;quot;apply&amp;quot;
    ?callback &amp;quot;(AddMosM1)&amp;quot;
  )

  gridLayout = hiCreateGridLayout( &amp;#39;gridLayout
    ?items (list
      list( addMosW_string &amp;#39;row 0 &amp;#39;col 0 )
      list( addMosW_button &amp;#39;row 0 &amp;#39;col 1 )
      list( &amp;#39;col_stretch 0 1)
      list( &amp;#39;col_stretch 1 0)
    )
  )

  boxLayout = hiCreateHorizontalBoxLayout(
    &amp;#39;boxLayout
    ?items list(gridLayout)
  )


  appForm = hiCreateLayoutForm(
    &amp;#39;appForm &amp;quot;LAYOUT_PTE&amp;quot; boxLayout
  )


  procedure(AddMosM1()
    let((cv objs metal1 temp temp1 shapes x y ux uy xy row column transform M1_width)
      M1_width = evalstring(appForm~&amp;gt;addMosW_string~&amp;gt;value)
      cv = geGetEditCellView()
      objs = geGetSelSet()
      foreach(obj objs
        transform = nil
        if(obj~&amp;gt;objType == &amp;quot;inst&amp;quot; then transform = list(obj~&amp;gt;transform));end if
        if(obj~&amp;gt;objType == &amp;quot;mosaic&amp;quot; then
          x = xCoord(obj~&amp;gt;xy)
          y = yCoord(obj~&amp;gt;xy)
          ux = obj~&amp;gt;uX
          uy = obj~&amp;gt;uY
          row = obj~&amp;gt;rows
          column = obj~&amp;gt;columns
          for(a 0 row-1
            for(b 0 column-1
              case(car(obj~&amp;gt;tileArray)
                (&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x+a*ux : y+b*uy))
                (&amp;quot;R90&amp;quot; || &amp;quot;MY&amp;quot; xy = list(x-a*ux : y+b*uy))
                (&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x+a*ux : y-b*uy))
                (&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x-a*ux : y-b*uy))
              );end case
              transform = append1(transform list(car(xy) car(obj~&amp;gt;tileArray) 1.0))
            );end for
          );enf for
        );end if
        shapes = obj~&amp;gt;master~&amp;gt;shapes
        foreach(shape shapes
          ; Andrew changed M1 to Metal1 for testing
          if(car(shape~&amp;gt;lpp) == &amp;quot;Metal1&amp;quot; &amp;amp;&amp;amp; cadr(shape~&amp;gt;lpp) == &amp;quot;drawing&amp;quot;
            then
              foreach(trans transform
                metal1 = dbCopyFig(shape cv trans)
                temp = leConvertPolygonToPath(metal1)
                temp~&amp;gt;width = M1_width
              );foreach
          );if
        );foreach
      );foreach
    );let
  );proc


  dock_W=hiCreateDockWindow(
    ?appType &amp;quot;layout&amp;quot;
    ?widgetType &amp;quot;form&amp;quot;
    ?form appForm
  )

  ns=hiGetWindowList(&amp;#39;session)

  foreach( n ns
    hiDockWindow(
      ?window dock_W
      ?session n
    )
  )
)&lt;/pre&gt;
&lt;p&gt;My first observations are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You are using SKILL (not SKILL++) and have procedures defined within lets. These are not lexically scoped, and hence any variables they reference in a surrounding let are actually not local - they are global. This makes the code confusing and almost certainly is not doing what you think it&amp;#39;s doing. SKILL++ mode (having the files with a .ils suffix) does introduce lexical scoping but then the procedures would be local (and you&amp;#39;d need to use globalProc to make them visible from outside) - but then some of the form variables wouldn&amp;#39;t work.&lt;/li&gt;
&lt;li&gt;You will need a separate dock window for each session window, but you don&amp;#39;t need to store that in a global variable&lt;/li&gt;
&lt;li&gt;You will need separate global variables for each form. Each (independent) form needs to have a unique global variable to represent it - you can&amp;#39;t just re-use the same variable after constructing it (the reason is that the name needs to be known so that SKILL expressions can be generated as you interact with the form - you&amp;#39;ll see these in the replay). You can use gensym() to create a unique symbol each time&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Anyway, I&amp;#39;ll restructure your code a little to tidy things up and show how this can be done. This will take me a little while to clean up what you&amp;#39;ve done... I&amp;#39;ll be back soon!&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409212?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 05:10:03 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:aa36279a-a35f-44b3-b992-91f3c3e61c9a</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409212?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Source code is shown below&lt;br /&gt;&lt;br /&gt;load_form.il:&lt;/p&gt;
&lt;p&gt;(let (load_en reload_en)&lt;/p&gt;
&lt;p&gt;procedure(load_form()&lt;br /&gt; cond(&lt;br /&gt; (dock_W&lt;br /&gt; load_en = nil&lt;br /&gt; reload_en = t&lt;br /&gt; )&lt;br /&gt; (t&lt;br /&gt; load_en = t&lt;br /&gt; reload_en = nil&lt;br /&gt; )&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;layoutForm_pte~&amp;gt;loadpte_button~&amp;gt;enabled = load_en&lt;br /&gt;layoutForm_pte~&amp;gt;reloadpte_button~&amp;gt;enabled = reload_en&lt;/p&gt;
&lt;p&gt;hiDisplayForm(&amp;#39;layoutForm_pte)&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;load_procedure.il:&lt;/p&gt;
&lt;p&gt;(let (a b ns)&lt;/p&gt;
&lt;p&gt;procedure(loadpte(a)&lt;br /&gt; load(&amp;quot;test_layout_demand.il&amp;quot;)&lt;br /&gt; hiFormClose(a)&lt;br /&gt; layoutForm_pte~&amp;gt;loadpte_button~&amp;gt;enabled = nil&lt;br /&gt; layoutForm_pte~&amp;gt;reloadpte_button~&amp;gt;enabled = t&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;procedure(reloadpte(a) &lt;br /&gt; b=hiDockWindow(&lt;br /&gt; ?window dock_W&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;if(b==t then&lt;br /&gt; hiFormClose(a)&lt;br /&gt; else&lt;br /&gt; dock_W=hiCreateDockWindow(&lt;br /&gt; ?appType &amp;quot;layout&amp;quot;&lt;br /&gt; ?widgetType &amp;quot;form&amp;quot;&lt;br /&gt; ?form appForm&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;ns=hiGetWindowList(&amp;#39;session)&lt;/p&gt;
&lt;p&gt;foreach( n ns&lt;br /&gt; hiDockWindow(&lt;br /&gt; ?window dock_W&lt;br /&gt; ?session n&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt; )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gui_contain.il:&lt;/p&gt;
&lt;p&gt;(let (load_en reload_en loadpte_button reloadpte_button loadpte reloadpte boxLayout_ver )&lt;/p&gt;
&lt;p&gt;dock_W = nil&lt;br /&gt; load_en = t&lt;br /&gt; reload_en = nil&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;loadpte_button = hiCreateButton(&lt;br /&gt; ?name &amp;#39;loadpte_button&lt;br /&gt; ?buttonText &amp;quot;Press this button for initial loading:&amp;quot;&lt;br /&gt; ?callback &amp;quot;loadpte(layoutForm_pte)&amp;quot;&lt;br /&gt; ?enabled load_en&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;reloadpte_button = hiCreateButton(&lt;br /&gt; ?name &amp;#39;reloadpte_button&lt;br /&gt; ?buttonText &amp;quot;Click to Reload: &amp;quot;&lt;br /&gt; ?callback &amp;quot;reloadpte(layoutForm_pte)&amp;quot;&lt;br /&gt; ?enabled reload_en&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;boxLayout_ver = hiCreateVerticalBoxLayout(&lt;br /&gt; &amp;#39;boxLayout_ver&lt;br /&gt; ?items list(loadpte_button reloadpte_button)&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;layoutForm_pte = hiCreateLayoutForm(&lt;br /&gt; &amp;#39;layoutForm_pte &amp;quot;LOAD PTE&amp;quot; boxLayout_ver&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;)&lt;br /&gt;&lt;br /&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;test_layout_demand.il:&lt;/p&gt;
&lt;p&gt;(let (addMosW_string addMosW_button gridLayout boxLayout loadpte_button reloadpte_button boxLayout_ver ns)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;addMosW_string = hiCreateStringField( &lt;br /&gt; ?name &amp;#39;addMosW_string&lt;br /&gt; ?prompt &amp;quot;M1_width: &amp;quot;&lt;br /&gt; ?defValue &amp;quot;1.5&amp;quot;&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;addMosW_button = hiCreateButton(&lt;br /&gt; ?name &amp;#39;addMosW_button &lt;br /&gt; ?buttonText &amp;quot;apply&amp;quot;&lt;br /&gt; ?callback &amp;quot;(AddMosM1)&amp;quot; &lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;gridLayout = hiCreateGridLayout( &amp;#39;gridLayout&lt;br /&gt; ?items (list &lt;br /&gt; list( addMosW_string &amp;#39;row 0 &amp;#39;col 0 )&lt;br /&gt; list( addMosW_button &amp;#39;row 0 &amp;#39;col 1 )&lt;br /&gt; list( &amp;#39;col_stretch 0 1)&lt;br /&gt; list( &amp;#39;col_stretch 1 0)&lt;br /&gt; )&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;boxLayout = hiCreateHorizontalBoxLayout(&lt;br /&gt; &amp;#39;boxLayout&lt;br /&gt; ?items list(gridLayout)&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;appForm = hiCreateLayoutForm(&lt;br /&gt; &amp;#39;appForm &amp;quot;LAYOUT_PTE&amp;quot; boxLayout&lt;br /&gt; )&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;procedure(AddMosM1()&lt;br /&gt;let((cv objs metal1 temp temp1 shapes x y ux uy xy row column transform M1_width)&lt;br /&gt;M1_width = evalstring(appForm~&amp;gt;addMosW_string~&amp;gt;value)&lt;br /&gt;cv = geGetEditCellView()&lt;br /&gt;objs = geGetSelSet()&lt;br /&gt;foreach(obj objs&lt;br /&gt;transform = nil&lt;br /&gt;if(obj~&amp;gt;objType == &amp;quot;inst&amp;quot; then transform = list(obj~&amp;gt;transform));end if&lt;br /&gt;if(obj~&amp;gt;objType == &amp;quot;mosaic&amp;quot; then&lt;br /&gt;x = xCoord(obj~&amp;gt;xy)&lt;br /&gt;y = yCoord(obj~&amp;gt;xy)&lt;br /&gt;ux = obj~&amp;gt;uX&lt;br /&gt;uy = obj~&amp;gt;uY&lt;br /&gt;row = obj~&amp;gt;rows&lt;br /&gt;column = obj~&amp;gt;columns&lt;br /&gt;for(a 0 row-1&lt;br /&gt;for(b 0 column-1&lt;br /&gt;case(car(obj~&amp;gt;tileArray)&lt;br /&gt;(&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x+a*ux : y+b*uy))&lt;br /&gt;(&amp;quot;R90&amp;quot; || &amp;quot;MY&amp;quot; xy = list(x-a*ux : y+b*uy))&lt;br /&gt;(&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x+a*ux : y-b*uy))&lt;br /&gt;(&amp;quot;R0&amp;quot; || &amp;quot;MXR90&amp;quot; xy = list(x-a*ux : y-b*uy))&lt;br /&gt;);end case&lt;br /&gt;transform = append1(transform list(car(xy) car(obj~&amp;gt;tileArray) 1.0))&lt;br /&gt;);end for&lt;br /&gt;);enf for&lt;br /&gt;);end if&lt;br /&gt;shapes = obj~&amp;gt;master~&amp;gt;shapes&lt;br /&gt;foreach(shape shapes&lt;br /&gt;if(car(shape~&amp;gt;lpp) == &amp;quot;M1&amp;quot; &amp;amp;&amp;amp; cadr(shape~&amp;gt;lpp) == &amp;quot;drawing&amp;quot;&lt;br /&gt;then&lt;br /&gt;foreach(trans transform&lt;br /&gt;metal1 = dbCopyFig(shape cv trans)&lt;br /&gt;temp = leConvertPolygonToPath(metal1)&lt;br /&gt;temp~&amp;gt;width = M1_width&lt;br /&gt;);foreach&lt;br /&gt;);if&lt;br /&gt;);foreach&lt;br /&gt;);foreach&lt;br /&gt;);let&lt;br /&gt;);proc&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;dock_W=hiCreateDockWindow(&lt;br /&gt; ?appType &amp;quot;layout&amp;quot;&lt;br /&gt; ?widgetType &amp;quot;form&amp;quot;&lt;br /&gt; ?form appForm&lt;br /&gt;)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ns=hiGetWindowList(&amp;#39;session)&lt;/p&gt;
&lt;p&gt;foreach( n ns&lt;br /&gt; hiDockWindow(&lt;br /&gt; ?window dock_W&lt;br /&gt; ?session n&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>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409211?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 04:20:25 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:e54710bb-d8df-4cd7-ba5b-b9e3bb184c64</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409211?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;This project is developed to meet requirements from the layout team. They need a persistently‑pinned UI panel that can be activated by clicks at any time. For this purpose, I planned to use dockWindow so that the panel can be docked inside the PTE frame. However, I have run into multiple issues during development, as listed below:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;With my current implementation, the dock window is only created for a single session window. My expectation is to make this dock window available for multiple session windows simultaneously.&lt;/li&gt;
&lt;li&gt;How can I completely delete an appForm from memory? I create an appForm via hiCreateLayoutForm, then construct the dock window with:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;dock_W = hiCreateDockWindow( &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;?appType &amp;quot;layout&amp;quot; &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;?widgetType &amp;quot;form&amp;quot; &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;?form appForm )&lt;/p&gt;
&lt;p&gt;Afterwards I render the dock window with:&lt;/p&gt;
&lt;p&gt;foreach( n ns hiDockWindow( ?window dock_W ?session n ) )&lt;/p&gt;
&lt;p&gt;My intention is to automatically unset the global variable appForm after the dock window is generated. When creating the dock window for another session window, I would recreate the global appForm variable.&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;If fully destroying appForm is not feasible, I considered generating time‑dependent unique variable names. Each time a new session window opens, a brand‑new global variable such as appForm_currentTime would be generated to avoid naming conflicts caused by re‑using the same variable appForm.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the motivation behind my post.&lt;/p&gt;
&lt;p&gt;There are three global variables in my codebase: appForm, layoutForm_pte and dock_W.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409210?ContentTypeID=1</link><pubDate>Fri, 21 Aug 2026 02:32:25 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:710d6211-9b69-4563-9f9e-6d87266beb06</guid><dc:creator>SZ20260803361</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409210?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Dear Mr. Beckett,&lt;/p&gt;
&lt;p&gt;Thank you very much for your prompt, professional and informative replies. I have tried both of your proposed methods, and both work as I expected. I will test the hash‑table approach you suggested later. I will elaborate on why I require dynamic variable names based on a small ongoing project I am developing, and seek your advice on the issues I have encountered during development.&lt;br /&gt;&lt;br /&gt;Best regards,&lt;br /&gt;Steve&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can a concatenated string be transformed into a variable name?</title><link>https://community.cadence.com/thread/1409204?ContentTypeID=1</link><pubDate>Thu, 20 Aug 2026 12:03:17 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:3e7cb5b6-6d33-4ca4-a1ef-b5ffc3d5c598</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>3</slash:comments><comments>https://community.cadence.com/thread/1409204?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66275/how-can-a-concatenated-string-be-transformed-into-a-variable-name/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;This is almost certainly not what you want to do, because creating different variable names on the fly usually means you should be creating a different data structure - e.g. a hash table indexed by the date rather than a unique variable name. However, if you really want to do this (the wrong way in my opinion), then taking your code:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;item=&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;lists=setof(i parseString(getCurrentTime() &amp;quot;&amp;quot;) i!=&amp;quot; &amp;quot; &amp;amp;&amp;amp; i!=&amp;quot;:&amp;quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;foreach(elem lists&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; item=strcat(item elem)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(I assume you used some kind of optical character recognition because it had some spurious parentheses) then you could do:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;set(concat(&amp;quot;a_&amp;quot; item) 5)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;you can retrieve it with:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;symeval(concat(&amp;quot;a_&amp;quot; item))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A cleaner (more efficient in terms of creating garbage that needs collecting)&amp;nbsp;way of building the variable name would be to do:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;cleanup=pcreCompile(&amp;quot;[ :]&amp;quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;varName=concat(&amp;quot;a_&amp;quot; pcreReplace(cleanup getCurrentTime() &amp;quot;&amp;quot; 0))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;However, if you creating a number of these, I&amp;#39;d use a hash table (using makeTable) as I mentioned before.&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to extract only highest metal Power/Ground/Bulk routing from top-level hierarchy using SKILL/Python in Virtuoso Studio IC 23.1?</title><link>https://community.cadence.com/thread/66272?ContentTypeID=0</link><pubDate>Wed, 19 Aug 2026 06:01:36 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:b3bf9e02-911f-4eb1-a7fd-65ee508f2b3b</guid><dc:creator>AR202509246930</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66272?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66272/how-to-extract-only-highest-metal-power-ground-bulk-routing-from-top-level-hierarchy-using-skill-python-in-virtuoso-studio-ic-23-1/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Hello Cadence Community,&lt;/p&gt;
&lt;p&gt;I am using Cadence Virtuoso Studio IC 23.1 and I am trying to create an automation flow to extract only the highest metal routing shapes for Power/Ground/Bulk nets from a top-level layout.&lt;/p&gt;
&lt;p&gt;I want the script to automatically identify Power, Ground, and Bulk nets from the layout/database, without asking the user to manually provide net names.&lt;/p&gt;
&lt;p&gt;For example, the script should automatically recognize nets like:&lt;/p&gt;
&lt;p&gt;Power nets: VDD, VDD1, VDD2...etc.&lt;br /&gt;Ground nets: VSS, VSSA, VSSB,&amp;nbsp; etc.&lt;br /&gt;Bulk/Well nets: NWELL, DNWELL, BULK, etc.&lt;br /&gt;I am looking for the best way to identify them using net properties, terminal types, global nets, inherited connections, or any recommended Virtuoso database API.&lt;br /&gt;Main challenge&lt;br /&gt;In some designs, the top-level cell may only contain pins for these nets, while the actual metal routing is present inside lower-level sub-blocks.&lt;/p&gt;
&lt;p&gt;So, I do not want to extract only the top-level pin shapes. I want to traverse the hierarchy and identify where the actual routing metal exists for the auto-detected PG/Bulk nets.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Warning while using asiSelectInst</title><link>https://community.cadence.com/thread/66248?ContentTypeID=0</link><pubDate>Thu, 06 Aug 2026 15:10:04 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:d284a0f5-d60a-4c64-b854-aed5af544e23</guid><dc:creator>SK202511261716</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/66248?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66248/warning-while-using-asiselectinst/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;#39;m developing a form which at a certain point needs to allow the user to select an instance from their schematic. I then need to fetch the database&amp;nbsp;object of that instance to do some further processing. I&amp;#39;m using &lt;code&gt;asiSelectInst&amp;nbsp;&lt;/code&gt;for this, in the following callback from a button on my form:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(procedure selectDUT(field scope)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; (sevOpenSchematic (axlGetToolSession sess testname))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; (asiSelectInst &amp;#39;mydutfield ?prompt &amp;quot;select instance...&amp;quot; ?form myform ?tab (list &amp;#39;mytabs &amp;#39;page1))&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;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;mydutfield&amp;quot; is an uneditable string field. I gave it a callback which fetches the database instance, so whenever asiSelectInst changes the value of the field, the callback is initiated:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(procedure fetchDUTInst(field scope)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; (let&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (cv (geGetEditCellView))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inst&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (setq inst (car (exists obj cv-&amp;gt;instances (equal obj-&amp;gt;name (car (last (parseString scope-&amp;gt;mydutfield-&amp;gt;value &amp;quot;/&amp;quot;)))))))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; )&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;/code&gt;&lt;/p&gt;
&lt;p&gt;This works like a charm....almost. Sometimes, when I open the form for the first time, asiSelectInst fails with the following warning, printed to the CIW:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;*Warning* No window and/or doneProc argument passed to&lt;br /&gt; &amp;quot;astiSelectInst&amp;quot;, selection not started&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The value in mydutfield doesn&amp;#39;t change, and the callback is not executed. If I immediately try again, it works no problem, and continues to work all subsequent times. I&amp;#39;ve not been able to determine the exact conditions under which it fails, but it always seems to be when the form/maestro view is first opened.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Am I doing something wrong here?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#39;m on version&amp;nbsp;IC23.1-64b&lt;/p&gt;</description></item><item><title>Automatization of Maestro view and schematic (testbench) for simulation of multiple results</title><link>https://community.cadence.com/thread/66185?ContentTypeID=0</link><pubDate>Tue, 21 Jul 2026 10:08:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:db1c1968-4a46-4d79-a82d-e48c2051ffba</guid><dc:creator>OG202503213520</dc:creator><slash:comments>2</slash:comments><comments>https://community.cadence.com/thread/66185?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66185/automatization-of-maestro-view-and-schematic-testbench-for-simulation-of-multiple-results/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello,&amp;nbsp;&lt;br /&gt;I have a design that I need to verify and do the simulation , to give an idea , it had multiple inputs and outputs and they depend on internal values. I need to simulate each input with different output to see the delay.&lt;br /&gt;&lt;br /&gt;Is there a way by which I can automatize the changing of equations in maestro setup depending on the inputs and outputs? Also , depending in the inputs and outputs selected , I need to automatically make changes in the testbench.&lt;br /&gt;&lt;br /&gt;For the moment I think using &amp;quot;skillbrigde&amp;quot; (skill functions using python) the generation of schematic can be done writing a code , but I dont understand how I can make the link with maestro testbench.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you have any solutions , please let me know.&lt;br /&gt;&lt;br /&gt;Thank you.&lt;/p&gt;</description></item><item><title>RE: Automatization of Maestro view and schematic (testbench) for simulation of multiple results</title><link>https://community.cadence.com/thread/1409093?ContentTypeID=1</link><pubDate>Wed, 05 Aug 2026 08:41:47 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:831cf688-b83d-4de5-8aa3-5f1b09e2171c</guid><dc:creator>OG202503213520</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409093?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66185/automatization-of-maestro-view-and-schematic-testbench-for-simulation-of-multiple-results/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Thank you very much Andrew !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Looking for a SKILL/Python Script to Automatically Run Schematic Netlist in Virtuoso IC23.1</title><link>https://community.cadence.com/thread/1409078?ContentTypeID=1</link><pubDate>Tue, 04 Aug 2026 10:31:27 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:30f3b8df-1eac-47ce-b20a-038b3f7cd9f2</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409078?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66241/looking-for-a-skill-python-script-to-automatically-run-schematic-netlist-in-virtuoso-ic23-1/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;You didn&amp;#39;t say which netlister you wanted. If it&amp;#39;s an ADE netlister (e.g. spectre) then you can use:&lt;/p&gt;
&lt;p&gt;simulator(&amp;#39;spectre)&lt;br /&gt;design(&amp;quot;libName&amp;quot; &amp;quot;cellName&amp;quot; &amp;quot;schematic&amp;quot; &amp;quot;r&amp;quot;)&lt;br /&gt;fileName=createNetlist(?display nil)&lt;/p&gt;
&lt;p&gt;You could then use &amp;quot;ocean -restore script.il&amp;quot; or &amp;quot;virtuoso -nograph -restore script.il&amp;quot; to run it (you could add exit() at the end too if needed).&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Looking for a SKILL/Python Script to Automatically Run Schematic Netlist in Virtuoso IC23.1</title><link>https://community.cadence.com/thread/66241?ContentTypeID=0</link><pubDate>Tue, 04 Aug 2026 09:36:59 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:07614086-a3d3-4fb4-a4ac-5b538e0b01d9</guid><dc:creator>AR202509246930</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/66241?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66241/looking-for-a-skill-python-script-to-automatically-run-schematic-netlist-in-virtuoso-ic23-1/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Hi Community,&lt;/p&gt;
&lt;p&gt;I am using &lt;strong&gt;Cadence Virtuoso IC23.1&lt;/strong&gt; and am looking for a SKILL or Python script that can automatically &lt;strong&gt;run schematic netlisting&lt;/strong&gt; by simply providing the &lt;strong&gt;library name&lt;/strong&gt; and &lt;strong&gt;cell (schematic) name&lt;/strong&gt; as inputs.&lt;/p&gt;
&lt;p&gt;The requirement is to run the netlisting process &lt;strong&gt;without opening the schematic in the Virtuoso GUI or in the background&lt;/strong&gt;. Ideally, the solution should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept &lt;strong&gt;library name&lt;/strong&gt; and &lt;strong&gt;cell/schematic name&lt;/strong&gt; as inputs.&lt;/li&gt;
&lt;li&gt;Run the schematic netlisting automatically.&lt;/li&gt;
&lt;li&gt;Avoid opening any schematic window.&lt;/li&gt;
&lt;li&gt;Support batch/automated execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Has anyone implemented something similar or know of any available SKILL APIs, Python scripts, or examples that can achieve this in &lt;strong&gt;Virtuoso IC23.1&lt;/strong&gt;?&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>how to use variable in defcell</title><link>https://community.cadence.com/thread/66212?ContentTypeID=0</link><pubDate>Tue, 28 Jul 2026 19:38:29 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:886f48b0-2b6e-4f49-89c9-e330c884e5f6</guid><dc:creator>MorrisDH</dc:creator><slash:comments>9</slash:comments><comments>https://community.cadence.com/thread/66212?ContentTypeID=0</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I am open to suggestions if there is a better way&amp;nbsp;to create a symbol cellview but the following is what I am using.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;defcell(&amp;quot;realCellName&amp;quot; defSymbol( nil ) )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It works fine for a basic symbol with no pins which is all I need. It creates a symbol cellview under the cell &amp;quot;realCellName&amp;quot;.&lt;br /&gt;&lt;br /&gt;The following does not work as expected.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;cellName = &amp;quot;realCellName&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;defcell(cellName defSymbol( nil ))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It creates a new cell named &amp;quot;cellName&amp;quot; instead of parsing the variable. Is it not possible for defcell to recognize variables?&lt;br /&gt;&lt;br /&gt;Or maybe there is a better way to create simple symbol cellviews.&lt;br /&gt;&lt;br /&gt;Thanks&lt;/p&gt;</description></item><item><title>RE: how to use variable in defcell</title><link>https://community.cadence.com/thread/1409051?ContentTypeID=1</link><pubDate>Thu, 30 Jul 2026 17:11:08 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:f21c0269-9f53-4df4-9cda-783db116bee8</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409051?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;That&amp;#39;s because you have &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;defsymbol( &lt;span style="background-color:#ffff00;"&gt;nil&lt;/span&gt; )&lt;/span&gt; . The&amp;nbsp;&lt;em&gt;nil&lt;/em&gt; is unexpected and hence incorrect. If you just have defsymbol( ) then it wouldn&amp;#39;t have this issue.&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to use variable in defcell</title><link>https://community.cadence.com/thread/1409050?ContentTypeID=1</link><pubDate>Thu, 30 Jul 2026 16:59:06 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:d2e92468-1cbe-45f9-8e6f-6acdd2471ddd</guid><dc:creator>MorrisDH</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409050?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Created this procedure based on&amp;nbsp;the template.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;procedure( makeTheSymbol(@key cellName libName)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; let(((tsgFile &amp;quot;myfile.tsg&amp;quot;) tsgPort tsgTemplate)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; tsgPort=outfile(tsgFile)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; tsgTemplate=`defcell(,cellName defsymbol( nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; pprint(tsgTemplate tsgPort)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; newline(tsgPort)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; close(tsgPort)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; lmOpenLib(libName)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; &amp;nbsp; load(tsgFile)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;nbsp; ) ; let&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;) ; procedure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It appears to work perfectly but I do get a warning.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff6600;font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;*WARNING* TSG: Invalid identifier&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Is that something I should be concerned about?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to use variable in defcell</title><link>https://community.cadence.com/thread/1409048?ContentTypeID=1</link><pubDate>Thu, 30 Jul 2026 16:33:41 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:7a037f3f-355a-4bd6-9bcd-2ede592f2056</guid><dc:creator>MorrisDH</dc:creator><slash:comments>0</slash:comments><comments>https://community.cadence.com/thread/1409048?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Yep. I went back to the template. I&amp;#39;d actually done something similar in a script I wrote a few years ago. I&amp;#39;d forgotten all about it.&lt;br /&gt;&lt;br /&gt;Appreciate your patient assistance.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to use variable in defcell</title><link>https://community.cadence.com/thread/1409047?ContentTypeID=1</link><pubDate>Thu, 30 Jul 2026 06:43:50 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:62057d4e-6527-4440-875a-ec5fb958f6c0</guid><dc:creator>Andrew Beckett</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409047?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>[quote userid="422976" url="~/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/1409044"]Apparently&amp;nbsp;&lt;span&gt;dbOpenCellViewByType(testLibName testCellName &amp;quot;symbol&amp;quot; &amp;quot;schematicSymbol&amp;quot; &amp;quot;w&amp;quot;) creates a cellview call &amp;quot;symbol&amp;quot; but it is an empty cellview&lt;/span&gt;[/quote]
&lt;p&gt;Of course. Why would it do anything else? How would it know what the content was, given that all you did was open the cellVIew in write (which means overwrite) mode? You could also use &amp;quot;a&amp;quot; which would create if it didn&amp;#39;t exist, but leave the existing contents.&lt;/p&gt;
&lt;p&gt;If you are wanting an alternative to tsg() (text-to-symbol generator - I see no problem with the fact that it needs a file as input), you could use the schViewToView functionality, particularly schPinListToSymbol - there you can give info on the pins and it will construct a tsg-like symbol using the current tsg template (which can be set with the&amp;nbsp;schematic tsgTemplateType cdsenv var, with the name-to-file mapping being controlled via the&amp;nbsp;tsgTemplateMasters SKILL variable - search in the documentation for more details). You can also use schSchemToPinList to get a pin list from a schematic. Overall this approach has less flexibility than everything that tsg() offers, but it&amp;#39;s usually sufficient...&lt;/p&gt;
&lt;p&gt;Andrew&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to use variable in defcell</title><link>https://community.cadence.com/thread/1409044?ContentTypeID=1</link><pubDate>Wed, 29 Jul 2026 22:22:09 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:ef2cf010-a0ba-4531-b222-496004778ed2</guid><dc:creator>MorrisDH</dc:creator><slash:comments>1</slash:comments><comments>https://community.cadence.com/thread/1409044?ContentTypeID=1</comments><wfw:commentRss>https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/66212/how-to-use-variable-in-defcell/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Apparently&amp;nbsp;&lt;span&gt;dbOpenCellViewByType(testLibName testCellName &amp;quot;symbol&amp;quot; &amp;quot;schematicSymbol&amp;quot; &amp;quot;w&amp;quot;) creates a cellview call &amp;quot;symbol&amp;quot; but it is an empty cellview.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>