<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="https://community.cadence.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Robert Dwyer Blog</title><link>https://community.cadence.com/search?q=type%3Ablog%20user%3A2907&amp;sort=date%20desc&amp;Redirected=true</link><description></description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle>Search results for 'type:blog user:2907'</itunes:subtitle><item><title>The Case for the Tiny Testcase</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/the-case-for-the-tiny-testcase</link><pubDate>Fri, 16 Nov 2012 11:56:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1316707</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/the-case-for-the-tiny-testcase</guid><slash:comments>1</slash:comments><description>I often joke with customers that, although I realize they have to work on large designs, I do my best work on designs with just 2 or 3 instances. That&amp;#39;s because I&amp;#39;m often trying to replicate an issue they&amp;#39;ve observed on their design and I&amp;#39;m attempting to reproduce that behavior in a smaller circuit. I&amp;#39;ve found tiny testcases to be extremely efficient ways to gain quick clarity on tool behaviors which can then be more effectively applied to the real design. But it&amp;#39;s not just having a tiny testcase that&amp;#39;s most useful. It&amp;#39;s the act of creating the small testcase where most insight is gained. But it&amp;#39;s not always easy to create a tiny testcase. Do you know how to write a syntactically correct gate-level Verilog netlist from scratch with a text editor? Do you know how to contrive complicated timing scenarios? Do you know to modify .lib/LEFs to replicate the things likely present in a design in a smaller setting? These are non-trivial things for someone who works in many different aspects of a design flow as designers are tasked with understanding an ever-increasing breadth of tools. I recall a quote from a colleague of mine, Thad McCracken ( interview here ), a few years ago. We were working on a benchmark and were having a hard time reproducing some of the issues we were observing in a small testcase. He said &amp;quot; If we can&amp;#39;t reproduce it in a small testcase it tells me we fundamentally don&amp;#39;t understand the problem well enough. &amp;quot; Isn&amp;#39;t that the truth of it? With the exception of run-time/memory related issues, nearly every issue we run into can be replicated in a tiny representative testcase -- but doing so can be very difficult. Customers often joke with me that the oldest tricks in the EDA Applications Engineering books are (1) to ask if you&amp;#39;re using the latest tool version and (2) ask for a testcase. Sure it&amp;#39;s easy to get a self-contained testcase with Encounter (see the link for saveTestcase at the end of this post). But a better question to ask is, &amp;quot; Do you have any hunches on the likely circumstances causing the issue? &amp;quot; Tiny testcases can be powerful in the user community as well. Some of the most disciplined and effective project teams and CAD groups I&amp;#39;ve worked with relentlessly stress the tool at the onset of a project in ways they&amp;#39;re going to need it to perform during crunch time. Sure, some things only come to light in the context of real designs. But creating tiny testcases can efficiently flush out the gaps between project requirements and tool capabilities to give everyone a chance to find ways to get the software to do what it needs to do to meet project requirements. In our busy schedules we often feel like we don&amp;#39;t have time to create small testcases to triage a situation. And indeed, sometimes we just need to send a testcase in to R&amp;amp;D for resolution. But next time you run into an issue I&amp;#39;d encourage you to consider whether a tiny testcase might shed more light on the situation. To borrow a line from Paul Cunningham : &amp;quot; Sometimes we need to slow down to speed up. &amp;quot; -Bob Dwyer Related Reading: The Case for Robust Database Access Creating a testcase with Encounter&amp;#39;s &amp;quot;saveTestcase&amp;quot; command</description></item><item><title>How To: Bring Up Encounter "man" Pages from a UNIX Prompt</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/how-to-bring-up-encounter-quot-man-quot-pages-from-a-unix-prompt</link><pubDate>Wed, 01 Aug 2012 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1313536</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/how-to-bring-up-encounter-quot-man-quot-pages-from-a-unix-prompt</guid><slash:comments>1</slash:comments><description>Okay, this one is too cool not to share. The other day a customer and I were trying to understand a tool behavior better so we did what we all do in desperate times: We read the documentation. As straightforward as &amp;quot;reading the documentation&amp;quot; would seem, I bet no two users of the system interact with documentation the same way. Some people like to bring up &amp;quot;cdnshelp&amp;quot; at the UNIX prompt. Some like to download the .pdfs from the install tree. Others like to use CommandGetIt through a web browser. Some click the &amp;quot;Help&amp;quot; button within the tool. Others like to read them through https://support.cadence.com/ For most things, I use &amp;quot; help &amp;quot; at the Encounter prompt. And &amp;quot; man &amp;quot; for an extended description of what each option does along with some examples. So when the designer I was working with saw me launching Encounter to bring up the man page for a command, he asked if there is a way to do that from the UNIX prompt without launching the tool. I didn&amp;#39;t know how to do that, but there is a way. Here&amp;#39;s how... The short answer is to add the path to the Encounter man pages to your MANPATH environment variable. The man pages reside in the Encounter installation tree under /share/fe/man - for example: UNIX&amp;gt; which encounter /icd/flow/EDI/EDI111/latest.USR1.lnx86/lnx86 /bin/encounter UNIX&amp;gt; setenv MANPATH /icd/flow/EDI/EDI111/latest.USR1.lnx86/lnx86 /share/fe/man UNIX&amp;gt; man placeDesign This should bring up the man page for placeDesign without needing to launch Encounter. However, you probably don&amp;#39;t want to lose access to regular UNIX commands, so you&amp;#39;ll want to append the Encounter path to your existing MANPATH. How to do this depends on the shell you use but this works for me: setenv MANPATH ${MANPATH}:/icd/flow/EDI/EDI111/latest.USR1.lnx86/lnx86/share/fe/man Want to get even fancier? If you&amp;#39;ve already got the encounter executable in your path you can make use of the &amp;quot; cds_root &amp;quot; utility to set your MANPATH. This way your MANPATH will always update to the latest version of Encounter you&amp;#39;re pointing to. Slick! setenv MANPATH ${MANPATH}:`cds_root encounter`/share/fe/man Another approach would be to create an alias to a separate man command for Encounter: UNIX&amp;gt; alias eman &amp;#39;man -M `cds_root encounter`/share/fe/man&amp;#39; UNIX&amp;gt; eman placeDesign Hope this is helpful! And thanks to my colleagues Tim, Benton, and Bupendra for pointing out how to do this. -Bob Dwyer</description></item><item><title>10 Encounter Tips and Tricks You May Not Be Aware Of</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/10-tips</link><pubDate>Fri, 27 Jul 2012 14:26:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1313357</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/10-tips</guid><slash:comments>3</slash:comments><description>In looking over the shoulders of Encounter users over the years I&amp;#39;ve found there&amp;#39;s a bunch of little tips and tricks I use to make interacting with the tool a little easier that aren&amp;#39;t necessarily immediately obvious. Here are some of the more common ones I used this week: When navigating an Encounter log file in a text editor, search forward for &amp;quot; &amp;quot;. Each time a command is executed it&amp;#39;s embedded in the log file, for example: &amp;quot; optDesign -preCTS &amp;quot;. This makes it easier to understand what was executed and what resulted. Use &amp;quot; getLogFileName &amp;quot; to determine which log file goes with which Encounter session. Use &amp;quot; win &amp;quot; at the Encounter prompt to raise the window of the session associated with the Encounter console. Doesn&amp;#39;t work with all window managers but when it does I find this quite useful. Use &amp;quot; dbWireCleanup &amp;quot; to delete all of the signal routes in the design (trialRoute or NanoRoute). See also &amp;quot; editDelete -type Signal &amp;quot;. Use &amp;quot; deleteAllPowerPreroutes &amp;quot; to delete all of the power routing in a design. Sure you could &amp;quot; editDelete -type Special &amp;quot; but what fun is that? Use &amp;quot; encounter -init design.enc &amp;quot; to restore a design from the UNIX prompt. Load designs with &amp;quot; source design.enc &amp;quot; at the Encounter prompt instead of using restoreDesign. That way you don&amp;#39;t need to use a pulldown menu and you don&amp;#39;t need to tell the tool the top cell name since it&amp;#39;s embedded within the .enc file. Use emacs-style shortcuts like &amp;quot;ctrl-a&amp;quot;, &amp;quot;ctrl-e&amp;quot;, and &amp;quot;ctrl-k&amp;quot; to position the cursor and strike text at the Encounter console. Use &amp;quot; dbGet selected.?? &amp;quot; to query physical information about an object. Use &amp;quot; report_property [get_nets ] &amp;quot; to query timing information about an object. Question of the Day: What little tips and tricks have you found useful in Encounter over the years? Let us know in the comments. -Bob Dwyer</description></item><item><title>Capturing and Processing Encounter Console Output with "redirect"</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/capturing-and-processing-encounter-console-output-with-quot-redirect-quot</link><pubDate>Mon, 23 Jul 2012 12:08:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1313169</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/capturing-and-processing-encounter-console-output-with-quot-redirect-quot</guid><slash:comments>2</slash:comments><description>In my last post I wrote about writing more compact db access scripts with dbGet&amp;#39;s expression-based matching . We found all of the high fanout nets in the design which weren&amp;#39;t clock nets: dbGet [dbGet top.nets {.numInputTerms &amp;gt; 16 &amp;amp;&amp;amp; .isClock == 0}].name This writes the name of each net to the console. But how would we write those nets to a file? Say, for example, if we wanted to call optDesign -selectedNets on them? optDesign expects a file with a list of net names, one per line. How could we create that file? We could use the redirect command along with some clever scripting. More on that in a moment, but let&amp;#39;s talk about redirect first. The Basics The redirect command as described here is available starting in release EDI release 11.1 (EDI stands for Encounter Digital Implementation System). In its simplest form redirect takes the output that&amp;#39;s written to the Encounter console and writes it to a file. This is useful when you want to process that output programatically and do something based on what&amp;#39;s found in that file. Take for example the checkPinAssignment command. It writes output like this: encounter 1&amp;gt; checkPinAssignment Start Checking pins of top cell: [top] **WARN: (ENCPTN-562): Pin [in] is [PLACED] at location ( 0.330, 50.120 4 ) is NOT ON THE DESIGN BOUNDARY. Summary report for top level: [top] Total Pads : 0 Total Pins : 3 Legally Assigned Pins : 2 Illegally Assigned Pins : 0 Unplaced Pins : 0 Constant/Spl Net Pins : 0 Internal Pins : 1 Legally Assigned Feedthrough Pins : 0 Illegally Assigned Feedthrough Pins: 0 End of Summary report End Checking pins of top cell: [top] The command doesn&amp;#39;t return anything (ie, if you &amp;quot; set x checkPinAssignment&amp;quot; , &amp;quot;x&amp;quot; wouldn&amp;#39;t have a value) so if we want to query whether checkPinAssignment found any violations -or- check which specific pins were in violation we could do it by redirecting to a file and parsing the output. It&amp;#39;s not necessarily pretty but sometimes you&amp;#39;ve got to do it. Here&amp;#39;s how it works: encounter 1&amp;gt; redirect checkPinAssignment.out checkPinAssignment **Info: stdout is directed to file &amp;#39;checkPinAssignment.out&amp;#39;... Now, you could iterate through each line in checkPinAssignment.out and regexp for &amp;quot;WARN&amp;quot;, find a pin name and operate on it in some way. If the command you want to execute contains options, embed the options in curly brackets: encounter 1&amp;gt; redirect queryPlaceDensity.out {queryPlaceDensity -userSpecified} **Info: stdout is directed to file &amp;#39;queryPlaceDensity.out&amp;#39;... Intermediate We&amp;#39;ve talked before about writing to and reading from a file . I&amp;#39;ve got a couple more tips that extend on that idea and make things more compact. First, check out the dbForEachFileLine command. It essentially does the same thing as: set infile [open checkPinAssignment.out &amp;quot;r&amp;quot;] while {[gets $infile line] &amp;gt;= 0} { if {[regexp WARN $line]} { Puts &amp;quot;$line&amp;quot; } } close $infile If you&amp;#39;re like me and have trouble remembering the infile/open/while/gets/close business try dbForEachFileLine instead: dbForEachFileLine checkPinAssignment.out line { if {[regexp WARN $line]} { Puts &amp;quot;$line&amp;quot; } } But we can get even fancier with this approach, and avoid writing to a file altogether with redirect&amp;#39;s -variable option: redirect x checkPinAssignment -variable set lines [split $x \n] foreach line $lines { if {[regexp WARN $line]} { Puts &amp;quot;$line&amp;quot; } } Extra Credit Back to the original puzzler I mentioned previously. How could we write to a file, one net per line, all of the nets with fanout greater than &amp;quot;n&amp;quot; so we could pass it to a command like &amp;quot; optDesign -selectNets &amp;quot;? It&amp;#39;s a little tricky, and probably exceedingly compound to be honest, but there is a way: encounter 18&amp;gt; redirect high_fanout.nets {puts &amp;quot;[join [split [dbGet [dbGet top.nets {.numInputTerms &amp;gt; 16 &amp;amp;&amp;amp; .isClock == 0}].name]] \n]&amp;quot;} **Info: stdout is directed to file &amp;#39;high_fanout.nets&amp;#39;... encounter 19&amp;gt; more high_fanout.nets scan_enI DTMF_INST/TDSP_CORE_INST/MPY_32_INST/n_7295 DTMF_INST/TDSP_CORE_INST/MPY_32_INST/n_6735 {DTMF_INST/TDSP_CORE_INST/MPY_32_INST/ab_a[15]} {DTMF_INST/TDSP_CORE_INST/MPY_32_INST/ab_b[15]} Pretty cool! Here&amp;#39;s the full usage for the redirect command: encounter 1&amp;gt; help redirect Usage: redirect [-help] [ ] [ ] [-tee] [-stdin | -append | -variable ] [-stderr | -stdin ] -help # Prints out the command usage # file name or variable name, for outputs to go # (string, optional) # command to execute (string, optional) -append # append stdout/stderr to file or variable # (bool, optional) -stderr # redirect stderr also (bool, optional) -stdin # redirect stdin (bool, optional) -tee # redirect output to both screen and file or # variable (bool, optional) -variable # redirect to a Tcl variable (bool, optional) I hope there&amp;#39;s a useful nugget or two in here. Question of the Day: Any tips or tricks you&amp;#39;d like to share about reading from/writing to a file, capturing output as a variable, or redirecting it to a file? -Bob Dwyer</description></item><item><title>Writing More Compact Encounter Scripts with dbGet Expressions</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/writing-more-compact-encounter-scripts-with-dbget-expressions</link><pubDate>Wed, 30 May 2012 13:36:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1311462</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/writing-more-compact-encounter-scripts-with-dbget-expressions</guid><slash:comments>5</slash:comments><description>Querying the Encounter database with dbGet is typically pretty concise to begin with. But you might not be aware of its support for expression-based matching, which enables even more compact scripting. Let&amp;#39;s take a very simple but common scripting challenge: Finding all of the high fanout nets in the design. Then let&amp;#39;s take this a little further. How would we write a script to find all nets with fanout greater than &amp;quot;n&amp;quot; which are not clock nets? Historically we&amp;#39;d do this by iterating through all of the nets in the design, checking whether their fanout is greater than &amp;quot;n&amp;quot;, checking whether it is marked as a clock net, and if so add it to a list of nets that meet the criteria. This would take about a half-dozen lines of code. But by using dbGet&amp;#39;s support for expression-based matching, we can make this script more compact. Here&amp;#39;s how it works. First, let&amp;#39;s look at how we&amp;#39;d write this script without expressions: set high_fanout_nets {} foreach net [dbGet top.nets] { if {[dbGet $net.numInputTerms] &amp;gt; 32} { if {![dbGet $net.isClock]} { lappend high_fanout_nets $net } } } return $high_fanout_nets Here&amp;#39;s how we&amp;#39;d write the same functionality using dbGet&amp;#39;s expression-based matching: encounter 1&amp;gt; dbGet top.nets {.numInputTerms &amp;gt; 32 &amp;amp;&amp;amp; .isClock == 0} Much more compact, right? So here&amp;#39;s how it works, step by step. The attribute &amp;quot;.numInputTerms&amp;quot; gives us, effectively, the fanout for each net. If we were to query that attribute for each net we&amp;#39;d get a list of numbers representing the fanout of each net in the design: encounter 2&amp;gt; dbGet top.nets.numInputTerms 5 5 1 16 32 32 16 33 19 17 18 21 20 21 20 20 71 17 17 8 16 16 32 16 We more commonly use &amp;quot;simple&amp;quot; matching to find things we&amp;#39;re looking for like object names, and testing for 1&amp;#39;s and 0&amp;#39;s. And we could certainly do that with the .numInputTerms attribute: encounter 3&amp;gt; dbGet top.nets.numInputTerms 32 32 32 32 32 32 32 32 32 And if we wanted to get the pointers to those nets we could do it like this: encounter 4&amp;gt; dbGet top.nets.numInputTerms 32 -p 0x2aaab4252f38 0x2aaab20acbe8 0x2aaab20acf30 0x2aaab215fc88 0x2aaab2160078 0x2aaab21faa00 0x2aaab21faca0 0x2aaab21fcab8 And if we wanted to get their names we could do it like this: encounter 5&amp;gt; dbGet [dbGet top.nets.numInputTerms 32 -p].name DTMF_INST/TDSP_CORE_INST/ALU_32_INST/n_3062 DTMF_INST/TDSP_CORE_INST/EXECUTE_INST/n_896 {DTMF_INST/TDSP_CORE_INST/EXECUTE_INST/nbus_426[0]} DTMF_INST/TDSP_CORE_INST/TDSP_CORE_GLUE_INST/n_1213 DTMF_INST/TDSP_CORE_INST/TDSP_CORE_GLUE_INST/n_1357 DTMF_INST/RESULTS_CONV_INST/n_2516 DTMF_INST/RESULTS_CONV_INST/n_2521 DTMF_INST/RESULTS_CONV_INST/n_2512 But if we want to get more sophisticated we can use dbGet expression matching. The first thing to notice is the unique syntax these expressions use. If we want to do the same as we did a couple examples back -- ie, get the pointers to all nets with a fanout of 32 -- here&amp;#39;s how we do it with expression matching: encounter 6&amp;gt; dbGet top.nets {.numInputTerms == 32} 0x2aaab4252f38 0x2aaab20acbe8 0x2aaab20acf30 0x2aaab215fc88 0x2aaab2160078 0x2aaab21faa00 0x2aaab21faca0 0x2aaab21fcab8 Notice that we select the attribute to match on with &amp;quot;.numInputTerms&amp;quot;, then the criteria (&amp;quot;==&amp;quot; in this case), then the value. And we wrap it all in &amp;quot;{}&amp;quot;. Note also that dbGet automatically returns pointers in this mode and doesn&amp;#39;t require a &amp;quot;-p&amp;quot;. From there we can make it more complex, with a greater than rather than equal: encounter 7&amp;gt; dbGet top.nets {.numInputTerms &amp;gt; 32} 0x2aaab3c5c928 0x2aaab3c5c9d0 0x2aaab3cf7898 0x2aaab3cf8c48 0x2aaab40e5890 0x2aaab42533d0 0x2aaab4253a60 0x2aaab44474b0 0x2aaab20ad080 0x2aaab20adc38 0x2aaab20c4180 0x2aaab20c44c8 0x2aaab21fb288 0x2aaab21fbfa8 Or combine two expressions to match the nets with fanout greater than &amp;quot;n&amp;quot; which are not marked as clock nets: encounter 8&amp;gt; dbGet top.nets {.numInputTerms &amp;gt; 32 &amp;amp;&amp;amp; .isClock == 0} 0x2aaab3c5c928 0x2aaab3c5c9d0 0x2aaab40e5890 0x2aaab42533d0 0x2aaab4253a60 0x2aaab44474b0 0x2aaab20ad080 0x2aaab20adc38 0x2aaab20c4180 0x2aaab20c44c8 0x2aaab21fb288 0x2aaab21fbfa8 If we wanted to get the names of these nets we could wrap it within another call to dbGet: encounter 9&amp;gt; dbGet [dbGet top.nets {.numInputTerms &amp;gt; 32 &amp;amp;&amp;amp; .isClock == 0}].name test_modeI scan_enI {DTMF_INST/TDSP_CORE_INST/alu_cmd[1]} DTMF_INST/TDSP_CORE_INST/ALU_32_INST/n_1716 DTMF_INST/TDSP_CORE_INST/ALU_32_INST/n_1738 DTMF_INST/TDSP_CORE_INST/MPY_32_INST/n_268 {DTMF_INST/TDSP_CORE_INST/EXECUTE_INST/nbus_440[0]} DTMF_INST/TDSP_CORE_INST/EXECUTE_INST/n_4221 DTMF_INST/TDSP_CORE_INST/DECODE_INST/n_4475 DTMF_INST/TDSP_CORE_INST/DECODE_INST/n_181 DTMF_INST/RESULTS_CONV_INST/n_2509 DTMF_INST/RESULTS_CONV_INST/n_6011 I hope this is helpful in making your scripting within Encounter more compact. Check back next time and I&amp;#39;ll show how to write these nets to a file, one net name per line by using redirect and a couple of tricks. I&amp;#39;d love it if you subscribed to the Cadence Digital Implementation blogs for notification of new posts. Question of the Day: Have you found cases where dbGet&amp;#39;s expression based matching is particularly useful? -Bob Dwyer</description></item><item><title>Collaboration, Concurrency, and Convergence: CDNLive! Silicon Valley 2012</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/collaboration-concurrency-and-convergence-cdnlive-silicon-valley-2012</link><pubDate>Mon, 19 Mar 2012 18:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1309056</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/collaboration-concurrency-and-convergence-cdnlive-silicon-valley-2012</guid><slash:comments>0</slash:comments><description>I was out in San Jose last week for CDNLive! Silicon Valley 2012 -- our US user&amp;#39;s group conference. I feel like we&amp;#39;ve been on a good run with this conference during the past few years. I&amp;#39;m seeing users return to present papers year after year. And each year we seem to have new users who are inspired to share what they&amp;#39;ve been working on at a future conference. Here are three themes I noticed at this year&amp;#39;s conference: Collaboration The conference is all about collaboration -- a theme well represented in the keynote speeches. Rick Cassidy from TSMC said that &amp;quot;deep partnership with folks like Cadence sits at the heart of what we need to do.&amp;quot; Furthermore, in remarks directed at atttendees, he said that &amp;quot;we (TSMC) will not compete with you.&amp;quot; Tom Lantzsch from ARM said &amp;quot;collaboration and partnership is probably the most critical element for our success.&amp;quot; And Cadence CEO Lip-Bu Tan (right) said &amp;quot;We need all the key partners to collaborate with us, from the foundry partners to the IP partners all the way to the software developers.&amp;quot; (See listings of blog posts on these keynote speeches at the end of this post). This idea of collaboration isn&amp;#39;t new in the IC design community. But I appreciate how the guys at the top reinforced this message. It set the tone for the user papers which followed the keynotes. And for informal conversations throughout the two day conference. Personally, this resonated with me because I believe that every interaction with a customer is a chance to improve our solutions, and that if we work together we can achieve great things. Concurrency Mobile computing was a common thread through each of the keynotes. Mobile devices present unique challenges to the digital designer: Would you like high performance or low power? Yes is the answer. Deliverying high performance low power design requires breakthrough concurrent design capabilities.Tom Lantzsch from ARM described how a design team implementing one of their cores pushed performance while reducing power. The final gains that enabled their objectives to be achieved came by leveraging Cadence&amp;#39;s Clock-Concurrent Optimization (CCOpt). By concurrently optimizing clock and data signals, CCOpt is able to maximize performance while minizing power consumption. More on CCOpt in this interview with Paul Cunningham -- and more to come in future blog posts. I co-presented a paper with Netronome at this year&amp;#39;s conference on the topic. Convergence Lantzsch revealed that ARM is looking beyond mobile computing and is pursuing new opportunities in the server, home entertainment, and automotive marketplaces. A few years ago, he cataloged the number of devices in his home with IP addresses and found 23. He re-assessed the count recently and found that the number of devices actually went down a bit in recent years even though a number of new devices were added. The reason for this: Convergence in the number of functions each device performs. As we look around and see multiple MP3 players, smartphones, and tablets in our homes -- whereas we used to have one or two shared desktop computers -- it&amp;#39;s striking how personal this technology has become. The devices have certainly increased the number of functions they perform (MP3 player, GPS, e-reader, and more) but a family has more copies of each device than ever before. The changes we&amp;#39;ve seen in personal communications devices are just the beginning. As these changes take place in home entertainment and automotive it will be a fascinating space to watch. We see convergence in the digital implementation space as well. Multiple steps are collapsed into single steps within the Encounter Digital Implementation System each release. Concurrent clock and data. Concurrent base and signal integrity delay. Just as we need to mutli-task as engineers, so do the tools we use to get our jobs done. My favorite part of CDNLive! is creating connections. There are connections between users working with similar functionality in our tools. And there are connections with the developers and product engineers responsible for architecting and improving the tools in areas our customers interact with. I&amp;#39;d love it if you subscribed to our Digital Implementation Blogs to be informed of new posts. Bob Dwyer Photo by Joe Hupcey III Blog posts on CDNLive! keynote speeches: CDNLive! - Lip-Bu Tan Keynote Cites Semiconductor Growth Drivers TSMC CDNLive! Keynote - &amp;quot;We Can Beat Moore&amp;#39;s Law&amp;quot; CDNLive! Keynote - New Horizons for ARM based SoCs</description></item><item><title>CDNLive! Silicon Valley 2012 Abstracts Due November 11th, 2011</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/cdnlive-silicon-valley-2012-abstracts-due-november-11th-2011</link><pubDate>Wed, 02 Nov 2011 17:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1304960</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/cdnlive-silicon-valley-2012-abstracts-due-november-11th-2011</guid><slash:comments>0</slash:comments><description>The Call for Papers for CDNLive! Silicon Valley 2012 is open now through Friday November 11th, 2012. CDNLive! is the Cadence users group conference. It provides an opportunity to present and listen to presentations from folks who use Cadence software to get their jobs done. Next year&amp;#39;s conference is being held March 13-14 2012 at the Doubletree San Jose. I&amp;#39;ve attended a number of these events in the past, both as a customer and as a co-presenter along with customers. The thing I like most is connected with other people in the world who have been working with the same hyper-specific design challenges as I&amp;#39;ve been. The design community itself is pretty tight knit, but when you&amp;#39;re able to meet someone who&amp;#39;s been working with writing TCL in Encounter for 10 years to solve interesting problems (just like I have!) it can make for a very enjoyable conversation. Customers I talk to are often at a loss as to what topic to present on -- even ones who have done some incredible things with our software over the years. Don&amp;#39;t sell yourself short. The best presentations describe how you applied Cadence technology (usually a collection of different pieces of functionality) to solve your real world design challenges. Here are some suggested topics and here is an archive of presentations from last year&amp;#39;s conference. For more information visit the CDNLive! Silicon Valley 2012 part of our website . I look forward to seeing you there! -Bob Dwyer</description></item><item><title>Encounter Quick Tip: Dimming the Display with F12</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-quick-tip-dimming-the-display-with-f12</link><pubDate>Fri, 30 Sep 2011 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1301373</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-quick-tip-dimming-the-display-with-f12</guid><slash:comments>1</slash:comments><description>I remember when I first started working with the Cooper &amp;amp; Chyan Technology (CCT) router back in the day. It had this great feature where you could darken the display for everything in the design other than what you had selected. This was particularly useful when you were trying to route a net because it focused your eyes on the task at hand while still providing visibility to the rest of the design that you had to avoid bumping into when making wiring edits. We&amp;#39;ve had a similar feature in Encounter for quite some time but a lot of people don&amp;#39;t know about it. Here&amp;#39;s how it works... In the design below I&amp;#39;ve selected one net with the &amp;quot;selectNet&amp;quot; command. Can you see it highlighted in the design below? Neither can I, because the white it is highlighted in is so similar to the color used for M4 and M6 routing: To help make the selected objects more visible, go to Edit-&amp;gt;Dim Background (which is bound to the F12 key): The selected objects should remain bright while non-selected objects will be dimmed, giving focus to the selected objects: This works for any selected object in the design. Give it a try next time you&amp;#39;re having trouble seeing an object in the design. Hope this helps. -Bob Dwyer</description></item><item><title>Encounter Quick Tip: Finding Available Cell Masters with dbGet</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-quick-tip-finding-available-cell-masters-with-dbget</link><pubDate>Wed, 28 Sep 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1301314</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-quick-tip-finding-available-cell-masters-with-dbget</guid><slash:comments>0</slash:comments><description>When you first start using dbGet, many of your queries branch off the &amp;quot;top&amp;quot; keyword and then traverse to &amp;quot;insts&amp;quot; or &amp;quot;nets&amp;quot;. These searches return a list of all the instances or nets in the design. But sometimes it&amp;#39;s necessary to query the available cell masters -- some of which may or may not be instantiated. Common reasons for needing this are for finding things like well taps, end caps, antenna diodes and filler cells. You have a hunch what these cells are called for the library you&amp;#39;re working on and you&amp;#39;d like to search through all of the cell masters currently loaded in the design. Say for example you want to tell the tool which cells should be used as fillers. (Fillers are physical-only instances added after placement to fill gaps between standard cells to provide standard cell rail and well continuity). You can have a hunch they&amp;#39;re called FILL-&amp;quot;something&amp;quot;. Here&amp;#39;s how to use dbGet to find the names of all the cell masters available that match FILL*: encounter 1&amp;gt; dbGet head.allCells.name FILL* FILL1 FILL16 FILL2 FILL32 FILL4 FILL64 FILL8 You can pass the output directly to setFillerMode, then call addFiller to add the instances to the design: encounter 2&amp;gt; setFillerMode -core [dbGet head.allCells.name FILL*] encounter 3&amp;gt; addFiller Although &amp;quot;top&amp;quot; is by far the common dbGet starting point, the &amp;quot;head&amp;quot; pointer provides a link to technology information like layers, vias and more. Give it a look next time you&amp;#39;re seeking to find technology information rather than design-specific data. For more information on dbGet check out this post on Getting Started with dbGet . Hope this helps. -Bob Dwyer</description></item><item><title>Tab Completion with Encounter's dbGet Command: Smarter Than You Might Think</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/tab-completion-with-encounter-s-dbget-command-smarter-than-you-might-think</link><pubDate>Thu, 19 May 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1277206</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/tab-completion-with-encounter-s-dbget-command-smarter-than-you-might-think</guid><slash:comments>4</slash:comments><description>If there&amp;#39;s one thing that makes navigating a UNIX command line or tool console more efficient, it&amp;#39;s tab completion. We&amp;#39;ve been improving Encounter&amp;#39;s support for tab completion over the past few releases, and in 10.1 Encounter&amp;#39;s dbGet command received tab completion support for the first time. Have a look at the screencast embedded below -- I think the way it&amp;#39;s been implemented is really nice. And smarter than you might realize at first glance. In its simplest sense tab completion works like this: encounter 1&amp;gt; dbGet top. ...returns a list of all the attributes associated with the &amp;quot;top&amp;quot; cell in the design. If I provide a portion of an attribute it auto-completes and inserts a trailing &amp;quot;.&amp;quot;: encounter 2&amp;gt; dbGet top.i encounter 2&amp;gt; dbGet top.insts. If you continue on and ask it to complete when there are no remaining attributes associated with the last field, notice how inserts a trailing space: encounter 3&amp;gt; dbGet top.insts.n encounter 3&amp;gt; dbGet top.insts.name dbGet selected. Similarly, if you task it with tab completing a variable. It&amp;#39;s smart enough to examine the contents of the variable and tab complete accordingly: encounter 5&amp;gt; set nets [dbGet top.nets.name *clk* -p] encounter 6&amp;gt; dbGet $nets. These examples are demonstrated in the screencast embedded below: (if you have trouble viewing the video try this link instead) Check it out next time you&amp;#39;re using dbGet in 10.1 or newer releases. I hope you find it useful. Bob Dwyer</description></item><item><title>Encounter Quick Tip: How to Repair Command Line Navigation When Launching via bsub</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-quick-tip-how-to-repair-command-line-navigation-when-launching-via-bsub</link><pubDate>Tue, 12 Apr 2011 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1267495</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-quick-tip-how-to-repair-command-line-navigation-when-launching-via-bsub</guid><slash:comments>3</slash:comments><description>When two users report the same issue in the same week I&amp;#39;m glad I can share the problem and solution via this blog. I know a lot of you work in an environment where you request computing resources via &amp;quot;bsub.&amp;quot; In many cases it&amp;#39;s frowned upon to request an xterm to launch jobs and it&amp;#39;s preferred to start an interactive session with something like &amp;quot;bsub -I encounter.&amp;quot; What we were seeing was that command line navigation at the Encounter console was broken when launched via bsub yet was working fine when launched via an xterm. Backspace produced garbage characters like &amp;quot;^H&amp;quot;, tab-completion didn&amp;#39;t work, and arrow-up (precious arrow-up!) wouldn&amp;#39;t retrieve the previously issued commands. You could barely get around but it was truly painful. The remedy we found was to launch jobs with &amp;quot;bsub -Ip encounter&amp;quot; instead of just &amp;quot;bsub -I encounter.&amp;quot; The &amp;quot;-Ip&amp;quot; asks for an interactive prompt that should enable command line navigation to work as desired. Hope this is useful. If this works/doesn&amp;#39;t work for you -or- you&amp;#39;re having any other problems with command line navigation let us know. Little things like that can really affect your impression of the software so I want to make sure everyone&amp;#39;s console is working the way it should be. Bob Dwyer</description></item><item><title>Encounter Puzzler #3 Solution: Renaming a Net Logically</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-puzzler-solution-renaming-a-net-logically</link><pubDate>Wed, 09 Mar 2011 18:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1260745</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-puzzler-solution-renaming-a-net-logically</guid><slash:comments>6</slash:comments><description>Once again, the Encounter Digital Implementation designer community has stepped up to the challenge. Last week&amp;#39;s puzzler -- renaming a net logically in Encounter -- was solved in short order. Let&amp;#39;s add J2mh and Sims to the list of Encounter Wizards (along with regular commentator and guest blogger Jason G ). To quickly restate the challenge, we wanted to rename a logical net. We wanted to take this netlist: module testcase (); wire net; BUFX1 i0(.Y(net)); BUFX1 i1(.A(net)); endmodule ...and turn it into this: module testcase (); wire new_net; BUFX1 i0 (.Y(new_net)); BUFX1 i1 (.A(new_net)); endmodule J2mh&amp;#39;s solution was very similar to my own -- but his was more concise. Create a new net, and attach each instance terminal connected to the old net to the new net: proc changeNetName {oldNetName newNetName} { selectNet $oldNetName addNet $newNetName foreach selTerminals [dbGet selected.allTerms] { attachTerm [dbGet $selTerminals.inst.name] [dbGet $selTerminals.cellTerm.name] $newNetName } deselectAll } Notice how we don&amp;#39;t need to disconnect the old net from each terminal. Connecting it to the new net overrides the connection since a given instance terminal can only be connected to a single net. attachTerm takes 3 arguments: When you&amp;#39;re iterating through each instance terminal in &amp;quot;net.allTerms&amp;quot; it returns pointers whose &amp;quot;name&amp;quot; is the instance name plus the pin name. Like &amp;quot;i0/A&amp;quot; for example. I especially liked how he used dbGet to &amp;quot;walk&amp;quot; from each instance terminal to get the inst.name and cellTerm.name to pass the required arguments to attachTerm. I used a slightly different approach that&amp;#39;s probably more error prone. I used &amp;quot;file&amp;quot; commands to decompose / : set instTermName [dbGet $term.name] set instName [file dirname $instTermName] set termName [file tail $instTermName] attachTerm $instName $termName $newNetName I like his approach better because it&amp;#39;s not splitting strings -- it&amp;#39;s getting the name directly from the appropriate db object. The extra credit to the challenge was to make sure the script worked when renaming a net that connected through hierarchical terminal -- like &amp;quot;net2&amp;quot; does in this example: module testcase (); wire net2; BUFX1 i0(.Y(net2)); a i_a(.in(net2)); endmodule module a(in); input in; BUFX1 i0(.A(in)); endmodule I thought this was going to be a really complicated case to handle. Sims&amp;#39; approach was what I thought was going to be necessary where we&amp;#39;d need to connect the hierarchical terminal i_a/in to the net at each level of hierarchy. However, I don&amp;#39;t think it&amp;#39;s that difficult after all. Here&amp;#39;s why... With the netlist above, although there are indeed fractional representations of the net in the db, there is only 1 net in the design in terms of how it is presented to us via dbGet. I&amp;#39;ve heard this called the &amp;quot;canonical&amp;quot; net name. Therefore, if we connect the input of the buffer within the &amp;quot;a&amp;quot; module to a new net: encounter 1&amp;gt; addNet new_net2 encounter 2&amp;gt; attachTerm i_a/i0 A new_net2 encounter 3&amp;gt; attachTerm i0 Y new_net2 ...&amp;quot;new_net2&amp;quot; is automatically connected through the hierarchical terminal &amp;quot;i_a/in&amp;quot;. The netlist would look like this: module a ( in); input in; BUFX1 i0 (.A(in)); endmodule module testcase (); // Internal wires wire new_net2; wire net2; BUFX1 i0 (.Y(new_net2)); a i_a (.in(new_net2)); endmodule The final part of the extra credit was to handle the case where the net was connected to a top-level IO port. Like top-level input port &amp;quot;in&amp;quot; in this example: module testcase (in); input in; BUFX1 i0(.A(in)); endmodule This too was a little easier than I expected, but in an interesting way. Rather than having to create a new top-level port and connect it to a newly-created net, when you create a new top-level port a new net is automatically available. Or, if you create the net first and then create a new top-level port the two are automatically associated. addModulePort takes a moduleName -or- uses the special character &amp;quot;-&amp;quot; to denote addition at the top level: Usage: addModulePort addModulePort | - {input | output | bidi} For example: addModulePort - new_in input It&amp;#39;s worth mentioning why dbGet calls the list of terminals associated with the &amp;quot;net&amp;quot; object &amp;quot;allTerms&amp;quot; instead of &amp;quot;terms&amp;quot; or &amp;quot;instTerms&amp;quot;. It&amp;#39;s called &amp;quot;all&amp;quot; to indicate the list of objects may contain a mixture of top-level terminals (&amp;quot;terms&amp;quot;) and instance terminals (&amp;quot;instTerms&amp;quot;). Stringing this all together, we can check the object type of each terminal in the allTerms list and do something different depending on which it is: proc userChangeNetName {oldNetName newNetName} { set net [dbGetNetByName $oldNetName] addNet $newNetName foreach term [dbGet $net.allTerms] { if {[dbGet $term.objType] == &amp;quot;instTerm&amp;quot;} { set instTermName [dbGet $term.name] set instName [file dirname $instTermName] set termName [file tail $instTermName] attachTerm $instName $termName $newNetName } else { addModulePort - $newNetName [dbGet $term.inOutDir] deleteModulePort - $oldNetName } } deleteNet $oldNetName } All of this made me realize it would be a good to have native net-renaming functionality in the tool so I filed a reuquest asking for an enhancement. Hopefully this served as a useful example of how db access can help bridge the gap between current capabilities and something we as users need to accomplish. When performing netlist manipulations like these it&amp;#39;s always good to check your work. I&amp;#39;m sure many of you are familiar with the Encounter Conformal Equivilence Checker which provides (among other things) a quick and easy way to make sure two Verilog gate level netlists are functionally equivilent. Thanks again for participating in these puzzlers. I&amp;#39;ll follow-up soon with another (designers have been sharing some great challenges lately!). It would be great if you subscribed to these blogs so we can keep in touch. Bob Dwyer</description></item><item><title>Encounter Puzzler #3: Renaming a Net Logically</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-puzzler-3-renaming-a-net-logically</link><pubDate>Mon, 28 Feb 2011 20:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1260627</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-puzzler-3-renaming-a-net-logically</guid><slash:comments>3</slash:comments><description>The other day a designer E-mailed me: How can we rename a net in Encounter? I followed up to clarify whether the designer wanted to change the net associated with routed wire segments, or wanted to rename a signal net. He clarified that he wanted to change a logical signal net&amp;#39;s name. Changing the net name associated with a routed wire segments is described in this solution : editSelect -nets VDD1 editSelectVia -nets VDD1 editChangeNet -to VDD2 However, it&amp;#39;s not so easy to change a logical net name in Encounter. The &amp;quot;name&amp;quot; field for a net isn&amp;#39;t editable in the Attribute Editor, there is no &amp;quot;dbSetNetName&amp;quot; command, and dbGet says the &amp;quot;name&amp;quot; attribute of the &amp;quot;net&amp;quot; object type isn&amp;#39;t settable: encounter 1&amp;gt; dbGet top.nets.?h name: string, Canonical (flat) name of the net If an attribute is settable dbGet will say &amp;quot;settable&amp;quot; after the attribute name. For example: skipRouting(settable): bool, Specifies that Nanoroute should not route or re-route the net. So how can we change the net name programatically? How would we take this netlist: module testcase (); wire net; BUFX1 i0(.Y(net)); BUFX1 i1(.A(net)); endmodule ...and turn it into this: module testcase (); wire new_net; BUFX1 i0 (.Y(new_net)); BUFX1 i1 (.A(new_net)); endmodule Today&amp;#39;s puzzler is to write a TCL script called &amp;quot;userChangeNetName&amp;quot; that changes the logical net name of nets programmatically: proc userChangeNetName {oldNetName newNetName} { } Leave your solution as a comment below. I&amp;#39;ll post further discussion and a round-up on Friday. We&amp;#39;re looking to change the net name logically so don&amp;#39;t worry about things like wire segments or physical I/O pins. For extra credit, check whether your scripted solution can handle the case where the net is connected to an I/O port and/or connected through Verilog hierarchy like top-level net &amp;quot;in&amp;quot; and &amp;quot;net2&amp;quot; in this example: module testcase (in); input in; wire net1, net2; BUFX1 i0(.Y(net1)); BUFX1 i1(.A(net1)); BUFX1 i2(.A(in)); BUFX1 i3(.Y(net2)); a i_a(.in(net2)); endmodule module a(in); input in; BUFX1 i0(.A(in)); endmodule Related Reading: Encounter Puzzler #1: Where did my fences go? Encounter Puzzler #2: Finding registers beneath a hierarchy I&amp;#39;ll look forward to seeing your solutions! Update: Click here to see solutions and discussion about this puzzler Bob Dwyer</description></item><item><title>Guest User Blog: dbShape For All Your Logical Operation Needs</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/dbshape-for-all-your-logical-operation-needs</link><pubDate>Wed, 16 Feb 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1254487</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/dbshape-for-all-your-logical-operation-needs</guid><slash:comments>3</slash:comments><description>This is a guest post from Jason Gentry at Avago. I hope you enjoy this useful piece he&amp;#39;s contributed on using the Encounter Digital Implementation System&amp;#39;s dbShape command that debuted in 10.1. I figured it was time for another guest blog, especially since I&amp;#39;ve been able to play with one of the new-to-EDI10.1 commands called &amp;quot;dbShape.&amp;quot; During CDNLive! 2008, one of the topics I talked about was my need for logical operations or LogOps for short. Think basic OR, AND, ANDNOT, etc. operations on physical geometries. I had Tcl-implemented versions of these that worked well (N-log(N)) but their performance was really poor when dealing with a large number of shapes (N). Well, apparently Cadence was listening and decided to bolt-on a shapes engine. EDI10.1 introduces the &amp;#39;dbShape&amp;#39; command and it is a thing of beauty. The usage is as follows: Usage: dbShape [-help] [-d] [-step ] [-output ] [AND | ANDNOT | OR | XOR | SIZE | BBOX | MOVE { }] ... -help # Prints out the command usage -d # User specified values and return values are in database units. # Default: All values are in user units, in microns. (bool, optional) -step # Specifies step size if output format is rect, required to convert # non-orthogonal shapes into series of rectangles. Default: minwidth # value of first routing layer (coord, optional). -output # Specifies the output format. default: rect (string, optional) # polygon or rect or list of polygon and rect. polygon: # {{x y} {x y} {x y} ... }; rect: {x1 y1 x2 y2} (list, required) AND # binary operator: intersection of shapeLists ANDNOT # binary operator: initial shapeList minus OR # binary operator: union of shapelists XOR # binary operator: OR minus AND of shapeList # (string, optional) SIZE # unary operator: increase the size of shapeList by MOVE { } # unary operator: move the shapeList by { } BBOX # unary operator: computes the bounding box of shapeList # (string, optional) I&amp;#39;ve since replaced all of my low-level LogOp procedures with calls to dbShape. I&amp;#39;ve seen some performance improvement but it wasn&amp;#39;t until I re-architected some of my biggest programs that I saw a major impact. One such script, a custom power grid insertion script, went from running in 8-9 hours to running in 1/2 an hour. It ran so fast I had to double check that my power grid actually got inserted. Below are some examples of each of the available operations (note that I use the &amp;#39;-output rect&amp;#39; option for all of these to simplify the illustrations but it is not necessary). set shapes1 [list [list 100 100 1100 1100]] set shapes2 [list [list 300 300 500 500] [list 700 700 900 900]] set shapes3 [list [list 500 700 1200 900]] LogOp OR: dbShape -d -output rect $shapes1 OR $shapes3 LogOp: AND dbShape -d -output rect $shapes1 AND $shapes2 LopOp: ANDNOT dbShape -d -output rect $shapes1 ANDNOT $shapes2 LogOp: SIZE dbShape -d -output rect $shapes2 SIZE 100 There are some limitations that you should know about before you write your own scripts: - There is only a &amp;#39;SIZE&amp;#39; logop, no &amp;#39;SIZEX&amp;#39; or &amp;#39;SIZEY&amp;#39; for sizing only one dimension. This has caused me some headaches but I&amp;#39;ve gotten around it for the most part for now, albeit inefficiently. - The is no &amp;#39;INTERSECTS&amp;#39; LogOp; a LogOp that returns all shapes that intersect the specified shapeList. Think &amp;#39;AND&amp;#39; without modifying the original shapeList. This would be really nice for finding floating power wires (wires with no vias connecting to it). - If you choose to work with rectangles (-output rect), all of the rectangles are returned in maximally-vertical form. In other words, the resulting rectangles will be cut such that they are as tall as possible. You might ask, &amp;quot;Why do I care?&amp;quot; The only time that I&amp;#39;ve needed to care whether I have maximally-horizontal versus maximally-vertical rectangles dealt with trying to compute spacing requirements. The &amp;quot;run-length&amp;quot; of a given shape may change depending on whether or not it appears very long or very short. I&amp;#39;ve included images below showing the above ANDNOT example with maximally-horizontal and maximally-vertical configurations. Maximally-Vertical Rectangles: Maximally-Horizontal Rectangles: - You can daisy-chain the operations. This is best shown through example: dbShape -d -output rect $shapes1 OR $shapes3 ANDNOT $shapes2 -Jason Gentry Related Post: Using dbTransform to Translate Geometric Coordinates in Encounter</description></item><item><title>Advanced Maneuvers in Feedthrough Insertion: Maximizing Routability while Minimizing Port Creation</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/advanced-maneuvers-in-feedthrough-insertion-maximizing-routability-while-minimizing-port-creation</link><pubDate>Mon, 10 Jan 2011 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1249096</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/advanced-maneuvers-in-feedthrough-insertion-maximizing-routability-while-minimizing-port-creation</guid><slash:comments>0</slash:comments><description>Previously I wrote about the basics of feedthrough insertion in Encounter . Today I&amp;#39;d like to push into a tiny but powerful example of how Encounter&amp;#39;s feedthrough insertion solution can derive solutions that enable rapid top-level design closure. Feedthrough insertion in Encounter has two modes of operation: Placement-based -or- route-based. The advantage of route-based is its awareness of congested vs. sparse areas of the design. Encounter&amp;#39;s high capacity virtual flat view of the design combined with hierarchically aware track-assignment-based trial routing provides design insight not usually available until after partitioning and reassembly. We can use this information to derive feedthrough insertion and pin assignment with a high degree of routability. Once we embark up on deriving feedthrough insertion solutions based on trial routing, some interesting situations arise. Take for example the one pictured below. The design has 4 partitions. The example net potentially in need of feedthrough insertion is driven from an instance within the partition on the lower left to a partition on the upper right. I&amp;#39;ve highlighted the net showing how it crosses over the neighboring partition to the lower right: If we run route-based feedthrough insertion it will follow the topology of the net, determine which partitions it crosses, and insert feedthroughs generally along the route. Here is the command: insertPtnFeedthrough -chanLess -doubleBuffer -routeBased And here is the result: After performing pin assignment ( assignPtnPin ) and commiting the partitions ( partition ) the result is neatly aligned connections on the partitions with no top level routing crossing over partitions: This solution is fine, but what if we wanted to reduce the number of ports created and feedthrough buffers inserted? For this particular net we could avoid the need for feedthrough buffers all together if we instead assign the partition pins for the lower left and upper right partition along the common edge they share in the center of the design. But how can derive the benefits of route-based feedthrough insertion while still detecting situations where it would be better to instead simply align pins on common edges in situations like this? There&amp;#39;s a very useful switch called &amp;quot;-preferPinAbutment&amp;quot; that will give us the best of both worlds. With it, the tool will perform route-based feedthrough insertion and back off in situations where a common edge is available -- unless the common edges are highly congested. insertPtnFeedthrough -chanLess -doubleBuffer -routeBased -preferPinAbutment I remember working with our developers on this capability years ago. I thought it was a stretch when I asked them for it but I was pleased when they implemented it. There are a number of other capabilities insertPtnFeedthrough has that are subtly powerful. I&amp;#39;ll be talking about them in future blog posts. Have you used Encounter&amp;#39;s feedthrough insertion functionality? If so I&amp;#39;d love to hear what&amp;#39;s working and what&amp;#39;s not in the comments. Bob Dwyer</description></item><item><title>Planning for Hierarchical Design Success: Do You Have a Robust Feedthrough Insertion Solution?</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/planning-for-hierarchical-design-success-do-you-have-a-robust-feedthrough-insertion-solution</link><pubDate>Mon, 27 Dec 2010 11:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1248835</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/planning-for-hierarchical-design-success-do-you-have-a-robust-feedthrough-insertion-solution</guid><slash:comments>1</slash:comments><description>Feedthrough insertion is a subtly crucial task that naturally arises in hierarchical digital design. There are several types of approaches we can use to allow signals to traverse across a chip, but the most common and effective I&amp;#39;ve seen is where buffers are inserted in neighboring partitions. This eliminates top-level routing and more importantly takes the top-level timing closure task and makes it part of block-level timing closure. In Encounter this capability is accessed through the TCL command insertPtnFeedthrough . Here&amp;#39;s a picture to describe what I&amp;#39;m talking about. Say we have 3 partitions: a, b, and c. A signal that originates in &amp;quot;a&amp;quot; and connects to &amp;quot;c&amp;quot; traverses over &amp;quot;b&amp;quot;: If we don&amp;#39;t perform feedthrough insertion, what we&amp;#39;ll get is a net that traverses over partition &amp;quot;b&amp;quot;. This is unacceptable in scenarios where all layers are reserved for partitions, and in scenarios where some layers are reserved for over the block-routing we get into a difficult situation because we can&amp;#39;t insert buffers on nets that exceed the maximum distance required for rebuffering. See below what the design would look like after buffering without feedthrough insertion: If we use insertPtnFeedthrough, the tool will: Insert buffers within &amp;quot;b&amp;quot; for each entrance and (optionally) exit required to traverse the partition. Create new ports as needed on the partitions to make new connections. In this case, 1 new input and 1 new output port is needed on &amp;quot;b&amp;quot;. Create new top-level logical nets as needed to connect to the new ports. Here&amp;#39;s what the design would look like after feedthrough insertion (insertPtnFeedthrough -chanLess -bufCell BUFX1 -doubleBuffer) prior to partitioning: Once the buffers have been inserted we can place the partition pins ( assignPtnPin ) and commit the partitions ( partition is the command). The result should be a design where connections between neighboring partitions consist of only 2-pin nets between abutted edges (or in the case of design with small roughly 10 microns channels, short jumper wires connecting the partitions): So that&amp;#39;s how feedthrough works in its simplest sense. In this context it&amp;#39;s tempting to consider writing a script to do this at the logic synthesis stage. But feedthrough insertion is much more complex in practice. In upcoming blog posts I plan to focus on more advanced scenarios to give you a sense of what to prepare for in terms of making sure the tools you&amp;#39;re using are up to the task. I&amp;#39;d love it if you subscribed to our Digital Implementation RSS feed -or- via E-mail at the form on the right side of this page so we can continue the conversation. Bob Dwyer</description></item><item><title>CDNLive! Silicon Valley 2010: User Papers Explore Digital Implementation</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/cdnlive-silicon-valley-2010-now-available-on-demand</link><pubDate>Thu, 04 Nov 2010 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1224726</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/cdnlive-silicon-valley-2010-now-available-on-demand</guid><slash:comments>0</slash:comments><description>I previously wrote about the general session of the 2010 CDNLive! Silicon Valley conference, focusing on what EDA360 means for Digital Implementation engineers . Today I wanted to share a little more about a couple of papers I co-presented along with Cadence customers. I enjoy co-presenting with customers where I, as a Cadence Applications Engineer, describe a piece of functionality in the system and then a customer describes how they brought it to bear on a real-world design challenge. It&amp;#39;s not always pretty or perfect but it is almost always useful. The best part of conferences like these is the chance to connect other users with the same hyper-specific interests as you have, and then hopefully stay connected with them via the Cadence.com Community or on other social channels. Proceedings for the conference have been posted. Click here to access CDNLive! Silicon Valley 2010 On-Demand where you can access slides for the presentations described below, along with (optionally) listening to audio recordings of the presentations along with slides. You&amp;#39;ll need a Cadence.com account to view the content. If you don&amp;#39;t have one you can get one here . In the first presentation I was involved with, Ranjit LoboPrabhu from Netronome described how they implemented a post-mask Mega-ECO. Post-mask meaning all of the base layers were frozen so no changes could be made to the instances in the design, and &amp;quot;mega&amp;quot; meaning a large amount of changes were being made. ECOs like this are complex because all the changes need to be made using spare cells -- or by reclaiming dormant logic if not enough spare cells are available. Ranjit (photo below) shared how they leveraged Conformal ECO Designer along with the Encounter Digital Implementation System&amp;#39;s &amp;quot; ecoDesign &amp;quot; super-command to achieve their design goals. Judging from the amount of audience interaction during the session, I think attendees appreciated the level of technical detail in the presentation. Next, Jason Gentry from Avago Technologies presented on extending the Encounter Digital Implementation System GUI in version 9.1. You might remember his name from a guest post he wrote about the dbTransform command . In the 9.1 release, Encounter switched from having an entirely tk-based GUI to being Qt-based. That changed the way we as users interact with and extend the main GUI. If you&amp;#39;ve tried to source an Encounter script written for version 8.1 or earlier that attaches a new item to a pulldown menu and received a message saying bad window path name &amp;quot;.m&amp;quot; this presentation was right up your alley. Thanks to everyone who participated in the conference, especially those who introduced themselves saying they participate in the Cadence.com Digitial Implementation Community. It means a lot to me. I&amp;#39;ll look forward to continuing the conversation and seeing you at a future Cadence event! Bob Dwyer</description></item><item><title>CDNLive! Silicon Valley 2010: What EDA360 Means to Digital Implementation Engineers</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/keeping-it-high-level-at-cdnlive-silicon-valley-2010</link><pubDate>Wed, 27 Oct 2010 16:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1202504</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/keeping-it-high-level-at-cdnlive-silicon-valley-2010</guid><slash:comments>0</slash:comments><description>CDNLive! Silicon Valley 2010 -- our user&amp;#39;s group meeting and more -- kicked off yesterday morning at the Fairmont Hotel in San Jose, California. It&amp;#39;s been 2 years since the last CDNLive! (last year&amp;#39;s event was online-only) where I captured this video of our Encounter software running though VPN/VNC on an iPhone . I was thinking this morning: How are we going to top that? What is going to be the thing I remember most at this year&amp;#39;s event? Well, for starters I grabbed a seat near Richard Goering , Gary Smith , and John Cooley who -- collectively -- have probably written 90% of the content I&amp;#39;ve consumed while working in the semiconductor and EDA industries for the past 13 years. It was great to see these guys in attendance along with other distinguished members of the press covering the event. Although I&amp;#39;m a Cadence employee I share these observations from the perspective of a typical engineer. I hope they&amp;#39;re useful in getting a feel for the tenor and topics discussed in the morning session at this year&amp;#39;s conference. The morning agenda had our executives describing what we&amp;#39;re working on at Cadence at a high level, what our strategy is, and what makes Cadence special. First, we heard from our President and CEO Lip-Bu Tan who shared that design costs are greater than mask costs. Automation, he suggested, is the way forward. Next, our Chief Marketing Officer John Bruggeman (image below) delivered a focused and deliberate message about what EDA360 is and why customers should care about it. He went into detail about System Realization, SoC Realization, and Silicon Realization and shared an anecdote I found interesting. He said that the average American television set has a lifespan of 15 years. That business model is undesirable when contrasted with a typical smartphone business model where the consumer pays for the handset, pays for a service contract, and then pays for apps and content on top of it. When John unboxed a television set he recently purchased he booted it up (as opposed to &amp;quot;plugging it in&amp;quot; or &amp;quot;turning it on&amp;quot;) -- and was presented with an app-like user interace similar to the iPhone. He used this as an example of how technology businesses need to fundamentally rethink the way they deliver their solutions to delight end users and then earn a revenue stream from them. Chi-Ping Hsu is our Senior VP of R&amp;amp;D in charge of Silicon Realization. Responsibility for the Encounter Digital Implementation System, my area of expertise, falls within his organization. He talked about EDA360&amp;#39;s concepts of intent, abstraction, and convergence and how those concepts drive product direction. He noted that design costs are greater than mask costs and suggested that automation is the way to reduce design costs. Next up was Dave Desharnais, Product Marketing Group Director, also in Silicon Realization. For the engineers in the room, this was likely a highlight of the morning because he delivered a demo which showed a tangible example of how an EDA360 concept meaningfully touches backend design. A key topic that came up throughout the day was Mixed Signal design. He showed how a top-level analog designer could easily interact with digital IP in their design by analyzing pin assignment quality in Virtuoso and then moving over to Encounter to implement the details of the pin move while keeping the top and bottom levels in sync. This is a simple task conceptually which can be complicated if analog and digital design teams and/or tools aren&amp;#39;t well aligned. Here&amp;#39;s a photo of Dave in front of one of the biggest screens I&amp;#39;ve ever seen an EDA demo on: So that took us to our first break. Quite a session from the high-level to the mid-level, conceptually. Check back later for some thoughts on the excellent customer presentation from Ty Garibay from Texas Instruments and a panel discussion on EDA360 in the Real World . I&amp;#39;ll also go into a couple of papers I co-presented with customers and talk about perhaps the best part about conferences like these -- the side discussions that occur with people with similar areas of experience and expertise. If you&amp;#39;re looking for a nice meal while you&amp;#39;re out here I have a couple of suggestions. One of my favorite restaurants in downtown San Jose is Il Fornaio inside the nearby Sainte Claire Hotel. The Pizza Fradiavola ($13.79) includes mozzarella, tomato sauce, Italian sausage, mushrooms, bell peppers, red onions, and spicy peperoncino oil. Delicious. Looking for a nice steak? The Grill (attached to the Fairmont) serves up nice stuff with great service in a classy environment. Pricey, but very good. I&amp;#39;d love it if you subscribed to the Digital Implementation blogs (via E-mail or RSS) so we can continue the conversation. Question of the Day: Are you out here at the conference? What did you think of the morning session? Bob Dwyer</description></item><item><title>Guest Blog: Using dbTransform to Translate Geometric Coordinates in Encounter</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/using-dbtransform-to-translate-geometric-coordinates-in-encounter</link><pubDate>Tue, 28 Sep 2010 11:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1179194</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/using-dbtransform-to-translate-geometric-coordinates-in-encounter</guid><slash:comments>1</slash:comments><description>This is a guest post from JasonG at Avago. I hope you enjoy this useful piece he&amp;#39;s contributed on using the relative-new dbTransform Encounter command. If you&amp;#39;d like to write a guest post we&amp;#39;d love to have it. Please drop me an E-mail if you&amp;#39;re interested in contributing: dwyer@cadence.com -Bob Dwyer Hello fellow digital implementation Tcl developers! Bob asked if I&amp;#39;d be interested in contributing to a &amp;quot;guest blog&amp;quot; on a subject of my choosing. First, a quick background about me. I am a senior design engineer for Avago Technologies where I do a lot of floorplanning and floorplan-related script development. You may have seen me a couple years ago at CDNLive! 2008 where I gave a presentation on all the extensions I&amp;#39;ve written for SoC Encounter during my career. When Bob asked if I was interested in guest blogging, I thought what better topic than a db-command that I&amp;#39;m anxious to integrate into my Tcl scripts. Some commands that always pop up high on my list of time-consuming procedures are my Tcl-implemented transformation commands. Often times my higher-level scripts require that I transform back and forth between &amp;quot;cell&amp;quot; coordinates and &amp;quot;instance&amp;quot; coordinates. For instance, say you are adding a routing blockage to a partition clone and you want to ensure it also gets added to the master in the corresponding location. One could transform the clone instance&amp;#39;s coordinate to the clone&amp;#39;s cell reference coordinate and then transform it from the cell reference to the master. Easy, right? Well, when you think about all the orientations that a clone could have, the computations can be pretty time consuming. Thankfully, the Cadence Encounter Digital Implementation system platform provides a partial solution to this problem; dbTransform. The usage, as of EDI9.1USR1: Usage: dbTransform [-help] [-d] -localPt {-inst | {-cell -orient -pt {x y}}} -help # Prints out the command usage -d # Specifies if points are in dbUnit: default is um # (bool, optional) -inst # instance object (db object, required) -cell # cell object (db object, optional) -orient {R0|R90|R180|R270|MX|MX90|MY|MY90|dbcR0|dbcR90|dbcR180|dbcR270|dbcMX|dbcMX90|dbcMY|dbcMY90} # orientation (enum, optional) -pt {x y} # location (point, optional) -localPt # a pt {x y}, rect {xl yl xu yu} or list of pts and/or # rects {{x1 y1} {x2 y2} {xl yl xu yu} ...} inside cell # (string, required) Here is an example that shows how one would go about finding the shapes for a specific pin on a leaf cell. ### Find the metal shapes associated with the &amp;quot;CK&amp;quot; pin of a cell. set instPtr [dbGetInstByName i_a/i2] set termPtr [dbGetTermByName $instPtr CK] ### The pin shapes are stored on the &amp;quot;cell fterm&amp;quot; reference. dbForEachFTermLefPort [dbTermFTerm $termPtr] lefPortPtr { dbForEachLefPortLayerShape $lefPortPtr lShapePtr { set lsLyr [dbLayerWireId [dbLayerShapeLayer $lShapePtr]] dbForEachLayerShapeShape $lShapePtr lShapeSPtr { set lsBox [dbShapeRect $lShapeSPtr] ### Use &amp;#39;dbTransform&amp;#39; to take this &amp;quot;local point&amp;quot; and translate into ### the instance&amp;#39;s placement. set pinShape [join [dbTransform -d -localPt $lsBox -inst $instPtr]] ### Fix the shape to be a legal &amp;quot;rect&amp;quot; (i.e. urx&amp;gt;llx and ury&amp;gt;lly). foreach {llx lly urx ury} $pinShape { if {$llx &amp;gt; $urx} { set tmp $llx; set llx $urx; set urx $tmp; } if {$lly &amp;gt; $ury} { set tmp $lly; set lly $ury; set ury $tmp; } break } set pinShape [list $llx $lly $urx $ury] Puts &amp;quot;Pin on layer $lsLyr has rectangle \{$pinShape\}&amp;quot; } } } ### The resulting coordinates, in DBU, are: Pin on layer 1 has rectangle {2077950 5172740 2078370 5172920} Pin on layer 1 has rectangle {2077950 5172270 2078090 5172740} Pin on layer 1 has rectangle {2078230 5172920 2078370 5173170} The picture below shows, in solid blue lines, the resulting shapes. As you can see, they exactly correspond with the pin shapes for the &amp;quot;CK&amp;quot; pin on this instance. Note that this instance just happened to be placed in the MY orient and, thus, the ury and lly were swapped. Unfortunately, as dbTransform is currently implemented, there is no way to transform the other way. In other words, you cannot transform coordinates that are in terms of an instance to a cell. However, I hear this will be available in the next version and I cannot wait to test it out. Also, dbTransform only supports objects of type &amp;#39;dbcObjInst&amp;#39; and &amp;#39;dbcObjBump&amp;#39;. For my scripting needs, I also need support for &amp;#39;dbcObjHInst&amp;#39;. Hopefully this, too, will be available soon. Well, that&amp;#39;s it for me. I hope you enjoyed this little tutorial. I hope to give more in the future (I have a couple ideas for future posts but they&amp;#39;ll have to wait for the offical EDI10.1 release). I&amp;#39;ll be giving a presentation on the new EDI GUI API available in EDI9.1 at this year&amp;#39;s CDNLive! Silicon Valley conference Oct. 28. If you are in attendance, please drop by and say &amp;#39;Hi&amp;#39;. JasonG</description></item><item><title>Encounter Puzzler #2 Solution: Finding Registers Beneath a Hierarchy</title><link>https://community.cadence.com/cadence_blogs_8/b/di/posts/encounter-puzzler-2-solution-finding-registers-beneath-a-hierarchy</link><pubDate>Fri, 24 Sep 2010 11:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1179027</guid><dc:creator>BobD</dc:creator><guid>/cadence_blogs_8/b/di/posts/encounter-puzzler-2-solution-finding-registers-beneath-a-hierarchy</guid><slash:comments>0</slash:comments><description>Thanks to everyone who participated in this week&amp;#39;s Encounter Puzzer . If you didn&amp;#39;t catch it earlier, have a look now before reading the solution discussion below. I thought this puzzler was great because it&amp;#39;s such a small and simple example, yet it leads to so many useful fundamental components of database access. The first two comments were especially appreciated because it pointed out two of the primary ways to access data in Encounter: with dbGet and with Advanced Timing TCL commands (let&amp;#39;s call them CTE-TCL commands for &amp;quot;Common Timing Engine-Tool Command Language&amp;quot; shall we?). Coincidentally, I had a chance to visit was the original requestor of this challenge just yesterday. I sent him the solution via E-mail and it wasn&amp;#39;t working! More on why in the discussion below... @Edwin suggests a solution that was very nearly what I proposed to the customer: deselectAll foreach inst [dbGet -p2 [dbGetHInstByName i_a].allTreeInsts.cell.name DFF*] { dbSelectObj $inst } What I like about this solution is that it discovers the instances beneath the hierarchical instance i_a programatically rather than relying on instance name. The \i_a/i0 instance I added at the top-level of the design is a bit contrived, but it does point out a risk in assuming hierarchy from instance name. In the spirit of writing generic code that can work across a number of designs it is good practice to find the instances that are explicity stored beneath the hierarchical instance and using dbGet to traverse from hierarchical instance to &amp;quot;allTreeInsts&amp;quot; is a great way to do that. But it raises a complication... Another point to mention in this example is keying off a cell name of &amp;quot;DFF*&amp;quot;. If the timing libraries are loaded, the script could key off the &amp;quot;.isSequential&amp;quot; cell marking as follows: foreach inst [dbGet -p2 [dbGetHInstByName i_a].allTreeInsts.cell. isSequential 1 ] { dbSelectObj $inst } Remember how I said the script I sent the customer wasn&amp;#39;t working? It turns out timing libraries weren&amp;#39;t loaded so the isSequential marking was populated. Turns out selecting by a sequential cell master name like Edwin suggested was a better approach for the situation. Another point to mention is that as of 9.1.USR1 dbSelectObj works on a list so the code could be compacted further into: dbSelectObj [dbGet -p2 [dbGetHInstByName i_a].allTreeInsts.cell.isSequential 1] Further reading on selecting objects by pointer with dbGet in this blog entry. By the way, it&amp;#39;s worth mentioning that a Google search for &amp;quot;dbSelectObj cadence encounter&amp;quot; would retrieve this blog entry as would a search on support.cadence.com for &amp;quot;dbSelectObj&amp;quot; . One other thing to mention relative to the dbGet solution. When I run the suggested code I get the following message: **WARN: (ENCDBTCL-204): &amp;#39;cell&amp;#39; is not a recognized object/attribute for object type &amp;#39;hInst&amp;#39;. For help use &amp;#39;dbGet .?h&amp;#39; to get list of all supported (settable/unsettable) objects and attributes. What&amp;#39;s happening there? Well, the warning can be ignored but .allTreeInsts returns what we call a &amp;quot;heterogeneous&amp;quot; list which includes all of the instances -and- hierarchical instances beneath i_a. This list includes the hierarchical instance i_a/i_a_sub and when we try to traverse from i_a/i_a_sub to its &amp;quot;cell&amp;quot; we get the warning message because &amp;quot;cell&amp;quot; is not a valid object for hierarchical instances. We could filter out the objects that aren&amp;#39;t instances with the following addition in bold: dbSelectObj [dbGet -p2 [dbGet -p [dbGetHInstByName i_a].allTreeInsts. objType inst ].cell.isSequential 1] Note: We&amp;#39;re considering exposing heterogeneous and non-heterogeneous lists in a number of areas to make this simpler in a future release. @Vishnu used CTE-TCL: set x [get_cells -hier -filter &amp;quot;hierarchical_name =~ i_a/* &amp;amp;&amp;amp; is_sequential == true&amp;quot;] foreach_in_collection y $x { selectInst [get_object_name $y] } There&amp;#39;s a lot of extremely useful functionality demonstrated in this example. The complex filtering capabilities of get_cells, keying off the &amp;quot;is_sequential&amp;quot; attribute, using foreach_in_collection to iterate through the objects... Great stuff. One tiny tiny nuance that was problematic with the example was filtering out the top-level \i_a/i0 instance. By default, Encounter hides leading backslashes from instance names, so the instance that&amp;#39;s called \i_a/i0 in the Verilog netlist is identified within Encounter as simply &amp;quot;i_a/i0&amp;quot;. Consequently, the script would still catch that instance undesireably as being beneath i_a. We can overcome this however with a call to: encounter 1&amp;gt; set dbgIsBackslashInNamesHidden 0 Once this variable is set, the leading backslash is no longer hidden and the code would work as desired: \i_a/i0 would be filtered out because it contains a leading backslash and therefore doesn&amp;#39;t match the &amp;quot;i_a/*&amp;quot; filter expression. Normally, variables like this are visible from Options-&amp;gt;Set Global Variable... However, this one isn&amp;#39;t public yet. I&amp;#39;m working with our developers on that now. Kind of a wacky side-issue but I hope it illustrates some risks associated with keying off names vs. keying off the hierarchical structure directly. Laurent proposed an interesting area-based solution. I hadn&amp;#39;t thought of that myself but it could certainly be useful in this and other scenarios when seeking to find objects by type in a specific area of the design: set area [list 600 600 1200 1200] foreach i [dbGet [dbQueryInstInBox \ [dbMicronsToDBU [dbBoxLLX $area]] \ [dbMicronsToDBU [dbBoxLLY $area]] \ [dbMicronsToDBU [dbBoxURX $area]] \ [dbMicronsToDBU [dbBoxURY $area]]].cell.isSequential 1 -p2] { dbSelectObj $i } An even easier way to go about this is with the dbQuery command. I haven&amp;#39;t talked about it yet since it&amp;#39;s not fully documented until 9.1.USR3 but check back in a month or so for an update on that. It can be really powerful and simple to use. Another way to solve this puzzler is by using what JasonG referred to as &amp;quot;old school&amp;quot; commands. Here we&amp;#39;re talking about commands like &amp;quot;dbForEachCellInst&amp;quot; and old school is actually a good characterization of them since they&amp;#39;ve been around since Encounter&amp;#39;s inception. I sometimes refer to these as &amp;quot;FE-TCL&amp;quot; commands. They&amp;#39;re sometimes criticized as being cryptical and confusing, but they can often be fast and powerful: proc selectHierRegisters {hinstName} { dbForEachCellVInst [dbHInstCell $hinstName] viPtr { if {[dbIsCellHier [dbVInstCell $viPtr]]} { selectHierRegisters $hinstName/[dbVInstName $viPtr] } elseif {[dbIsCellSequential [dbVInstCell $viPtr]]} { selectInst $hinstName/[dbVInstName $viPtr] } } } Ideally, we can do everything you can do with FE-TCL with dbGet but there are some cases where I find it more comfortable to fall back on FE-TCL commands. This just might be one of those cases. Here&amp;#39;s why... FE-TCL provides one very useful command for this scenario: dbForEachHInstTreeInst . It&amp;#39;s an object-type specific iterator that goes through each instance beneath a given hierarchical instance. Perfect! There&amp;#39;s also a &amp;quot;dbForEachHInstTreeHinst&amp;quot; command that iterates throughall of the hierarchical instances beneath a hierarchical instance. Here&amp;#39;s an example: proc userSelectHierRegisters {hinstName} { dbForEachHInstTreeInst [dbGetHInstByName $hinstName] inst { if {[dbIsCellSequential [dbInstCell $inst]]} { dbSelectObj $inst } } } An interesting side-note: We&amp;#39;ve been discussing the idea of splitting out more homogeneous lists in dbGet to make code more compact. In this case, that would mean a list of just the instances beneath the hierarchical instance. Stay tuned for more on that in a future release. As you can see there&amp;#39;s more than one way to solve this solution for sure. I&amp;#39;m pleased we covered it from so many angles -- the general techniques described here can be applied to other scripting tasks in the tool. Thanks again for the participation and discussion. If you have any thoughts you&amp;#39;d like to add we&amp;#39;d love to hear from you. Check back soon for more puzzlers and updates. You&amp;#39;d be my Best Friend Forever if you subscribed to E-mail updates to our Digital Implementation blogs . Never more than one E-mail a day and hopefully useful and interesting content. Bob Dwyer</description></item></channel></rss>