<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.cadence.com/Community/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Custom IC Design</title><subtitle type="html">The Custom IC Design blog is tailored...</subtitle><id>http://www.cadence.com/Community/blogs/cic/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.cadence.com/Community/blogs/cic/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2010-03-02T06:00:00Z</updated><entry><title>SKILL for the Skilled: Introduction to Classes -- Part 5</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2012/02/10/u-nder-construction-skill-for-the-skilled-introduction-to-classes-part-5.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2012/02/10/u-nder-construction-skill-for-the-skilled-introduction-to-classes-part-5.aspx</id><published>2012-02-10T14:00:00Z</published><updated>2012-02-10T14:00:00Z</updated><content type="html">&lt;p&gt;In the previous &lt;i&gt;SKILL for the Skilled&lt;/i&gt; postings, we looked at a pretty good algorithm for solving the Sudoku puzzle. This algorithm is able to find at least one solution of the puzzle if one exists, and is able to detect that no solution exists if that is in fact the case. In this article we look at a particularly difficult case which the algorithm we have chosen performs poorly. &lt;/p&gt;&lt;p&gt;&lt;b&gt;What about a difficult puzzle?&lt;/b&gt; &lt;/p&gt;&lt;p&gt;In his article &lt;a href="http://norvig.com/sudoku.html"&gt;Solving Every Sudoku Puzzle&lt;/a&gt;, Peter Norvig suggests a puzzle which is pretty difficult. In fact it is the worse case for the algorithm he proposes in the article. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;Sudoku puzzle 5-1 &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;(SkuSolve &amp;#39;((? ? ?  ? ? 6  ? ? ?)&lt;br /&gt;            (? 5 9  ? ? ?  ? ? 8)&lt;br /&gt;            (2 ? ?  ? ? 8  ? ? ?)&lt;br /&gt;&lt;br /&gt;            (? 4 5  ? ? ?  ? ? ?)&lt;br /&gt;            (? ? 3  ? ? ?  ? ? ?)&lt;br /&gt;            (? ? 6  ? ? 3  ? 5 4)&lt;br /&gt;&lt;br /&gt;            (? ? ?  3 2 5  ? ? 6)&lt;br /&gt;            (? ? ?  ? ? ?  ? ? ?)&lt;br /&gt;            (? ? ?  ? ? ?  ? ? ?)))&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;The algorithm implemented in &lt;code&gt;SkuFindSolution&lt;/code&gt; does in fact solve this puzzle but considerably slower than the other examples shown above. On the particular machine I&amp;#39;m using, all the puzzles described in the previous posting are solved in less than 1/10 of a second. This problematic puzzle takes more than 25 seconds to solve. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;starting with: &lt;br /&gt;+-----+-----+-----+&lt;br /&gt;| | | | | |6| | | |&lt;br /&gt;| |5|9| | | | | |8|&lt;br /&gt;|2| | | | |8| | | |&lt;br /&gt;| |4|5| | | | | | |&lt;br /&gt;| | |3| | | | | | |&lt;br /&gt;| | |6| | |3| |5|4|&lt;br /&gt;| | | |3|2|5| | |6|&lt;br /&gt;| | | | | | | | | |&lt;br /&gt;| | | | | | | | | |&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;found solution:&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;|8|3|4|9|7|6|5|1|2|&lt;br /&gt;|6|5|9|2|3|1|7|4|8|&lt;br /&gt;|2|7|1|4|5|8|6|9|3|&lt;br /&gt;|1|4|5|8|6|2|3|7|9|&lt;br /&gt;|7|2|3|5|4|9|8|6|1|&lt;br /&gt;|9|8|6|7|1|3|2|5|4|&lt;br /&gt;|4|1|7|3|2|5|9|8|6|&lt;br /&gt;|5|9|2|6|8|4|1|3|7|&lt;br /&gt;|3|6|8|1|9|7|4|2|5|&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;A different algorithm&lt;/b&gt; &lt;/p&gt;&lt;p&gt;The version of &lt;code&gt;SkuFindSolution&lt;/code&gt; shown in &lt;i&gt;&lt;a href="https://www.cadence.com:443/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx"&gt;SKILL for the Skilled: Part 4&lt;/a&gt;&lt;/i&gt; iterates over the cells in the board simply in the order they appear in the list. The following improved version of &lt;code&gt;SkuFindSolution&lt;/code&gt; first sorts the cells into order of increasing possibility. Cells which have few possibilities are moved to the beginning of the list, and cells with more possibilities are moved to the end of the list. &lt;/p&gt;&lt;p&gt;The changes in the function are to introduce the local function &lt;code&gt;count_possibilities&lt;/code&gt; into the &lt;code&gt;(labels ...)&lt;/code&gt;, &lt;/p&gt;&lt;pre&gt;(count_possibilities (cell)&lt;br /&gt;  (let ((c 0))&lt;br /&gt;    (for i 1 9&lt;br /&gt;      (unless (conflict? i cell)&lt;br /&gt;        c++))&lt;br /&gt;     c))&lt;br /&gt;&lt;/pre&gt;and to insert a call to &lt;code&gt;(sort ... (genCmpFunction...))&lt;/code&gt; &lt;pre&gt;sudoku-&amp;gt;cells = (sort sudoku-&amp;gt;cells&lt;br /&gt;                      (genCmpFunction ?key count_possibilities))&lt;br /&gt;&lt;/pre&gt;before calling &lt;code&gt;solve_cell&lt;/code&gt;. &lt;p&gt;Recall the functions &lt;code&gt;genCmpFunction&lt;/code&gt; and &lt;code&gt;identity&lt;/code&gt; from a previous blog posting. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;(defun genCmpFunction (@key (test lessp)&lt;br /&gt;                            (key  identity))&lt;br /&gt;  (lambda (A B)&lt;br /&gt;    (test (key A)&lt;br /&gt;          (key B))))&lt;br /&gt;&lt;br /&gt;(defun identity (x)&lt;br /&gt;  x)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;genCmpFunction&lt;/code&gt; generates a function which can be used as the second argument of &lt;code&gt;sort&lt;/code&gt;. In this case &lt;code&gt;genCmpFunction&lt;/code&gt; returns a function which will cause &lt;code&gt;sort&lt;/code&gt; to order the cells in increasing order according to the return value of &lt;code&gt;count_possibilities&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;The local function &lt;code&gt;count_possibilities&lt;/code&gt; returns the integer corresponding to how many of the number in the set &lt;code&gt;{1 2 3 4 5 6 7 8 9}&lt;/code&gt; are conflict-free when placed in the given cell. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;New version of SkuFindSolution&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;(defun SkuFindSolution (sudoku)&lt;br /&gt;  (prog ()       &lt;br /&gt;    (labels (&lt;b&gt;(count_possibilities (cell)&lt;br /&gt;               (let ((c 0))&lt;br /&gt;                 (for i 1 9&lt;br /&gt;                   (unless (conflict? i cell)&lt;br /&gt;                     c++))&lt;br /&gt;                 c))&lt;/b&gt;&lt;br /&gt;             (conflict? (solution cell)&lt;br /&gt;               (exists group &amp;#39;(column row b3x3)&lt;br /&gt;                 (exists c (slotValue cell group)-&amp;gt;cells&lt;br /&gt;                   (and (neq c cell)&lt;br /&gt;                        (eqv solution c-&amp;gt;value)))))&lt;br /&gt;             (solve_cells (cells)&lt;br /&gt;               (cond&lt;br /&gt;                 ((null cells)&lt;br /&gt;                  (return sudoku))&lt;br /&gt;                 (((car cells)-&amp;gt;value)&lt;br /&gt;                  (and (not (conflict? (car cells)-&amp;gt;value&lt;br /&gt;                                       (car cells)))&lt;br /&gt;                       (solve_cells (cdr cells))))&lt;br /&gt;                 (t&lt;br /&gt;                  (let ((cell (car cells)))&lt;br /&gt;                    (for solution 1 9&lt;br /&gt;                      (unless (conflict? solution cell)&lt;br /&gt;                        cell-&amp;gt;value = solution&lt;br /&gt;                        (solve_cells (cdr cells))))&lt;br /&gt;                    cell-&amp;gt;value = nil)))))&lt;br /&gt;      &lt;b&gt;&lt;br /&gt;      sudoku-&amp;gt;cells = (sort sudoku-&amp;gt;cells&lt;br /&gt;                            (genCmpFunction ?key count_possibilities))&lt;br /&gt;      &lt;/b&gt;&lt;br /&gt;      (solve_cells sudoku-&amp;gt;cells))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;What about the performance?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I ran the new algorithm and the old algorithm on four examples, three from the previous posting 4-1, 4-2, and 4-3, and also on 5-1 above. It turns out that the old algorithm performs 2x to 8x faster than the new for the cases it handles well. In particular, for cases for which the old algorithm solves the puzzle in less than 1/10 of a second, the new algorithm works slower but still solves in less than 1/10 of a second. On the other hand, on the extreme case where old algorithm handles poorly, where the old algorithm requires half a minute to solve the puzzle, the new algorithm is 12x faster. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;Performance Measurements &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Puzzle&lt;/th&gt;&lt;th&gt;Algorithm 1&lt;br /&gt;(seconds)&lt;/th&gt;&lt;th&gt;Algorithm 2&lt;br /&gt;(seconds)&lt;/th&gt;&lt;th&gt;Comparison&lt;br /&gt;&amp;lt; 1.0 is bad &lt;br /&gt;(&lt;i&gt;More is Better&lt;/i&gt;) &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4-1&lt;/td&gt;&lt;td&gt;0.0420&lt;/td&gt;&lt;td&gt;0.0669&lt;/td&gt;&lt;td&gt;1 / 1.59 &lt;i&gt;degradation&lt;/i&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4-2&lt;/td&gt;&lt;td&gt;0.0230&lt;/td&gt;&lt;td&gt;0.0830&lt;/td&gt;&lt;td&gt;1 / 3.61 &lt;i&gt;degradation&lt;/i&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4-3&lt;/td&gt;&lt;td&gt;0.0030&lt;/td&gt;&lt;td&gt;0.0220&lt;/td&gt;&lt;td&gt;1 / 7.35 &lt;i&gt;degradation&lt;/i&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5-1&lt;/td&gt;&lt;td&gt;25.22&lt;/td&gt;&lt;td&gt;2.075&lt;/td&gt;&lt;td&gt;12.154 &lt;i&gt;improvement&lt;/i&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;b&gt;Summary&lt;/b&gt; &lt;p&gt;In this series of 5 postings (first&amp;nbsp;four listed below)&amp;nbsp;we&amp;#39;ve used the SKILL++ Object System to implement a sudoku puzzle solver. &lt;/p&gt;&lt;p&gt;I hope you will find the examples in these posting useful. &lt;/p&gt;&lt;p&gt;Jim Newton&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.cadence.com:443/Community/blogs/cic/archive/2011/08/15/skill-for-the-skilled-introduction-to-classes-part-1.aspx"&gt;SKILL for the Skilled: Introduction to Classes - Part 1&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.cadence.com:443/Community/blogs/cic/archive/2011/09/05/under-construction-skill-for-the-skilled-introduction-to-classes-part-2.aspx"&gt;SKILL for the Skilled: Introduction to Classes - Part 2&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.cadence.com:443/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx"&gt;SKILL for the Skilled: Introduction to Classes - Part 3&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.cadence.com:443/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx"&gt;SKILL for the Skilled: Introduction to Classes - Part 4&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1305299" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="object orientation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx" /><category term="Sudoku" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: Measurements Across Corners</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2012/02/09/things-you-didn-t-know-about-virtuoso-we-re-in-your-corner.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2012/02/09/things-you-didn-t-know-about-virtuoso-we-re-in-your-corner.aspx</id><published>2012-02-09T20:56:00Z</published><updated>2012-02-09T20:56:00Z</updated><content type="html">&lt;p&gt;In Virtuoso IC 6.1.5 ISR6, we released a new feature in ADE XL, which had been requested by many customers--the ability to define a measurement expression which operates on the results of another measurement expression across corners.&amp;nbsp; For example, I can create an expression to measure, say, a delay.&amp;nbsp; Call it &amp;quot;myDelay&amp;quot;.&amp;nbsp; Now I can create another expression which calculates, for example, the maximum value of &amp;quot;myDelay&amp;quot; over all the corners I ran.&lt;/p&gt;&lt;p&gt;To do this, I simply add an expression in the ADE XL Outputs Setup pane, give it a name (optional), and set the cyclic in the &amp;quot;&lt;strong&gt;EvalType&lt;/strong&gt;&amp;quot; column (you were wondering what that new column was for, weren&amp;#39;t you?) to &amp;quot;&lt;strong&gt;corners&lt;/strong&gt;&amp;quot;.&amp;nbsp; The line will now be highlighted in &lt;strong&gt;blue&lt;/strong&gt; to distinguish it from regular waveform and scalar expressions.&amp;nbsp; Now create your expression.&amp;nbsp; If you use the functions &lt;strong&gt;ymax&lt;/strong&gt;, &lt;strong&gt;ymin&lt;/strong&gt;, &lt;strong&gt;average&lt;/strong&gt;, &lt;strong&gt;peakToPeak&lt;/strong&gt; or &lt;strong&gt;stddev&lt;/strong&gt;, the argument &amp;quot;?overall t&amp;quot; will automatically be added to the function to ensure the values are treated by the function as discrete, rather than continuous points.&lt;/p&gt;&lt;p&gt;It should be fairly obvious what the above functions do--you run a simulation over corners and you can find the max, min, average, spread (peakToPeak), and stddev of any scalar measurement over those corners.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;ymax(myDelay)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;ymin(myDelay)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;average(myDelay)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;peakToPeak(myDelay)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;stddev(myDelay)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Perhaps not so obvious is the fact that you can use other functions to measure across corners as well.&amp;nbsp; For example, if you create a set of corners as a temperature sweep (remember, the definition of corners in ADE XL isn&amp;#39;t restricted to PVT--you can create a variable out of pretty much anything and then sweep it in the &lt;a target="_blank" href="http://www.cadence.com/Community/blogs/cic/archive/2012/01/26/things-you-didn-t-know-about-virtuoso-we-ve-got-you-cornered.aspx?postID=1307412"&gt;Corners&lt;/a&gt; form), you can create a MAC expression using the &lt;strong&gt;cross()&lt;/strong&gt; function to find the temperature at which an expression reaches a certain value:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;cross(myDelay 200n 1 &amp;quot;either&amp;quot; nil nil)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Or you can use the &lt;strong&gt;value()&lt;/strong&gt; function to find the value of an expression at an interpolated temperature value (or whatever variable you swept in your corners run):&lt;/p&gt;&lt;p&gt;&lt;strong&gt;value(myDelay 65)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MAC expressions are also supported for Monte Carlo analysis and Local and Global Optimization.&lt;/p&gt;&lt;p&gt;I&amp;#39;m sure you&amp;#39;ll find this new feature useful.&amp;nbsp; As always, comments and feedback are welcome!&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1307870" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="custom/analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx" /><category term="Corners analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Corners+analysis/default.aspx" /><category term="Analog  Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx" /><category term="IC615" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx" /><category term="corners" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/corners/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: We've Got You Cornered</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2012/01/26/things-you-didn-t-know-about-virtuoso-we-ve-got-you-cornered.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2012/01/26/things-you-didn-t-know-about-virtuoso-we-ve-got-you-cornered.aspx</id><published>2012-01-26T17:26:00Z</published><updated>2012-01-26T17:26:00Z</updated><content type="html">&lt;p&gt;One of the big buzzwords around the EDA world these days is &amp;quot;variation.&amp;quot;&amp;nbsp; Don&amp;#39;t you just love buzzwords?&amp;nbsp; Take a perfectly normal, slightly ambiguous word, capitalize it, add a another slightly ambiguous hyphenated suffix, and suddenly you&amp;#39;ve just solved a new problem for your customers.&amp;nbsp; &amp;quot;Interface-driven&amp;#39;&amp;#39; &amp;quot;user-centric&amp;#39;&amp;#39;, &amp;quot;platform-based&amp;quot; and &amp;quot;variation-aware.&amp;quot;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Well, I&amp;#39;m not here to sling buzzwords.&amp;nbsp; I&amp;#39;m here to help you find ways to make better use of our software so you can deal with the actual situations you have to face every day.&amp;nbsp; And, of course, &amp;quot;variation&amp;quot; does exist.&amp;nbsp; It exists in all sorts of forms in all parts of the design process.&amp;nbsp; So today, let&amp;#39;s talk about one of the most basic forms of variation you&amp;#39;ve been dealing with in design for years.&amp;nbsp; &lt;strong&gt;Corners&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Specifically, I&amp;#39;d like to cover some of the features in Virtuoso IC6.1.5 which help you set up and run the massive number of corner combinations you have to define to verify your designs today.&amp;nbsp; &lt;/p&gt;&lt;p&gt;First, it helps to realize that our definition of a &amp;quot;corner&amp;quot; can encompass any sort of variation you can define in ADE XL.&amp;nbsp; It&amp;#39;s not just limited to your classic PVT.&amp;nbsp; You can create corners using any design variables, device parameters (to be the subject of a future article), or combination thereof.&amp;nbsp; You can even create statistical corners based on sample points from Monte Carlo analysis (yet another future article).&amp;nbsp; &lt;/p&gt;&lt;p&gt;The ability to create corners in many different ways opens the door to lots of efficient methods of circuit analysis.&lt;/p&gt;&lt;p&gt;But first, you&amp;#39;ve got to set them up.&lt;/p&gt;&lt;p&gt;If you&amp;#39;re using IC6.1.5, you&amp;#39;ll have noticed that we redesigned the Corners Setup UI.&amp;nbsp; The basics of using the new form are covered in &lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/NewCornerSetupForm_ADEXLCOS.html;searchHash=9989a633d5ecf5f79748de737b0289f5"&gt;this video&lt;/a&gt; and &lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_ADEXL_QS_CORNERS/adexl_qs_corners_615COS.htm;searchHash=9989a633d5ecf5f79748de737b0289f5"&gt;this video&lt;/a&gt;.&amp;nbsp; (And, of course, in &lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:DocumentViewer;src=pubs;q=adexl/adexl6.1.5/adexlCorners.html#1011663"&gt;the documentation&lt;/a&gt;.)&amp;nbsp; The videos explain how to create corners, model groups and corner groups, as well as how to copy corners and enable or disable individual corners and corner groups for each simulation testbench.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Instead of repeating those topics here (you can always just watch the videos), I&amp;#39;ll introduce some new features that have been added in recent ISR releases of IC6.1.5.&amp;nbsp; Everything described here is available in &lt;strong&gt;ISR6&lt;/strong&gt; (released in Sept. 2011) or later.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Selective Corner Group Expansion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Rather than just expanding a group of corners completely, such that each column contains only one combination of values, you can now expand a corner group based on one or more selected parameters.&amp;nbsp; There are 2 options for this.&amp;nbsp; The first is similar to the original full corner group expansion, only you use just a &lt;strong&gt;selected set of parameters&lt;/strong&gt;.&amp;nbsp; Those parameters will be &lt;strong&gt;combinatorially&lt;/strong&gt; expanded.&amp;nbsp; The rest will remain as they were.&lt;/p&gt;&lt;p&gt;For a simple example, if I start with Temperature=0,100 and VDD=1.7,1.9 (a group of 4) and I select to expand based on VDD, I&amp;#39;ll get one group with Temperature=0,100 and VDD=1.7&amp;nbsp;and a 2nd group with Temperature=0,100 and VDD=1.9.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/Corners_exp_select_small.jpg"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/Corners_exp_select_small.jpg" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;The 2nd option is what we call a &lt;strong&gt;parametric set (&lt;/strong&gt;ParamSet) &lt;strong&gt;expansion&lt;/strong&gt;.&amp;nbsp; For this case, each selected parameter must have the same number of values, then the corner group is expanded using the 1st value of each parameter, the 2nd value of each, and so on.&amp;nbsp; Other values remained grouped as they were.&lt;/p&gt;&lt;p&gt;Using the same simple example, if I start with Temperature=0,100 and VDD=1.7,1.9 (a group of 4) and I select both Temperature and VDD for ParamSet expansion, I&amp;#39;ll get one corner with Temperature=0 and VDD=1.7&amp;nbsp;and a 2nd group with Temperature=100 and VDD=1.9.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/Corners_exp_pset_small.jpg"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/Corners_exp_pset_small.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bonus Tip&lt;/strong&gt;:&amp;nbsp; Once you&amp;#39;ve set up a&amp;nbsp;lot of corners and corners groups,&amp;nbsp;you can select their columns in the Corners Setup form and choose &lt;strong&gt;RMB-&amp;gt;Create Corner Group&lt;/strong&gt;.&amp;nbsp; The tool will collapse the columns down, combining&amp;nbsp;common variable values,&amp;nbsp;into the smallest possible number of corner groups.&amp;nbsp; This makes your corners setup much easier to manage.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Extra Bonus Tip&lt;/strong&gt;: After you&amp;#39;ve gone through all this great work, you&amp;#39;ll probably want to reuse these corner definitions for other designs.&amp;nbsp; Simply use the &lt;strong&gt;Save&lt;/strong&gt; icon at the top of the Corner Setup form to save them to a file.&amp;nbsp; You can use the &lt;strong&gt;Load&lt;/strong&gt; icon to load them in the next design, or use the cdsenv variable:&lt;/p&gt;&lt;p&gt;envSetVal( &amp;quot;adexl.gui&amp;quot; &amp;quot;defaultCorners&amp;quot; &amp;#39;string&amp;nbsp;&amp;quot;myDefaultCorners.sdb&amp;quot; )&lt;/p&gt;&lt;p&gt;in your .cdsinit file to have the same corners setup every time you create a new ADE XL view.&lt;/p&gt;&lt;p&gt;The ability to create, group and expand corners to suit different design needs makes it much easier to perform all your circuit verification and analysis.&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1307412" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="custom/analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /><category term="Analog  Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx" /><category term="IC615" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx" /><category term="corners" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/corners/default.aspx" /><category term="corner analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/corner+analysis/default.aspx" /></entry><entry><title>Improved IDF Tool Automatically Fixes Design Rule Violations in Virtuoso</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/12/13/automatic-design-rule-violation-fixing-in-virtuoso-improved-idf-tool-automatically-fixes-design-rule-violations-in-virtuoso.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/12/13/automatic-design-rule-violation-fixing-in-virtuoso-improved-idf-tool-automatically-fixes-design-rule-violations-in-virtuoso.aspx</id><published>2011-12-13T19:00:00Z</published><updated>2011-12-13T19:00:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Although many automatic layout generation tools are available to automate design creation, the layout modification/correction step (fixing design rule violations) is not automated very well.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;Consequently, design modification including error correction typically needs to be done manually.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;A good solution to automate the layout modification/correction step can be provided by a layout optimization tool that optimizes the areas containing design rule violations in a layout, and fixes the violations automatically. Such a capability is provided by the Interactive Design violation Fixing (IDF) tool that was first provided in the Virtuoso IC6.1.4 release.&lt;/span&gt;&lt;span style="color:red;font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;The primary advantages of IDF are:&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;1. Only required areas are modified and corrected (nothing will be changed outside of the selected areas.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;2. It can be called any time in any design phase (even if&amp;nbsp;the layout has not been finalized.)&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;3.&amp;nbsp;Quality of&amp;nbsp;the modified layout is stable (the&amp;nbsp;results won&amp;#39;t vary&amp;nbsp;according to engineers&amp;#39; experience or design manner.)&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;p class="MsoNormal" style="line-height:normal;margin:0in 0in 0pt;"&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;As the first step to realize the above requirements, IDF was implemented in our IC6.1.4 software release by freezing (not changing) details outside of specified areas. (Fig 1)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="line-height:normal;margin:0in 0in 0pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal" style="line-height:normal;margin:0in 0in 0pt;"&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig1.jpg"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;img src="https://www.cadence.com:443/Community/controlpanel/blogs/" border="0" height="1" width="1" alt="" /&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Fig 1. IDF- IC6.1.4 (freeze outside of the area to be optimized)&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Although the IDF in IC6.1.4 worked very well, freezing areas around the area to be optimized had the following two limitations:&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;1. It takes long time when a design is big because the entire layout data needs to be loaded on the dynamic memory.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;2. When multiple areas are selected, one optimization failure (&amp;quot;infeasible&amp;quot;) causes the optimization failure of all selected areas. &amp;nbsp; (All areas must be optimized at the same time since optimizing a design means generating a result that satisfies all requirements simultaneously.)&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Therefore, IDF needed to be enhanced so that automated layout modification/correction worked regardless of the design size, and without infeasible results interrupting the flow.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt; In the latest release, IC6.1.5, the IDF has successfully been enhanced to realize the above requirements.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;The solution to the problem is applying the automated correction (IDF) only to the affected region.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The areas to be optimized from a design are extracted.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Then, the extracted areas are sent to the IDF engine one by one (Fig. 2)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig2.jpg"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;Fig 2. IDF in IC6.1.5&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;IDF &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;works very fast in most cases because the size of the data &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;is very small.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt; The following table compares benchmark results of &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.4 and in IC6.1.5.&lt;span&gt;&amp;nbsp; &lt;/span&gt;IDF in IC6.1.5 finishes all error fixing within 1 minute.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;b&gt;Table 1.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Runtime comparison (Frozen Donut Area vs. Area Segmenting Method)&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;font size="3"&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/font&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;Unit [h:m:s]&lt;/span&gt;&lt;span style="font-weight:normal;"&gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;table class="MsoTableGrid" style="width:438.05pt;border-collapse:collapse;border:medium none;" cellpadding="0" cellspacing="0"&gt;&lt;tr style="height:34.05pt;"&gt;&lt;td style="padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:34.05pt;border:1pt solid windowtext;"&gt;&lt;p class="MsoNormal" style="line-height:normal;margin:0in 0in 0pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Design&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext #f0f0f0;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:34.05pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Size&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(um x um)&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext #f0f0f0;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:34.05pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;# of Design Rule Errors &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext #f0f0f0;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:34.05pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.4&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext #f0f0f0;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:34.05pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.5&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:23.2pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Stdcell MX2X1&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;2.61x2.61&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;3s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;1s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:22.7pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Stdcell DLY1X4 &lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;4.06x2.61&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;1&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;2s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;0.5s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:23.2pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Stdcell ADDFX1&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;7.54x2.61&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;2&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;2s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;0.5s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:23.2pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;CustomDigital 1&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;15 x 15&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;7&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;3min 52s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;4s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:22.7pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Analog 2&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;4.5 x 6.5&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;8&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;4s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:22.7pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;1s&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:23.2pt;"&gt;&lt;td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:#f0f0f0 windowtext windowtext;padding:0in 5.4pt;background-color:transparent;width:104.15pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;Analog PLL&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:72.7pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;650 x 550&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;30&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:86.95pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;&amp;gt; 2hours &lt;sup&gt;*1)&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;padding:0in 5.4pt;background-color:transparent;width:87.3pt;height:23.2pt;"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;font-weight:normal;"&gt;30s&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;sup&gt;*2)&lt;/sup&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;*1) Job was terminated during constraint generation phase.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;*2) 2 Infeasible results were reported.&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;Runtime (User time) was measured. &lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;Test Machine: &lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;VMWare Virtual Machine &lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;Redhat Linux 4&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;RAM: 1 GB&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;Physical Machine:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;Dell Laptop PC M65&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;CPU :Intel Core 2 CPU 2.16GHz &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;RAM : 3.25 GB&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:10pt;"&gt;&lt;b&gt;OS Windows XP SP3&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;Figure 3&lt;span style="font-weight:normal;"&gt; shows the biggest design &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;used for this benchmark test.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;.&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig3.jpg"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/Hiro/IDF_Fig3.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;Fig. 3 Analog PLL design 650um X 550um（# of DRC Errors&lt;span&gt;&amp;nbsp; &lt;/span&gt;30 -&amp;gt; 2 : runtime = 30sec)&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;This approach (loading only the specified area) allows the following benefits:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No design size limitations&lt;/li&gt;&lt;li&gt;Very fast&lt;/li&gt;&lt;li&gt;Non-stop optimization despite some infeasible results &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Symbol;font-size:10pt;font-weight:normal;"&gt;&lt;span&gt;&lt;span style="font:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.5 works effectively for medium / large designs.&lt;span&gt;&amp;nbsp; &lt;/span&gt;It can also handle designs of chip-level complexity. Because each optimization task is discrete, the flow does not become interrupted by an infeasible result error.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Also, the runtime is very fast, since the size of each extracted cell tends to be small.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Actually, IDF in IC6.1.5 consists of multiple small IDF fixes in IC6.1.4.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Because &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;a huge amount of design time is wasted on inefficient manual modifications, &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.5 is a great solution to correct errors. &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;IDF in IC6.1.5 is the answer to industry&amp;rsquo;s demand for automatic error correction.&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Hiroshi Ishikawa&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Sr. Engineering Manager, &lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;Physical Design&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;San Jose R&amp;amp;D, Custom IC, Silicon Realization Group&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-weight:normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1306101" width="1" height="1"&gt;</content><author><name>Hiro Ishikawa</name><uri>http://www.cadence.com/Community/members/Hiro-Ishikawa.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="error correction" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/error+correction/default.aspx" /><category term="IC layout" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+layout/default.aspx" /><category term="IC615" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx" /><category term="design rule violations" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/design+rule+violations/default.aspx" /><category term="layout correction" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/layout+correction/default.aspx" /><category term="interactive design fixing" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/interactive+design+fixing/default.aspx" /><category term="layout optimization" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/layout+optimization/default.aspx" /><category term="IDF" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IDF/default.aspx" /></entry><entry><title>Cadence is the OpenText Connectivity Partner of the Year</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/11/28/cadence-is-the-opentext-connectivity-partner-of-the-year.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/11/28/cadence-is-the-opentext-connectivity-partner-of-the-year.aspx</id><published>2011-11-28T22:00:00Z</published><updated>2011-11-28T22:00:00Z</updated><content type="html">&lt;p&gt;Cadence is pleased to be honored by the OpenText Global Partners Program as their 2011 Connectivity Partner of the Year.&amp;nbsp; The award is a reflection of the close working relationship that we have had with &lt;a href="http://www.opentext.com/2/global.htm"&gt;OpenText&lt;/a&gt; over the past several years, providing our mutual customers with the best experiences when using Cadence Virtuoso tool suite with OpenText&amp;#39;s ExceedOn Demand product line, which provides remote access to Virtuoso. We have done a number of webinars and joint papers to describe how best for our customers to set up both tools to maximize the benefits, particularly when working in a globalized work environment. Once again, on behalf of Cadence, I&amp;#39;d like to thank OpenText for their generous acknowledgment. &lt;/p&gt;&lt;p&gt;The following resources provide more information about OpenText and ExceedOn Demand. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Blog Post&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/07/28/q-amp-a-how-opentext-provides-remote-access-to-virtuoso.aspx"&gt;http://www.cadence.com/Community/blogs/ii/archive/2011/07/28/q-amp-a-how-opentext-provides-remote-access-to-virtuoso.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Whitepaper &lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://connectivity.opentext.com/resource-centre/whitepapers/achieving-optimal-performance-with-cadence-virtuoso.aspx"&gt;http://connectivity.opentext.com/resource-centre/whitepapers/achieving-optimal-performance-with-cadence-virtuoso.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Video&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www10.edacafe.com/video/Get-free-evaluation-OpenText-Exceed-onDemand-OpenText-Remote-Connectivity-Cadence-Virtuoso-Stephen-Lewis/35159/media.html"&gt;&lt;br /&gt;http://www10.edacafe.com/video/Get-free-evaluation-OpenText-Exceed-onDemand-OpenText-Remote-Connectivity-Cadence-Virtuoso-Stephen-Lewis/35159/media.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Webinar&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/cadence/events/Pages/event.aspx?eventid=442"&gt;http://www.cadence.com/cadence/events/Pages/event.aspx?eventid=442 &lt;/a&gt;&lt;/p&gt;&lt;p&gt;Steve Lewis &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1305768" width="1" height="1"&gt;</content><author><name>NewYorkSteve</name><uri>http://www.cadence.com/Community/members/NewYorkSteve.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="OpenText" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/OpenText/default.aspx" /><category term="Exceed on Demand" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Exceed+on+Demand/default.aspx" /><category term="ExceedOn Demand" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ExceedOn+Demand/default.aspx" /><category term="connectivity partner" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/connectivity+partner/default.aspx" /><category term="remote access" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/remote+access/default.aspx" /><category term="Open Text" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Open+Text/default.aspx" /></entry><entry><title>SKILL for the Skilled: Introduction to Classes -- Part 4</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx</id><published>2011-11-14T15:00:00Z</published><updated>2011-11-14T15:00:00Z</updated><content type="html"> 

In several previous postings we introduced the problem of solving the
sudoku puzzle. 
&lt;ul&gt;&lt;li&gt; In &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/08/15/skill-for-the-skilled-introduction-to-classes-part-1.aspx?postID=1292966"&gt;Part 1&lt;/a&gt;, we saw the rules of sudoku and a brief
introduction to the SKILL++ Object System.  

&lt;/li&gt;&lt;li&gt; In &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/09/05/under-construction-skill-for-the-skilled-introduction-to-classes-part-2.aspx?postID=1292967"&gt;Part 2&lt;/a&gt;, we started solving the problem top-down by
implementing the top level function &lt;code&gt;SkuSolve&lt;/code&gt; and
agreeing to fill in all the missing pieces incrementally until the
program was complete.  We also saw how to use hierarchical class
definitions to represent the components representing rows, columns and
3x3 blocks.

&lt;/li&gt;&lt;li&gt; In &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx?postID=1292968"&gt;Part 3&lt;/a&gt;, we saw how to create and initialize non-trivial
instances of SKILL++ classes, and used these techniques to initialize
the sudoku board with a given partial solution, ready for solving.

&lt;/li&gt;&lt;li&gt; In this posting, Part 4, we&amp;#39;ll finally show one possible
definition of function &lt;code&gt;SkuFindSolution&lt;/code&gt;.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
Just for a reminder, here is the definition of the top level
function, &lt;code&gt;SkuSolve&lt;/code&gt;.
&lt;/p&gt;&lt;pre&gt;(defun SkuSolve (partial_solution)&lt;br /&gt;  (let ((sudoku (SkuInitialize (SkuNew) partial_solution)))&lt;br /&gt;    (printf &amp;quot;starting with: \n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint sudoku))&lt;br /&gt;    (printf &amp;quot;\nfound solution:\n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint (SkuFindSolution sudoku)))))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;
We have already seen the definitions
of &lt;code&gt;SkuNew&lt;/code&gt;, &lt;code&gt;SkuInitialize&lt;/code&gt;,
and &lt;code&gt;SkuPrint&lt;/code&gt;.  Now we can take a look at the
implementation of
&lt;code&gt;SkuFindSolution&lt;/code&gt;, the function which actually searches for
the sudoku solution.

&lt;/p&gt;&lt;b&gt;Solving the sudoku puzzle&lt;/b&gt;&lt;p&gt;

The function &lt;code&gt;SkuFindSolution&lt;/code&gt; takes an instance of
class &lt;code&gt;SkuSudoku&lt;/code&gt; (created by &lt;code&gt;SkuNew&lt;/code&gt;, and
populated by &lt;code&gt;SkuInitialize&lt;/code&gt;) and modifies it to find a
solution of the sudoku puzzle, &lt;i&gt;assuming one exists&lt;/i&gt;.
&lt;/p&gt;&lt;p&gt;
How does it work? 
&lt;/p&gt;&lt;p&gt;
It basically brute forces its way through the cells in the board,
trying every possibility for each cell, from 1 to 9, which does not
present an immediate &lt;i&gt;conflict&lt;/i&gt;. If no solution exists for a
particular cell (i.e., if each choice from 1 to 9 inflicts a
conflict), the algorithm backtracks and tries a different guess, until
it guesses correctly.
&lt;/p&gt;&lt;p&gt;
The local function &lt;code&gt;conflict?&lt;/code&gt; asks &amp;quot;Does the given digit
already exist in the row, column, or 3x3 block which contains the
cell?&amp;quot;  If not, it is a potentially valid guess.  The local
function &lt;code&gt;solve_cells&lt;/code&gt; takes a list of all the remaining
cells which have not yet been visited.  Each digit that does not create a conflict is tried.  There are three cases in the &lt;code&gt;(cond
...)&lt;/code&gt;:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt; If there are no more cells to consider, then we&amp;#39;re done; we&amp;#39;ve
found a solution!  In this case we don&amp;#39;t return
from &lt;code&gt;solve_cells&lt;/code&gt;, but rather return
from &lt;code&gt;(SkuFindSolution ...)&lt;/code&gt; thanks
to &lt;code&gt;prog/return&lt;/code&gt;.

&lt;/li&gt;&lt;li&gt; If the cell already has a value in it, skip it because it
was &lt;i&gt;given&lt;/i&gt; in the puzzle partial solution.  Note that this
second case refuses to recure if a conflict is found.  This means the
puzzle has no solution, and recursion terminates,
causing &lt;code&gt;SkuFindSolution&lt;/code&gt; to return &lt;code&gt;nil&lt;/code&gt;.

&lt;/li&gt;&lt;li&gt; Otherwise, try all possibilities 1 through 9, skipping conflicts.
If the &lt;code&gt;(for ...)&lt;/code&gt; loop completes, that means we didn&amp;#39;t
find a solution for this cell. This happens if we&amp;#39;ve made an invalid
guess in a previous iteration.  So we set the cell back to the
unsolved state (&lt;code&gt;nil&lt;/code&gt;), and backtrack.
&lt;/li&gt;&lt;/ol&gt;

&lt;pre&gt;(defun SkuFindSolution (partial)&lt;br /&gt;  (prog ()&lt;br /&gt;    (labels ((conflict? (digit cell)&lt;br /&gt;               (exists group &amp;#39;(column row b3x3)&lt;br /&gt;                 (exists c (slotValue cell group)-&amp;gt;cells&lt;br /&gt;                   (and (neq c cell)&lt;br /&gt;                        (eqv digit c-&amp;gt;value)))))&lt;br /&gt;             (solve_cells (cells)&lt;br /&gt;               (cond&lt;br /&gt;                 ((null cells)&lt;br /&gt;                  (return sudoku))&lt;br /&gt;                 (((car cells)-&amp;gt;value)&lt;br /&gt;                   (and (not (conflict? (car cells)-&amp;gt;value&lt;br /&gt;                                        (car cells)))&lt;br /&gt;                        (solve_cells (cdr cells))))&lt;br /&gt;                 (t&lt;br /&gt;                  (let ((cell (car cells)))&lt;br /&gt;                    (for solution 1 9&lt;br /&gt;                      (unless (conflict? solution cell)&lt;br /&gt;                        cell-&amp;gt;value = solution&lt;br /&gt;                        (solve_cells (cdr cells))))&lt;br /&gt;                    cell-&amp;gt;value = nil)))))&lt;br /&gt;      (solve_cells sudoku-&amp;gt;cells))))&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Testing the program&lt;/b&gt;
&lt;p&gt;
Now you can test the program by copying the following into the CIWindow which
comes from the &lt;a href="http://en.wikipedia.org/wiki/Sudoku"&gt;Sudoku
Wikipedia entry&lt;/a&gt;.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table&gt;
&lt;tr&gt;&lt;th&gt; Sudoku puzzle 4-1
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;(SkuSolve &amp;#39;((5 3 ?  ? 7 ?  ? ? ?)&lt;br /&gt;            (6 ? ?  1 9 5  ? ? ?)&lt;br /&gt;            (? 9 8  ? ? ?  ? 6 ?)&lt;br /&gt;&lt;br /&gt;            (8 ? ?  ? 6 ?  ? ? 3)&lt;br /&gt;            (4 ? ?  8 ? 3  ? ? 1)&lt;br /&gt;            (7 ? ?  ? 2 ?  ? ? 6)&lt;br /&gt;&lt;br /&gt;            (? 6 ?  ? ? ?  2 8 ?)&lt;br /&gt;            (? ? ?  4 1 9  ? ? 5)&lt;br /&gt;            (? ? ?  ? 8 ?  ? 7 9)))&lt;br /&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;
You should get the following result if you entered the code correctly.
&lt;/p&gt;&lt;pre&gt;starting with: &lt;br /&gt;+-----------------+&lt;br /&gt;|5|3| | |7| | | | |&lt;br /&gt;|6| | |1|9|5| | | |&lt;br /&gt;| |9|8| | | | |6| |&lt;br /&gt;|8| | | |6| | | |3|&lt;br /&gt;|4| | |8| |3| | |1|&lt;br /&gt;|7| | | |2| | | |6|&lt;br /&gt;| |6| | | | |2|8| |&lt;br /&gt;| | | |4|1|9| | |5|&lt;br /&gt;| | | | |8| | |7|9|&lt;br /&gt;+-----------------+&lt;br /&gt;&lt;br /&gt;found solution:&lt;br /&gt;+-----------------+&lt;br /&gt;|5|3|4|6|7|8|9|1|2|&lt;br /&gt;|6|7|2|1|9|5|3|4|8|&lt;br /&gt;|1|9|8|3|4|2|5|6|7|&lt;br /&gt;|8|5|9|7|6|1|4|2|3|&lt;br /&gt;|4|2|6|8|5|3|7|9|1|&lt;br /&gt;|7|1|3|9|2|4|8|5|6|&lt;br /&gt;|9|6|1|5|3|7|2|8|4|&lt;br /&gt;|2|8|7|4|1|9|6|3|5|&lt;br /&gt;|3|4|5|2|8|6|1|7|9|&lt;br /&gt;+-----------------+&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;If you notice, this algorithm only finds one solution of the sudoku
puzzle.  In some cases there are multiple solutions, but this
algorithm won&amp;#39;t find them.  For example, the empty puzzle has lots of
solutions.
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table&gt;
&lt;tr&gt;&lt;th&gt; Sudoku puzzle 4-2
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;(SkuSolve &amp;#39;((? ? ? ? ? ? ? ? ?)&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;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;starting with: &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;+-----------------+&lt;br /&gt;&lt;br /&gt;found solution:&lt;br /&gt;+-----------------+&lt;br /&gt;|9|7|8|5|3|1|6|4|2|&lt;br /&gt;|6|4|2|9|7|8|5|3|1|&lt;br /&gt;|5|3|1|6|4|2|9|7|8|&lt;br /&gt;|8|9|7|2|1|4|3|6|5|&lt;br /&gt;|3|6|5|8|9|7|2|1|4|&lt;br /&gt;|2|1|4|3|6|5|8|9|7|&lt;br /&gt;|7|8|9|1|2|3|4|5|6|&lt;br /&gt;|4|5|6|7|8|9|1|2|3|&lt;br /&gt;|1|2|3|4|5|6|7|8|9|&lt;br /&gt;+-----------------+&lt;br /&gt;&lt;/pre&gt;
&lt;b&gt;What if there is no solution?&lt;/b&gt;&lt;p&gt;

The &lt;code&gt;SkuSolve&lt;/code&gt; function is good at detecting that no
solution exists for a particular puzzle.
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table&gt;
&lt;tr&gt;&lt;th&gt; Sudoku puzzle 4-3
&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;pre&gt;(SkuSolve &amp;#39;((5 3 4  6 7 8  9 1 2)&lt;br /&gt;            (6 7 2  1 9 5  3 4 8)&lt;br /&gt;            (1 9 8  3 4 2  5 6 7)&lt;br /&gt;&lt;br /&gt;            (8 5 9  7 6 1  4 2 3)&lt;br /&gt;            (4 2 6  8 5 3  7 9 1)&lt;br /&gt;            (7 1 3  9 2 4  8 5 6)&lt;br /&gt;&lt;br /&gt;            (9 6 ?  5 3 7  2 8 4)&lt;br /&gt;            (1 8 7  4 1 9  6 3 5)&lt;br /&gt;            (? ? 5  2 8 6  1 7 9)))&lt;br /&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;starting with: &lt;br /&gt;+-----+-----+-----+&lt;br /&gt;|5|3|4|6|7|8|9|1|2|&lt;br /&gt;|6|7|2|1|9|5|3|4|8|&lt;br /&gt;|1|9|8|3|4|2|5|6|7|&lt;br /&gt;|8|5|9|7|6|1|4|2|3|&lt;br /&gt;|4|2|6|8|5|3|7|9|1|&lt;br /&gt;|7|1|3|9|2|4|8|5|6|&lt;br /&gt;|9|6| |5|3|7|2|8|4|&lt;br /&gt;|1|8|7|4|1|9|6|3|5|&lt;br /&gt;| | |5|2|8|6|1|7|9|&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;no solution&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Summary&lt;/b&gt;&lt;p&gt;

In this posting, we have seen a fairly straightforward approach to
solving the sudoku puzzle.  The solution algorithm is pretty easy
because the data structures representing the structure of the board
make it easy to ask the questions we need to ask, such as:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Is there a conflict putting a digit into a cell?
&lt;/li&gt;&lt;li&gt;Which row, column, and 3x3 block is a given cell in?
&lt;/li&gt;&lt;li&gt;Is a given cell pending resolution?
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
The particular implementation of &lt;code&gt;SkuFindSolution&lt;/code&gt; also
shows an example of how to use SKILL++ local functions.  This usage
avoids polluting the global function space.


&lt;/p&gt;&lt;b&gt;Preview&lt;/b&gt;&lt;p&gt; In the next posting of &lt;i&gt;SKILL for the Skilled&lt;/i&gt;
we&amp;#39;ll take a look at some shortcomings of this algorithm, particularly in regard to performance.

&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1292969" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="object orientation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx" /><category term="Sudoku" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx" /></entry><entry><title>A Moment to Mourn -- John McCarthy, Father of Lisp</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/10/31/a-moment-to-mourn.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/10/31/a-moment-to-mourn.aspx</id><published>2011-10-31T18:00:00Z</published><updated>2011-10-31T18:00:00Z</updated><content type="html">&lt;a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/John_McCarthy_Stanford.jpg/320px-John_McCarthy_Stanford.jpg" align="right" hspace="10" alt="" /&gt;&lt;/a&gt;&lt;i&gt;Here lies a Lisper&lt;br /&gt;
Uninterned from this mortal package&lt;br /&gt;
Yet not gc&amp;#39;d&lt;br /&gt;
While we retain pointers to his memory&lt;/i&gt; &lt;p&gt;[Author unknown]&lt;/p&gt;&lt;p&gt;Last week (October 23rd, 2011 or 24th depending on which source you
read) we lost Dr. John McCarthy, one of the great contributors to the
field of computer science.  I&amp;#39;d like to send my condolences and best
wishes to friends and family he left behind.
&lt;/p&gt;&lt;p&gt;
John McCarthy was the 1971 recipient of the Turing Award for his
contributions to the field of artificial intelligence.  But the reason
we remember him and pay tribute to him today is because he is
generally acknowledged as being the Father of Lisp which in some sense
also makes him the grandfather of SKILL.

&lt;/p&gt;&lt;p&gt;
In 1960 McCarthy published a paper entitled &lt;i&gt;Recursive Functions of
Symbolic Expressions and Their Computation by Machine (Part 1)&lt;/i&gt;.
In this paper (part 2 of which was never published) he introduced a
system he called &lt;i&gt;LISP&lt;/i&gt; in which he was able to represent
algorithms and mathematical logic in terms of what he called
m-expressions and s-expressions.  In fact, many of the names of the
primitive objects and operators in the SKILL programming language were
first mentioned from that paper,
including: &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;caar&lt;/code&gt;, &lt;code&gt;cadar&lt;/code&gt;, &lt;code&gt;cdr&lt;/code&gt;, &lt;code&gt;assoc&lt;/code&gt;, &lt;code&gt;atom&lt;/code&gt;, &lt;code&gt;nil&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;eq&lt;/code&gt;, &lt;code&gt;cons&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt;, &lt;code&gt;quote&lt;/code&gt;,
and &lt;code&gt;list&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
From the stories I&amp;#39;ve been told, McCarthy originally did not intend
Lisp to become an actual language.  Rather he simply illustrated it as
a discussion exercise to his students.  He used an M-expression
notation such as &lt;code&gt;F[G[a,b]]&lt;/code&gt; to expression function calling
syntax.  Some of his ambitious students were determined that they
could create actual implementation on their IBM 704 mainframes based
on McCarthy&amp;#39;s theoretical concepts.  &lt;/p&gt;&lt;p&gt;The students used an easier to
parse s-expression syntax such as &lt;code&gt;(F (G A B))&lt;/code&gt;.  McCarthy
hoped they&amp;#39;d eventually implement a &lt;i&gt;better&lt;/i&gt; surface syntax.
However, his students were initially more interested in how the
language worked than the syntax.  Meanwhile they also learned to love
this internal (((syntax))).  Eventually a student did manage to
implement the m-expression syntax as originally conceived by McCarthy,
but by that time none of the students wanted to use it.
&lt;/p&gt;&lt;p&gt;
Lisp is truly a great contribution to the world of computer science
and software development in general. 

&lt;/p&gt;&lt;p&gt;

Thanks John McCarthy. Rest in Peace.

&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1304870" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="John McCarthy" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/John+McCarthy/default.aspx" /><category term="McCarthy" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/McCarthy/default.aspx" /><category term="software development" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/software+development/default.aspx" /></entry><entry><title>SKILL for the Skilled: Introduction to Classes -- Part 3</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx</id><published>2011-10-17T13:00:00Z</published><updated>2011-10-17T13:00:00Z</updated><content type="html"> 

In the previous posting &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/09/05/under-construction-skill-for-the-skilled-introduction-to-classes-part-2.aspx?postID=1292967"&gt;Introduction to Classes -- Part 2&lt;/a&gt;
we saw the high level function for initializing, solving, and
displaying the sudoku puzzle.

&lt;pre&gt;(defun SkuSolve (partial_solution)&lt;br /&gt;  (let ((sudoku (SkuInitialize (SkuNew) partial_solution)))&lt;br /&gt;    (printf &amp;quot;starting with: \n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint sudoku))&lt;br /&gt;    (printf &amp;quot;\nfound solution:\n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint (SkuFindSolution sudoku)))))&lt;br /&gt;&lt;/pre&gt;

In this posting we&amp;#39;ll look at the definition of
the &lt;code&gt;SkuSudoku&lt;/code&gt; class as well as the definitions of the
functions &lt;code&gt;SkuNew&lt;/code&gt;, &lt;code&gt;SkuInitialize&lt;/code&gt;,
and &lt;code&gt;SkuPrint&lt;/code&gt;.  We leave the
function &lt;code&gt;SkuFindSolution&lt;/code&gt; until next posting.

&lt;p&gt;
In this posting, you&amp;#39;ll see some examples of non-trivial class and
instance manipulation which completely avoid the topic of methods.
Although the SKILL++ object system provides a powerful method
manipulation capability, you are not required to understand anything
about methods to implement applications that operate on classes.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;Non-trivial slot initialization&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;

In the previous posting we saw how to use &lt;code&gt;@initform&lt;/code&gt; to
initialize instance slots to constant/default values. But
the &lt;code&gt;@initform&lt;/code&gt; can do more than provide constant defaults.
The expression provided by &lt;code&gt;@initform&lt;/code&gt; is actually SKILL++
code which runs every time an instance is created
with &lt;code&gt;makeInstance&lt;/code&gt;.  The code in this SKILL++ expression
is allowed to reference any global or local function or variable, such
as functions defined within an &lt;code&gt;labels&lt;/code&gt; as shown in the
example below.

&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;
The &lt;code&gt;SkuSudoku&lt;/code&gt; class defined below represents the sudoku
board itself.  It has a list of 81 cells, a list of 9 columns, a list
of 9 rows, and a list of 9 3x3 blocks.  Notice that the
class &lt;code&gt;SkuSudoku&lt;/code&gt; is defined inside a &lt;code&gt;(labels
...)&lt;/code&gt; which defines a local function named &lt;code&gt;repeat&lt;/code&gt;,
and that local function is referenced inside
the &lt;code&gt;@initform&lt;/code&gt; expression.
&lt;/p&gt;&lt;p&gt;
In particular, in the class definition, the three slots
(rows, columns, and b3x3s) each
have a different &lt;code&gt;@initform&lt;/code&gt; expression which each
reference the local function &lt;code&gt;repeat&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;(labels ((repeat (n unary &amp;quot;xU&amp;quot;)&lt;br /&gt;          &lt;i&gt;;; call the given function N number of times,&lt;/i&gt;&lt;br /&gt;          &lt;i&gt;;; collecting the return values.&lt;/i&gt;&lt;br /&gt;          (when (plusp n)&lt;br /&gt;            (cons (unary (sub1 n))&lt;br /&gt;                  (repeat (sub1 n) unary)))))&lt;br /&gt;  (defclass SkuSudoku ()&lt;br /&gt;     ((cells   @initform nil)&lt;br /&gt;      (rows    @initform (repeat 9 (lambda (n)&lt;br /&gt;                                     (makeInstance &amp;#39;SkuRow    ?index n))))&lt;br /&gt;      (columns @initform (repeat 9 (lambda (n) &lt;br /&gt;                                     (makeInstance &amp;#39;SkuColumn ?index n))))&lt;br /&gt;      (b3x3s   @initform (repeat 9 (lambda (n) &lt;br /&gt;                                     (makeInstance &amp;#39;SkuB3x3   ?index n)))))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

A call to the SKILL primitive &lt;code&gt;makeInstance&lt;/code&gt; such as an
evaluation of the expression &lt;code&gt;(makeInstance &amp;#39;SkuSudoku)&lt;/code&gt;
will create an instance of the class and will initialize the 4 slots
by evaluating the 4 respective &lt;code&gt;@initform&lt;/code&gt; expressions.
Furthermore, the expressions will be evaluated such that the local
function &lt;code&gt;repeat&lt;/code&gt; is defined.


&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Encapsulation through lexical scoping&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;Note that the feature of encapsulation (the ability to limit the
visibility of functions like &lt;code&gt;repeat&lt;/code&gt;) is provided by
SKILL++ lexical scoping.  This is different from the C++/Java paradigm
which forces you to use the object system to implement encapsulation.
In SKILL++, encapsulation works with or without the object system, so
all SKILL++ programs can take advantage of it, not just
object-oriented programs.
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Initialization using a factory function&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

There is a limit to how much initialization is possible from
the &lt;code&gt;@initform&lt;/code&gt; expressions. In particular
the &lt;code&gt;@initform&lt;/code&gt; expressions are not allowed to reference
each other.  Furthermore, you have no guarantee in which order the
initialization expressions will evaluate.  This lack of guarantee is
especially important when define classes using single inheritance, and
even more important in the case of multiple inheritance.
All &lt;code&gt;@initform&lt;/code&gt; expressions need to be mutually independent
expressions which only depend on the environment of
the &lt;code&gt;defclass&lt;/code&gt; and not on each other.

&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;
Skill++ programs typically create instances of classes in one of two
ways: either by a direct call to &lt;code&gt;makeInstance&lt;/code&gt; or by a
call to an intermediate function which
calls &lt;code&gt;makeInstance&lt;/code&gt;.  Such an intermediate function is
called a &lt;i&gt;factory function&lt;/i&gt;.  A benefit of a factory function is
that the function may also preform any additional initialization as
necessary for the correct behavior of the program.
&lt;/p&gt;&lt;p&gt;
There is still another advantage to using a factory function rather
than a direct call to &lt;code&gt;makeInstance&lt;/code&gt;. The function can
initialize slots so that their initial values depend on each other.
In the case of a properly initialized sudoku board, the cells, rows,
columns, and 3x3 blocks all depend on each other in a particular way.
There is a list of 81 cells &lt;code&gt;cells&lt;/code&gt; slot, and each of these
cell objects is in the correct row, column, and 3x3 block.  The sudoku
board cannot be initialized simply by the &lt;code&gt;@initform&lt;/code&gt;
expressions.  The job of &lt;code&gt;SkuNew&lt;/code&gt; is to assure that the
cells, rows, columns, and 3x3 blocks reference each other properly.
&lt;/p&gt;&lt;p&gt;
A factory function typically does the following:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Allocates an instance
&lt;/li&gt;&lt;li&gt;Initializes the slots of the instance, potentially according to
the arguments of the factory function itself
&lt;/li&gt;&lt;li&gt;Returns the initialized instance.
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;

&lt;b&gt;Creating a structurally correct sudoku board&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;We want to define such a factory function
named &lt;code&gt;SkuNew&lt;/code&gt; which allocates, initializes, and
returns an instance of the &lt;code&gt;SkuSudoku&lt;/code&gt; class.
&lt;/p&gt;&lt;p&gt;

The function, &lt;code&gt;SkuNew&lt;/code&gt;, does the actual allocation via a
call to &lt;code&gt;makeInstance&lt;/code&gt; as well as setting up the structure
of the board independent of the actual content of the particular
sudoku solution. In particular &lt;code&gt;SkuNew&lt;/code&gt; assures
that each cell can easily access its row, column, and 3x3 block and
that each row, column, and 3x3 block can easily access its cells.
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;(defun SkuNew ()&lt;br /&gt;  &lt;i&gt;;; allocate a blank-slate instance of SkuSudoku representing an empty&lt;/i&gt;&lt;br /&gt;  &lt;i&gt;;; sudoku board&lt;/i&gt;&lt;br /&gt;  (let ((sudoku (makeInstance &amp;#39;SkuSudoku)))&lt;br /&gt;    (let ((index 0))&lt;br /&gt;      (foreach row sudoku-&amp;gt;rows&lt;br /&gt;        (foreach col sudoku-&amp;gt;columns&lt;br /&gt;          (let ((cell (makeInstance &amp;#39;SkuCell ?index index++))&lt;br /&gt;                (b3x3 (nth (xplus (xtimes 3&lt;br /&gt;                                        (xquotient row-&amp;gt;index 3))&lt;br /&gt;                                 (xquotient col-&amp;gt;index 3))&lt;br /&gt;                            sudoku-&amp;gt;b3x3s)))&lt;br /&gt;             &lt;i&gt;;; add the cell to the list of sudoku cells.&lt;/i&gt;&lt;br /&gt;             sudoku-&amp;gt;cells = (cons cell sudoku-&amp;gt;cells)&lt;br /&gt; &lt;br /&gt;             &lt;i&gt;;; tell the cell which row, column&lt;/i&gt;&lt;br /&gt;             &lt;i&gt;;; and 3x3 block it belongs to.&lt;/i&gt;&lt;br /&gt;             cell-&amp;gt;row    = row&lt;br /&gt;             cell-&amp;gt;column = col&lt;br /&gt;             cell-&amp;gt;b3x3   = b3x3&lt;br /&gt;             &lt;br /&gt;             &lt;i&gt;;; tell the row, col, and 3x3 block&lt;/i&gt;&lt;br /&gt;             &lt;i&gt;;; that this cell belongs to it.&lt;/i&gt;&lt;br /&gt;             row-&amp;gt;cells  = (cons cell row-&amp;gt;cells)&lt;br /&gt;             col-&amp;gt;cells  = (cons cell col-&amp;gt;cells)&lt;br /&gt;             b3x3-&amp;gt;cells = (cons cell b3x3-&amp;gt;cells)))&lt;br /&gt;    &lt;i&gt;;; return the new instance.&lt;/i&gt;&lt;br /&gt;    sudoku))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;b&gt;Feeding in the partial solution&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

Finally, given an initialized and consistent object which represents
the sudoku board, it is necessary to &lt;i&gt;feed&lt;/i&gt; in a given partial
solution in preparation for running the solution
algorithm, &lt;code&gt;SkuFindSolution&lt;/code&gt;.  The
function &lt;code&gt;SkuInitialize&lt;/code&gt; iterates through the rows and
columns of a given &lt;code&gt;SkuSudoku&lt;/code&gt; instance, filling some of
the cells with a number from 0 to 9 as per the given partial solution.

&lt;/p&gt;&lt;pre&gt;(defun SkuInitialize (sudoku partial_solution)&lt;br /&gt;  &lt;i&gt;;; feed in the partial solution&lt;/i&gt;&lt;br /&gt;  (foreach (sudoku_row solution_row) sudoku-&amp;gt;rows partial_solution&lt;br /&gt;    (foreach (cell solution) sudoku_row-&amp;gt;cells solution_row&lt;br /&gt;      (when (numberp solution)&lt;br /&gt;        cell-&amp;gt;value = solution)))&lt;br /&gt;  sudoku)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;b&gt;The sudoku instance initialization protocol&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;

The two functions together form the sudoku initialization protocol:
&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;code&gt;SkuNew&lt;/code&gt;
Create a newly allocated, structurally correct sudoku board,
complete with &lt;i&gt;cross-references&lt;/i&gt; which allow for effeciently
search.
&lt;code&gt;SkuInitialize&lt;/code&gt;
Feed a given partial solution into a given structurally correct
sudoku board.



Now you may experiment with the functions, &lt;code&gt;SkuInitialize&lt;/code&gt;,
and &lt;code&gt;SkuNew&lt;/code&gt; by evaluating an expression such as the
following in the CIWindow.

&lt;pre&gt;(SkuInitialize (SkuNew)&lt;br /&gt;               &amp;#39;((5 3 ?  ? 7 ?  ? ? ?)&lt;br /&gt;                 (6 ? ?  1 9 5  ? ? ?)&lt;br /&gt;                 (? 9 8  ? ? ?  ? 6 ?)&lt;br /&gt;&lt;br /&gt;                 (8 ? ?  ? 6 ?  ? ? 3)&lt;br /&gt;                 (4 ? ?  8 ? 3  ? ? 1)&lt;br /&gt;                 (7 ? ?  ? 2 ?  ? ? 6)&lt;br /&gt;&lt;br /&gt;                 (? 6 ?  ? ? ?  2 8 ?)&lt;br /&gt;                 (? ? ?  4 1 9  ? ? 5)&lt;br /&gt;                 (? ? ?  ? 8 ?  ? 7 9)))&lt;br /&gt;&lt;br /&gt;==&amp;gt;&lt;br /&gt;stdobj@0x1d454234&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;The printed object such as &lt;code&gt;stdobj@0x1d454234&lt;/code&gt; is how an
instance of a SKILL++ class is printed.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;Displaying an instance&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;

The default way an instance of a SKILL++ class prints is not very
informative. We need to write a special purpose
function, &lt;code&gt;SkuPrint&lt;/code&gt; to display the partial (or full) state
of the sudoku board.

&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;The following function &lt;code&gt;SkuPrint&lt;/code&gt; generates a string
representing the ASCII representation of the sudoku board.  The string
contains \n characters so you&amp;#39;ll have to use &lt;code&gt;(printf &amp;quot;%s&amp;quot;
...)&lt;/code&gt; or a similar function to print it so it is human readable.
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;(defun SkuPrint (sudoku)&lt;br /&gt;  (let ((divider &amp;quot;+-----------------+\n&amp;quot;))&lt;br /&gt;    (strcat divider&lt;br /&gt;            (buildString (foreach mapcar row sudoku-&amp;gt;rows&lt;br /&gt;                           (strcat &amp;quot;|&amp;quot;&lt;br /&gt;                                   (buildString (foreach mapcar cell row-&amp;gt;cells&lt;br /&gt;                                                  (if cell-&amp;gt;value&lt;br /&gt;                                                      (sprintf nil &amp;quot;%d&amp;quot; cell-&amp;gt;value)&lt;br /&gt;                                                      &amp;quot; &amp;quot;))&lt;br /&gt;                                                &lt;i&gt;;; separate the cells with |&lt;/i&gt;&lt;br /&gt;                                                &amp;quot;|&amp;quot;)&lt;br /&gt;                                   &amp;quot;|&amp;quot;))&lt;br /&gt;                         &lt;i&gt;;; separate the lines with \n&lt;/i&gt;&lt;br /&gt;                         &amp;quot;\n&amp;quot;)&lt;br /&gt;            &amp;quot;\n&amp;quot;&lt;br /&gt;            divider)))&lt;br /&gt;&lt;/pre&gt;

You may now print the object with a call to &lt;code&gt;printf&lt;/code&gt; as
follows.

&lt;pre&gt;(printf &amp;quot;%s\n&amp;quot;&lt;br /&gt;        (SkuPrint (SkuInitialize (SkuNew)&lt;br /&gt;                                 &amp;#39;((5 3 ?  ? 7 ?  ? ? ?)&lt;br /&gt;                                   (6 ? ?  1 9 5  ? ? ?)&lt;br /&gt;                                   (? 9 8  ? ? ?  ? 6 ?)&lt;br /&gt;&lt;br /&gt;                                   (8 ? ?  ? 6 ?  ? ? 3)&lt;br /&gt;                                   (4 ? ?  8 ? 3  ? ? 1)&lt;br /&gt;                                   (7 ? ?  ? 2 ?  ? ? 6)&lt;br /&gt;&lt;br /&gt;                                   (? 6 ?  ? ? ?  2 8 ?)&lt;br /&gt;                                   (? ? ?  4 1 9  ? ? 5)&lt;br /&gt;                                   (? ? ?  ? 8 ?  ? 7 9)))))&lt;br /&gt;==&amp;gt;&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;|5|3| | |7| | | | |&lt;br /&gt;|6| | |1|9|5| | | |&lt;br /&gt;| |9|8| | | | |6| |&lt;br /&gt;|8| | | |6| | | |3|&lt;br /&gt;|4| | |8| |3| | |1|&lt;br /&gt;|7| | | |2| | | |6|&lt;br /&gt;| |6| | | | |2|8| |&lt;br /&gt;| | | |4|1|9| | |5|&lt;br /&gt;| | | | |8| | |7|9|&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Enhancements in IC615&lt;/b&gt;&lt;/p&gt;&lt;p&gt; The approach and the actual code shown
here works in versions of SKILL++ using IC5033, IC5141, and IC61 up to
and including IC615.  However, there are some new features in IC615
which make initialization and presentation of SKILL++ objects easier
and more flexible.  To completely understand these and other new
features, you&amp;#39;ll need to understand something about generic functions
and methods, which &lt;i&gt;SKILL for the Skilled&lt;/i&gt; has not addressed yet,
but here is a little taste.
&lt;/p&gt;&lt;ul&gt;&lt;li&gt; There is a new generic function defined
called &lt;code&gt;printself&lt;/code&gt;.  Virtuoso calls &lt;code&gt;printself&lt;/code&gt;
on SKILL++ instances when printing them into the CIWindow,
stacktraces, or as a result of &lt;code&gt;(printf ... &amp;quot;%L&amp;quot;)&lt;/code&gt;.  You
may provide a method of &lt;code&gt;printself&lt;/code&gt; specializing on your
class which provides a string for the SKILL++ implementation to use as
the printed representation of your object.

&lt;/li&gt;&lt;li&gt; In IC615 &lt;code&gt;makeInstance&lt;/code&gt; calls the generic
function &lt;code&gt;initializeInstance&lt;/code&gt; on a SKILL++ instance before
returning it.  You are allowed to provide what is called
an &lt;code&gt;@after&lt;/code&gt; method on &lt;code&gt;initializeInstance&lt;/code&gt;
specializing on your SKILL++ class to initialize it.  This means that
any application which makes an instance of your class will
automatically call your initialization code without having to know
the name of your factory function.

&lt;/li&gt;&lt;li&gt; In IC615 &lt;code&gt;defclass&lt;/code&gt; allows you to define classes which
inherit from multiple potentially independent or interrelated
superclasses called mix-in classes.  In this case the various methods
on &lt;code&gt;initializeInstance&lt;/code&gt; are even more important as each
such method is able to initialize the slots of an instance it is
responsible for.

&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
&lt;b&gt;Review&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;

In this posting you have seen some examples of non-trivial SKILL++
class allocation and initialization using both &lt;code&gt;@initform&lt;/code&gt;
and by a factory function.  You&amp;#39;ve also seen a way to present SKILL++
objects in human readable form depending on the semantics of your
particular class.
&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;&lt;b&gt;Preview&lt;/b&gt;&lt;/p&gt;&lt;p&gt; In the next posting of &lt;i&gt;SKILL for the Skilled&lt;/i&gt;
we&amp;#39;ll finally look at how to implement the
function &lt;code&gt;SkuFindSolution&lt;/code&gt; which is the last function
needed to complete the implementation of &lt;code&gt;SkuSolve&lt;/code&gt;
function.&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1292968" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="object orientation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx" /><category term="classes" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/classes/default.aspx" /><category term="Sudoku" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx" /></entry><entry><title>SKILL for the Skilled: Introduction to Classes -- Part 2</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/09/05/under-construction-skill-for-the-skilled-introduction-to-classes-part-2.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/09/05/under-construction-skill-for-the-skilled-introduction-to-classes-part-2.aspx</id><published>2011-09-06T04:00:00Z</published><updated>2011-09-06T04:00:00Z</updated><content type="html">&lt;p&gt;In the previous posting
&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/08/15/skill-for-the-skilled-introduction-to-classes-part-1.aspx"&gt;Introduction
to Classes -- Part 1&lt;/a&gt; we introduced the problem of solving the
Sudoku puzzle. I want to show a solution to this puzzle in SKILL++.
Doing so, I&amp;#39;ll break the problem up roughly into four parts.

&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Represent the structure of the data
&lt;/li&gt;&lt;li&gt;Initializing 
&lt;/li&gt;&lt;li&gt;Displaying the state
&lt;/li&gt;&lt;li&gt;Searching for a solution
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;High Level View&lt;/b&gt;&lt;p&gt;
Here is a top-down view of the solution algorithm.

&lt;/p&gt;&lt;pre&gt;(defun SkuSolve (partial_solution)&lt;br /&gt;  (let ((sudoku (SkuInitialize (SkuNew) partial_solution)))&lt;br /&gt;    (printf &amp;quot;starting with: \n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint sudoku))&lt;br /&gt;    (printf &amp;quot;\nfound solution:\n%s\n&amp;quot;&lt;br /&gt;            (SkuPrint (SkuFindSolution sudoku)))))&lt;br /&gt;&lt;/pre&gt;

In the upcoming postings I&amp;#39;ll define the following functions used
in &lt;code&gt;SkuSolve&lt;/code&gt;.
&lt;code&gt;SkuNew&lt;/code&gt;
Allocate a new sudoku board, creating rows, columns and 3x3 grids
which appropriate links to enable fast searching.

&lt;code&gt;SkuInitiailize&lt;/code&gt;
Fill in the empty board with an initial partial solution.

&lt;code&gt;SkuPrint&lt;/code&gt;
Print the current state of the board with either a number or white
space in each cell.

&lt;code&gt;SkuFindSolution&lt;/code&gt;
Assign the appropriate numbers to the empty cells so as to solve
the sudoku puzzle.

&lt;p&gt;

In this posting, let&amp;#39;s look at how to represent the structure of the
sudoku puzzle using SKILL++ classes.


&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Defining a class&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A sudoku board has 9 rows, 9 columns, and 9 3x3 blocks of cells.
Each row, column and 3x3 block has 9 individual cells.  Each
individual cell contains a single value which is a digit between 1 and
9 inclusive.  We can represent a cell in SKILL++ with the following
class definition. As shown on line 1.1, we define a class
with &lt;code&gt;defclass&lt;/code&gt;. Each instance of an &lt;code&gt;SkuCell&lt;/code&gt;
has several &lt;i&gt;slots&lt;/i&gt; which can be accessed by name.
&lt;/p&gt;&lt;ul&gt;&lt;li&gt; an &lt;code&gt;index&lt;/code&gt;, (line 1.2) which is a number between 0 and
80 inclusive.  There are 81 (9x9) cells in the sudoku board.  The
index uniquely identifies the cell.

&lt;/li&gt;&lt;li&gt; a &lt;code&gt;value&lt;/code&gt;, (line 1.3) which is an integer in the
set &lt;code&gt;{1, 2, 3, 4, 5, 6, 7, 8, 9}&lt;/code&gt;.

&lt;/li&gt;&lt;li&gt; &lt;code&gt;row&lt;/code&gt;, (line 1.4) an instance of
SKILL++ class &lt;code&gt;SkuRow&lt;/code&gt; indicating that this cell is an element of
that row in the sudoku board.

&lt;/li&gt;&lt;li&gt; &lt;code&gt;column&lt;/code&gt;, (line 1.5) an instance of SKILL++
class &lt;code&gt;SkuColumn&lt;/code&gt; indicating that this cell is an element
of that column in the sudoku board.

&lt;/li&gt;&lt;li&gt; &lt;code&gt;b3x3&lt;/code&gt;, (line 1.6) an instance of SKILL++
class &lt;code&gt;SkuB3x3&lt;/code&gt; indicating that this cell is an element of
that 3x3 block in the sudoku board.
&lt;/li&gt;&lt;/ul&gt;

&lt;pre&gt;(defclass SkuCell ()      ; 1.1&lt;br /&gt;  ((index @initarg index) ; 1.2&lt;br /&gt;   (value @initform nil)  ; 1.3&lt;br /&gt;   (row)                  ; 1.4&lt;br /&gt;   (column)               ; 1.5&lt;br /&gt;   (b3x3)))               ; 1.6&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Creating instances of a class&lt;/b&gt;&lt;p&gt;

You can use &lt;code&gt;makeInstance&lt;/code&gt; to create an instance of the
class: &lt;code&gt;(makeInstance &amp;#39;SkuCell)&lt;/code&gt;.  Because the
slot &lt;code&gt;index&lt;/code&gt; is defined containing &lt;code&gt;@initarg
index&lt;/code&gt; (line 1.2), you can optionally specify
the &lt;code&gt;?index&lt;/code&gt; keyword in the &lt;code&gt;makeInstance&lt;/code&gt;
call. E.g., &lt;code&gt;(makeInstance &amp;#39;SkuCell ?index 42)&lt;/code&gt;, this will
provide an initial value of 42 as for slot &lt;code&gt;index&lt;/code&gt;.  The
slot &lt;code&gt;value&lt;/code&gt; is defined with &lt;code&gt;@initform nil&lt;/code&gt;
(line 1.3) which provides an initial value of &lt;code&gt;nil&lt;/code&gt; this
slot.&lt;/p&gt;&lt;p&gt;  

&lt;b&gt;Accessing slots of an instance of a class&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

The slots defined on lines 1.4, 1.5, and 1.6 have
no &lt;code&gt;@initarg&lt;/code&gt; nor &lt;code&gt;@initform&lt;/code&gt;, but you can
access these slot values using the handy-dandy &lt;code&gt;-&amp;gt;&lt;/code&gt;
operator as shown on lines 2.3, 2.4, 2.6 and 2.7.

&lt;/p&gt;&lt;pre&gt;cell1 = (makeInstance &amp;#39;SkuCell ?index 42) ; 2.1&lt;br /&gt;cell2 = (makeInstance &amp;#39;SkuCell ?index 43) ; 2.2&lt;br /&gt;(assert cell1-&amp;gt;index == 42)               ; 2.3&lt;br /&gt;(assert cell2-&amp;gt;index == 43)               ; 2.4&lt;br /&gt;                                          ; 2.5&lt;br /&gt;cell1-&amp;gt;row    = nil                       ; 2.6&lt;br /&gt;(assert cell1-&amp;gt;row == nil)                ; 2.7&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Using classes to share structure&lt;/b&gt;&lt;p&gt;The rows, columns, and 3x3 blocks (b3x3&amp;#39;s) are represented
respectively by the
classes &lt;code&gt;SkuRow&lt;/code&gt;, &lt;code&gt;SkuColumn&lt;/code&gt;,
and &lt;code&gt;SkuB3x3&lt;/code&gt;. But each of these shares some structure.
Each has an index, rows are numbered 0 through 8, columns are also
numbered 0 through 8 (likewise for 3x3 blocks).  Furthermore, rows,
columns, and 3x3 blocks have a list of cells (9 instances of
class &lt;code&gt;SkuCell&lt;/code&gt;).  This shared structure is represented by
the class &lt;code&gt;SkuGroup&lt;/code&gt; from
which &lt;code&gt;SkuRow&lt;/code&gt;, &lt;code&gt;SkuColumn&lt;/code&gt;,
and &lt;code&gt;SkuB3x3&lt;/code&gt; each inherit.  Note in the example 3 that the
second argument of &lt;code&gt;defclass&lt;/code&gt; may be &lt;code&gt;nil&lt;/code&gt;
indicating that the direct super-class is the default one provided by
SKILL++, or the second argument may be a list of class names.
Actually in 6.1.5 the list of class names is fully supported.  Prior to
6.1.5, classes were only allowed one direct super-class.  In example 3,
the three sub-classes (&lt;code&gt;SkuRow&lt;/code&gt;, &lt;code&gt;SkuColumn&lt;/code&gt;,
and &lt;code&gt;SkuB3x3&lt;/code&gt;) of &lt;code&gt;SkuGroup&lt;/code&gt; all have slots
named &lt;code&gt;index&lt;/code&gt; and &lt;code&gt;cells&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;(defclass SkuGroup ()&lt;br /&gt;  ((index @initarg index)&lt;br /&gt;   (cells @initform nil)))&lt;br /&gt;&lt;br /&gt;(defclass SkuRow (SkuGroup)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(defclass SkuColumn (SkuGroup)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(defclass SkuB3x3 (SkuGroup)&lt;br /&gt;  ())&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Review&lt;/b&gt;&lt;p&gt; In this posting we looked at the plan for solving the
sudoku puzzle, and the first step we used class inheritance define
some simple classes which represent the state of the board.  This
includes simple uses of &lt;code&gt;@initarg&lt;/code&gt;, &lt;code&gt;@initform&lt;/code&gt;,
and &lt;code&gt;makeInstance&lt;/code&gt;
&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Preview&lt;/b&gt;&lt;/p&gt;&lt;p&gt; In the upcoming postings we&amp;#39;ll continue by looking
at some slightly more advanced ways to use defclass and encapsulation.
We&amp;#39;ll also continue the development of sudoku by printing the board
and solving the puzzle.

&lt;/p&gt;&lt;p&gt;Jim Newton&lt;b&gt; &lt;/b&gt;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1292967" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="object orientation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx" /></entry><entry><title>  SKILL for the Skilled: Introduction to Classes -- Part 1</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/08/15/skill-for-the-skilled-introduction-to-classes-part-1.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/08/15/skill-for-the-skilled-introduction-to-classes-part-1.aspx</id><published>2011-08-15T19:00:00Z</published><updated>2011-08-15T19:00:00Z</updated><content type="html">&lt;p&gt;In the previous couple of &lt;a href="http://www.cadence.com/community/posts/TeamSKILL.aspx"&gt;SKILL for the Skilled&lt;/a&gt; postings, we looked at
some of the features of SKILL++.  In fact, we saw local functions,
higher-order functions, and lexical scoping.  Still another set of
features of SKILL++ is called the &lt;i&gt;SKILL++ Object System&lt;/i&gt;. This
system provides a standardized way of implementing object oriented
SKILL applications.
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Object Orientation&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

An Object System is a programming language feature which allows the
programmer to control the characteristics and behavior of groups of
objects in an organized and coherent way -- in effect making certain
types of problems easier to solve.

&lt;/p&gt;&lt;p&gt;

If you are familiar with C++, Java, or similar programming languages,
you might think that Object Orientation is &lt;i&gt;that thing which
C++/Java&lt;/i&gt; does.  I would suggest to abandon that restrictive
misconception.  One of the first languages to introduce the concepts
of object orientation was lisp during the 1970s, long before C++ or
Java existed. The SKILL++ object system is based on this lisp
approach.  I hope the upcoming series of articles begins to peek your
interest in this powerful and elegant subset of the SKILL language.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;The SKILL++ Object System&lt;/b&gt;&lt;/p&gt;&lt;p&gt; 

SKILL++ strives to make the object system dynamic and reflective.
This means you can create classes, and methods on the fly, inspect and
debug them, and edit and redefine them in the same VM image.  As you
learn more about SKILL++ you should be pleasantly surprised at the
power of a dynamic object oriented language.

&lt;/p&gt;&lt;p&gt;

In a nutshell the SKILL++ Object System allows the SKILL programmer to
define classes of objects which share (some) structure definition and
have similar behavior.  &lt;i&gt;Classes&lt;/i&gt; define how &lt;i&gt;instances&lt;/i&gt; are
structured.  On the other hand &lt;i&gt;methods&lt;/i&gt; on &lt;i&gt;generic
functions&lt;/i&gt; define how those instances of those classes behave and
interact.

&lt;/p&gt;&lt;p&gt;

The SKILL++ object system provides the capabilities of classes and
methods in such a way that they can be used independently or together
as the programmer chooses. The means you don&amp;#39;t need to understand
generic functions and methods to understand classes and instances. In
the upcoming series of articles we will look at classes as a tool for
solving the Sudoku puzzle.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Sudoku puzzle&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

First, what is a Sudoku puzzle?  The Sudoku puzzle is a grid divided
into nine horizontal rows, nine vertical columns, and nine so-called
3x3 blocks. To solve a sudoku puzzle, you must fill in each blank
entry with an appropriately chosen digit from the set &lt;code&gt;{1, 2, 3,
4, 5, 6, 7, 8, 9}&lt;/code&gt; such that the rows, columns, and 3x3 blocks
each contain all of the numbers from 1 through 9. An implication of
this requirement is that each digit must appear exactly once in each
row, exactly once in each column, and exactly once in each 3x3 block.

&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Sudoku in SKILL++&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;
I&amp;#39;d like to implement a SKILL function, &lt;code&gt;SkuSolve&lt;/code&gt;, which
will work like the following example.  The actual example comes from
the &lt;a href="http://en.wikipedia.org/wiki/Sudoku"&gt;Sudoku Wikipedia
entry&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png" alt="" /&gt;
&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Sudoku-by-L2G-20050714_solution.svg/250px-Sudoku-by-L2G-20050714_solution.svg.png" alt="" /&gt;
&lt;/p&gt;&lt;p&gt;
After we have implemented &lt;code&gt;SkuSolve&lt;/code&gt;
and its support functions&lt;code&gt;&lt;/code&gt;, we should be able to solve any valid Sudoku
puzzle as follows.

&lt;/p&gt;&lt;pre&gt;(SkuSolve &amp;#39;((5 3 ?   ? 7 ?   ? ? ?)&lt;br /&gt;            (6 ? ?   1 9 5   ? ? ?)&lt;br /&gt;            (? 9 8   ? ? ?   ? 6 ?)&lt;br /&gt; &lt;br /&gt;            (8 ? ?   ? 6 ?   ? ? 3)&lt;br /&gt;            (4 ? ?   8 ? 3   ? ? 1)&lt;br /&gt;            (7 ? ?   ? 2 ?   ? ? 6)&lt;br /&gt;&lt;br /&gt;            (? 6 ?   ? ? ?   2 8 ?)&lt;br /&gt;            (? ? ?   4 1 9   ? ? 5)&lt;br /&gt;            (? ? ?   ? 8 ?   ? 7 9)))&lt;br /&gt;&lt;/pre&gt;

This call should&lt;code&gt;&lt;/code&gt; print something like the following:
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;starting with: &lt;br /&gt;+-----+-----+-----+&lt;br /&gt;|5|3| | |7| | | | |&lt;br /&gt;|6| | |1|9|5| | | |&lt;br /&gt;| |9|8| | | | |6| |&lt;br /&gt;|8| | | |6| | | |3|&lt;br /&gt;|4| | |8| |3| | |1|&lt;br /&gt;|7| | | |2| | | |6|&lt;br /&gt;| |6| | | | |2|8| |&lt;br /&gt;| | | |4|1|9| | |5|&lt;br /&gt;| | | | |8| | |7|9|&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;br /&gt;found solution:&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;|5|3|4|6|7|8|9|1|2|&lt;br /&gt;|6|7|2|1|9|5|3|4|8|&lt;br /&gt;|1|9|8|3|4|2|5|6|7|&lt;br /&gt;|8|5|9|7|6|1|4|2|3|&lt;br /&gt;|4|2|6|8|5|3|7|9|1|&lt;br /&gt;|7|1|3|9|2|4|8|5|6|&lt;br /&gt;|9|6|1|5|3|7|2|8|4|&lt;br /&gt;|2|8|7|4|1|9|6|3|5|&lt;br /&gt;|3|4|5|2|8|6|1|7|9|&lt;br /&gt;+-----+-----+-----+&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;b&gt;Preview&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;In the upcoming series we&amp;#39;ll look at the following:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Defining a class including with inheritance
  &lt;/li&gt;&lt;li&gt;Constructing instances of a class
  &lt;/li&gt;&lt;li&gt;Manipulating instances at run-time
  &lt;/li&gt;&lt;li&gt;Examining the content of an instance
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;

Stay tuned for more to come.  Please send submit your questions or
comments in the comment section below.

&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;b&gt;See Also:&lt;/b&gt;
&lt;ul&gt;&lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;Object-oriented programming&lt;/a&gt;
&lt;/li&gt;&lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/CLOS"&gt;Common Lisp Object System&lt;/a&gt;
&lt;/li&gt;&lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/Sudoku"&gt;Sudoku&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1292966" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="Allegro" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Allegro/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="object orientation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx" /><category term="object system" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/object+system/default.aspx" /><category term="Sodoku" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Sodoku/default.aspx" /><category term="classes" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/classes/default.aspx" /></entry><entry><title>Virtuoso Analog Design Environment XL – Data Everywhere, But You Have a Review in 10 minutes, Now What?</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/07/29/virtuoso-analog-design-environment-xl-here-s-some-data-there-s-some-data-everywhere-there-s-data-data-but-you-have-a-review-in-10-minutes-now-what.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/07/29/virtuoso-analog-design-environment-xl-here-s-some-data-there-s-some-data-everywhere-there-s-data-data-but-you-have-a-review-in-10-minutes-now-what.aspx</id><published>2011-07-29T13:00:00Z</published><updated>2011-07-29T13:00:00Z</updated><content type="html">&lt;p&gt;In my previous &lt;a href="https://www.cadence.com:443/community/posts/Rama%20Jupalli.aspx"&gt;blogs&lt;/a&gt;, I talked about productivity enhancing features of Virtuoso Analog Design Environment XL and how designers can take advantage of these capabilities to design complex custom analog ICs. The&amp;nbsp;Virtuoso Analog Design Environment XL multi-test bench environment, specification compliance and statistical analysis tools allow designers to cover the design space in a fast and efficient manner. Compiling and documenting all these results and performance metrics for a speedy design review is just as important as generating them.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Rapid growth in the IP development cost (as a percentage of IC development cost) and the fact that majority of the designs are derivative designs in some shape or form means IP reuse is becoming a critical factor in determining the success of many projects. One of the important aspects of IP reuse is the ability to compile design information and tie it electronically to the IP to ensure accurate and consistent information for reference and reuse. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Using Datasheets&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This is where Virtuoso Analog Design Environment XL datasheets come in handy. Virtuoso Analog Design Environment XL datasheets allow designers to specify information (variables, specifications, corners, results waveforms, etc.) that need to be captured, enabling designers to create datasheets with a single click. These HTML datasheets allow users to quickly review designs and share them with other team members and design partners. &lt;/p&gt;&lt;p&gt;The Virtuoso Analog Design Environment XL history assistant allows designers to save results of up to 10 previous history items. This, combined with the ability to easily generate HTML datasheets, saves a significant amount of designer&amp;#39;s time while allowing designers to explore different topologies and design variations for optimum performance. &amp;nbsp;Designers can electronically tie documentation to the IP for efficient review and validation by team members and design partners who might be located in different geographical locations. &lt;/p&gt;&lt;p&gt;Design managers can refer to the datasheets, using them as a means to quickly decide if all or some parts of IP could be reused in a new project. Users can combine and store other documents such as Excel spread sheets, PDF documents, and schematic screenshots along with the datasheets in &amp;quot;ADE XL view&amp;quot; enabling comprehensive design information in a single location. This enables seamless knowledge transfer across the design organizations. Such a methodology of keeping all the information in one location goes a long way in conducting efficient design reviews and helping design teams meet shorter design cycles.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Taking Snapshots&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The Virtuoso Schematic Editor XL HTML publisher allows designers to take static snapshots of schematics and include them with verification results and design documentation, enabling designers to review schematics without the need to bring up Virtuoso Schematic Editor and tie up licenses that could be better used by other designers.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;With the explosive growth of verification coverage, documenting results is becoming crucial to ensure that designers do not duplicate the efforts of fellow team members or waste their precious time rerunning same simulations because they failed to document results in the first place. Virtuoso Analog Design Environment XL datasheets allow designers to avoid such pitfalls by providing them with an easy to use, efficient mechanism to generate datasheets with a single click, allowing them to focus their energies on more important issues - such as designing the custom analog ICs.&lt;/p&gt;&lt;p&gt;Here are the links to some of the Virtuoso Analog Design Environment XL videos. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; You need a COS (Cadence Online Support) account to access these videos.&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_DATASHEET/adexl_qs_datasheet_614.htm"&gt;Creating Datasheets in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC615_viva_adexl/viva_615_adexl.html"&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA) Analog Design Environment XL Integration&lt;/a&gt; &lt;p&gt;Rama Jupalli&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1292483" width="1" height="1"&gt;</content><author><name>Rama Jupalli</name><uri>http://www.cadence.com/Community/members/Rama-Jupalli.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="Analog  Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx" /><category term="Virtuoso datasheets" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+datasheets/default.aspx" /><category term="Schematic Editor" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Schematic+Editor/default.aspx" /><category term="datasheets" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/datasheets/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: Viva ViVA! </title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/07/08/things-you-didn-t-know-about-virtuoso-viva-viva.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/07/08/things-you-didn-t-know-about-virtuoso-viva-viva.aspx</id><published>2011-07-08T16:00:00Z</published><updated>2011-07-08T16:00:00Z</updated><content type="html">&lt;p&gt;I realize that I have been quite remiss in that I have not yet blogged about the new all-singing all-dancing ViVA waveform viewer which was released in IC6.1.5 back in January.&amp;nbsp; All right, it doesn&amp;#39;t really sing and dance -- but would you really want it to?&amp;nbsp; Really?&amp;nbsp; Submit an enhancement request and we&amp;#39;ll see what we can do...&lt;/p&gt;&lt;p&gt;In the meantime, I can tell you that &lt;b&gt;ViVA&lt;/b&gt; (oh, that&amp;#39;s &lt;b&gt;Virtuoso Visualization and Analysis&lt;/b&gt; for the acronymically challenged) -- the waveform viewer used in the &lt;b&gt;Analog Design Environment L/XL/GXL &lt;/b&gt;-- has been rewritten from the ground up with the objectives of providing excellent performance, capacity and&amp;nbsp;usability for all manner of waveform viewing and analysis tasks.&amp;nbsp; Feedback from customers so far is that we have largely achieved those objectives.&lt;/p&gt;&lt;p&gt;So go ahead and give it a spin and see what you think.&amp;nbsp; As with other Virtuoso IC6.1 applications, when in doubt, &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/23/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-RMB_2C00_-OMG_2100_-_3B002D002900_.aspx" target="_blank"&gt;RMB&lt;/a&gt; (for those who haven&amp;#39;t been following along, that means try clicking the right mouse button).&amp;nbsp; ViVA also allows drag-and-drop (DnD) operations on waveforms for many tasks.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Scroll down to the &lt;b&gt;bottom of this post&lt;/b&gt; for links to a whole host of video demos to show you many of the new features. You can view these on the web or download them to post for your colleagues to access as well.&lt;/p&gt;&lt;p&gt;Some things that may not be so obvious in the tool are the wide variety of bindkeys and keyboard shortcuts available to perform common actions.&amp;nbsp; So, voila!&amp;nbsp; Here you have the coveted secret decoder ring for ViVA bindkeys, shortcuts and icons.&amp;nbsp; Print it out, keep it handy, make copies for your friends.&amp;nbsp; I&amp;#39;m sure you could even have it printed on your coffee mug for a nominal fee...&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/vivakeys1.png"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/vivakeys1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ViVA video demos available on &lt;a href="http://support.cadence.com" target="_blank"&gt;COS&lt;/a&gt;:&lt;/p&gt;&lt;div id="ext-gen57" class="searchTitleLabel searchTitleMouseOver"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/SubwindowsCOS.html;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Using Subwindows in Qt Graph&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel searchTitleMouseOver"&gt;&lt;div id="ext-gen145" class="searchTitleLabel searchTitleMouseOver"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/QtStripsCOS.html;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Using Strip Charts in Qt Graph&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel searchTitleMouseOver"&gt;&lt;div id="ext-gen87" class="searchTitleLabel searchTitleMouseOver"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/CalculatorBufferCOS.html;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Using Calculator Buffer New Features&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel searchTitleMouseOver"&gt;&lt;div id="ext-gen95" class="searchTitleLabel"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/DependentExpressionsCOS.html;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Building Dependent Expressions Using Expression Editor&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_viva_zoom/viva_615_zoomCOS.htm;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA) Zooming and Panning&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;&lt;div class="searchTitleLabel"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_viva_markers/viva_615_markersCOS.htm;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA) Markers&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_viva_mixed_signal/viva_615_mixed_signalCOS.htm;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA) Working with Mixed Signal Data&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_viva_adexl/viva_615_adexlCOS.htm;searchHash=4a3b66dfb531fc9720085467457258bb" target="_blank"&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA) ADE XL Integration&lt;/a&gt;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="searchTitleLabel"&gt;Stacy Whiteman &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1285951" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="ViVa-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ViVa-XL/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /><category term="Viva" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Viva/default.aspx" /></entry><entry><title>Virtuoso Analog Design Environment XL – Make Friends with Variation</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/06/16/virtuoso-analog-design-environment-xl-make-friends-with-variation.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/06/16/virtuoso-analog-design-environment-xl-make-friends-with-variation.aspx</id><published>2011-06-16T13:00:00Z</published><updated>2011-06-16T13:00:00Z</updated><content type="html">&lt;p&gt;In my last blog, &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/05/06/virtuoso-analog-design-environment-xl-embrace-the-productivity.aspx?postID=1268388"&gt;Virtuoso Analog Design Environment XL - Embrace the Productivity&lt;/a&gt;, I wrote about Virtuoso Analog Design Environment XL&amp;#39;s multi-test bench environment and how design teams can make use of this feature to increase productivity and use hardware resources efficiently. In this blog, I will focus on advanced Virtuoso Analog Design Environment XL features like corners analysis and Monte Carlo analysis.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Corners Analysis&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Decreasing geometries, along with increasing design complexity in an era of short time-to-market windows,&amp;nbsp;are making the task of designing custom analog ICs very difficult. Add to this the task of designing and verifying designs for a large number of PVT (Process, Voltage &amp;amp; Temperature) corners, and it is easy to understand the designer&amp;#39;s need for efficient tools that make their lives easier. Corners analysis in Virtuoso Analog Design Environment XL is one such capability&amp;nbsp;that enablez designers overcome such challenges. &lt;/p&gt;&lt;p&gt;Using the new and improved corners analysis tool available in the Virtuoso Analog Design Environment XL, designers can perform comprehensive analysis and verification across multiple corners to ensure design specification compliance. Apart from predefined PVT corners, designers can also create corners on various design parameters to increase the design space coverage and to ensure that their design meets the performance requirements over a wide range of operating conditions. A color coded display of spec-compliant corners analysis results in Virtuoso Analog Design Environment XL, combined with an easy to use debug mechanism, makes it easy for the designer to quickly get to the results they are interested in and&amp;nbsp;to identify underlying issues that might be causing design spec violations. Virtuoso Analog Design Environment XL provides designers with the ability to run just the failed corner cases with a single click of a button and quickly identify problem areas. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; In Virtuoso 6.1.5, as part of &amp;quot;Worst Case Corners&amp;quot; tool, users can take advantage of efficient algorithms to create worst case corners and reduce the number of corners to simulate from 100s to single digits. &amp;quot;Worst Case Corners&amp;quot; is a Virtuoso Analog Design Environment GXL feature and you can find out more about worst case corners and other Virtuoso Analog Design Environment GXL features &lt;a href="https://www.cadence.com:443/rl/Resources/datasheets/virtuoso_adeGXL_ds.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Monte Carlo Analysis&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Just as corners analysis is needed to verify design performance across PVT corners, Monte Carlo analysis is becoming critical for designers to better understand design performance with respect to statistical variations. Monte Carlo analysis in Virtuoso Analog Design Environment XL allows designers to analyze deign performance against statistical variations and take corrective actions where needed to increase the yield. Designers can selectively enable/disable Monte Carlo analysis on a complete design, or just parts of it, to study the effects of statistical variation.&lt;/p&gt;&lt;p&gt;The in-memory integration of Virtuoso Analog Design Environment XL&amp;#39;s Monte Carlo analysis with Cadence MMSIM tools provides faster and efficient simulations by removing the overhead encountered with Monte Carlo tools offered by 3&lt;sup&gt;rd&lt;/sup&gt; party vendors.&amp;nbsp; Apart from a close integration with MMSIM tools, Virtuoso Analog Design Environment XL&amp;#39;s Monte Carlo analysis also provides advanced algorithms to effectively reduce number of trials needed to cover the entire design space. The ability to plot histograms and scatter plots in Virtuoso Visualization &amp;amp; Analysis (ViVA), Cadence&amp;#39;s latest waveform display tool, combined with the Virtuoso Analog Design Environment XL&amp;#39;s debug environment (users can open a Virtuoso Analog Design Environment L session on failed simulations with all the variable settings used in that particular Monte Carlo trial), allows designers to analyze results and help identify underlying reasons for failed simulations.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; It is a well known fact that regular Monte Carlo analysis is very expensive (in terms of number of simulations needed) to predict high-sigma yield. In such cases, you can use High-Sigma yield analysis. High-Sigma analysis enables designers to predict yield up to 6 sigma, i.e. 3.4 ppm failures with fewest possible number simulations. This is a Virtuoso Analog Design Environment GXL feature and you can find out more about High-Sigma yield analysis and other Virtuoso Analog Design Environment GXL features &lt;a href="https://www.cadence.com:443/rl/Resources/datasheets/virtuoso_adeGXL_ds.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here are the links to some of the Virtuoso Analog Design Environment XL videos. &lt;b&gt;Note:&lt;/b&gt; You need a COS (Cadence Online Support) account to access these videos.&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_CORNERS/adexl_qs_corners_614.htm"&gt;Setting up &amp;amp; Simulating Corners in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC615ISR1VideoUpdate/NewCornersSetupForm_ADEXL.html"&gt;Using the New Corners Setup Form in Virtuoso Analog Design Environment XL (IC 6.1.5)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_RESIM/adexl_qs_resim.htm"&gt;Incremental Resimulation in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/NewDebugEnvironment_ADEXLCOS.html"&gt;Debugging Points of Simulation Results in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_MC/adexl_qs_mc_614.htm"&gt;Monte Carlo Analysis in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Rama Jupalli&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1277891" width="1" height="1"&gt;</content><author><name>Rama Jupalli</name><uri>http://www.cadence.com/Community/members/Rama-Jupalli.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Monte Carlo" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Monte+Carlo/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="custom/analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /><category term="Corners analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Corners+analysis/default.aspx" /><category term="worst case corners" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/worst+case+corners/default.aspx" /><category term="PVT" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PVT/default.aspx" /></entry><entry><title>SKILL for the Skilled: Virtuoso Applications of SKILL++</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/05/31/skill-for-the-skilled-virtuoso-applications-of-skill.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/05/31/skill-for-the-skilled-virtuoso-applications-of-skill.aspx</id><published>2011-05-31T17:00:00Z</published><updated>2011-05-31T17:00:00Z</updated><content type="html">&lt;p&gt;In this posting, I continue looking at applications of SKILL++.  In
particular, I&amp;#39;ll also discuss how to create functions that hold onto
their state. I&amp;#39;ll use these functions to implement multiple-criteria
(cascading) sort predicates.  I&amp;#39;ll look at ways to sort
layout pins counter-clockwise around the center point of the design. &lt;/p&gt;&lt;b&gt;Quick Review&lt;/b&gt;&lt;p&gt;&amp;nbsp;In the &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/05/03/skill-for-the-skilled-sorting-with-skill.aspx"&gt;previous posting&lt;/a&gt; we looked at an implementation
of &lt;code&gt;genCmpFunction&lt;/code&gt; which I&amp;#39;ll repeat here.

&lt;/p&gt;&lt;pre&gt;;; Example 5.11&lt;br /&gt;(defun genCmpFunction (@key (test lessp)&lt;br /&gt;                            (key  identity)) ;; see example 5.10&lt;br /&gt;   (lambda (A B)&lt;br /&gt;      (test (key A)&lt;br /&gt;            (key B))))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;The value passed as &lt;code&gt;?key&lt;/code&gt; is a function, which given the
sort candidate, retrieves the value to be compared.  Thus if we wish
to sort a list of db-instances by name, we need to pass as &lt;code&gt;?key&lt;/code&gt; a
function that given a db-instance will return its name.  In example
5.15, we did just that; we passed &lt;code&gt;?key &amp;#39;name (lambda (i)
i-&amp;gt;name)&lt;/code&gt;.

&lt;/p&gt;&lt;b&gt;The getter function&lt;/b&gt;&lt;p&gt;
This idiom is actually common enough that we can introducing a new
SKILL++ function, named &lt;code&gt;getter&lt;/code&gt;, which generates a
read-accessor to access a given property name.

&lt;/p&gt;&lt;pre&gt;;; Example 5.16&lt;br /&gt;(defun getter (propertyName)&lt;br /&gt;  (lambda (object)&lt;br /&gt;    (get object propertyName)))&lt;br /&gt;&lt;/pre&gt;

The function &lt;code&gt;getter&lt;/code&gt; takes a property name as its
argument and returns a newly generated unary function which will
retrieve the value of that property name from &lt;i&gt;its&lt;/i&gt; argument.
For example given the symbol &lt;code&gt;name&lt;/code&gt;, it will return turn a
unary function which will retrieve the value of the
property &lt;code&gt;name&lt;/code&gt;. &lt;code&gt;(funcall (getter &amp;#39;name)
db_inst)&lt;/code&gt; is the same as &lt;code&gt;db_inst-&amp;gt;name&lt;/code&gt;.  Of
course this is not very interesting used by itself, but is useful in
conjunction with other functions like &lt;code&gt;genCmpFunction&lt;/code&gt;
and &lt;code&gt;genCascadeCmpFunction&lt;/code&gt; which will be seen later.
&lt;p&gt;
Example 5.17 shows the code example 5.15 but using the &lt;code&gt;getter&lt;/code&gt;
function rather than &lt;code&gt;lambda&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;;; Example 5.17&lt;br /&gt;(sort (geGetEditCellView)-&amp;gt;instances&lt;br /&gt;      (genCmpFunction ?test alphalessp&lt;br /&gt;                      ?key (getter &amp;#39;name)))&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;What&amp;#39;s a closure?&lt;/b&gt;&lt;p&gt; 

Functions such as &lt;code&gt;genCmpFunction&lt;/code&gt; from example 5.11,
and &lt;code&gt;getter&lt;/code&gt; from example 5.17 are subtly different than
functions available in traditional SKILL++.  Notice
that &lt;code&gt;genCmpFunction&lt;/code&gt; returns an on-the-fly function
created by &lt;code&gt;(lambda ...)&lt;/code&gt;.  The code within
the &lt;code&gt;lambda&lt;/code&gt; found in &lt;code&gt;genCmpFunction&lt;/code&gt;
references two &lt;i&gt;free&lt;/i&gt; variables, &lt;code&gt;test&lt;/code&gt;
and &lt;code&gt;key&lt;/code&gt;. These free variables are not declared by or
inside the &lt;code&gt;lambda&lt;/code&gt;. Likewise, in the
function &lt;code&gt;getter&lt;/code&gt;, the lambda expression references but
does not define &lt;code&gt;propertyName&lt;/code&gt;.  Functions which extend the
life-time of variables defined elsewhere and hold on to
these &lt;i&gt;closed-over&lt;/i&gt; variables in this way are referred to
as &lt;i&gt;closures&lt;/i&gt;. In example 5.17, the &lt;code&gt;sort&lt;/code&gt; function is
called only after &lt;code&gt;genCmpFunction&lt;/code&gt; returns.  Nevertheless,
the closure returned from &lt;code&gt;genCmpFunction&lt;/code&gt; holds onto the
local variables of &lt;code&gt;genCmpFunction&lt;/code&gt;,
namely &lt;code&gt;test&lt;/code&gt; and &lt;code&gt;key&lt;/code&gt;.

&lt;/p&gt;&lt;p&gt; Many other Lisp dialects as well as some other programming
languages (such as ML, SmallTalk, and JavaScript) implement and
support closures.  You can find out more about
&lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closures
on wikipedia&lt;/a&gt;.

&lt;/p&gt;&lt;b&gt;Sorting pins in a layout cellView&lt;/b&gt;&lt;p&gt;

Example 5.18 shows a function which sorts the pin figures in a given
layout cellView into counter-clockwise order around the center of the
cellView.

&lt;/p&gt;&lt;pre&gt;;; Example 5.18&lt;br /&gt;(defun sortPinFigs (cv)&lt;br /&gt;  (let ((cv_center (centerBox cv-&amp;gt;bBox))&lt;br /&gt;        (cv_pin_figs (foreach mapcan term cv-&amp;gt;terminals&lt;br /&gt;                       (foreach mapcan pin term-&amp;gt;pins&lt;br /&gt;                         pin-&amp;gt;figs))))&lt;br /&gt;    (sort cv_pin_figs&lt;br /&gt;          (genCmpFunction&lt;br /&gt;            ?key (lambda (fig)&lt;br /&gt;                   (let ((fig_center (centerBox fig-&amp;gt;bBox)))&lt;br /&gt;                      (atan2 (yCoord cv_center) - (yCoord fig_center)&lt;br /&gt;                             (xCoord cv_center) - (xCoord fig_center))))))))&lt;br /&gt;&lt;/pre&gt;

Note that the function
&lt;code&gt;sortPinFigs&lt;/code&gt; in example 5.18 assumes there is no pin whose
center is in the cellView center, because in that
case &lt;code&gt;atan2&lt;/code&gt; would fail.

&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cascading sort&lt;/b&gt;&lt;p&gt;
Another limitation of &lt;code&gt;sortPinFigs&lt;/code&gt; as implemented in
example 5.18 is that two different pin figures might be at the same
angle.  It would be great if the &lt;code&gt;sortPinFigs&lt;/code&gt; function
would sort pins deterministically.  We need a secondary sort criteria.
For example, if two figures appear at the same angle, then sort by
their distance from the center.  But there might actually be some
overlapping pins which have the same center, in which case a third
criteria is needed, such as sort by layer name (or terminal name, or
pin name, or left edge).

&lt;/p&gt;&lt;p&gt;
In general, whenever sorting objects based not on their identity but on
some attribute, it might happen that two different objects share a
value of that attribute.  As in the example above, when sorting file
names according to file sizes, it might of course happen that two
different files have the same size.  Example 5.19 shows a
function &lt;code&gt;genCascadeCmpFunction&lt;/code&gt; which is more general
than &lt;code&gt;genCmpFunction&lt;/code&gt;. The &lt;code&gt;genCascadeCmpFunction&lt;/code&gt;
function generates a compare predicate based on a sequence of
cascading key/test pairs.

&lt;/p&gt;&lt;pre&gt;;; Example 5.19&lt;br /&gt;(defun genCascadeCmpFunction (key lessp @rest others)&lt;br /&gt;  (lambda (a b)&lt;br /&gt;    (labels ((cascade (key lessp others &amp;quot;UUl&amp;quot;)&lt;br /&gt;               (cond&lt;br /&gt;                 ((lessp (key a) (key b)))&lt;br /&gt;                 ((lessp (key b) (key a))&lt;br /&gt;                  nil)&lt;br /&gt;                 (others&lt;br /&gt;                  (cascade (car others) (cadr others) (cddr others))))))&lt;br /&gt;      (cascade key lessp others))))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;b&gt;Sorting strings by cascading criteria&lt;/b&gt;&lt;p&gt;

To sort a list of strings proceed first by string-length, then (if they have
the same string-length) alphabetically.
&lt;/p&gt;&lt;pre&gt;;; Example 5.20&lt;br /&gt;(sort (list &amp;quot;c&amp;quot; &amp;quot;abc&amp;quot; &amp;quot;jkl&amp;quot; &amp;quot;b&amp;quot; &amp;quot;hello&amp;quot; &amp;quot;d&amp;quot; &amp;quot;world&amp;quot; &amp;quot;xyz&amp;quot;)&lt;br /&gt;      (genCascadeCmpFunction strlen lessp&lt;br /&gt;                             identity alphalessp))&lt;br /&gt;&lt;br /&gt;&lt;i&gt;===&amp;gt; (&amp;quot;b&amp;quot; &amp;quot;c&amp;quot; &amp;quot;d&amp;quot; &amp;quot;abc&amp;quot; &amp;quot;jkl&amp;quot; &amp;quot;xyz&amp;quot; &amp;quot;hello&amp;quot; &amp;quot;world&amp;quot;)&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Sorting file names by cascading criteria&lt;/b&gt;&lt;p&gt;
To sort a list of file names first by file length, then alphabetically
according to name, you can use the following.
&lt;/p&gt;&lt;pre&gt;;; Example 5.21&lt;br /&gt;(sort (getDirFiles &amp;quot;.&amp;quot;)&lt;br /&gt;      (genCascadeCmpFunction fileLength lessp&lt;br /&gt;                             identity alphalessp))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Sorting db-shapes by cascading criteria&lt;/b&gt;&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;

To sort a list of db-shapes, first according to their layer name, then
layer-purpose, then left-to-right by left edge, then right-to-left
right edge, then top-to-bottom top edge, then bottom-to-top bottom
edge, use the following.

&lt;/p&gt;&lt;pre&gt;;; Example 5.22&lt;br /&gt;(sort list_of_shapes&lt;br /&gt;      (genCascadeCmpFunction (lambda (obj) obj-&amp;gt;layerName) alphalessp&lt;br /&gt;                             (lambda (obj) obj-&amp;gt;purpose) alphalessp&lt;br /&gt;                             leftEdge lessp&lt;br /&gt;                             rightEdge greaterp&lt;br /&gt;                             topEdge greaterp&lt;br /&gt;                             bottomEdge lessp))&lt;br /&gt;&lt;/pre&gt;

We can rewrite the call above to something simpler using
the &lt;code&gt;getter&lt;/code&gt; function defined in example 5.16.

&lt;pre&gt;;; Example 5.23&lt;br /&gt;(sort list_of_shapes&lt;br /&gt;      (genCascadeCmpFunction (getter &amp;#39;layerName) alphalessp&lt;br /&gt;                             (getter &amp;#39;purpose)   alphalessp&lt;br /&gt;                             leftEdge   lessp&lt;br /&gt;                             rightEdge  greaterp&lt;br /&gt;                             topEdge    greaterp&lt;br /&gt;                             bottomEdge lessp))&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Summary&lt;/b&gt;&lt;p&gt; 

The examples shown above illustrate a interesting and powerful feature
of SKILL++, &lt;i&gt;closures&lt;/i&gt;.  You might also find some of the examples
useful to simply copy and paste into your programs.  Remember to use
the .ils extension.

&lt;/p&gt;&lt;b&gt;See also&lt;/b&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;Closures on Wikipedia&lt;/a&gt;
&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.paulgraham.com/noop.html"&gt;Paul Graham&amp;#39;s interesting perspective on closures&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Jim Newton&lt;br /&gt;



&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1277460" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="sorting" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/sorting/default.aspx" /><category term="sort" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/sort/default.aspx" /><category term="closures" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/closures/default.aspx" /></entry><entry><title>Virtuoso Analog Design Environment XL – Embrace the Productivity</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/05/06/virtuoso-analog-design-environment-xl-embrace-the-productivity.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/05/06/virtuoso-analog-design-environment-xl-embrace-the-productivity.aspx</id><published>2011-05-06T13:00:00Z</published><updated>2011-05-06T13:00:00Z</updated><content type="html">&lt;p&gt;In my last blog, &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/04/13/virtuoso-ic-5-1-41-was-good-but-virtuoso-ic-6-1-is-better.aspx"&gt;Virtuoso IC 5.1.41 was Good but Virtuoso IC6.1 is Better&lt;/a&gt;, I wrote about the improvements in Open Access, SKILL and Virtuoso Schematic Editor in Virtuoso IC 6.1. In this blog, I am going to focus on Virtuoso Analog Design Environment, mainly on Virtuoso Analog Design Environment XL, its design analysis and verification capabilities, and how design teams can take advantage of these features to increase productivity.&lt;/p&gt;&lt;p&gt;The Virtuoso Analog Design Environment offers comprehensive set of capabilities required to fully explore, analyze, and verify a design against the design&amp;#39;s specifications. &amp;nbsp;The tiered product structure of the Virtuoso Analog Design Environment provides designers with the flexibility to select the tier that meets their design needs, enabling efficient use of EDA tools. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Virtuoso Analog Design Environment L&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Virtuoso Analog Design Environment L provides a quick entry into the analysis process with easy execution of simulations. Virtuoso IC 6.1 Analog Design Environment L provides users with a short learning curve and easy transition from previous versions of Virtuoso. Apart from maintaining the same use model, Virtuoso Analog Design Environment L has many new features to enable efficient design analysis and simulation, including:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Configurable assistants and toolbars for optimum display of relevant data and design setup customization&lt;/li&gt;&lt;li&gt;Availability of Analog Design Environment L toolbar and post-processing toolbars in Virtuoso Schematic Editor L / XL for reduced mouse miles&lt;/li&gt;&lt;li&gt;Ability to launch Analog Design Environment XL/GXL directly from Analog Design Environment L. All information from Analog Design Environment L is pre-populated into Analog Design Environment XL, providing users with easily transition.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To know more about Virtuoso Analog Design Environment L, click &lt;a href="http://www.cadence.com/rl/Resources/datasheets/virtuoso_adeL_ds.pdf"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Virtuoso Analog Design Environment XL&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Virtuoso Analog Design Environment XL is an advanced tier&lt;b&gt; &lt;/b&gt;that extends the L tier capabilities, providing a multiple test bench environment; analysis over sweeps, corners, and Monte Carlo analysis; and easy reviewing of results and generation of spec comparison sheets and datasheets as needed.&lt;/p&gt;&lt;p&gt;One of the important features of Virtuoso Analog Design Environment XL is its multi-test bench environment. Historically, custom/analog designers are used to setting up one test bench at a time, run simulation(s), analyze results, improve the design to meet design specifications, and then move on to the next test bench or next stage of the design. This methodology was necessitated not only because of hardware limitations but also because of limitations of available EDA tools. &lt;/p&gt;&lt;p&gt;However, with powerful hardware resources now being made available to designers, analyzing one test bench at a time not only is inefficient but also limits the designer&amp;#39;s ability to simultaneously analyze different design architectures and test benches, and quickly settle on designs that meet the requirements. Virtuoso Analog Design Environment XL was designed and developed to overcome this shortcoming in existing tools. &lt;/p&gt;&lt;p&gt;The multi-test bench environment of Virtuoso Analog Design Environment XL allows designers to simultaneously run multiple test benches and efficiently analyze design specification compliance. Designers can analyze multiple test benches of the same design (with a different setup) or multiple test benches on different designs, using the same setup to enable optimum use of design infrastructure. &lt;/p&gt;&lt;p&gt;Some of our major customers who have adopted Virtuoso Analog Design Environment XL in their design flow are making use of this methodology to comprehensively analyze vast design spaces by running hundreds of simulations on multiple test benches, and by farming out these simulations onto larges farm of hardware resources. During a recent customer visit, I found out that designers are taking advantage of the &amp;quot;test specific job policy&amp;quot; to quickly get to the results of the simulations they are interested in while other simulations are still going on. Making use of a test specific job policy in conjunction with the multi-test bench environment is a clever way of using different hardware farms that are available to designers. &amp;nbsp;&lt;/p&gt;&lt;p&gt;Designers can sweep design variables across multiple test benches to perform extensive design analysis and verification. The ability to enable/disable sweeps for each test gives designers the flexibility to customize analysis and verification plans to meet design requirements. An easy to use design debug environment allows designers to quickly access the required information of failed simulations, allowing designers to analyze issues that are causing design performance issues. &lt;/p&gt;&lt;p&gt;Apart from sweeps, designers can also perform corners analysis and Monte Carlo simulations across these test benches in the same setup. I will be covering these topics in my upcoming blog. Finally, designers can make use of Analog Design Environment XL setup for pre and post-layout simulations to analyze layout parasitic effects&lt;/p&gt;&lt;p&gt;In summary, whereas Virtuoso Analog Design Environment L provides designers with the same use model as the one designers are used to with previous versions of Virtuoso ADE (such as analyzing one test bench at a time), Virtuoso Analog Design Environment XL provides designers with the powerful multi-test bench environment, resulting in increased designer productivity, the efficient use of design infrastructure, and comprehensive design analysis and verification.&lt;/p&gt;&lt;p&gt;To get more details about Virtuoso Analog Design Environment XL and find out how design teams can adopt Virtuoso Analog Design Environment XL in their design flow to take advantage of the productivity enhancing features mentioned in this blog, please contact your Cadence Application Engineer. &lt;/p&gt;&lt;p&gt;Here are the links to some of the Virtuoso Analog Design Environment XL videos.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; You need a COS (Cadence Online Support) account to access these videos.&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC615WhatsNewVideos/IC615_Launching_ADEG(XL)_from_ADEL.html"&gt;Creating new Analog Design Environment XL view from Analog Design Environment L and Opening existing Analog Design Environment XL view in Analog Design Environment L&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_SETUP/adexl_qs_setup_614.htm"&gt;Setting up multiple tests in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_SPEC_RUN/adexl_qs_spec_run_614.htm"&gt;Setting specifications &amp;amp; running simulations in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC614_ADEXL_QS_SWEEPS/adexl_qs_sweeps.htm"&gt;Variable &amp;amp; parameter sweeps in Virtuoso Analog Design Environment XL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/PA_DocumentViewer/wp/Video/Custom_IC_Design/IC615ISR1VideoUpdate/NewDebugEnvironment_ADEXL.html"&gt;Virtuoso Analog Design Environment XL Debug Environment&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Rama Jupalli&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1268388" width="1" height="1"&gt;</content><author><name>Rama Jupalli</name><uri>http://www.cadence.com/Community/members/Rama-Jupalli.aspx</uri></author><category term="Parasitic analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Parasitic+analysis/default.aspx" /><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="PAD" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PAD/default.aspx" /><category term="ADEnalog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADEnalog/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="parasitic-aware design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitic-aware+design/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /></entry><entry><title>SKILL for the Skilled: Sorting With SKILL++</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/05/03/skill-for-the-skilled-sorting-with-skill.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/05/03/skill-for-the-skilled-sorting-with-skill.aspx</id><published>2011-05-03T19:00:00Z</published><updated>2011-05-03T19:00:00Z</updated><content type="html">&lt;p&gt;In the previous couple of SKILL for the Skilled postings we looked at
some of the features of SKILL++.  In fact, we saw local functions,
higher-order functions, and lexical scoping. In this episode
of &lt;i&gt;SKILL for the Skilled&lt;/i&gt; I would like to show a few more
practical examples of these concepts.

&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Functions are first class&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

In the SKILL language, functions are themselves first class objects.
They can be created dynamically, and they can be passed around as
arguments to other functions.  We&amp;#39;ll see in the examples how to write
functions that generate functions, and why you might want to do that.

&lt;/p&gt;&lt;b&gt;Review of the SKILL &lt;code&gt;sort&lt;/code&gt; function&lt;/b&gt;

&lt;p&gt;The SKILL primitive &lt;code&gt;sort&lt;/code&gt; function, takes two
arguments. The first is the list to be sorted, and the second is a function
designator indicating a compare predicate.  A &lt;i&gt;predicate&lt;/i&gt; is a
function whose return value is to be interpreted as TRUE or FALSE.  A
compliant compare predicate (for &lt;code&gt;sort&lt;/code&gt;) promises to accept
two arguments and return a boolean value indicating whether the two
arguments given are &lt;i&gt;in order&lt;/i&gt; in some appropriate sense.  Often
there is already a built-in SKILL function which does the type of
comparison needed, and sometimes an
&lt;i&gt;on-the-fly&lt;/i&gt; function does the trick.  The code in example 5.1
uses a pre-existing function, &lt;code&gt;alphalessp&lt;/code&gt; as a compare
predicate.  In this case, the &lt;code&gt;sort&lt;/code&gt; function reorders the
list of strings alphabetically.

&lt;/p&gt;&lt;b&gt;Sorting with built-in sort predicates&lt;/b&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.1&lt;br /&gt;(sort (list &amp;quot;this&amp;quot; &amp;quot;is&amp;quot; &amp;quot;a&amp;quot; &amp;quot;list&amp;quot; &amp;quot;of&amp;quot; &amp;quot;words&amp;quot;)&lt;br /&gt;      &amp;#39;alphalessp)&lt;br /&gt;  &lt;i&gt;==&amp;gt; (&amp;quot;a&amp;quot; &amp;quot;is&amp;quot; &amp;quot;list&amp;quot; &amp;quot;of&amp;quot; &amp;quot;this&amp;quot; &amp;quot;words&amp;quot;)&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/04/skill-for-the-skilled-what-is-skill.aspx"&gt;As
seen previously&lt;/a&gt;, if your code is in SKILL++, you can simply
reference the global variable whose name is the same as the function
name: &lt;code&gt;alphalessp&lt;/code&gt;.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.2&lt;br /&gt;(inScheme&lt;br /&gt;  (sort (list &amp;quot;this&amp;quot; &amp;quot;is&amp;quot; &amp;quot;a&amp;quot; &amp;quot;list&amp;quot; &amp;quot;of&amp;quot; &amp;quot;words&amp;quot;)&lt;br /&gt;        alphalessp))&lt;br /&gt;  &lt;i&gt;==&amp;gt; (&amp;quot;a&amp;quot; &amp;quot;is&amp;quot; &amp;quot;list&amp;quot; &amp;quot;of&amp;quot; &amp;quot;this&amp;quot; &amp;quot;words&amp;quot;)&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;i&gt;For the rest of this article, please assume all top level SKILL
expressions reside in a &lt;code&gt;(inScheme ...)&lt;/code&gt; form.&lt;/i&gt;

&lt;/p&gt;&lt;b&gt;Implementing SKILL++ sort predicates&lt;/b&gt;

&lt;p&gt;The compare predicate of &lt;code&gt;sort&lt;/code&gt; may actually be any
callable object.  Several types of objects are callable in SKILL.
Symbols such as &lt;code&gt;alphalessp&lt;/code&gt; are callable if they name
existing functions or are somehow auto-loadable.  Function objects
created by &lt;code&gt;lambda&lt;/code&gt; are also callable.
&lt;/p&gt;&lt;p&gt;Global functions get created and named when you
use &lt;code&gt;procedure&lt;/code&gt; or &lt;code&gt;defun&lt;/code&gt;.  As we
&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/25/skill-for-the-skilled-continued-introduction-to-skill.aspx"&gt;saw
previously&lt;/a&gt; functions can also be created and named locally
using &lt;code&gt;flet&lt;/code&gt; and &lt;code&gt;labels&lt;/code&gt;.  But you can also
create nameless functions with &lt;code&gt;lambda&lt;/code&gt;.

&lt;/p&gt;&lt;p&gt;The code in example 5.3 creates a function
named &lt;code&gt;fileLengthLessp&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;;; Example 5.3&lt;br /&gt;(&lt;b&gt;defun fileLengthLessp&lt;/b&gt; (f1 f2)&lt;br /&gt;  (lessp (fileLength f1)&lt;br /&gt;         (fileLength f2)))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;
The code in example 5.4 creates an equivalent function, i.e., a function
that does the same thing as &lt;code&gt;fileLengthLessp&lt;/code&gt; when called,
but which has no name.  You have to store the value in a variable or pass
the value directly to a function, such as to the &lt;code&gt;sort&lt;/code&gt;
function.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.4&lt;br /&gt;(&lt;b&gt;lambda&lt;/b&gt; (f1 f2)&lt;br /&gt;  (lessp (fileLength f1)&lt;br /&gt;         (fileLength f2)))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;

In the following examples (5.5, 5.6, and 5.7) we want to sort a list
of file names (strings) according to the file size (in bytes).  There
are several ways to do this.  There is a SKILL built-in function to
return the file size, but there is no built-in SKILL function which
compares file sizes. However Example 5.3 above implements one
named &lt;code&gt;fileLengthLessp&lt;/code&gt;.  We can use that function as an
argument to &lt;code&gt;sort&lt;/code&gt;.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.5&lt;br /&gt;(sort (getDirFiles &amp;quot;.&amp;quot;)&lt;br /&gt;      fileLengthLessp)&lt;br /&gt;&lt;/pre&gt;

You can also build the function on-the-fly without a name as in
Example 5.6.

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.6&lt;br /&gt;(sort (getDirFiles &amp;quot;.&amp;quot;)&lt;br /&gt;      (lambda (f1 f2)&lt;br /&gt;         (lessp (fileLength f1)&lt;br /&gt;                (fileLength f2))))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;

You can also do this using &lt;code&gt;flet&lt;/code&gt; as in example 5.7.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.7&lt;br /&gt;(flet ((lesspFileLength (f1 f2)&lt;br /&gt;         (lessp (fileLength f1)&lt;br /&gt;                (fileLength f2))))&lt;br /&gt;  (sort (getDirFiles &amp;quot;.&amp;quot;)&lt;br /&gt;        lesspFileLength))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Reversing the sort order&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;Two more examples are seen in examples 5.8 and 5.9.  Example 5.8 shows
how to sort a list of strings in decreasing order according to (string)
length; i.e., longest string first.
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.8&lt;br /&gt;(sort list_of_strings&lt;br /&gt;      (lambda (a b)&lt;br /&gt;         (greaterp (strlen a)&lt;br /&gt;                   (strlen b))))&lt;br /&gt;&lt;/pre&gt;

Example 5.9 shows how to sort a list of sub-lists by decreasing order
according to (list) length.

&lt;pre&gt;;; Example 5.9&lt;br /&gt;(sort list_of_lists&lt;br /&gt;      (lambda (a b)&lt;br /&gt;         (greaterp (length a)&lt;br /&gt;                   (length b))))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Components of the sort predicate&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

Notice the similar code structure in examples 5.6, 5.8, and 5.9.
There are a couple characteristics of the compare function which we
can factor out.

&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;test&lt;/b&gt;: the kind of relation function, numerical relation such as
      greater (&lt;code&gt;greaterp&lt;/code&gt;) than or less than
      (&lt;code&gt;lessp&lt;/code&gt;), or an alphabetic type of relation
      such as &lt;code&gt;alphalessp&lt;/code&gt;.
  &lt;/li&gt;&lt;li&gt;&lt;b&gt;key&lt;/b&gt;: the kind of attribute we want to compare such as
      &lt;code&gt;length&lt;/code&gt;, &lt;code&gt;strlen&lt;/code&gt;, &lt;code&gt;fileLength&lt;/code&gt;,
      or &lt;code&gt;identity&lt;/code&gt;.
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;The &lt;code&gt;identity&lt;/code&gt; function&lt;/b&gt;

&lt;p&gt;
It will simplify a few things later if we first define a very
simple function called &lt;code&gt;identity&lt;/code&gt; to be a unary function
which returns its argument.  The &lt;code&gt;identity&lt;/code&gt; function
defined in example 5.10 is to function application, as zero is to
addition, and &lt;code&gt;1&lt;/code&gt; is to numerical multiplication.

&lt;/p&gt;&lt;p&gt;
;; Example 5.10
&lt;/p&gt;&lt;pre&gt;(defun identity (x)&lt;br /&gt;  x)&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Higher order functions -- calculating a sort predicate&lt;/b&gt;

&lt;p&gt;
We can use SKILL++ to &lt;i&gt;calculate&lt;/i&gt; the compare function to pass
to &lt;code&gt;sort&lt;/code&gt;.  Writing functions that generate functions is
an easy thing to do in SKILL++.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.11&lt;br /&gt;(defun genCmpFunction (@key (test lessp)&lt;br /&gt;                            (key  identity)) ;; see example 5.10&lt;br /&gt;   (lambda (A B)&lt;br /&gt;      (test (key A)&lt;br /&gt;            (key B))))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;

The function, &lt;code&gt;genCmpFunction&lt;/code&gt; defined in Example 5.11, can
be called with keyword arguments &lt;code&gt;?test&lt;/code&gt;
and &lt;code&gt;?key&lt;/code&gt; and returns a function which is compatible
with &lt;code&gt;sort&lt;/code&gt;; i.e., it returns a binary function which can
be used as a sort predicate.  The names
&lt;code&gt;test&lt;/code&gt;, and &lt;code&gt;key&lt;/code&gt; are somewhat standard
names--even if a bit confusing. Usage examples are shown in example
5.12.  The &lt;code&gt;key&lt;/code&gt; defaults to the
&lt;i&gt;identity&lt;/i&gt; function, and the &lt;code&gt;test&lt;/code&gt;
defaults to the &lt;code&gt;lessp&lt;/code&gt; function.


&lt;/p&gt;&lt;p&gt;&lt;b&gt;Using the higher order function&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;Now, the SKILL &lt;code&gt;sort&lt;/code&gt; can be used in a more generalized
way. We can rewrite the code examples in 5.5, 5.6, and 5.7.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.12&lt;br /&gt;&lt;br /&gt;;; reimplementation of example 5.6&lt;br /&gt;;; sort a list of file names by increasing file size&lt;br /&gt;(sort (getDirFiles &amp;quot;.&amp;quot;)&lt;br /&gt;      (genCmpFunction ?key fileLength))&lt;br /&gt;&lt;br /&gt;;; reimplementation of example 5.8&lt;br /&gt;;; sort a list of strings by decreasing string length&lt;br /&gt;(sort list_of_strings&lt;br /&gt;      (genCmpFunction ?key strlen&lt;br /&gt;                      ?test greaterp))&lt;br /&gt;&lt;br /&gt;;; reimplementation of example 5.9&lt;br /&gt;;; sort a list of sub-lists by decreasing list length&lt;br /&gt;(sort list_of_lists&lt;br /&gt;      (genCmpFunction ?key length&lt;br /&gt;                      ?test greaterp))&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Reimplementing the &lt;code&gt;sortcar&lt;/code&gt; function&lt;/b&gt;

&lt;p&gt;Notice that if the built-in function &lt;code&gt;sortcar&lt;/code&gt; did not
exist in SKILL, we could implement it using &lt;code&gt;sort&lt;/code&gt; as shown
in example 5.13.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.13&lt;br /&gt;(defun sortcar (list predicate)&lt;br /&gt;  (sort list&lt;br /&gt;        (genCmpFunction ?test predicate&lt;br /&gt;                        ?key car)))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;b&gt;Sorting objects from the Cadence Database&lt;/b&gt;


&lt;/p&gt;&lt;p&gt;The &lt;code&gt;genCmpFunction&lt;/code&gt; can generate useful sort predicates
for sorting data base objects under various criteria. Example 5.14
shows how to sort shapes in a Virtuoso layout from top-to-bottom
according to top edge.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.14&lt;br /&gt;(sort (geGetEditCellView)-&amp;gt;shapes&lt;br /&gt;      (genCmpFunction ?test greaterp&lt;br /&gt;                      ?key  topEdge))&lt;br /&gt;&lt;/pre&gt;

Example 5.15 shows how to sort the db-instances in a schematic
alphabetically according to instance name.  In this example, we
pass &lt;code&gt;?key&lt;/code&gt; as a function which will retrieve value of
the &lt;code&gt;name&lt;/code&gt; property from a db-instance.
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;;; Example 5.15&lt;br /&gt;(sort (geGetEditCellView)-&amp;gt;instances&lt;br /&gt;      (genCmpFunction ?test alphalessp&lt;br /&gt;                      ?key (lambda (i) i-&amp;gt;name)))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;b&gt;Review&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

In this posting we looked at the following concepts.
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The SKILL built-in sort function
  &lt;/li&gt;&lt;li&gt;Sorting list of string alphabetically (examples 5.1, 5.2)
  &lt;/li&gt;&lt;li&gt;Sorting file name by file size (examples 5.5, 5.6, 5.7)
  &lt;/li&gt;&lt;li&gt;Calculating sort predicates programmatically (example 5.11)
  &lt;/li&gt;&lt;li&gt;Reimplementing &lt;code&gt;sortcar&lt;/code&gt; based on a generalized sort predicate
  &lt;/li&gt;&lt;li&gt;Using higher-order function in conjunction with sorting strings
  and db-objects.
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;To Be Continued&lt;/b&gt;&lt;p&gt; 

In the next posting we&amp;#39;ll see more examples of how to use
these types of higher order functions with virtuoso, for example to
sort pin figures clockwise around the boundary of the cellView. In
addition we&amp;#39;ll generalize the &lt;code&gt;genCmpFunction&lt;/code&gt; further to
allow for secondary and ternary sorting criteria.

&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;p&gt;&lt;b&gt;Previous Posts&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/25/skill-for-the-skilled-continued-introduction-to-skill.aspx"&gt;SKILL for the Skilled: Continued Introduction to SKILL++&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/04/skill-for-the-skilled-what-is-skill.aspx"&gt;SKILL for the Skilled: What is SKILL++?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/06/skill-for-the-skilled-rule-of-english-translation.aspx"&gt;SKILL for the Skilled: Rule of English Translation&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/11/08/skill-for-the-skilled-making-programs-clear-and-concise.aspx"&gt;SKILL for the Skilled:&amp;nbsp; Making Programs Clear and Concise&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1268036" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="sorting" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/sorting/default.aspx" /><category term="functions" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/functions/default.aspx" /><category term="sort" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/sort/default.aspx" /></entry><entry><title>Thing You Didn't Know About Virtuoso: Redux</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/04/27/thing-you-didn-t-know-about-virtuoso-redux.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/04/27/thing-you-didn-t-know-about-virtuoso-redux.aspx</id><published>2011-04-27T23:00:00Z</published><updated>2011-04-27T23:00:00Z</updated><content type="html">&lt;p&gt;After a long break, I&amp;#39;m going to try to venture back into the blogosphere, starting off nice and easy--by cheating...&lt;/p&gt;&lt;p&gt;You see, Virtuoso IC 6.1.5 came out at the end of January, and one of the changes made to the Schematic Editor is that many of the handy dockable assistants featured in IC 6.1 are now available at the basic L tier of software.&amp;nbsp; If you don&amp;#39;t know what that means, don&amp;#39;t worry, because what I&amp;#39;m trying to say is that now, everybody can use these features!&lt;/p&gt;&lt;p&gt;And since I have already blogged about these assistants, I get to write a new article that pretty much consists of nothing but a bunch of links to those previous posts.&amp;nbsp; So here goes...&lt;/p&gt;&lt;p&gt;The assistants that are now available in VSE L are:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/05/26/things-you-didn-t-know-about-virtuoso-navigator-assistant.aspx" target="_blank"&gt;Navigator Assistant&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Since I wrote the initial post, the Navigator now enables you to add probes using the &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/23/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-RMB_2C00_-OMG_2100_-_3B002D002900_.aspx" target="_blank"&gt;RMB&lt;/a&gt;&amp;nbsp;(remember that&amp;nbsp;&amp;quot;right mouse button&amp;quot;?) on instances, nets or nets and connected instances.&amp;nbsp; You can choose what color probe to create and the probes get highlighted with that color in the schematic and the Navigator all the way down the hierarchy.&amp;nbsp; There is also a search field at the top of the assistant and a new filter to display only probed objects.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/01/things-you-didn-t-know-about-virtuoso-editing-properties.aspx" target="_blank"&gt;Property Editor Assistant&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I am still surprised when I sit and work with customers and they are constantly popping up that gigantic bindkey &amp;quot;q&amp;quot; property editor form over and over again.&amp;nbsp; Especially now in IC 6.1.5.&amp;nbsp;&amp;nbsp; You&amp;#39;ve selected the instance(s).&amp;nbsp; Just look in the lower left corner of your window.&amp;nbsp; The information you&amp;#39;re looking for is already displayed right there in front of you.&amp;nbsp; Get your finger off of that &amp;quot;q&amp;quot; key!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/07/17/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-Search-Assistant.aspx" target="_blank"&gt;Search Assistant&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now you can also use the Search Assistant to find bindkey definitions and CDS environment variables.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/07/09/tydkav-9.aspx" target="_blank"&gt;World View Assistant&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Another woefully underused assistant.&amp;nbsp; With this assistant, coupled with the new &lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC615_Using_The_MagnifierCOS.html;searchHash=a123f31acb5a56001f38445115d89331" target="_blank"&gt;Magnifier&lt;/a&gt; in IC 6.1.5, you need never zoom in or out again.&amp;nbsp; Yes, I said &amp;quot;Magnifier&amp;quot;.&amp;nbsp; Try &amp;quot;&lt;b&gt;View-&amp;gt;Magnifier&lt;/b&gt;&amp;quot; (or bindkey &amp;quot;.&amp;quot;) in the schematic window (use &lt;b&gt;Options-&amp;gt;Magnifer&lt;/b&gt; to adjust).&lt;/p&gt;&lt;p&gt;Also check out the articles on the general usage of &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/09/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-Managing-Your-Real-Estate-_2D00_-Part-1.aspx" target="_blank"&gt;Assistants&lt;/a&gt; and &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/16/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-Managing-Your-Real-Estate-_2D00_-Part-2.aspx" target="_blank"&gt;Workspaces&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So before you straightaway go for the little &amp;quot;x&amp;quot; button to close those assistants, do a little homework and maybe you&amp;#39;ll find something you like!&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1267917" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="Schematic-driven Layout" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Schematic-driven+Layout/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="Search Assistant" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Search+Assistant/default.aspx" /><category term="Property Editor" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Property+Editor/default.aspx" /><category term="Navigator" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Navigator/default.aspx" /><category term="schematic" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/schematic/default.aspx" /></entry><entry><title>Analog IP Verification - A Reference Guide to Practices Used</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/04/18/analog-ip-verification-a-reference-guide-to-practices-used.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/04/18/analog-ip-verification-a-reference-guide-to-practices-used.aspx</id><published>2011-04-18T17:00:00Z</published><updated>2011-04-18T17:00:00Z</updated><content type="html">&lt;p&gt;I have had a lot of discussions recently around improving the final integration of analog IP.

There has been a lot of material published over the years to aid in this task, and I wanted to point to some of my favorites while talking about what has and has not changed.

&lt;/p&gt;&lt;p&gt;There is a lot to be learned from digital verification methodologies applied to &amp;quot;big A&amp;quot; mixed signal designs, and the first is leveraging a systematic approach to functional verification in order to continually converge on your specification. Applying this approach enables the design team to avoid connectivity issues and expand coverage of more complex analog/mixed-signal systems.The following papers provide a good guide to the growth of mixed signal verification and its future direction with some good examples.

&lt;/p&gt;&lt;p&gt;Although the first paper is relatively old, the goal and details outlined by the author are very clear, making this a good foundation to build upon.
Here our author, Jonathan David, takes us through a programmable approach to functional verification on a 10/100 Ethernet Phy.
&lt;a href="http://tinyurl.com/4yk6ux5"&gt;Best Practices and Methods for Mixed-Signal Verification&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Designer&amp;rsquo;s Guide outlines a very good methodology for a similar concept with mixed signal verification in their paper, &lt;a href="http://tinyurl.com/43qa9rj"&gt;Designer&amp;rsquo;s Guide Consulting Introduction to Analog Verification&lt;/a&gt;. This paper starts to take into consideration the power of abstracting your analog blocks upwards for functional verification.
&lt;/p&gt;&lt;p&gt;I cannot forget to mention my friends at Triune Systems and the webinar we put together late last year where they described how they used the top down design methodology approach to converge on design feasibility for power management:
&lt;a href="https://www.cadence.com/cadence/events/Pages/event.aspx?eventid=431"&gt;Are You Ready for Your Next-Generation Analog/Mixed-Signal Product?&lt;/a&gt; &lt;/p&gt;&lt;p&gt;What about the direction that mixed-signal verification and analog functional verification are going and what can be accomplished today?
For presentations on Mixed-Signal Approaches in Assertion-Based Verification, and Verification Solutions for Digitally Calibrated Analog Design, see the &lt;a href="http://vault.eetimes.com/armconference/proceedings/"&gt;ARM Tech Conference 2010 proceedings&lt;/a&gt;,&amp;nbsp;
ARM Tech Conference 2010 Day 1, ATC-122 and ATC-124.&lt;/p&gt;&lt;p&gt;

I will leave you with my most recent favorite:
William Dunham&amp;#39;s webinar with EETimes,
&lt;a href="http://tinyurl.com/3c9cx5p"&gt;Efficient Functional Verification for Mixed Signal IP&lt;/a&gt;.

There are a lot of opportunities to improve analog verification and the tools are here today to help companies make significant impacts.

I hope you all enjoy the material referenced as much as I have, and more importantly can take something away from it to improve your productivity and quality of your silicon.

&lt;/p&gt;&lt;p&gt;John Pierce
&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1267625" width="1" height="1"&gt;</content><author><name>JohnPierce</name><uri>http://www.cadence.com/Community/members/JohnPierce.aspx</uri></author><category term="AMS Simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS+Simulation/default.aspx" /><category term="mixed-signal simulators" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal+simulators/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="AMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS/default.aspx" /><category term="assertions" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertions/default.aspx" /><category term="assertion" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertion/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /></entry><entry><title>Will Evolving Language Standards Address Mixed-Signal Verification Problems? </title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/04/18/will-the-evolving-language-standards-address-mixed-signal-verification-problems.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/04/18/will-the-evolving-language-standards-address-mixed-signal-verification-problems.aspx</id><published>2011-04-18T16:00:00Z</published><updated>2011-04-18T16:00:00Z</updated><content type="html">&lt;p&gt;Mixed-signal verification has been one of the hottest topics in the past year, and it was very evident in DVCon 2011, looking at the number of technical papers submitted on this topic. Engineers are looking for solutions to solve tough problems in this space, and the creativity put into developing custom solutions is mind blowing. We are at an interesting stage where engineer&amp;#39;s minds are racing past the capabilities of EDA tools and the lack of standard languages to find their own innovative solutions. &lt;/p&gt;&lt;p&gt;First generation standards such as Verilog-AMS and Verilog-A introduced behavioral modeling to the analog world. But the complexity of mixed-signal designs have grown exponentially, and this begs for the evolution of next generation standards. Some of the successful methodologies adopted for digital SoC verification need to be extended to the analog/mixed-signal world. Extraordinary work is being done developing these new standards under the leadership of Scott Little from Freescale Semiconductor, chair of the IEEE SystemVerilog Discrete Real Modeling Committee (SV-DC) and Analog SystemVerilog Assertion (A-SVA) committees. Scott was grateful to address some of my questions on the progress of these standards committees.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What is the charter of SV-DC?&amp;nbsp; How can one participate or contribute to this effort?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;SV-DC intends to provide capabilities in SystemVerilog to support efficient modeling of analog/mixed-signal circuit components.&amp;nbsp; These models are to be simulated by the event-driven simulation engine and should, therefore, exhibit simulation performance comparable to digital models and be suitable for system level simulation.&amp;nbsp; The new modeling capabilities will be achieved by natural extensions to the existing SystemVerilog language; no analog solvers or netlist manipulations will be required.&amp;nbsp; [Note: This is the Executive Summary from the SV-DC roadmap.&amp;nbsp; The entire roadmap can be found at &lt;a href="http://bit.ly/apjS6s"&gt;http://bit.ly/apjS6s&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;SV-DC is a technical subcommittee of the IEEE P1800 (SystemVerilog) Working Group.&amp;nbsp; The participation rules for this group have recently changed.&amp;nbsp; The current rules state that IEEE SA Advanced and Basic members can participate as observers.&amp;nbsp; For a list of IEEE SA members please see &lt;a href="http://standards.ieee.org/develop/corpchan/mbrs1.html"&gt;http://standards.ieee.org/develop/corpchan/mbrs1.html&lt;/a&gt;.&amp;nbsp; For active participation IEEE-SA advanced member companies need to join the P1800 Working Group which requires an additional fee.&amp;nbsp; Information regarding those fees can be obtained from the P1800 Working Group chair, Karen Pieper (&lt;a href="mailto:karen_l_pieper@yahoo.com"&gt;karen_l_pieper@yahoo.com&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;&lt;b&gt;What applications do you see for the SV-DC functionality? &lt;/b&gt;&lt;/p&gt;&lt;p&gt;The primary application that I see for the functionality being developed in SV-DC is the modeling of AMS circuits.&amp;nbsp; Modeling experts and SoC verification engineers have an increasing need for efficient, abstract models for AMS components.&amp;nbsp; The features being discussed in SV-DC will help them fill this need.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Can you tell us about the progress rate of SV-DC?&amp;nbsp; When can we expect a final standard?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The SV-DC committee is currently in the process of refining a proposal that adds user-defined nets and resolution functions to the SystemVerilog language.&amp;nbsp; We believe this proposal provides a core set of real-valued modeling features in SystemVerilog.&amp;nbsp; For example, using these features a user can create a single net containing two real values, one representing voltage and the other representing resistance.&amp;nbsp; In cases where there are multiple drivers on a net of this type the user-defined resolution function will be used to determine the resolved value of the net.&lt;/p&gt;&lt;p&gt;We are on schedule to vote on a final version of that proposal in early May.&amp;nbsp; After that proposal is complete, we have until October 1, 2011 to address additional items.&amp;nbsp; The next item on our agenda is not currently set.&lt;/p&gt;&lt;p&gt;This work is expected to be in the next revision of SystemVerilog which is currently scheduled to be released in the middle of 2012.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Why was this done in IEEE Vs Accellera?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The user community wanted a real-valued modeling solution in the SystemVerilog language, and SystemVerilog work is done in IEEE.&amp;nbsp; It may have been possible to add these features to SystemVerilog through the SystemVerilog/Verilog-AMS (SV-AMS) merger, but it was felt that the majority of the desired features are not present in the current Verilog-AMS standard and would require significant changes to the core SystemVerilog functionality.&amp;nbsp; Based on that analysis, it was decided to add these features directly to the SystemVerilog standard while managing any potential compatibility issues with Verilog-AMS wreal.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Will SV-DC make SV-AMS irrelevant? What things should SV-AMS deliver that SV-DC cannot?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;No, SV-DC will not make SV-AMS irrelevant.&amp;nbsp; SV-AMS brings the promise of being able to mix Verilog-AMS constructs with SystemVerilog constructs.&amp;nbsp; For example, using SV-AMS I could access electrical quantities or analog events in an assertion.&amp;nbsp; I could connect a driver to an AMS DUT using an interface.&amp;nbsp; These constructs provide tremendous value and are clearly outside the SV-DC charter.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What is the charter of A-SVA? How can one participate or contribute to this effort?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A-SVA is a subcommittee of Verilog-AMS that is charged with studying language features necessary for AMS assertions.&amp;nbsp; To participate one only needs to begin attending the meetings or participating on the e-mail reflector.&amp;nbsp; Instructions for joining the e-mail reflector can be found on the ASVA web page at &lt;a href="http://www.eda.org/twiki/bin/view.cgi/VerilogAMS/AmsAssertions"&gt;http://www.eda.org/twiki/bin/view.cgi/VerilogAMS/AmsAssertions&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Where does A-SVA fit in? Is it designed to be part of SV-AMS?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A-SVA fits best into SV-AMS.&amp;nbsp; The A-SVA committee spent a number of months trying to fit the A-SVA requirements into Verilog-AMS or SystemVerilog alone.&amp;nbsp; The eventual conclusion was that the full power of SV-VAMS is needed to properly support A-SVA.&amp;nbsp; The committee is currently investigating the addition of unclocked LTL operators into SVAs as well as the addition of SVAs to Verilog-AMS.&amp;nbsp; Both of these efforts are useful, but they will not provide the full power of A-SVA originally envisioned by the committee.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What are the technical challenges extending assertions from digital to analog/mixed-signal?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;One of the primary challenges in extending assertions from digital to AMS is efficiently managing the notion of dense time.&amp;nbsp; The assertion evaluation engine will not be efficient if it checks the property at every point of time.&amp;nbsp; However, it must check often enough to accurately measure the property.&lt;/p&gt;&lt;p&gt;Another key difficulty is defining the syntax and semantics for an assertion language that allows the free intermingling of realtime and clocked sequences and properties.&amp;nbsp; We believe this is a key feature of a user friendly AMS assertion language, but it is a difficult problem to solve.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What is the value add of assertions for verifying analog designs? &lt;/b&gt;&lt;/p&gt;&lt;p&gt;The value added by assertions when verifying analog designs is very similar to the value added by assertions when verifying digital designs.&amp;nbsp; Assertions enable designers and verification engineers to encode assumptions and specifications in an unambiguous manner.&amp;nbsp; Assertions also enable efficient debugging by identifying errors when and where they occur. &lt;/p&gt;&lt;p&gt;&lt;b&gt;What needs to happen for engineers to adopt such a methodology?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I believe the primary thing that needs to happen for adoption of an AMS assertion-based verification methodology is tool support.&amp;nbsp; Right now, I am seeing some adoption of the methodology even with the convoluted ways we are forced to use it today.&amp;nbsp; I expect increased adoption when the flow becomes easier to use.&amp;nbsp; Increasing adoption of these methods isn&amp;#39;t difficult when you can demonstrate that it finds bugs and improves quality. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Do you think a &amp;quot;metric driven verification&amp;quot; methodology can increase the overall productivity of analog designs? Why?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I hesitate to say that metric driven verification will increase the productivity of analog designs.&amp;nbsp; I would rather focus on how it can improve the quality of analog design.&amp;nbsp; Metric driven verification is focused on quantifying what has been verified and what still needs to be verified.&amp;nbsp; I believe that adding this additional structure into the traditional AMS verification process will improve the overall quality of AMS designs.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What are the main drivers for adoption of such a methodology?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The main driver is avoiding the dreaded re-spin.&amp;nbsp; AMS circuits are becoming more complicated along several different axes.&amp;nbsp; Two of the most notable drivers of metric driven verification are the addition of complicated digital control and low power features.&amp;nbsp; Traditional analog verification methods do a good job of getting the analog content functioning properly, but they often fall short in dealing with problems related to integration and low power features.&amp;nbsp; I have seen a metric driven methodology improve the ability for AMS designers to identify and fix integration and low power issues.&lt;/p&gt;&lt;p&gt;Srikanth V Raghavan &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1267687" width="1" height="1"&gt;</content><author><name>Raggie</name><uri>http://www.cadence.com/Community/members/Raggie.aspx</uri></author><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="SVA" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SVA/default.aspx" /><category term="AMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS/default.aspx" /><category term="SystemVerilog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SystemVerilog/default.aspx" /><category term="assertion-based" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertion-based/default.aspx" /><category term="accellera" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/accellera/default.aspx" /><category term="DMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/DMS/default.aspx" /><category term="SV-DC" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SV-DC/default.aspx" /><category term="A-SVA" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/A-SVA/default.aspx" /></entry><entry><title>Virtuoso IC 5.1.41 Was Good but Virtuoso IC 6.1 is Better</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/04/13/virtuoso-ic-5-1-41-was-good-but-virtuoso-ic-6-1-is-better.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/04/13/virtuoso-ic-5-1-41-was-good-but-virtuoso-ic-6-1-is-better.aspx</id><published>2011-04-13T13:00:00Z</published><updated>2011-04-13T13:00:00Z</updated><content type="html">&lt;p&gt;With the recent release of unified &lt;a href="http://www.cadence.com/cadence/newsroom/features/Pages/custom_analog.aspx"&gt;custom/analog flow&lt;/a&gt; that is based on the latest version of the Virtuoso IC 6.1.5 technologies (see Virtuoso IC 6.1.5 press release &lt;a href="http://www.cadence.com/cadence/newsroom/press_releases/Pages/pr.aspx?xml=031411_custom_analog"&gt;here&lt;/a&gt;), it is time to revisit the strengths of Virtuoso IC 6.1 platform and find out how new capabilities enable designers with the productivity gains they have been clamoring for.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Open Access and SKILL &lt;/b&gt;&lt;/p&gt;&lt;p&gt;One of the major changes in Virtuoso IC 6.1 is the database. For the last 20 years, the Cadence Data Base (CDB) has been used. However, starting from IC 6.1, keeping pace with the &amp;quot;open source&amp;quot; movement and the Cadence goal of an open environment, we have started using the &amp;nbsp;Open Access (OA) database. This allows custom/analog teams to save the data in a format that can be accessed by applications from different EDA vendors without the need for translation. &lt;/p&gt;&lt;p&gt;The OA database was built by Cadence and was donated to Silicon Integration Initiative (Si2) to encourage the adoption of it by other EDA vendors. The OA database was architected and developed to handle larger designs, offer faster response and enable easier implementation. Cadence works closely with customers who are migrating to Virtuoso IC 6.1 technology by providing technical help and application resources to make the migration as seamless as possible.&lt;/p&gt;&lt;p&gt;Cadence users know that the SKILL language plays a central role in our technologies. All the PDK and GUI development is done in SKILL and many tools that integrate into Virtuoso technologies do so using SKILL. SKILL is ubiquitous in PDK development with each and every major foundry supplying SKILL PCells as part of their PDKs. &lt;/p&gt;&lt;p&gt;In Virtuoso IC 6.1, we greatly improved the functionality of SKILL. Cadence recognizes that a new crop of CAD engineers and software developers are more in-tune with object oriented programming concepts. To let engineers take advantage of these techniques in customizing their design flows, Cadence has made SKILL++ available to developers. Like other object oriented programming languages, SKILL++ lets CAD teams take advantage of latest developments in software programming in customizing their design flows and methodologies.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Virtuoso Schematic Editor&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The Industry leading Cadence Virtuoso Schematic Editor provides custom/analog engineers with an easy to use design entry tool with various capabilities to enable fast, intuitive, and comprehensive schematic capture. To ensure a smooth and easy transition to Virtuoso IC 6.1, the same look and feel and a similar use model was maintained, at the same time providing engineers with features and capabilities to increase the productivity in their day-to-day design activities. Features include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Easy-to-use, lockable Navigator, Property Editor, Search, Annotation Browser, World View assistants, etc... to increase designer efficiency&lt;/li&gt;&lt;li&gt;On-canvas editing capability to edit, modify object properties without the need to open multiple forms&lt;/li&gt;&lt;li&gt;Multi-window multi-tabbed schematic canvas, bookmarks, and history provide an intuitive editing environment, allowing designers to open multiple schematics, or different views of the same design, consequently enabling effective design management &lt;/li&gt;&lt;li&gt;A magnifier to explore and enlarge an area under the mouse cursor, read and edit labels and save zoom-in/out commands&lt;/li&gt;&lt;li&gt;HTML publisher for schematics - Create multi-frame HTML/XML document, with all top-to-bottom schematic views, an index and hyperlinks, to walk through the design with the preferred browser&lt;/li&gt;&lt;li&gt;Power Intent Export Assistant and Common Power Format (CPF) file creation capability to set power domains in a hierarchical schematic &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Virtuoso IC 6.1 is the first release to enable constraint-driven design. Constraints are design rules that allow design teams to maintain design intent throughout the design cycle. Instead of relying on schematic notes, emails and various other documents, constraints provide a systemic methodology to maintain consistent information between front-end designers and back-end physical implementation teams. Easy-to use constraint entry mechanism and constraint notes in Virtuoso IC 6.1 allows for formal communication mechanism across the team members. &lt;/p&gt;&lt;p&gt;To know more about Virtuoso Schematic Editor, click &lt;a href="http://www.cadence.com/rl/Resources/datasheets/virtuoso_vse_fam_ds.pdf"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In the next few blogs, I will showcase the Virtuoso Analog Design Environment and give you detailed look at its capabilities so that users can find out how the new and improved Virtuoso Analog Design Environment enables designer productivity. &lt;/p&gt;&lt;p&gt;Rama Jupalli&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Related Blog Posts&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/17/rapid-analog-prototyping-hand-crafted-layout-gets-a-needed-boost-in-productivity.aspx?postID=1266670"&gt;Rapid Analog Prototyping - Handcrafted Layout Gets a Needed Productivity Boost&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/16/early-analysis-is-key-parasitic-aware-design.aspx?postID=1261045"&gt;Early Analysis is Key - Parasitic-Aware Design&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/14/software-and-fine-red-wine.aspx?postID=1260991"&gt;Virtuoso IC6.1.5: Software and Fine Red Wine&lt;/a&gt;&lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx?postID=1260992"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx?postID=1260992"&gt;How Parasitic-Aware Design Flow Improves Custom/Analog Productivity&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1267465" width="1" height="1"&gt;</content><author><name>Rama Jupalli</name><uri>http://www.cadence.com/Community/members/Rama-Jupalli.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="Constraint-driven" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Constraint-driven/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /></entry><entry><title>Rapid Analog Prototyping - Handcrafted Layout Gets a Needed Productivity Boost</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/17/rapid-analog-prototyping-hand-crafted-layout-gets-a-needed-boost-in-productivity.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/03/17/rapid-analog-prototyping-hand-crafted-layout-gets-a-needed-boost-in-productivity.aspx</id><published>2011-03-17T22:00:00Z</published><updated>2011-03-17T22:00:00Z</updated><content type="html">&lt;p&gt;As more and more custom/analog designs migrate to advanced process nodes (&amp;lt;65nm), design teams are being confronted with an ever-increasing need to better manage the impact of parasitics throughout the entire custom/analog design flow. In addition, more and more layout design teams are finding themselves drawn into the front-end design team&amp;#39;s simulation flow and their path to parasitic closure. &lt;/p&gt;&lt;p&gt;But why is a new approach needed, when many custom/analog methodologies today already incorporate estimated layout dependent effects in PCell device models, device callbacks, and in estimated wire models?&amp;nbsp; At advanced process nodes, layout-dependent effects increasingly not only have to take into account separate device and wire effects, but also the effects of devices and wires related to their surrounding environments,. Anywhere from 20-30% of a circuit&amp;#39;s performance can be attributed to the effects of the surrounding environment. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Layout-Dependent Effects&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Two such layout dependent effects are shallow trench isolation (STI) and well proximity effect (WPE).&amp;nbsp; STI effects for a device must take into account the distance of a gate to each edge of the diffusion, gate to gate separation, and the overall length of the diffusion.&amp;nbsp;&amp;nbsp; As such, any handcrafting of devices or groups of devices -- including any folding, merging, abutting, and dummy insertion -- all impact STI effects and a consequently a device&amp;#39;s performance.&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/MKelly_031711.jpg"&gt;&lt;img border="0" src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/MKelly_031711.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Figure 1 -- STI Illustration&lt;/p&gt;&lt;p&gt;WPE effects must take into account the distance or proximity of a device to the edge of the well, and in turn a device&amp;#39;s performance is directly correlated to this distance. This effect can only be accurately determined after placement and any handcrafting, including any merging of multiple devices into common wells.&lt;/p&gt;&lt;p&gt;Continuing with inaccurate parasitic estimation methodologies or inserting time-consuming handcrafted layouts in the midst of highly iterative front-end simulation flows would not only have a negative impact on the productivity of both the front-end design team and layout team, but would increase overall risk in the success of a product. &lt;/p&gt;&lt;p&gt;Thus, new custom/analog design flow methodologies that provide more accurate parasitic estimates faster and sooner in the design flow are needed for advanced node designs.&lt;/p&gt;&lt;p&gt;The Virtuoso parasitic-aware design flow provides parasitic closure faster and in fewer design iterations, without sacrificing design performance on advanced node designs. The Virtuoso parasitic-aware design flow spans the design, verification and implementation phases of custom/analog design.&amp;nbsp; For an overview of the entire Virtuoso parasitic-aware design flow, please see Richard Goering&amp;#39;s &lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx?CMP=home"&gt;blog&lt;/a&gt;, and for details on the design and verification phases, please see Rama Jupalli&amp;#39;s &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/16/early-analysis-is-key-parasitic-aware-design.aspx?postID=1261045"&gt;blog&lt;/a&gt;. The remainder of this blog will focus on the physical implementation or layout phase, and specifically how Rapid Analog Prototyping delivers more accurate parasitic estimates faster.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Better Productivity for Managing Parasitics&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Rapid Analog Prototyping brings handcrafted layout a needed boost in productivity required for managing parasitics in advanced node designs. It does this by selectively automating key aspects of custom/analog layout, providing direct access to advanced automated technologies from the familiar industry-standard Virtuoso layout cockpit, all integrated on a common Open Access database.&lt;/p&gt;&lt;p&gt;By allowing layout designers to selectively automate key aspects of custom/analog layout, they can rapidly create layout prototypes with more accurate parasitics for front-end designers, while focusing their creativity on precision hand crafting final layouts.&lt;/p&gt;&lt;p&gt;There are three key Rapid Analog Prototyping tasks in the physical implementation or layout phase of the Virtuoso parasitic-aware design &lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx?CMP=home"&gt;flow&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Module Generation&lt;/li&gt;&lt;li&gt;Device Placement&lt;/li&gt;&lt;li&gt;Net Routing&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Virtuoso&amp;#39;s advanced module generators are built on SKILL PCells to automatically assist a layout designer in generating complex, highly matched, structured arrays of devices for common analog subcircuits like differential pairs, current mirrors, and more.&amp;nbsp; &amp;nbsp;&amp;nbsp;A layout designer can selectively automate merging, abutting, and interdigitating multiple devices, as well as inserting dummies and guardrings.&amp;nbsp; The module generators rapidly create DRC and LVS correct layout ready for parasitic extraction while accurately reflecting layout dependent effects such as STI effects.&lt;/p&gt;&lt;p&gt;Virtuoso&amp;#39;s advanced custom/analog device placement is capable of rapid constraint driven placement of SKILL PCells and module generators.&amp;nbsp; A layout designer can selectively create rapid placement prototypes in three increasing modes of automation: quick placement for quick area estimation, quick placement based on device positioning in the schematic, and fully automated placement that minimizes area and overall wire length and automatically places similar devices in clusters and merges common wells.&amp;nbsp; The rapid analog placements are DRC and LVS correct layouts ready for parasitic extraction, while accurately reflecting layout dependent effects such as WPE effects. &lt;/p&gt;&lt;p&gt;Virtuoso&amp;#39;s advanced custom/analog net routing is provided by the Space-Based Router technology.&amp;nbsp; A layout designer can selectively complete net routing in increasing modes of automation - interactive wire editing, assisted autorouting and fully automated routing.&amp;nbsp; All net routing is DRC and LVS correct layout ready for parasitic extraction, while more accurately reflecting layout dependent effects of wires.&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Rapid Analog Prototyping and the Virtuoso parasitic-aware design flow are part of a recently announced Cadence Silicon Realization &lt;a href="http://www.cadence.com/cadence/newsroom/features/Pages/custom_analog.aspx?CMP=031411custom_analog_bb"&gt;custom/analog flow&lt;/a&gt; focused on unified intent, abstraction, and convergence.&amp;nbsp; This flow leverages the breadth, depth, and integration of Virtuoso Schematic Editor, Virtuoso Analog Design Environment, Virtuoso MMSIM, Virtuoso Layout Suite, and in-design manufacturing Virtuoso DFM.&lt;/p&gt;&lt;p&gt;Please send me your comments on what issues you see with parasitics, how you manage those today in your design flows, and what improvements you would like to see.&lt;/p&gt;&lt;p&gt;Michael Kelly&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1266670" width="1" height="1"&gt;</content><author><name>mrkelly</name><uri>http://www.cadence.com/Community/members/mrkelly.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Constraint-driven" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Constraint-driven/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="advanced node" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/advanced+node/default.aspx" /><category term="PAD" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PAD/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /><category term="AMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="parasitic-aware design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitic-aware+design/default.aspx" /><category term="custom/analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx" /><category term="modgens" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/modgens/default.aspx" /><category term="RAP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/RAP/default.aspx" /><category term="PCells" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PCells/default.aspx" /><category term="rapid analog prototyping" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/rapid+analog+prototyping/default.aspx" /><category term="Virtuoso Layout Suite" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Layout+Suite/default.aspx" /></entry><entry><title>Early Analysis is Key – Parasitic-Aware Design</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/16/early-analysis-is-key-parasitic-aware-design.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/03/16/early-analysis-is-key-parasitic-aware-design.aspx</id><published>2011-03-16T13:00:00Z</published><updated>2011-03-16T13:00:00Z</updated><content type="html">&lt;p class="MsoNormal"&gt;Decreasing geometries and increasing design complexity are
making the task of designing custom ICs very difficult (not that it was easy
before). One of the main issues designers grapple with is the issue of
parasitics and their effect on design specifications and yield estimates. With increasing cost pressures and decreasing
ASPs, meeting yield targets could decide the commercial success of the chip.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;In an era of ever shortening design cycles, waiting for
layout engineers to provide designers with a complete, optimized layout and
then perform post-layout verification is not always preferable, and in many
cases it&amp;#39;s inefficient. Having a methodology to consider the effects of parasitics in
the early stages of design cycle is crucial to the success of the project. This
is precisely where a parasitic-aware design flow comes to the help of designers.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Parasitic-aware design is a design
methodology that allows designers to understand and analyze the effect of
parasitics and help take corrective actions. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;There are two aspects to parasitic-aware design flow. One
part of parasitic-aware design deals with the front-end design, and the other
with the physical implementation (see parasitic-aware design flow diagram &lt;a href="https://www.cadence.com:443/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx?CMP=home"&gt;here&lt;/a&gt;). &lt;span style="font-size:11pt;line-height:115%;font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;/span&gt;In this blog we will focus on design and verification
phases of design, cover important features of parasitic-aware design flow, and show how
these features add value to designers in their day-to-day design activities.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;In the front-end, the industry leading tools such as the Virtuoso
Schematic Editor and Virtuoso Analog Design Environment allow designers to
capture design intent and characterize the design for a multitude of operating
conditions. A schematic editor with features like Canvas Magnifier, Custom Checks
Creator, and HTML Publisher for Schematics will ensure reduced mouse clicks and
increased productivity.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Analog Design
Environment XL&amp;rsquo;s Multi-Test environment has statistical analysis (Corners, Monte
Carlo) capabilities that allow designers to use hardware resources efficiently,
and comprehensively verify the design. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Native RelXpert integration with Analog
Design Environment XL will enable designers to perform reliability analysis and
better understand age and stress related effects on their designs. Design
documentation capabilities provide designers with a simple but powerful way to capture
all the necessary information and electronically tie this information to the IP
for improved intra- and inter- design team communication.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;Parasitic estimation and parasitic stitching to incorporate
parasitics in early stages of the design are key steps in the parasitic-aware
design flow. &lt;span&gt;&amp;nbsp;&lt;/span&gt;These techniques enable
designers to leverage the prior knowledge and experience they have about
parasitics on similar designs, and to incorporate this knowledge into the design
they are working on. Analog Design Environment GXL provides designers with an easy
to use GUI to accomplish this task. &lt;span&gt;&amp;nbsp;&lt;/span&gt;Designers
can estimate parasitics by manually adding R, C, L and K to the schematic, such
that the estimated parasitics are representative of those coming from the final
layout. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Alternatively, users can stitch parasitics from previously designed
modules into the design they are working on. Since the majority of the designs
are reused in one form or another, parasitic stitching could be a more accurate
form of parasitic estimation. Designers can then use Analog Design Environment XL
to simulate and compare results with schematic design to analyze and understand
parasitic effects. Designers can subsequently filter, refine, and customize
these parasitics to meet their design specific needs and analyze their effects
on various figures of merit. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Designers can iterate through this process
multiple times to clearly understand parasitic effects in the early stages of
design cycle, and do so without a final layout.&lt;span&gt;&amp;nbsp;
&lt;/span&gt;The availability of various Cadence simulators (such as Spectre, SpectreRF,&lt;span&gt;&amp;nbsp; &lt;/span&gt;UltraSim, Accelerated Parallel Simulator, AMS
Designer), all using common device models, seamlessly integrated into a single
GUI, give designers freedom to choose simulation tools that meet their
accuracy, capacity and performance needs. Finally, designers can take advantage
of Analog Design Environment GXL optimization to take corrective action and
optimize their designs to mitigate parasitic effects.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;b&gt;NOTE: &lt;/b&gt;To access
&amp;ldquo;Quick Start&amp;rdquo; videos that show step-by-step instructions on how to accomplish
various tasks outlined above, please contact your local AE or Sales Engineer.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;In summary, the parasitic-aware design flow is not a panacea for
all the parasitic issues that are plaguing your design, nor is it a single tool
that is going to perform miracles. Parasitic-aware design, on the other hand,
is a design methodology that allows designers to systematically analyze and understand
effects of parasitics during early stages of design cycle and help take
corrective actions. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Since designers know more about their designs than anyone
else, parasitic-aware design provides a consistent methodology to capture this
knowledge in a systematic way, helping designers to maintain design intent
throughout the design process. By providing designers with a faster and better
way to bring parasitics back into the design, parasitic-aware design allows
designers to avoid over-designing and instead focus their energies on fine
tuning their design to increase the yield.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Rama Jupalli &lt;/p&gt;

&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1261045" width="1" height="1"&gt;</content><author><name>Rama Jupalli</name><uri>http://www.cadence.com/Community/members/Rama-Jupalli.aspx</uri></author><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /><category term="PAD" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PAD/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="parasitic-aware design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitic-aware+design/default.aspx" /><category term="Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx" /></entry><entry><title>Virtuoso IC6.1.5: Software and Fine Red Wine</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/03/14/software-and-fine-red-wine.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/03/14/software-and-fine-red-wine.aspx</id><published>2011-03-14T12:00:00Z</published><updated>2011-03-14T12:00:00Z</updated><content type="html">&lt;p&gt;Software, like fine red wine,&amp;nbsp;can get better with age as well --&amp;nbsp;but it requires constant advancements to remain a vibrant contributor.&amp;nbsp; Such is the case with the &lt;a href="http://www.cadence.com/cadence/newsroom/features/Pages/custom_analog.aspx"&gt;Virtuoso IC6.1.5 custom/analog technology release&lt;/a&gt;, which delivers on the promise of Silicon Realization with capabilities that maintain design intent throughout the custom/analog flow, simplify the abstraction of analog information to provide high-performance verification capability, and lead to design convergence by providing a common cockpit for in-design signoff technology and support for the Cadence Low-Power Solution. &lt;/p&gt;&lt;p&gt;The enhanced Virtuoso-based custom/analog flow spans design, implementation and verification. The amount of individual tool updates are too numerous to blog about, so I encourage our users to spend a bit of time with the What&amp;#39;s New document that is available from&amp;nbsp; &lt;a href="http://www.cadence.com/sourcelink"&gt;Cadence Online Support&lt;/a&gt;.&amp;nbsp; Instead, I want to highlight and provide more details on the three larger elements that are encapsulated in the IC6.1.5 release.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;Support for Globalized Teams:&lt;/i&gt;&lt;/b&gt;&amp;nbsp; A variety of new publishing features within the schematic, analysis environment, and waveform window allow for the easy exchange of information across the web.&amp;nbsp; We realize that many of our customers work on a 24-hour clock, and the ability to exchange accurate information at each hand-off point is crucial to keeping a design on track.&amp;nbsp; In previous versions of our software, we have given our customers the ability to closely monitor the design and the implementation of their circuits by using Cadence&amp;#39;s design constraint technology.&amp;nbsp; You can learn more about this technology by viewing the &lt;a href="http://www.cadence.com/cadence/events/Pages/event.aspx?eventid=371"&gt;Constraint Webinar&lt;/a&gt; if you wish.&amp;nbsp; &lt;/p&gt;&lt;p&gt;With this release of Virtuoso, our users can create hyperlinked schematics and datasheets that can be put together instantly, and enable design review at any moment.&amp;nbsp; There is no need to fumble around anymore looking for that particular document that is stored somewhere that makes no sense!&amp;nbsp; Instead, the documentation is stored with the design, and becomes a managed &amp;quot;cellview&amp;quot; just like the schematic or the layout.&amp;nbsp; Archiving is a snap since all the data you will ever need is now located exactly where it should be --&amp;nbsp;with the design.&amp;nbsp; You really can maintain the intent of your custom/analog design whether it is around the room or around the globe. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;New Design Methodologies:&lt;/i&gt;&lt;/b&gt;&amp;nbsp; Understanding the &amp;quot;impact&amp;quot; of the analog portion of any design is crucial to the success of on-time arrival for your chip.&amp;nbsp; In some cases, it is the parasitics and signal integrity of the analog portion that goes awry.&amp;nbsp; In other cases, it is the integration of the analog into a larger SoC where the problems begin.&amp;nbsp; In either case, Cadence provides solutions to these problems.&amp;nbsp;&lt;/p&gt;&lt;p&gt;For troublesome analog, we offer the &lt;a href="http://www.cadence.com/Community/blogs/ii/archive/2011/03/14/how-parasitic-aware-design-improves-custom-analog-productivity.aspx"&gt;parasitic-aware design&lt;/a&gt; flow, which allows users to determine the impact of design choices much sooner in the design process.&amp;nbsp; Users can easily include previous knowledge of topologies within the design flow, using these parasitic &amp;quot;estimates&amp;quot; to quickly assess design impact, and then use a combination of constraints and automated layout features to prototype blocks that can be fully extracted and analyzed.&amp;nbsp; These loops are very short and can provide the designer with a much better sense of the design long before any formal layout is fully committed to paper.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Once the prototyping is done, the implementation engineer will also have a better direction to take the lead to a faster &amp;quot;ultimate&amp;quot; solution.&amp;nbsp; They can see the critical design choices and have the tools they are using to implement the design respond to those critical decisions, thus supplementing their own knowledge to create an environment that employs best practices of the manual and automated design flow. If using design constraints, they can be easily checked to see if they were achieved or not, and if not, a notation can be made as to why not.&amp;nbsp; If the implementation engineers discover that important implementation choices need to be made, they can add information (constraints) and back-annotate these to the schematic to act as the golden reference.&lt;/p&gt;&lt;p&gt;In the case of analog abstraction, the new features for Virtuoso IC6.1.5 include the automatic creation of a Common Power Format file from an analog schematic to test the effects of turning on/off different regions of the chip during its operation.&amp;nbsp; Through a simple GUI, the analog engineer defines the power needs for his block, and that information along with the schematic generates the proper CPF file.&amp;nbsp; This file is now used as part of the &lt;a href="http://www.cadence.com/solutions/lp/Pages/Default.aspx"&gt;Cadence Low-Power Solution&lt;/a&gt;.&amp;nbsp; This enables the Cadence Low-Power Solution to extend to the ever increasing number mixed-signal designs. &lt;/p&gt;&lt;p&gt;And lastly, with IC6.1.5 we give you the ability to make your existing methodologies new again with the addition of our next generation &lt;a href="http://www.cadence.com/products/cic/accelerated_parallel/pages/default.aspx"&gt;Accelerated Parallel Simulator&lt;/a&gt; and new waveform technology.&amp;nbsp; We continue to expand our simulation technology to take advantage of the latest hardware configurations that are available.&amp;nbsp; We see our customers paying attention not only to their software requirements, but also their capital budgets to make the best choices when it comes to spending for new hardware.&amp;nbsp; &lt;/p&gt;&lt;p&gt;For customers who invest in multi-core machines, Cadence wants to make sure that you are able to exploit that technology as efficiently as possible.&amp;nbsp; To that end we are introducing our APS in a &amp;quot;Distributed&amp;quot; mode.&amp;nbsp; We have been offering our customers speed on single core and multi-core compute platforms. Now we allow you the power to harness multiple, multi-core compute platforms for your most demanding transient simulations to realize peak performance when you need it, particularly at design sign-off time. &amp;nbsp;And don&amp;#39;t worry if those transient files that are produced are&amp;nbsp;tens to&amp;nbsp;hundreds of Gigabytes in size.&amp;nbsp; Our completely new an upgraded waveform window technology has been tuned with our simulators to provide performance that is unmatched within the EDA industry for large databases.&amp;nbsp; Combined with its new measurement and extended mixed-signal analysis capabilities, we look forward to you being pleasantly delighted with the new Virtuoso Visualization and Analysis window that comes standard with our &lt;a href="http://www.cadence.com/products/cic/analog_design_environment/pages/default.aspx"&gt;Analog Design Environment&lt;/a&gt; product line.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;In-Design Signoff:&lt;/i&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&amp;nbsp;Cadence recognizes the fact that traditional signoff is accomplished today by using expensive tools and the end of an expensive design process to find problems that are now really expensive to fix!&amp;nbsp; Anyone see a problem with that? ...anyone??&amp;nbsp; Clearly this is &lt;u&gt;NOT&lt;/u&gt; the way to approach daily design.&amp;nbsp; Instead Cadence&amp;nbsp;allows its signoff technology under the Virtuoso layout user interface to be accessible at any time during the implementation of the design.&amp;nbsp; For instance, let&amp;#39;s say you want to check to see if the IR drop across your power rails was going to be severe enough to miss the power specification.&amp;nbsp; Or, perhaps the electromigration that is expected in this technology is going to cause a hotspot or a short somewhere in your design.&amp;nbsp; Or finally, you may be working with sub-45nm technology which you can almost guarantee won&amp;#39;t manufacture a proper mask without intervention and compensation during the design phase.&amp;nbsp; &lt;/p&gt;&lt;p&gt;In the past, a user would leave their layout window, run tools on the outside on the database, and then view the results in a third-party display with the translation and fixing left to user to remember.&amp;nbsp; That&amp;#39;s a completely error prone way to design and has no place anymore in sophisticated design methodologies. An engineer should be able to see critical problem directly on their layout within the context of the tool that they will use to either fix the problem, or verify the problem was fixed using some sort of automation. Now you have a real design flow that creates productivity instead of frustration.&amp;nbsp; Cadence allows our advanced technology such as Virtuoso Power System, &lt;a href="http://www.cadence.com/products/cic/litho_electric_analyzer/pages/default.aspx"&gt;Cadence Litho Electrical Analyzer&lt;/a&gt; and &lt;a href="http://www.cadence.com/products/cic/litho_physical_analyzer/pages/default.aspx"&gt;Physical Analyzer&lt;/a&gt; and our pattern matching DRC technology from the &lt;a href="http://www.cadence.com/products/cic/physical_verification/pages/default.aspx"&gt;Cadence Physical Verification System&lt;/a&gt; all to be used within the cockpit of the &lt;a href="http://www.cadence.com/products/cic/layout_suite/pages/default.aspx"&gt;Virtuoso Layout Suite&lt;/a&gt;.&amp;nbsp; Find, fix and verify all the time in one location.&amp;nbsp; You can save your expensive verification tools to simply be a signoff that Cadence was right all along.&lt;/p&gt;&lt;p&gt;Cadence is pleased that our customers, most recently Wolfson, have joined a growing list of public supporters for the expanded Virtuoso custom/analog flow, finding productivity improvements across the board and providing them with a 25-30% time saving for their designs.&amp;nbsp; For the last 20 years, Cadence has constantly innovated and led the way in solving the complexities of custom/analog design, implementation, and verification.&amp;nbsp; We look forward to serving your design needs into the future, and sharing a glass of wine as friends when we can.&lt;/p&gt;&lt;p&gt;I encourage you to read the press release, What&amp;#39;s New document, other collateral covering the new release of Virtuoso, and discuss your thoughts with me. Are the enhancements what you deem as essential in making you more productive? What do you see out there that you think we should know about? &lt;/p&gt;&lt;p&gt;Steve Lewis&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1260991" width="1" height="1"&gt;</content><author><name>NewYorkSteve</name><uri>http://www.cadence.com/Community/members/NewYorkSteve.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="DFM" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/DFM/default.aspx" /><category term="Constraint-driven" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Constraint-driven/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /><category term="AMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="Virtuoso IC6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx" /><category term="parasitic-aware design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitic-aware+design/default.aspx" /><category term="custom/analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx" /><category term="low power" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/low+power/default.aspx" /></entry><entry><title>Q&amp;A: IBM Modeling Team Describes Advanced SOI Qualification Flow In Cadence MMSIM Platform</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/02/23/ibm-modeling-team-describes-advanced-soi-qualification-flow-in-cadence-mmsim-platform.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/02/23/ibm-modeling-team-describes-advanced-soi-qualification-flow-in-cadence-mmsim-platform.aspx</id><published>2011-02-23T19:00:00Z</published><updated>2011-02-23T19:00:00Z</updated><content type="html">Circuits implemented using sub-micron technologies require designers to meet tighter and tighter specifications despite increasing statistical variation and complexity. High correlations between actual silicon and circuit verification using advanced SPICE models are therefore a must to ensure first pass design success. This characterization requires a high degree of cooperation and integration between modeling engineers and circuit simulation providers.&lt;p&gt;In this interview, members of the IBM modeling team talk about the verification effort that was initiated and completed last year between Cadence and IBM using silicon on insulator (SOI) advanced process nodes as a pilot. The goal between the two teams was to generate a robust, exhaustive and efficient model qualification flow using Cadence SPICE simulators (Spectre, Ultrasim, APS) specifically for IBM SOI process nodes. This SPICE verification flow was successfully implemented in MMSIM 10.1 and above.&lt;/p&gt;&lt;p&gt;The people involved in this work are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Radhika Allamraju&lt;/b&gt;, IBM, started working with IBM&amp;#39;s bulk models in 2003 and moved over to SOI a couple of years ago.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Carl Wermer&lt;/b&gt;, IBM, has been supporting design customers using IBM&amp;#39;s SOI models. Previously he worked in process engineering and characterization. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Joe Watts&lt;/b&gt; is a senior technical staff member at IBM and currently provides guidance to compact model groups in SOI and bulk. He is also chair of the &lt;a href="http://www.geia.org/index.asp?bid=597"&gt;Compact Model Council (CMC).&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Helene Thibieroz&lt;/b&gt; is a staff application engineer in Cadence Customer support and has been supporting Cadence customers for analog/mixed-signal products for 10 years.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Jushan Xie&lt;/b&gt; is a Cadence engineering director responsible for a simulation infrastructure that includes device modeling, simulation front end (SFE), MDL, and reliability simulation.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Natarajan Krishnan&lt;/b&gt; is a Cadence staff product verification engineer, leading product validation teams of MMSIM and AMS simulation products.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Q: Carl, Joe, can you please give us some background about modeling qualification at IBM and the flows and procedures you are using?&lt;/b&gt;&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Carl_IBM.JPG"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Carl_IBM.JPG" width="100" align="right" border="0" height="120" hspace="10" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; FET device modeling qualification at IBM starts from a new release of a compact model, such as BSIMSOI4.31 from U.C. Berkeley. &amp;nbsp;Senior device modelers at IBM are part of the CMC [Compact Model Council] which supports the industry review, testing and adoption of a new compact model code.&amp;nbsp; IBM and Cadence are both part of the CMC, and we started working together as part of this organization. &lt;/p&gt;&lt;p&gt;After a new and/or updated compact model is accepted by the CMC, it is implemented by IBM in our internal simulator, and the model is fit to proprietary device data or targets. It is also implemented in the Cadence common model interface and used by all MMSIM simulators including APS [Advanced Parallel Simulator], Spectre, and Ultrasim. &lt;/p&gt;&lt;p&gt;Engineers use both internal and vendor tools to extract the fitting parameters that support matching between the compact model and silicon. &lt;/p&gt;&lt;p&gt;After the model is built, testing over a range of conditions is done to confirm the fit is correct and self consistent.&lt;/p&gt;&lt;p&gt; &lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Joe_IBM.JPG"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Joe_IBM.JPG" width="100" align="left" border="0" height="120" hspace="10" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Joe:&lt;/b&gt; For C based models we have learned there is a need to test the analytic derivatives from the model against finite difference derivatives calculated from the primary outputs of current and charge.&amp;nbsp; For BSIMSOI, we put a great deal of effort into this and fixed a large number of errors. &lt;/p&gt;&lt;p&gt;In a Verilog-A model the compiler generates the derivatives automatically, so this is not necessary.&amp;nbsp; In general the CMC requires verification to make sure that a new model or new features in an old model can match hardware measurements, and that it runs and converges for some sample circuits and gives reasonable circuit results.&amp;nbsp; IBM does such tests for enhancements we request, and other companies do them for enhancements they request.&amp;nbsp; Normally the circuits are not shared with the CMC because of IP contained in the circuits.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: What simulation challenges are device/modeling engineers facing with BSIMSOI, especially when dealing with advanced process nodes? &lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; We have internal and external customers who use Spectre and other commercial simulators. So, after a model is generated for a given technology, we still need to check that the model implementation and results are consistent across many vendor simulators. &lt;/p&gt;&lt;p&gt;To ensure consistency between simulators, we run an exhaustive suite of DC netlists. The goal is to monitor multiple outputs (such as Ids, QG, cgg, gds) while varying process, temperature and voltage biases.&amp;nbsp; We also check simple circuit delay measurements at PVT corners.&lt;/p&gt;&lt;p&gt;In addition, we also have implemented a large number of features within the compact models to support parameter variability (process statistics) and allow designer and developers to predict process sensitivity. Those features need frequent updates and changes as more complex solutions are required to model the increased complexity caused by smaller and smaller process dimensions.&amp;nbsp; The same effort is also applied in Verilog-A for the passive models.&amp;nbsp; &lt;/p&gt;&lt;p&gt;We use different Cadence simulators. We first run Spectre to compare graphical outputs and check basic functionality. We then take advantage of Spectremdl scripts for more complex simulations (such as Monte Carlo, corners) and measurement capability. Spectre has proven to be extremely efficient in parsing all the model code we use and giving good run times, particularly for large Monte Carlo simulations.&lt;/p&gt;&lt;p&gt;Last, we compare a large set of outputs to ensure consistent implementation of our models across several commercial simulators (including Spectre) using Perl scripts and an internal IBM tool. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: Based on your experience, what are the simulation challenges that design engineers are facing with BSIMSOI?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; I have seen the same pattern with a number of IBM customers making the transition from bulk to SOI.&amp;nbsp; There is confusion over what to do with floating body nodes and concerns over slower run times and some extra convergence challenges.&amp;nbsp; The structures for body contacted models are also an initial hurdle.&lt;/p&gt;&lt;p&gt;That being said, we now have a large number of design teams have cleared these early hurdles and are designing successfully in SOI. For convergence questions, we first look for problems with the compact models and the customer set-up, and then rely on the Cadence customer support team to take over. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Joe:&lt;/b&gt; For C based models we need to test the analytic derivatives from the model against finite difference derivatives calculated from the primary outputs of current and charge. &amp;nbsp;BSIMSOI 4.0-4.2 had serious convergence issues because of the derivative errors mentioned previously.&amp;nbsp; BSIMSOI 4.3 had much better derivatives and at least in our tests convergence improved.&amp;nbsp; Another hurdle for logic design teams moving to SOI is the history effect.&amp;nbsp; New teams need help understanding the effect and learning to design to accommodate it.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: What was the triggering factor that started this collaboration?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; I have been working with Cadence on compact models on and off and since 1998. Regarding SOI, significant work investment did not start until 2000.&amp;nbsp; Customers who had been using Spectre with bulk models moved to SOI and wanted to continue to work with the Cadence Spectre simulator.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Along the way, we have dealt with a number of different issues related to different implementation of the UCB compact model updates in different simulators. These would typically be caught by our regression tests performed for each simulator.&lt;/p&gt;&lt;p&gt;One recent problem we addressed with the Cadence team started when a third party customer asked them for a bug fix of the Berkeley BSIMSOI compact model that we also used. Ideally, Cadence would have been able to just integrate a new release from Berkeley, with a new version identifier, including the fix, and the customer could have moved to that version. However, the update from Berkeley was many months off, and also included other code updates not everyone was ready to work with.&lt;/p&gt;&lt;p&gt;The follow-up meetings between Cadence and IBM tackled the obvious problem on how a vendor can securely and rapidly provide fixes in a code that is version controlled by another organization, while also allowing users to either apply the fix, or stay with the code they have already qualified.&lt;/p&gt;&lt;p&gt;After some review, Cadence proposed an elegant solution, where they now support an additional parameter in the model cards that allows us to include or exclude different bug fixes in the code from UCB. If a value was not assigned, it would just default to the original code, so there are no unexpected results and back compatibility is fully preserved.&lt;/p&gt;&lt;p&gt;This collaboration work also revealed that the regression testing done by Cadence did not fully match IBM set of regression tests. Cadence therefore initiated the effort of aligning their regression tests and verification procedures to match with IBM ones and worked closely with us to close the gap.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: Can you describe the different steps that IBM and Cadence took jointly to define a model qualification specifically for IBM SOI process nodes?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt;&amp;nbsp; In response to the problem where our testing flagged an unexpected change in Berkeley BSIMSOI code, the Cadence team stepped up and scheduled meetings to work with us and make sure their regression testing was updated to reflect our needs. During those meetings, both parties identified an exhaustive set of regression tests that would be used by both Cadence and IBM. &lt;/p&gt;&lt;p&gt;We then identified an IBM SOI process node technology file that could be used by Cadence R&amp;amp;D to ensure all parameters extracted by IBM are tested. We last identified how often those regression tests should be performed and how they would be communicated to IBM. One of the key issue was to make sure our large suite of model output measures for device current and charge, along with derivatives like the related capacitance and outputs like gm/gds, would be fully tested by Cadence. As a result, Cadence added more regression tests to fully match with IBM model validation. &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: Can you describe the outcome and results? What was achieved through this model qualification process?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt;&amp;nbsp; We sometimes work on very tight schedules, where features in the latest compact model qualified by the CMC are required in the device models we give to our customers.&amp;nbsp;&amp;nbsp; Since we need to distribute these models for multiple simulators, this puts pressure on the vendors we work with.&amp;nbsp; Knowing that Cadence regression tests now fully integrate our areas of concern is a big positive and significantly reduces overall SOI model validation cycle time. &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: How is this qualification process going to improve IBM productivity and SOI process node accuracy?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; There will be a reduction in the exposure that we would have with customers waiting for the latest model release, and not being able to work with it because not all the simulators properly support it. &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: How do you think this is going to have a positive impact for designers? Which Berkeley version would you recommend to use?&lt;/b&gt;&lt;a href="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Radhika_IBM.JPG"&gt;&lt;img src="https://www.cadence.com:443/Community/CSSharedFiles/blogs/cic/thibault_alix/HT_Radhika_IBM.JPG" width="100" align="right" border="0" height="120" hspace="10" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Radhika:&lt;/b&gt; We are moving or have moved to using BSIMSOI4.31 for SOI 22nm and 32nm nodes. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: What was your overall experience working with Cadence team? Would you agree this team was awesome?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Carl:&lt;/b&gt; While not everyone can be awesome, we are fortunate that Cadence has its share of people who are awesome; very insightful, quick to help us when we need advice/guidance using Cadence tools, and also quick to recognize and respond when there are problems that requires changes at their end. &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Q: How do you see this collaboration in the future? What would be the next step?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Radhika:&lt;/b&gt; Going into the next process node, we will be working with BSIMSOI4.4 and either bsim-img and /or bsim-mg.&amp;nbsp; There are significant changes in the multigate models and what we have learned working together in BSIMSOI2 through 4.31 will benefit both teams. We are also looking at moving to APS, as IBM and the IBM design teams we work with have already benefited from this simulator.&lt;/p&gt;&lt;p&gt;Helene Thibieroz&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1260448" width="1" height="1"&gt;</content><author><name>helenet</name><uri>http://www.cadence.com/Community/members/helenet.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="MMSIM" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/MMSIM/default.aspx" /><category term="APS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/APS/default.aspx" /><category term="Spectre" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Spectre/default.aspx" /><category term="SpectreMDL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SpectreMDL/default.aspx" /><category term="Spice model verification" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Spice+model+verification/default.aspx" /><category term="BSIMSOI" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/BSIMSOI/default.aspx" /><category term="SOI" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SOI/default.aspx" /><category term="model qualification" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/model+qualification/default.aspx" /><category term="IBM" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IBM/default.aspx" /><category term="Compact Modeling Council" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Compact+Modeling+Council/default.aspx" /><category term="characterization" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/characterization/default.aspx" /><category term="CMC" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/CMC/default.aspx" /><category term="Monte Carlo" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Monte+Carlo/default.aspx" /></entry><entry><title>Analog Assertion Based Verification Methodology – Reality or a Dream? (Part 2)</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/02/09/analog-assertion-based-verification-methodology-reality-or-a-dream-part-2.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/02/09/analog-assertion-based-verification-methodology-reality-or-a-dream-part-2.aspx</id><published>2011-02-09T22:00:00Z</published><updated>2011-02-09T22:00:00Z</updated><content type="html">&lt;p&gt;The design and verification methodology for analog circuits has not changed much over the past decade. But the complexity of analog designs has grown exponentially. Analog parts are not just on the peripherals of SoCs any more. It is very common to have complex analog IP in applications such as communications, transportation and bio-medical devices. So it is not enough to just verify analog designs in isolation. &lt;/p&gt;&lt;p&gt;There is an added emphasis on two major concepts: &lt;/p&gt;&lt;p&gt;1) Verify the analog design in isolation thoroughly for functional correctness. This is very similar to having a thorough block-level verification methodology in the digital world. The block handed over to the SoC integration team needs to be bug free. The statement that &amp;quot;debugging issues at the block level is much easier than debugging them at the SoC level&amp;quot; applies to all the analog blocks that become part of the mixed-signal SoC. This process demands an advanced methodology that can build significant automation into the verification of analog designs. &lt;/p&gt;&lt;p&gt;2) The advanced methodology needs to align itself with the SoC verification methodology. What this means is that the pre-verified analog blocks should be delivered to the SoC integration team in an easily consumable manner. At the simplest level it could mean delivering a high performance behavioral model that is functionally equivalent to the analog design. At the next level it could mean a set of assertions (that goes with the behavioral model) that the SoC verification engineer could turn on for the analog blocks to get visibility into the functionality for debugging purposes or metric collection purposes.&lt;/p&gt;&lt;p&gt;There are three important ideas that resonate with assertions: Observability, Controllability and Reuse. Put them all together and it simply means increased productivity. Assertions can describe design functionality in succinct statements. Some common properties could be&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Looking for a certain value on a signal under given conditions at a given time&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Looking for a logical combination of values on certain signals under given conditions at a given time&lt;/li&gt;&lt;li&gt;Looking for a sequential relationship between multiple signals over a period of time&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;One of the key value-adds of assertions is the ease of debugging. The visual inspection of waveforms (a very common practice still in the analog world) to make sure that a design is behaving correctly is very inefficient. It is extremely time consuming and error-prone, not to mention the length of analog simulations adding to the burden of analysis. Also the engineer has to wait for the end of simulation to find out about real design issues, or many times, just simple user setup issues. &lt;/p&gt;&lt;p&gt;By capturing the main design functionality and the input assumptions as part of assertions, the verification environment becomes extremely interactive. Assertions fire error messages as soon as a property is violated, and the user can stop the simulation right away. Once the simulation is stopped, the user is taken to the time stamp at which the error was fired. Our friends in the digital world have perfected the debugging of assertions and we can leverage it right away.&lt;/p&gt;&lt;p&gt;There are multiple standard assertion languages that digital verification engineers use extensively. Property Specification Language (PSL) and SystemVerilog Assertions (SVA) are the most popular ones. Cadence has worked vigorously in extending these languages to support assertion based verification for analog designs. These techniques are discussed in an excellent paper presented by my colleagues recently at &lt;a href="http://vault.eetimes.com/armconference/proceedings/"&gt;ARM Technology Conference 2010&lt;/a&gt; (click on Day 1 and scroll down to ATC-122). &lt;/p&gt;&lt;p&gt;In general the standard assertion languages depend on discrete events that are clocked to build meaningful sequences. Since analog values are continuous, the standard languages need to find a way to handle these. While several ad-hoc methodologies exist today, it is important to standardize this flow. I sincerely urge the analog design community to participate in the &lt;a href="http://www.eda.org/twiki/bin/view.cgi/VerilogAMS/AmsAssertions"&gt;Accellera standardization process&lt;/a&gt; to find a solution that is practical and portable across all phases of design and verification cycle. &lt;/p&gt;&lt;p&gt;In conclusion, when I try to compare the evolution of assertion-based verification on the digital side to what is happening now on the analog side, I see the exact same problems. The lack of standard languages and methodology, the lack of consistent tool support, the lack of training and use cases and the lack of availability of IP are all not new to the design community. But the demand for all the above has been clearly established by the complexity of mixed signal SoC realization, and Cadence has taken a leadership role on delivering these solutions to our customers. &lt;/p&gt;&lt;p&gt;Srikanth V Raghavan&lt;/p&gt;&lt;p&gt;Previous post: &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/24/analog-assertion-based-verification-methodology-reality-or-a-dream-part-1.aspx?postID=1249631"&gt;Analog Assertion Based Verification Methodology &amp;ndash; Reality or a Dream? (Part 1)&lt;/a&gt; &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1250199" width="1" height="1"&gt;</content><author><name>Raggie</name><uri>http://www.cadence.com/Community/members/Raggie.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="AMS Simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS+Simulation/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="ABV" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ABV/default.aspx" /><category term="SVA" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SVA/default.aspx" /><category term="PSL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PSL/default.aspx" /><category term="assertions" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertions/default.aspx" /><category term="assertion-based" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertion-based/default.aspx" /><category term="wreal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/wreal/default.aspx" /><category term="SoC" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SoC/default.aspx" /><category term="verification" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/verification/default.aspx" /></entry><entry><title>SKILL for the Skilled: Continued Introduction to SKILL++</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/25/skill-for-the-skilled-continued-introduction-to-skill.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/01/25/skill-for-the-skilled-continued-introduction-to-skill.aspx</id><published>2011-01-25T17:00:00Z</published><updated>2011-01-25T17:00:00Z</updated><content type="html">In my &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/04/skill-for-the-skilled-what-is-skill.aspx?postID=1248995"&gt;previous posting&lt;/a&gt;, which provided an introduction to SKILL++, I showed a simple but powerful design
hierarchy descent function that has various potential uses.  The
function is called &lt;code&gt;walkCvHier&lt;/code&gt;.  As a reminder, here is
the SKILL++ code again.

&lt;pre&gt;1.1: (defun walkCvHier (cv consume)&lt;br /&gt;1.2:   (foreach inst cv~&amp;gt;instances&lt;br /&gt;1.3:     (walkCvHier inst~&amp;gt;master consume))&lt;br /&gt;1.4:   (consume cv))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Just to reiterate: this function is naive for demonstration
purposes.  You can easily imagine ways of enhancing or generalizing
this function to be more robust and handle more complicated hierarchy
descent.  I encourage the reader to experiment with such enhancements,
and feel free to post your suggestions, or questions in the comment
section of this blog.
&lt;/p&gt;&lt;p&gt;
In the following paragraphs, I&amp;#39;ll show more advanced uses of the
&lt;code&gt;walkCvHier&lt;/code&gt; function.  Please assume that all the
code in this article is SKILL++ which means it is defined in a source
file with a .ils extension.
&lt;/p&gt;

&lt;b&gt;Local (private) function&lt;/b&gt;
&lt;p&gt;
In the previous article I showed how to implement
the &lt;code&gt;reportCvHier&lt;/code&gt; by writing a &lt;i&gt;private&lt;/i&gt;, global
function &lt;code&gt;_reportCv&lt;/code&gt;.  It turns out there are better ways
of doing this in SKILL++ which don&amp;#39;t require polluting the global
function name space.  It is not necessary to make this client function
visible to the world simply to pass it as a parameter
to &lt;code&gt;walkCvHier&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
If you are using IC 6.1.5, a more explicit way of defining and
referencing private (local) functions is to use the newly available
macro &lt;code&gt;flet&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;4.1: (defun reportCvHier (top_cv)&lt;br /&gt;4.2:   (flet ((reportCv (cv)&lt;br /&gt;4.3:           (println (list cv~&amp;gt;libName&lt;br /&gt;4.4:                          cv~&amp;gt;cellName&lt;br /&gt;4.5:                          cv~&amp;gt;viewName))))&lt;br /&gt;4.6:     (walkCvHier top_cv reportCv)))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
The &lt;code&gt;flet&lt;/code&gt; macro may be used to define one or more local
functions which are thereafter available for reference by name inside
the body of the &lt;code&gt;flet&lt;/code&gt;.  Such a by-name reference is shown
on line 4.6 in the example above, where the local function
named &lt;code&gt;reportCv&lt;/code&gt; is only visible and callable within the
body of the &lt;code&gt;flet&lt;/code&gt; form (i.e., within the matching
parentheses which surround &lt;code&gt;flet&lt;/code&gt;).  This local function
has a single required argument named &lt;code&gt;cv&lt;/code&gt;.  Since this is
SKILL++, we are free to use function names (global or local) as if
they were variable names, as on line 4.6.
&lt;/p&gt;&lt;p&gt;
One power of local functions over global functions is their ability to
securely reference other lexical variables which are in scope.  For
example, it would be possible for the local
function &lt;code&gt;reportCv&lt;/code&gt; to reference the
variable &lt;code&gt;top_cv&lt;/code&gt; if necessary. Because &lt;code&gt;reportCv&lt;/code&gt; lies textually within the matching
parentheses of the &lt;code&gt;(defun reportCvHier ...)&lt;/code&gt; form, it is
free to use all the local variables which that form binds, including
the formal parameter of &lt;code&gt;top_cv&lt;/code&gt;.  Other examples of these are
shown on lines 6.4 and 7.4 below.
&lt;/p&gt;&lt;p&gt;
If you don&amp;#39;t have access to IC 6.1.5, you may use the following
construct.  In this case we simply create a function on-the-fly
without a name, and pass it directly to &lt;code&gt;reportCvHier&lt;/code&gt;.

&lt;/p&gt;&lt;pre&gt;5.1: (defun reportCvHier (cv)&lt;br /&gt;5.2:   (walkCvHier cv (lambda (cv)&lt;br /&gt;5.3:                    (println (list cv~&amp;gt;libName&lt;br /&gt;5.4:                                   cv~&amp;gt;cellName&lt;br /&gt;5.5:                                   cv~&amp;gt;viewName)))))&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Functions that manipulate state&lt;/b&gt;

&lt;p&gt;In the next example (lines 6.1-6.5) I&amp;#39;d like to
use &lt;code&gt;walkCvHier&lt;/code&gt; to count the number of cellViews in the
hierarchy, and in (7.1-7.5) build a table mapping each cellView to the
number of times it occurs in the hierarchy.  In this case the consumer
function passed to &lt;code&gt;walkCvHier&lt;/code&gt; needs to modify some state
(such as, a counter or a hash table) within the calling function.
&lt;/p&gt;&lt;p&gt;
How would you attack this with traditional SKILL?  With traditional
SKILL the consumer function would probably need to modify a global
variable to maintain the count, introducing two immediately apparent
problems.  1) the function would probably not be non-reentrant.That is,
you may not be able to pass in consumer function which itself
calls &lt;code&gt;walkCvHier&lt;/code&gt;.  2) If the consumer function encounters
an error, this global variable could be left in an incomplete state,
which would confuse subsequent calls.
&lt;/p&gt;&lt;b&gt;SKILL++ and state manipulation&lt;/b&gt;
&lt;p&gt;Why do these problems vanish with the SKILL++ approach?  Because
there is no need for the global variable.  The variable can remain
local and lexical as seen on lines 6.2 and 7.2.
&lt;/p&gt;&lt;p&gt;
This function &lt;code&gt;countCvHier&lt;/code&gt; passes a function
to &lt;code&gt;walkCvHier&lt;/code&gt; which increments a
variable, &lt;code&gt;occurrences,&lt;/code&gt; at each step in the hierarchy.  Note
that the &lt;code&gt;walkCvHier&lt;/code&gt; knows absolutely nothing about the
local variable &lt;code&gt;occurrences&lt;/code&gt;.  Moreover, even
if &lt;code&gt;walkCvHier&lt;/code&gt; were implemented having a local variable of
the same name it would not have any ill
effect on &lt;code&gt;countCvHier&lt;/code&gt;.  
&lt;/p&gt;&lt;pre&gt;6.1: (defun countCvHier (cv)&lt;br /&gt;6.2:   (let ((occurrences 0))&lt;br /&gt;6.3:     (walkCvHier cv (lambda (cv)&lt;br /&gt;6.4:                      occurrences++))&lt;br /&gt;6.5:     occurrences))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;
In the function &lt;code&gt;occureHier&lt;/code&gt;, we use the same technique to
pass a function to &lt;code&gt;walkCvHier&lt;/code&gt; which modifies a hash table
referenced by the local variable, &lt;code&gt;occurrences&lt;/code&gt;.
&lt;/p&gt;&lt;pre&gt;7.1: (defun occureHier (cv)&lt;br /&gt;7.2:   (let ((occurrences (makeTable &amp;#39;occur 0)))&lt;br /&gt;7.3:     (walkCvHier cv (lambda (cv)&lt;br /&gt;7.4:                      occurrences[cv] = (add1 occurrences[cv])))&lt;br /&gt;7.5:     occurrences))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;It is perhaps worth emphasizing that if you were using traditional
SKILL rather than SKILL++, this technique would fail for several
reasons.  These problems boil down in the end to differences between
dynamic and global variables.  While dynamic variables are interesting
and have powerful uses, this is not one such place to use them.
Without giving a detailed explanation of subtle errors some of the
problems are the following:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt; You&amp;#39;d have to be sure to use a variable on lines 6.2, 6.4, 6.5,
7.2, 7.4, and 7.5 which were NOT also defined in
the &lt;code&gt;walkCvHier&lt;/code&gt; function.
&lt;/li&gt;&lt;li&gt;If the consumer function being passed to &lt;code&gt;walkCvHier&lt;/code&gt;
actually made an explicit call to &lt;code&gt;walkCvHier&lt;/code&gt; with a
different consumer function, they would not both be able to use the
same variable name.
&lt;/li&gt;&lt;li&gt; You would not be able to know that without access to the source
code for &lt;code&gt;walkCvHier&lt;/code&gt;, which you might not have.
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;Purging the hierarchy&lt;/b&gt;
&lt;p&gt;
If you want to purge all cellViews in a design hierarchy you might
think of evaluating something like &lt;code&gt;(walkCvHier cv
dbPurge)&lt;/code&gt;, but that probably wouldn&amp;#39;t be a good idea.  Why?
Well for one reason, the same cellView might (and probably does) occur
multiple times.  You don&amp;#39;t want cellViews being purged while they are
still needed for traversal.  We need to call &lt;code&gt;dbPurge&lt;/code&gt;
iteratively over a list of cellViews where each cellView occurs only
once and children always precede parents.  Here is a function which
will do that.

&lt;/p&gt;&lt;pre&gt;8.1: (defun purgeCvHier (cv)&lt;br /&gt;8.2:   (let ((visited nil))&lt;br /&gt;8.3:     (walkCvHier cv (lambda (cv)&lt;br /&gt;8.4:                      (unless (memq cv visited)&lt;br /&gt;8.5:                        (push cv visited))))&lt;br /&gt;8.6:     (mapc dbPurge (reverse visited))))&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;
How does it work?  Neither the consumer function nor consequently the
traversal function &lt;code&gt;walkCvHier&lt;/code&gt; actually purge anything,
but rather the consumer function collects a list of cellViews that
are visited.  Since the &lt;code&gt;walkCvHier&lt;/code&gt; is written such that
it descends into children cellViews before applying the consumer
function to the parent, &lt;code&gt;purgeCvHier&lt;/code&gt; simply uses the
SKILL &lt;code&gt;push&lt;/code&gt; macro to build a list in reverse order, so
that parents come before children -- a small problem that is easily
resolved with a call to &lt;code&gt;reverse&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
A more robust traversal implementation of &lt;code&gt;walkCvHier&lt;/code&gt;
function could of course allow two consumer functions to be used -- one
which is applied before traversing into children cellViews, and a
second to be called after each step of the descent is finished.  You,
the reader, might consider implementing a function.  Alternatively,
you could provide an optional argument to &lt;code&gt;walkCvHier&lt;/code&gt;
which specifies whether the consumer function will be called before or
after the descent.

&lt;/p&gt;&lt;b&gt;More about &lt;code&gt;flet&lt;/code&gt;&lt;/b&gt;
&lt;p&gt;
There is one important restriction on local functions defined
with &lt;code&gt;flet&lt;/code&gt;: they are not allowed to call themselves
recursively, and if you define more than one local function in a
single &lt;code&gt;flet&lt;/code&gt;, they are not allowed to call each other.
You might initially think this is a limitation, but actually it turns
out to be a powerful feature which we can look at in a future posting. If anyone is interested, please ask in the comment section of this
blog.

&lt;/p&gt;&lt;p&gt;
If you really need to call a local function recursively, or you need
to write several local functions, some of which call other ones, you
can use &lt;code&gt;labels&lt;/code&gt; instead.  Its syntax is exactly the same
as &lt;code&gt;flet&lt;/code&gt;, but its scoping rules are different.

&lt;/p&gt;&lt;p&gt;
Some other Lisp dialects provide implementations of &lt;code&gt;flet&lt;/code&gt;
and &lt;code&gt;labels&lt;/code&gt;.  The ones I&amp;#39;m aware of are
&lt;a href="http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html"&gt;Common
Lisp&lt;/a&gt; and
&lt;a href="http://www.delorie.com/gnu/docs/emacs/cl_22.html"&gt;Emacs
Lisp&lt;/a&gt;.


&lt;/p&gt;&lt;b&gt;Summary&lt;/b&gt; 
&lt;p&gt;
What you&amp;#39;ve seen above are some basics and a few more advanced
features of SKILL++.  Using local functions makes your SKILL++ code
more self-contained without sacrificing modularity.  And it&amp;#39;s pretty
easy to use SKILL++ on practical, easy to understand problems.

&lt;/p&gt;&lt;p&gt;We&amp;#39;ll look at some more examples in future articles.


&lt;/p&gt;&lt;b&gt;See Also:&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scope_%28programming%29"&gt;Lexical vs. dynamic scoping&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;code&gt;flet&lt;/code&gt; and &lt;code&gt;labels&lt;/code&gt; in &lt;a href="http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html"&gt;Common
Lisp&lt;/a&gt; and
&lt;a href="http://www.delorie.com/gnu/docs/emacs/cl_22.html"&gt;Emacs
Lisp&lt;/a&gt;.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Jim Newton&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1249642" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="hierarchy" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/hierarchy/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /><category term="walkCvHier" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/walkCvHier/default.aspx" /><category term="IC 6.1.5" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx" /><category term="flet" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/flet/default.aspx" /></entry><entry><title>Analog Assertion Based Verification Methodology – Reality or a Dream? (Part 1)</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/24/analog-assertion-based-verification-methodology-reality-or-a-dream-part-1.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/01/24/analog-assertion-based-verification-methodology-reality-or-a-dream-part-1.aspx</id><published>2011-01-24T23:00:00Z</published><updated>2011-01-24T23:00:00Z</updated><content type="html">&lt;p&gt;There is no doubt in my mind that assertions will play a significant role in analog verification, be it verifying individual analog blocks or a complete mixed-signal SoC in the near future. So yes, it is for real and it is here to stay. I hope to convince you in this blog that you should take a closer look at adopting assertion based verification (ABV) for your next mixed-signal design. I have worked on assertions extensively over the past several years and still remember very well the resistance I faced from customers in early 2004 when ABV was making its official debut into the digital world. I see similarities in the barriers faced in both the analog (today) and digital (a few years back) worlds for wide adoption of this powerful verification technique. &lt;/p&gt;&lt;p&gt;Let&amp;#39;s go back to year 2004 for a moment:&lt;/p&gt;&lt;p&gt;Digital engineers have been using procedural languages such as Verilog and VHDL for a very long time to design and verify their chips. Advanced verification languages such as Specman &lt;b&gt;&lt;i&gt;e,&lt;/i&gt;&lt;/b&gt; VERA, and C++ opened up new dimensions to traditional verification methodologies. Metric driven verification (MDV) improved the productivity of verification engineers by allowing them to test designs exhaustively, using random stimulus and at the same time finding bugs earlier in the verification cycle. SystemVerilog was evolving as the new standard language. &lt;/p&gt;&lt;p&gt;Around the same time formal verification was also catching up. Formal tools worked on proving design properties. Properties describe the design functionality in an easily readable format called assertions. The formal tools drive the design into numerous states exhaustively, and prove that the properties will always hold true or that the design state relevant to the property can never be reached, hence increasing the confidence of the verification engineer. It did not take the methodology leaders very long to leverage the power of assertions in a constrained-random verification environment. The exhaustiveness of the random simulations made assertions a perfect fit for MDV. Assertions once written hang around forever no matter what the status of the verification cycle. It is like a 24 hour security guard that is continuously looking to spot problems. &lt;/p&gt;&lt;p&gt;So assertions were adopted overnight by all digital verification teams across the globe, right?&amp;nbsp; Wrong. Let&amp;#39;s look at the barriers faced by assertions in the digital world.&lt;/p&gt;&lt;p&gt;1) Remember Verilog was/is still king. So it was no surprise that a declarative and abstract language feature such as assertions spooked the engineers in the beginning. The advantages of a declarative language over a procedural language are obvious by now but it is worth mentioning them one more time.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Verilog is verbose and it becomes difficult to read and maintain code for complex verification environments.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Verilog is not well suited for testing parallel events and if not written carefully it can miss capturing certain triggered events.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Verilog does not have built-in mechanism to provide functional coverage.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Assertions, on the other hand, are succinct, easily readable and maintainable, support spawning off multiple threads (parallel events) and have built-in mechanisms to collect coverage. &lt;/p&gt;&lt;p&gt;2) Who should be writing the assertions? The designer or the verification engineer? This is an ongoing debate. The logic is very clear but the logistics (such as resources) make these decisions in our extremely time constrained world. At the block level the individual designer must write the assertions. It is a great way to document the design functionality before handing the block over to the verification team. The verification engineers will write the interface level and system level assertions. &lt;/p&gt;&lt;p&gt;3) Which assertion language should I use? The existence of multiple flavors of assertion languages such as OVL, PSL, OVA, SVA and several other proprietary languages used by individual semiconductor companies left the EDA vendors and chip companies confused. As the dust settled and some standards evolved there was still resistance for wide adoption. Why?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Lack of re-usable assertion IP and real world examples.&lt;/li&gt;&lt;li&gt;Lack of a well defined ABV methodology. &lt;/li&gt;&lt;li&gt;Lack of sophisticated assertion debugging methodologies.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;But as tools matured over time ABV has found its home in the mainstream functional verification methodology and is an integral part of every SoC verification environment today.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Now let us come back to 2011:&lt;/p&gt;&lt;p&gt;The complexity of SoCs has made analog mixed-signal verification a must (&lt;a href="http://www.cadence.com/Community/blogs/fv/archive/2011/01/12/applying-digital-centric-verification-methodologies-to-analog.aspx?postID=1249231"&gt;Applying Digital-Centric Verification Methodologies to Analog&lt;/a&gt;). Excellent progress has been made in the evolution of new language extensions catering to mixed signal verification.&amp;nbsp; The first and the biggest challenge in verifying these complex SoCs is performance, and the introduction of analog behavioral modeling has proved to be a viable solution. Replacing the transistor level analog circuits with functional behavioral models have allowed the SoC integration and verification engineers to get their job done in a reasonable time. &lt;/p&gt;&lt;p&gt;Now that we have the analog blocks represented in the top level SoC, are we done? Is it enough to just verify the interface between the analog and digital blocks? No. Absolutely not. We have an opportunity to enhance the entire SoC verification environment by bringing in the functionality of the analog blocks as part of the MDV environment. Wouldn&amp;#39;t it be great if the analog blocks contributed to the overall coverage closure of the verification plan? Wouldn&amp;#39;t it be great if the analog blocks get verified in the context of the complete SoC verification environment for their core functionality? And what better way to accomplish this than analog ABV? &lt;/p&gt;&lt;p&gt;Like most complex methodologies it is easier said than done. In part 2 of this blog I will discuss the barriers for the adoption of ABV in the analog world, the solutions available today from Cadence and where the industry is headed. &amp;nbsp;&lt;/p&gt;&lt;p&gt;Srikanth V Raghavan&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1249631" width="1" height="1"&gt;</content><author><name>Raggie</name><uri>http://www.cadence.com/Community/members/Raggie.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Constraint-driven" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Constraint-driven/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /><category term="ABV" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ABV/default.aspx" /><category term="SVA" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SVA/default.aspx" /><category term="MDV" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/MDV/default.aspx" /><category term="AMS" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS/default.aspx" /><category term="PSL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PSL/default.aspx" /><category term="coverage" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/coverage/default.aspx" /><category term="random" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/random/default.aspx" /><category term="Verilog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Verilog/default.aspx" /><category term="SystemVerilog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SystemVerilog/default.aspx" /><category term="assertions" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertions/default.aspx" /><category term="assertion-based" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertion-based/default.aspx" /><category term="assertion" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/assertion/default.aspx" /></entry><entry><title>SKILL for the Skilled: What is SKILL++?</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2011/01/04/skill-for-the-skilled-what-is-skill.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2011/01/04/skill-for-the-skilled-what-is-skill.aspx</id><published>2011-01-04T18:00:00Z</published><updated>2011-01-04T18:00:00Z</updated><content type="html">&lt;p&gt;The way SKILL++ deals with functions is a bit different than the
way &lt;i&gt;traditional &lt;/i&gt;SKILL deals with them.  In this posting I&amp;#39;d
like to show how to implement a design hierarchy traversal engine in
SKILL++ and use it as an introduction to SKILL++.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;What is SKILL++?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;SKILL++ is a subset of the SKILL language, not a separate language as
one might suppose.  The term SKILL++ refers to a small but powerful
set of extensions that were made to the core SKILL language in the
mid 1990s and are now available for use in many Cadence tools.  In
fact, any Cadence tool that is extensible by loading and executing
SKILL programs is a candidate for using SKILL++, including: Virtuoso,
VirtuosoXL, pipo, Assura, Dracula, PVS, Allegro-PCB, cdnsip and
probably a few more that I&amp;#39;m forgetting.

&lt;/p&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;Basically the language features are:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Lexically
scoped&lt;/a&gt; variables
&lt;/li&gt;&lt;li&gt;Single function/variable name space (sometimes called
&lt;a href="http://www.nhplace.com/kent/Papers/Technical-Issues.html"&gt;Lisp-1&lt;/a&gt;)
&lt;/li&gt;&lt;li&gt;An object system based on the
&lt;a href="http://www.dreamsongs.com/CLOS.html"&gt;Common Lisp Object
System&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;By contrast, traditional SKILL offers
&lt;a href="http://c2.com/cgi/wiki?DynamicScoping"&gt;dynamically scoped&lt;/a&gt;
variables and separate names spaces (sometimes called Lisp-2) for
functions and variables.  Dynamic and lexical variables are both
useful for different purposes.  

&lt;/p&gt;&lt;p&gt;&lt;b&gt;What are dynamic and lexical variables?&lt;/b&gt; 

&lt;/p&gt;&lt;p&gt;These two kinds of variables differ semantically but not
syntactically.  All variables appearing in SKILL++ code are considered
lexical while all variables appearing in traditional SKILL code are
dynamic.
&lt;/p&gt;&lt;p&gt;
If you are wondering what the semantic difference is:

&lt;/p&gt;&lt;ul&gt;&lt;li&gt; Dynamic variables allow SKILL expressions to control particular
values during a dynamic extent; i.e., while a function and its
children functions are pending evaluation.  During this time of
pending evaluation, dynamic variables are visible globally unless
explicitly shadowed by another enclosed binding of the same name.
&lt;/li&gt;&lt;li&gt; Lexical variables allow functions to isolate visibility of
objects so that only a fixed set of expressions have access to the
value by name, but extend that access indefinitely -- even after the
dynamic extent of pending evaluation.
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
&lt;b&gt;Perceptions of SKILL++&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;In this article, we&amp;#39;ll ignore the SKILL++ object system and
concentrate on the first two of these capabilities -- sometimes referred
to jointly as the &lt;i&gt;SKILL++
&lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Scheme&lt;/a&gt;
Dialect&lt;/i&gt;.  Unfortunately, the other dialect which lives alongside
Scheme has no official marketing name.  For lack of a better name,
we&amp;#39;ll call it &lt;i&gt;traditional SKILL&lt;/i&gt;. Hereafter, I&amp;#39;ll just use the
term SKILL++ rather than the SKILL++ Scheme Dialect.

&lt;/p&gt;&lt;p&gt;
If you haven&amp;#39;t started using SKILL++ yet, the basics are simpler than
you might think.  If you are completely new to SKILL, you&amp;#39;ll find
SKILL++ easy and intuitive.  If you&amp;#39;re a long time SKILL programmer,
you&amp;#39;ll do things in SKILL++ pretty much the way you would have wanted
to 25 years ago when you started learning SKILL. That is, you&amp;#39;ve already
learned the hard way; now you can take a look at the easy way.
&lt;/p&gt;&lt;p&gt;&lt;b&gt;How to create SKILL++ code
&lt;/b&gt;&lt;/p&gt;&lt;p&gt;There are several ways to indicate to the SKILL interpreter that you
want to use SKILL++ rather than traditional SKILL.  One way is to end
your file names with the .ils extension for SKILL++
and .il for traditional SKILL; file.ils is
SKILL++; file.il is traditional SKILL.  

&lt;/p&gt;&lt;p&gt;
Please assume all the functions in the remainder of this article are
SKILL++.

&lt;/p&gt;&lt;b&gt;SKILL++ by example
&lt;/b&gt;&lt;p&gt;
The first example function, &lt;code&gt;walkCvHier&lt;/code&gt;, is an ultra-simple
design hierarchy traversal engine.  It won&amp;#39;t work for all purposes you
might need but is good for the purpose of the examples below.
&lt;/p&gt;&lt;pre&gt;1.1: (defun walkCvHier (cv consume)&lt;br /&gt;1.2:   (foreach inst cv~&amp;gt;instances&lt;br /&gt;1.3:     (walkCvHier inst~&amp;gt;master consume))&lt;br /&gt;1.4:   (consume cv))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
This function is a type of
&lt;a href="http://en.wikipedia.org/wiki/Higher_order_functions"&gt;higher-order
function&lt;/a&gt;, because it takes a function as one of its arguments.  It
is also possible with SKILL++ for functions to compute and create
other functions at run time according to their given arguments -- more
about this in a future article.  Although it is sometimes possible to
use traditional SKILL to create higher-order functions with limited
capability, my advice is that you always use SKILL++ if you need this
abstraction.
&lt;/p&gt;&lt;p&gt;
How does it work? The function, &lt;code&gt;walkCvHier&lt;/code&gt;, steps through
the explicit cellView hierarchy such as a layout, assuming you always
want to descend into the instance master.  At each step of the
hierarchy, a given function is applied.  You can pass in any function
as long as that function can take a cellView as its only argument.
The function, &lt;code&gt;walkCvHier&lt;/code&gt;, will happily call that function
for you at each cellView found of the hierarchy, every time that
cellView occurs.

&lt;/p&gt;&lt;p&gt;&lt;b&gt;Saving the hierarchy?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;

Here&amp;#39;s an example of how to use &lt;code&gt;walkCvHier&lt;/code&gt;.  The
function &lt;code&gt;saveCvHier&lt;/code&gt; asks &lt;code&gt;walkCvHier&lt;/code&gt; to
call &lt;code&gt;dbSave&lt;/code&gt; on each cellView in the hierarchy.
&lt;/p&gt;&lt;pre&gt;2.1: (defun saveCvHier (cv)&lt;br /&gt;2.2:   (walkCvHier cv dbSave))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
The function &lt;code&gt;walkCvHier&lt;/code&gt; has a local
variable &lt;code&gt;consume&lt;/code&gt;, declared on line 1.1, which it uses on
line 1.4 in the function call position &lt;code&gt;(consume cv)&lt;/code&gt;.
Because this is SKILL++, &lt;code&gt;consume&lt;/code&gt; does not refer to the
global function of that name, but since there is a local variable of
that name, that variable is used instead.  The value of that variable
better be a function, else an error will occur at run-time.  On line
2.2, the &lt;code&gt;saveCvHier&lt;/code&gt; function calls &lt;code&gt;dbSave&lt;/code&gt; as
this second argument.  There are several important things to note here:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The reference to &lt;code&gt;dbSave&lt;/code&gt; on line 2.2 is NOT QUOTED.
Why? Because in SKILL++ names of global functions can be referenced
exactly as variables.
&lt;/li&gt;&lt;li&gt;The &lt;code&gt;consume&lt;/code&gt; function is called on line 1.4 with
normal function calling syntax. Why? Because in SKILL++ you are
allowed to call global functions and local functions with the exact
same syntax.
&lt;/li&gt;&lt;li&gt;The name &lt;code&gt;consume&lt;/code&gt; does not need to start with a
capital letter or an underscore.  It need only obey the naming rules
for local variables.
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;Reporting the hierarchy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
Suppose that rather than
calling &lt;code&gt;dbSave&lt;/code&gt; on the hierarchy, you&amp;#39;d like to do
something for which there is no built-in function.  For example,
suppose you want to descend a design hierarchy and report which cellViews
are found.  You&amp;#39;ll need to provide a function which will do the
reporting for one cellView. One alternative is to define a function
for this purpose, such as &lt;code&gt;_reportCv&lt;/code&gt;.

&lt;pre&gt;3.1: (defun _reportCv (cv)&lt;br /&gt;3.2:   (println (list cv~&amp;gt;libName&lt;br /&gt;3.3:                  cv~&amp;gt;cellName&lt;br /&gt;3.4:                  cv~&amp;gt;viewName)))&lt;br /&gt;3.5:&lt;br /&gt;3.6: (defun reportCvHier (cv)&lt;br /&gt;3.7:   (walkCvHier cv _reportCv))&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;
The intent here is that &lt;code&gt;_reportCv&lt;/code&gt; be &lt;i&gt;private&lt;/i&gt; and
only be used in this one place.  However, because it is defined
with &lt;code&gt;defun&lt;/code&gt; (the same would be true if it were defined
with &lt;code&gt;procedure&lt;/code&gt;) it is actually available globally.  Its
private status cannot be enforced.  In the past, privacy has been
implemented in traditional SKILL using naming conventions and
documentation.  SKILL++ provides better fixes this problem by
providing ways systematic ways for
&lt;a href="http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29"&gt;hiding&lt;/a&gt;
data.
&lt;/p&gt;&lt;p&gt;
&lt;i&gt;...to be continued...&lt;/i&gt;
&lt;/p&gt;&lt;b&gt;What&amp;#39;s next?&lt;/b&gt;&lt;p&gt;

In the next posting we&amp;#39;ll look at local functions, closures (functions
with state), and a few slightly more advanced examples using
the &lt;code&gt;walkCvHier&lt;/code&gt; function.&lt;/p&gt;&lt;p&gt;Jim Newton &lt;/p&gt;&lt;h4&gt;See Also:&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Scheme&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scope_%28programming%29"&gt;Lexical vs. dynamic scoping&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scope_%28programming%29"&gt;Lexical scoping&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?DynamicScoping"&gt;Dynamic scoping&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Higher_order_functions"&gt;Higher order functions&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-35.html#%_sec_5.5.6"&gt;Optimizing lexical variables&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29"&gt;Encapsulation&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dreamsongs.com/CLOS.html"&gt;Common Lisp Object
System&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1248995" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="Allegro" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Allegro/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="hierarchy" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/hierarchy/default.aspx" /><category term="SKILL++" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx" /></entry><entry><title>On-Demand Webinar: Parasitic-Aware Design Part 3 -- Managing Parasitics in Back End</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/28/on-demand-webinar-parasitic-aware-design-part3-managing-parasitics-in-back-end.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/12/28/on-demand-webinar-parasitic-aware-design-part3-managing-parasitics-in-back-end.aspx</id><published>2010-12-28T14:00:00Z</published><updated>2010-12-28T14:00:00Z</updated><content type="html">&lt;p&gt;If you were not able to attend this recent live webinar, or were able to and would like to share the content of this webinar with colleagues, you can find an on-demand recording by clicking and registering here:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.cadence.com/cadence/events/Pages/event.aspx?eventid=467"&gt;Managing parasitics in the back end&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this third of a three part webinar series on parasitic aware design, Jeremiah Cessna and Sravasti Nair present an overview and demonstration of a back end analog IC design flow that allows you to effectively manage variability and uncertainty related to parasitics throughout the implementation phase of design.&amp;nbsp; Jeremiah discusses a new approach to rapid analog prototyping which enables early, efficient and accurate generation of parasitic design data.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Please let us know what you think, and if would like to see more webinars like this.&lt;/p&gt;&lt;p&gt;Mike Kelly&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1247347" width="1" height="1"&gt;</content><author><name>mrkelly</name><uri>http://www.cadence.com/Community/members/mrkelly.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /></entry><entry><title>On-Demand Webinar: Parasitic-Aware Design Part 2 -- Managing Parasitics in Front End</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/21/on-demand-webinar-parasitic-aware-design-part2-managing-parasitics-in-front-end.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/12/21/on-demand-webinar-parasitic-aware-design-part2-managing-parasitics-in-front-end.aspx</id><published>2010-12-21T14:00:00Z</published><updated>2010-12-21T14:00:00Z</updated><content type="html">&lt;p&gt;If you were not able to attend this recent live webinar, or were able to and would like to share the content of this webinar with colleagues, you can find an on-demand recording by clicking and registering here:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.cadence.com/cadence/events/Pages/event.aspx?eventid=464"&gt;Managing parasitics in front end&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this second of a three part webinar series on parasitic aware design, Nigel Bleasdale and Stacy Whiteman present an overview and demonstration of a front end analog IC design flow that allows you to effectively manage variability and uncertainty related to parasitics throughout the design and verification phases of design.&amp;nbsp; Nigel discusses a new approach to early pre-layout exploration of parasitic effects as well as rapidly converging on post-layout verification with parasitics.&lt;/p&gt;&lt;p&gt;Please let us know what you think, and if would like to see more webinars like this.&lt;/p&gt;&lt;p&gt;Mike Kelly&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1247346" width="1" height="1"&gt;</content><author><name>mrkelly</name><uri>http://www.cadence.com/Community/members/mrkelly.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /></entry><entry><title>On-Demand Webinar: Parasitic-Aware Design Part1 -- A Complete Analog Design Flow</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/17/on-demand-webinar-parasitic-aware-design-part1-a-complete-analog-design-flow.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/12/17/on-demand-webinar-parasitic-aware-design-part1-a-complete-analog-design-flow.aspx</id><published>2010-12-17T14:00:00Z</published><updated>2010-12-17T14:00:00Z</updated><content type="html">&lt;p&gt;If you were not able to attend this recent live webinar, or were able to and would like to share the content of this webinar with colleagues, you can find an on-demand recording by clicking and registering here:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.cadence.com/cadence/events/Pages/event.aspx?eventid=457"&gt;Parasitic Aware Design - A Complete Analog Design Flow&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this first of a three part webinar series on parasitic aware design, John Stabenow presents a high level overview of an end-to-end analog IC design flow that allows you to effectively manage variability and uncertainty related to parasitics throughout the design, verification and implementation phases of design.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Please let us know what you think, and if would like to see more webinars like this.&lt;/p&gt;&lt;p&gt;Mike Kelly&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1247345" width="1" height="1"&gt;</content><author><name>mrkelly</name><uri>http://www.cadence.com/Community/members/mrkelly.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /></entry><entry><title>Making Friends With Parasitic Effects </title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/13/making-friends-with-parasitic-effects-part-i.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/12/13/making-friends-with-parasitic-effects-part-i.aspx</id><published>2010-12-14T01:00:00Z</published><updated>2010-12-14T01:00:00Z</updated><content type="html">&lt;p&gt;OK, so the title is perhaps a little optimistic but I&amp;#39;m
playing off the saying &amp;quot;keep your friends close, but your enemies closer&amp;quot; (The
Godfather Part II: Francis Ford Coppola and Mario Puza). The corollary in
custom design is to bring the understanding of parasitic effects as early as
possible in the design flow, so there is less chance of surprises later.&lt;/p&gt;



&lt;p&gt;In custom design there are a few ways to bring your
parasitic effects &amp;quot;closer.&amp;quot; They are as follows:&lt;/p&gt;



&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The first is
perhaps the most painful. It&amp;#39;s where parasitic Rs and Cs are manually added
directly on the schematic in the hope they are representative enough to cover
the layout. So a duplicate of the design is created to protect the original.&lt;/p&gt;

&lt;p&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Some
companies have created scripts that will add a default parasitic capacitance to
every net in the design to at least push the design closer to the final result.
This can be done during the netlisting phase to avoid editing the schematic.&lt;/p&gt;

&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Other companies
have gone a step further and added in a level of structure recognition, so the
guesstimated parasitic elements are closer to what a layout would likely
produce. The estimates are programmed in, based on prior experience.&lt;/p&gt;

&lt;p&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Since
designs are typically 80% reused, it makes sense to try and leverage the 80% of
parasitic information you have from the previous designs. There are a number of
ways designers will do this, and depends on how much information is wanted.
Again some scripts are often developed to help.&lt;/p&gt;

&lt;p&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Lastly is the
prototype route, where the design is actually constructed very quickly to get
access to extracted results. This depends on a high level of automation in the
layout generation to make it worthwhile.&lt;/p&gt;

&lt;p&gt;Below is a flow that I want to present that covers the last three points and is based on the Parasitic Aware Design (PAD) capabilities of Virtuoso
ADE GXL. The six steps are:&lt;/p&gt;

&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create the
parasitic estimates &lt;/p&gt;

&lt;p&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Explore
their effects and make adjustments to the design&lt;/p&gt;

&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Complete
the layout and extraction as before&lt;/p&gt;

&lt;p&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Run the
verification simulations&lt;/p&gt;

&lt;p&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Analyze the
pre/post layout impact on performance and recalibrate the estimates from the real extracted results&lt;/p&gt;

&lt;p&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reuse the
parasitic estimates in subsequent designs as the parasitic estimates are saved
as constraints and travel with the design.&lt;/p&gt;

&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/CGA2E.png"&gt;&lt;/a&gt;&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/CGA2E.png"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/CGA2E.png" style="width:501px;height:388px;" border="0" alt="" /&gt;&lt;/a&gt;&lt;p&gt;PAD Flow&lt;/p&gt;



&lt;p&gt;The key challenge to any pre-layout parasitic analysis is
getting the estimates in the first place -- and the best estimates are going to
be those derived from real data. As I mentioned, some customers have developed
the ability to add parasitics based on some heuristics they developed over time
and scaled by the rules of the target process. With PAD, these can be included
into the flow using the SKILL interface. The advantage is you gain access to
all the other capabilities of PAD in ADE XL and GXL for analysis with these
effects. &lt;/p&gt;

&lt;p&gt;The alternative is to create a prototype of the layout and
collect the extracted results directly. With the constraint-driven flow from
Virtuoso Schematic Editor XL to Virtuoso Layout Suite XL/GXL, a prototype can
be created quickly. Use QRC to extract and you can run verification, then
either stitch parasitic networks of interest directly to your pre-layout design
or recalibrate any estimated parasitic.&lt;/p&gt;

&lt;p&gt;With PAD, you have the most
flexibility in incorporating the strategy that makes the most sense to you.
With reuse built in, it is now more possible than ever to reduce or even
eliminate the iterations back and forth between design and implementation.&lt;/p&gt;

&lt;p&gt;What strategy do you use?&lt;/p&gt;

&lt;p&gt;Nigel Bleasdale&lt;/p&gt;



&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1247212" width="1" height="1"&gt;</content><author><name>Nigel</name><uri>http://www.cadence.com/Community/members/Nigel.aspx</uri></author><category term="Parasitic analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Parasitic+analysis/default.aspx" /><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /><category term="Bleasdale" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Bleasdale/default.aspx" /><category term="PAD" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/PAD/default.aspx" /><category term="parasitics" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/parasitics/default.aspx" /></entry><entry><title>SKILL for the Skilled: Rule of English Translation</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/12/06/skill-for-the-skilled-rule-of-english-translation.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/12/06/skill-for-the-skilled-rule-of-english-translation.aspx</id><published>2010-12-06T17:00:00Z</published><updated>2010-12-06T17:00:00Z</updated><content type="html">&lt;p&gt;An obvious criticism of my previous post
&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/11/08/skill-for-the-skilled-making-programs-clear-and-concise.aspx"&gt;SKILL
for the Skilled: Making Programs Clear and Concise&lt;/a&gt; is
that &lt;i&gt;clarity&lt;/i&gt; is subjective.  What is clear to one person may be
confusing to someone else, especially to someone who is accustomed to
doing things the hard way.
&lt;/p&gt;&lt;p&gt;
I&amp;#39;d also suggest the converse is also true.  If you are
accustomed to using a programming language that encourages an
imperative style, you may become convinced that more confusing code
is clear.
&lt;/p&gt;&lt;p&gt;
Several readers of this blog referred me back to an iconic author in
the field of computer science, &lt;a href="http://www.norvig.com/"&gt;Peter
Norvig&lt;/a&gt;. The book &lt;a href="http://www.norvig.com/paip.html"&gt;Paradigms
of Artificial Intelligence Programming&lt;/a&gt; is a good resource as a
survey of many different non-trivial but easy to understand
programming problems.  The book is almost 1,000 pages and belongs on
every SKILL programmer&amp;#39;s bookshelf. The name of the book is generally
agreed to be misleading as it turns out not to be much about
artificial intelligence, but rather about programming style.

&lt;/p&gt;&lt;p&gt;Norvig also presents a nice test for clarity in his presentation
called a &lt;a href="http://www.norvig.com/luv-slides.ps"&gt;Tutorial on Good
Lisp Programming Style&lt;/a&gt;. The rule can be found on pages 53 and 54
of that set of slides.
&lt;/p&gt;&lt;span style="font-weight:bold;"&gt;Rule of English Translation&lt;/span&gt;
&lt;ol&gt;&lt;li&gt;Start with an English description of the algorithm.
&lt;/li&gt;&lt;li&gt;Write the code from the description.
&lt;/li&gt;&lt;li&gt;Translate the code back into English.
&lt;/li&gt;&lt;li&gt;Compare 3 to 1.
&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;From this description the implication seems to be that the smaller
the difference detected when comparing 1 and 3, the better job you have
done at writing a clear and concise program.
&lt;/p&gt;&lt;p&gt;
Let&amp;#39;s use SKILL as an example rather than Common Lisp as Norvig does.
Suppose we want to write a SKILL program to do some analysis of the
instances in a layout cellView.

&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Start with an English description of the algorithm&lt;/span&gt;

&lt;/p&gt;&lt;p&gt;Given a list of shapes and a layer name, find the subset of shapes on
that layer.&lt;/p&gt;&lt;p&gt;

&lt;span style="font-weight:bold;"&gt;First attempted implementation&lt;/span&gt; 

&lt;/p&gt;&lt;p&gt;The following implementation is an imperative approach. The reader
sees how the calculation occurs but has to think a while to figure out
exactly what is being calculated.

&lt;/p&gt;&lt;pre&gt;(defun shapes_on_layer (shapes layerName)&lt;br /&gt;  (let (stack)&lt;br /&gt;    (foreach shape shapes&lt;br /&gt;      (when (shape~&amp;gt;layerName == layerName)&lt;br /&gt;        (push shape stack)))&lt;br /&gt;    stack))&lt;br /&gt;&lt;/pre&gt;&lt;p style="font-weight:bold;"&gt;
Translate the code back into English&lt;/p&gt;&lt;p&gt;

Given a list of shapes and a layer name, start by initializing an
empty stack, iterate over the shapes. If the shape is on the given
layer, push it onto a stack; when finished iterating return the
elements on the stack.
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;More clear and concise implementation&lt;/span&gt;&lt;/p&gt;&lt;p&gt;

This implementation reads very easily, and it is clear to the reader
what is being calculated.

&lt;/p&gt;&lt;pre&gt;(defun shapes_on_layer (shapes layerName)&lt;br /&gt;  (setof shape shapes&lt;br /&gt;    (shape~&amp;gt;layerName == layerName)))&lt;br /&gt;&lt;/pre&gt;

&lt;p style="font-weight:bold;"&gt;Translate the code back into English&lt;/p&gt;

Given a list of shapes and a layer name, return the set of shapes which
are on the given layer.
&lt;p&gt;
We can see that when translated back to English, the second of the two
implementations looks much more like the original problem statement.

&lt;/p&gt;&lt;span style="font-weight:bold;"&gt;Exceptions&lt;/span&gt;&lt;p&gt; 

Of course there are exceptions to every rule (except perhaps this
one). Sometimes we must sacrifice clarity for efficiency--particularly
if the programming language is not as high level as SKILL.  If you
find the programming language you are using tends to more often force
you to write code in the style of the first two examples, rather than
the second, you should conclude that the strength of your programming
language is NOT its clarity and expressiveness.
&lt;/p&gt;&lt;p&gt;
Incidentally, I tested the two implementations above on my Linux
laptop to see which one is actually faster.  I tested both the
imperative and functional style implementations on a cellView
containing 32,768 shapes, 20,480 of which are on &amp;quot;Poly&amp;quot; layer.  The more
concise functional style implementation found the &amp;quot;Poly&amp;quot; subset about
7% faster than the imperative style implementation.  In this case
there was no run time performance penalty for clarity.

&lt;/p&gt;&lt;p&gt; The SKILL programming language allows you to write very expressive
code.

&lt;/p&gt;&lt;span style="font-weight:bold;"&gt;See Also:
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.norvig.com/"&gt;Peter Norvig&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.norvig.com/paip.html"&gt;Paradigms of Artificial
Intelligence Programming&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.norvig.com/luv-slides.ps"&gt;Tutorial on Good
Lisp Programming Style&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Jim Newton for Team SKILL&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1245533" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="LISP" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx" /><category term="clarity" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/clarity/default.aspx" /><category term="Norvig" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Norvig/default.aspx" /><category term="English translation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/English+translation/default.aspx" /></entry><entry><title>Video Demo -- Increase Simulation Accuracy and Efficiency With SpectreMDL</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/11/24/video-demo-increase-simulation-accuracy-and-efficiency-with-spectremdl.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/11/24/video-demo-increase-simulation-accuracy-and-efficiency-with-spectremdl.aspx</id><published>2010-11-24T16:00:00Z</published><updated>2010-11-24T16:00:00Z</updated><content type="html">&lt;p&gt;MDL is an immensely powerful feature in our simulators that allows designers to run better simulations quicker.&amp;nbsp; Below is a quick demo to get you started -- and be sure to try out the workshop in your hierarchy under &amp;lt;MMSIM_installation&amp;gt;/tools/spectre/examples/MDL_workshop.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;p&gt;If video fails to play click &lt;a href="http://www.youtube.com/v/zQkZ81suOUI&amp;amp;amp;hl=en_US&amp;amp;amp;fs=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Below are some solid SpectreMDL examples and tips from our Support knowledgebase that show what else it is capable of:&lt;/p&gt;
&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;How to calculate unity gain bandwidth, phase and gain margin using SpectreMDL&lt;/a&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;&lt;/a&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11319734"&gt;SpectreMDL example to measure maximum gm vs. drain current for a MOS device&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11577362"&gt;Optimize MDL performance using the Spectre &amp;quot;save=nooutput&amp;quot; option&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;&lt;/a&gt;&lt;p&gt;Samir Jafferali&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1244952" width="1" height="1"&gt;</content><author><name>AMSamirj</name><uri>http://www.cadence.com/Community/members/AMSamirj.aspx</uri></author></entry><entry><title>Video Demo -- Increase Simulation Accuracy and Efficiency With SpectreMDL</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/11/23/increase-simulation-accuracy-and-efficiency-with-spectremdl.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/11/23/increase-simulation-accuracy-and-efficiency-with-spectremdl.aspx</id><published>2010-11-24T00:10:00Z</published><updated>2010-11-24T00:10:00Z</updated><content type="html">&lt;p&gt;Measurement Description Language (MDL) is an immensely powerful feature in our simulators that is frequently overlooked.&amp;nbsp; MDL gives the designer advanced control of our simulators allowing them to run better simulations quicker.&amp;nbsp; Below is a quick demo to get you started. Also, be sure to try out the workshop in your hierarchy under &amp;lt;MMSIM_installation&amp;gt;/tools/spectre/examples/MDL_workshop.

&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;p&gt;If video fails to play click &lt;a href="http://www.youtube.com/v/zQkZ81suOUI&amp;amp;amp;hl=en_US&amp;amp;amp;fs=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here is some information that covers other examples and tips:&lt;/p&gt;&lt;p&gt;
&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;How to calculate unity gain bandwidth, phase and gain margin using SpectreMDL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;&lt;/a&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11319734"&gt;SpectreMDL example to measure maximum gm vs. drain current for a MOS device&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11577362"&gt;Optimize MDL performance using the Spectre &amp;quot;save=nooutput&amp;quot; option&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11192612"&gt;&lt;/a&gt;&lt;p&gt;Samir Jafferali&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1244898" width="1" height="1"&gt;</content><author><name>AMSamirj</name><uri>http://www.cadence.com/Community/members/AMSamirj.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Spectre" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Spectre/default.aspx" /><category term="MDL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/MDL/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="SpectreMDL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SpectreMDL/default.aspx" /></entry><entry><title>SKILL for the Skilled: Making Programs Clear and Concise</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/11/08/skill-for-the-skilled-making-programs-clear-and-concise.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/11/08/skill-for-the-skilled-making-programs-clear-and-concise.aspx</id><published>2010-11-08T14:00:00Z</published><updated>2010-11-08T14:00:00Z</updated><content type="html">&lt;p&gt;The SKILL programming language augments Cadence core tool
functionality for Virtuoso and Allegro customers.  It is also an
important development tool for internal Cadence services organizations
as well as Cadence product development groups.  We see the value,
power, flexibility, and elegance of the language as an enabling tool for customizing and enhancing design environments. These
capabilities are made possible by the tight integration of the
SKILL programming language into the Cadence platform.

&lt;/p&gt;&lt;p&gt;

This post introduces an upcoming series of articles, &lt;i&gt;SKILL for the Skilled&lt;/i&gt;,
which will attempt to better enable users to exploit the power and
elegance of this fun and interesting programming language.

&lt;/p&gt;&lt;p&gt; WARNING: What you are about to read is &lt;b&gt;HIGHLY OPINIONATED!&lt;/b&gt;

&lt;/p&gt;&lt;p style="font-weight:bold;"&gt;SKILL Functions: Short and Clear

&lt;/p&gt;&lt;p&gt;SKILL programs are usually made up of functions.  A function should be
short, clear, and express intent.  Some programming languages force
the programmer to transform the software problem into what the
language can express, rather than allowing the programmer to transform
the language to fit the problem at hand.  The unfortunate result is
often that the SKILL program looks like a C program, and is twice to
ten times as long as it needs to be.  We&amp;#39;ll look at this ability to
transform the language in upcoming articles.

&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Example Program&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;
To illustrate the idea that functions should be short and clear, here
are two different implementations of the same conceptual function.
The confusing one (#1) uses an imperative style. Avoid this style.
The second one (#2) uses a functional style.  Without sacrificing
clarity, it expresses in two lines what the imperative style expresses
in nine lines. It is clearer, probably easier to debug, most certainly
more efficient computation-wise, and scales better to larger programs.

&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Implementation #1 -- needlessly confusing&lt;/b&gt;

&lt;/p&gt;&lt;pre&gt;procedure( abs_less_than_100(x)&lt;br /&gt;  prog( (value)&lt;br /&gt;    value = abs(x)&lt;br /&gt;    if( value &amp;lt; 100&lt;br /&gt;      then return(t)&lt;br /&gt;      else return(nil)&lt;br /&gt;    ) ; if&lt;br /&gt;  ) ; prog&lt;br /&gt;) ; procedure&lt;br /&gt;&lt;/pre&gt;

&lt;b&gt;Implementation #2 -- clear and simple&lt;/b&gt;

&lt;pre&gt;(procedure (abs_less_than_100 x)&lt;br /&gt;  (abs x) &amp;lt; 100)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;

&lt;span style="font-weight:bold;"&gt;What were the programmers thinking?&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;
What are the problems of Implementation #1?  What was programmer #1&amp;#39;s
thought process?  He was probably trying to think like a Von Neumann
machine -- in terms of an arithmetic unit and moving values around
between registers until the goal is achieved.  Programmer #2 was
probably trying to express a mathematical expression.
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;A more natural way to think&lt;/span&gt;&lt;/p&gt;&lt;p&gt;

I claim that the mathematical evaluation model is an easier, more
natural way for humans to think than trying awkwardly to think like a
machine that&amp;#39;s moving data between registers.  Don&amp;#39;t try to make
the problem harder than it is.


&lt;/p&gt;&lt;b&gt;Some mistakes to avoid&lt;/b&gt;
&lt;p&gt;
Aside from the two very different ways of thinking, there are several
other issues I have with implementation #1.

&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It declares the useless variable: &lt;code&gt;value&lt;/code&gt;.  There is
  normally no need to declare a value which is used only once.

&lt;/li&gt;&lt;li&gt;It unnecessarily uses&amp;nbsp; &lt;code&gt;prog/return&lt;/code&gt;. There is no
  need to use &lt;code&gt;prog/return&lt;/code&gt; if you want to return the value
  that is already in the tail position.

&lt;/li&gt;&lt;li&gt;It unnecessarily uses &lt;code&gt;if/then/else&lt;/code&gt;. There is no need
  to test an expression for TRUE/FALSE, and thereafter produce the
  same TRUE/FALSE using &lt;code&gt;if/then/else&lt;/code&gt;.

&lt;/li&gt;&lt;li&gt;It fills up half the screen space with lines containing only close
  parentheses. There is no need to put parentheses on separate lines.
  Rather use an editor which enforces indentation.

&lt;/li&gt;&lt;li&gt;Its only comments are redundant; and worse, they will probably be
  out of date as soon as someone edits the function and forgets to
  check all the comments.
&lt;/li&gt;&lt;/ul&gt;

&lt;b&gt;SKILL is easy, flexible, powerful, and elegant&lt;/b&gt;
&lt;p&gt;
The SKILL language is on the one hand easy to learn and easy to use
for simple use-once-and-discard scripting tasks.  On the other hand
the power and flexibility of the language is evident when experienced
programmers develop well designed, high quality SKILL based software
applications. The elegance of the SKILL language is often
underestimated. A well written SKILL program is easy to understand,
takes fewer lines of code to implement, and incurs shorter development
times than with most other language alternatives, assuming the
developers understand the tools they are using.
&lt;/p&gt;&lt;p&gt;
Until now, it has been somewhat difficult to find insightful articles
written about SKILL and how to apply it to day to day problems. I hope
this series of articles enables you to get more benefit and enjoyment
out of the SKILL programming language.

&lt;/p&gt;&lt;p&gt;Jim Newton&amp;nbsp; &lt;/p&gt;&lt;h4&gt;&lt;b&gt;&lt;b&gt;See Also:&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt; &lt;a href="http://reprog.wordpress.com/2010/03/11/the-difference-between-imperative-and-functional-programming/"&gt;The Reinvigorated Programmer&lt;/a&gt;
&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt; &lt;a href="http://www.bartleby.com/141/strunk5.html#13"&gt;Avoid unnecessary clutter&lt;/a&gt;
&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt; &lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;What is Lisp?&lt;/a&gt;
&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;


&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1231111" width="1" height="1"&gt;</content><author><name>Team SKILL</name><uri>http://www.cadence.com/Community/members/Team-SKILL.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="Team SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx" /><category term="Allegro" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Allegro/default.aspx" /><category term="programming" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: ADE XL--Take This Job and...Run It!</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/10/06/things-you-didn-t-know-about-virtuoso-ade-xl-take-this-job-and-run-it.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/10/06/things-you-didn-t-know-about-virtuoso-ade-xl-take-this-job-and-run-it.aspx</id><published>2010-10-06T21:00:00Z</published><updated>2010-10-06T21:00:00Z</updated><content type="html">&lt;p&gt;Sometimes these articles just write themselves...&amp;nbsp; &lt;/p&gt;&lt;p&gt;Last week, 3 different people asked me questions about the&lt;b&gt; ADE XL Run Options&lt;/b&gt; form.&amp;nbsp;&amp;nbsp; Sadly, the odds that 3 people in the same week would ask a question to which I actually knew the answer are vanishingly slim, so that meant I needed to do some research.&amp;nbsp; And, in the course of that research, I discovered why there were so many questions about this topic.&amp;nbsp; It is quite confusing and the documentation seems to make sense only &lt;u&gt;after&lt;/u&gt; you thoroughly understand the subject.&lt;/p&gt;&lt;p&gt;Sounds like something that needs to be blogged -- if only so I have a place I can go to look up the answer the next time someone asks me that question.&lt;/p&gt;&lt;p&gt;So, here we go.&amp;nbsp; We&amp;#39;re talking about 2 forms here.&amp;nbsp; The first, the &lt;b&gt;Job Policy Setup&lt;/b&gt; form, is accessed by selecting &lt;b&gt;&lt;i&gt;Options-&amp;gt;Job Setup&lt;/i&gt;&lt;/b&gt; from the ADE XL window.&amp;nbsp; The second, where most of the confusion seems to come in, is the &lt;b&gt;Run Options&lt;/b&gt; form, accessed by selecting &lt;b&gt;&lt;i&gt;Options-&amp;gt;Run Options&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; Here they are for reference...&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/cadence_design/5057532841/" title="runoptions by cadencedesign, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4147/5057532841_58bd48c418.jpg" alt="runoptions" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The upper part of the &lt;b&gt;Job Policy Setup&lt;/b&gt; form concerns how you want to distribute your simulation runs in ADE XL.&amp;nbsp; This will vary depending on what type of job distribution system your company uses (LSF, SGE, etc.).&amp;nbsp; &amp;nbsp;We&amp;#39;ll take that up another time.&amp;nbsp; For now, let&amp;#39;s just assume you have some sort of system that lets you fire off simulations onto a farm of machines.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Now we need to define some terms:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A&amp;nbsp;&amp;quot;&lt;b&gt;run&lt;/b&gt;&amp;quot; in ADE XL = pressing the&amp;nbsp;green Run button in the UI.&amp;nbsp; Each &amp;quot;run&amp;quot; could be a single simulation or it could be 100 corner simulations...&lt;/li&gt;&lt;li&gt;A&amp;nbsp;&amp;quot;&lt;b&gt;job&lt;/b&gt;&amp;quot; in ADE XL = a remote job that is started for a run.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The way ADE XL works is that each&amp;nbsp;&lt;b&gt;run&lt;/b&gt; starts a number of &lt;b&gt;jobs (&lt;/b&gt;actually the process is called &amp;quot;ICRP&amp;quot;) on whatever machines you tell it to use (local, SGE, LSF, etc).&amp;nbsp; It uses the &amp;quot;&lt;b&gt;&lt;i&gt;Max. Jobs&lt;/i&gt;&lt;/b&gt;&amp;quot; field on the &lt;b&gt;Job Policy Setup&lt;/b&gt; form to determine the maximum number of those jobs to start.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Those processes stay alive for some &amp;quot;&lt;b&gt;&lt;i&gt;linger time&lt;/i&gt;&lt;/b&gt;&amp;quot; so that ADE XL can more efficiently start new simulations as needed.&amp;nbsp; So it will start by sending out a simulation to each &lt;b&gt;job&lt;/b&gt;, and then as each simulation completes, it will send that&amp;nbsp;&lt;b&gt;job&lt;/b&gt; a new simulation until all simulations in the&amp;nbsp;&lt;b&gt;run&lt;/b&gt; are completed.&lt;/p&gt;&lt;p&gt;Remember that.&amp;nbsp; A &amp;quot;&lt;b&gt;job&lt;/b&gt;&amp;quot; is assigned to a&amp;nbsp; particular &amp;quot;&lt;b&gt;run&lt;/b&gt;&amp;quot; and will likely receive a series of simulations to perform (assuming the &amp;quot;&lt;b&gt;run&lt;/b&gt;&amp;quot; involves more than a single simulation).&lt;/p&gt;&lt;p&gt;Let&amp;#39;s skip to the &lt;b&gt;Run Options&lt;/b&gt; form now.&lt;/p&gt;&lt;p&gt;The default in the &lt;b&gt;Run Options&lt;/b&gt; form is &lt;b&gt;&lt;i&gt;Serial&lt;/i&gt;&lt;/b&gt; - i.e. if you hit the green Run button twice,&amp;nbsp;the second &lt;b&gt;run&lt;/b&gt;&amp;nbsp;will not use any &lt;b&gt;jobs&lt;/b&gt; until the first &lt;b&gt;run&lt;/b&gt; completes. &lt;/p&gt;&lt;p&gt;If you set this to &lt;b&gt;&lt;i&gt;Parallel&lt;/i&gt;&lt;/b&gt;, if you hit the green Run button twice, the &lt;b&gt;runs&lt;/b&gt; will start in parallel. They will either share resources equally (which means if &lt;b&gt;&lt;i&gt;Max Jobs&lt;/i&gt;&lt;/b&gt; = 10, each &lt;b&gt;run&lt;/b&gt; will use 5 &lt;b&gt;jobs&lt;/b&gt;). Or you can specify - something like 3 &lt;b&gt;jobs&lt;/b&gt; per &lt;b&gt;run&lt;/b&gt;. &lt;/p&gt;&lt;p&gt;This applies to all run modes--corners, sweeps, Monte Carlo, optimization, etc.&lt;/p&gt;&lt;p&gt;So - for any given &lt;b&gt;run&lt;/b&gt;, all &lt;b&gt;jobs&lt;/b&gt; run in parallel. However multiple &lt;b&gt;runs&lt;/b&gt; in ADE XL are serial by default and can be made parallel.&lt;/p&gt;&lt;p&gt;Now, what about the fields at the bottom of the &lt;b&gt;Job Policy Setup&lt;/b&gt; form--&lt;b&gt;&lt;i&gt;For Multiple Runs (reassign immediately or wait until currently running points complete&lt;/i&gt;&lt;/b&gt;)?&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let&amp;#39;s say your setup is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Run in parallel&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Share resources equally&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Max jobs = 10. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You start a &lt;b&gt;run&lt;/b&gt; and the simulations are going to take 10 minutes. All ten &lt;b&gt;jobs&lt;/b&gt; start running the simulations. &lt;/p&gt;&lt;p&gt;Now you start another &lt;b&gt;run&lt;/b&gt; after making some changes to the setup.&lt;/p&gt;&lt;p&gt;So -- the question is -- do you want to immediately kill five of the current &lt;b&gt;jobs&lt;/b&gt; and re-assign them to the second &lt;b&gt;run&lt;/b&gt; or do you want to wait until the first five currently running simulations finish before re-assigning the &lt;b&gt;jobs&lt;/b&gt; to the second &lt;b&gt;run&lt;/b&gt;.&amp;nbsp; &lt;/p&gt;&lt;p&gt;(Don&amp;#39;t worry, the simulations that were killed will be assigned to re-run on one of the (now) five &lt;b&gt;jobs&lt;/b&gt; assigned to the first &lt;b&gt;run&lt;/b&gt;)&lt;/p&gt;&lt;p&gt;It&amp;#39;s an efficiency issue. Do you want to waste the progress already made by the &lt;b&gt;jobs&lt;/b&gt; on a simulation or do you want to make sure the subsequent &lt;b&gt;run(s)&lt;/b&gt; start right away?&lt;/p&gt;&lt;p&gt;I hope this is a bit enlightening.&amp;nbsp; You may need to read the above a couple of times until it becomes clear (I know I did).&amp;nbsp; &lt;/p&gt;&lt;p&gt;Stacy Whiteman &lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1179428" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /></entry><entry><title>Now Playing: Custom IC Videos-to-Go</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/09/27/now-playing-videos-to-go.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/09/27/now-playing-videos-to-go.aspx</id><published>2010-09-27T13:00:00Z</published><updated>2010-09-27T13:00:00Z</updated><content type="html">&lt;p&gt;I wanted to take a brief detour from my usual postings to point out a couple of new delivery mechanisms we&amp;#39;re trying out for distributing video collateral -- making better use of some of those toobz on the interwebs.&amp;nbsp; &lt;/p&gt;&lt;p&gt;First, we&amp;#39;ve made some of the videos in the CIC Video Library at &lt;a href="http://support.cadence.com/"&gt;http://support.cadence.com/&lt;/a&gt; available for download.&amp;nbsp; This way all the users at your site can&amp;nbsp;access the videos at your convenience without having to be logged into&amp;nbsp;Cadence Online Support.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Here&amp;#39;s a list of what&amp;#39;s available:&lt;/p&gt;



&lt;table style="border-collapse:collapse;" cellpadding="5" cellspacing="0"&gt;&lt;tr&gt;&lt;td style="background-color:#eeeeee;"&gt;&lt;p&gt;&lt;b&gt;Release &lt;br /&gt;(valid from)&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color:#eeeeee;"&gt;&lt;p&gt;&lt;b&gt;Video Topic&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="background-color:#eeeeee;"&gt;&lt;p&gt;&lt;b&gt;Software Area&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_CONSTRAINT_DRIVEN_FLOW/cnstFlowCOS.htm" target="_parent" title="This video demonstrates the Constraint Driven Flow in IC_614. It shows how design requirements can be captured and transferred using the Constraint System and how the constraints are implemented and verified in the Layout the implementation by automatic or interactive tools."&gt;Constraint Driven Flow in Virtuoso&lt;/a&gt; (15 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE-XL, VLS-XL, and VLS-GXL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_CONTEXT_SENSITIVE_RMB/Using_Context_Sensitive_RMBsCOS.htm" target="_parent" title="This video demonstrates how the new  context-sensitive RMB menus help achieve an improvement in productivity by making the most relevant  actions available at a single click (right-click)."&gt;Using Context-Sensitive RMB Menus&lt;/a&gt; (9 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;Virtuoso Layout Suite XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.0 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_WV/vse_wvCOS.htm" target="_parent" title="Describes how to use the World View assistant in VSE XL."&gt;The World View Assistant in VSE XL&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.0 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_UI/vse_uiCOS.htm" target="_parent" title="Describes how to use assistants, workspaces and toolbars in VSE XL."&gt;User Interface Configurations in VSE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_STRETCH/stretchCOS.htm" target="_parent" title="Describes how to use the Stretch command in VSE L."&gt;The Stretch command in VSE L&lt;/a&gt; (5 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.0 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_SEARCH/vse_searchCOS.htm" target="_parent" title="Describes how to use the Search toolbar and assistant in VSE XL."&gt;The Search Toolbar and Assistant in VSE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.0 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_PROPERTYEDITOR/vse_peaCOS.htm" target="_parent" title="Describes how to use the Property Editor assistant in VSE XL."&gt;The Property Editor Assistant in VSE XL&lt;/a&gt; (2 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_ONCANVAS/oncanvasCOS.htm" target="_parent" title="Describes how to perform direct text editing in VSE L."&gt;Direct Text Editing in VSE L&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_NETHIGHLIGHT/nethighlightCOS.htm" target="_parent" title="Describes how to perform dynamic net highlighting and net probing in VSE L."&gt;Dynamic Net Highlighting and Probing in VSE L&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_NAVIGATOR/vse_nav_614COS.htm" target="_parent" title="Describes how to use the Navigator assistant in VSE XL."&gt;The Navigator Assistant in VSE XL&lt;/a&gt; (2 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_ACCESS/vse_access_614COS.htm" target="_parent" title="Describes how to use bookmarks, tabs, and other design data access methods in VSE L."&gt;Design Data Access in VSE L&lt;/a&gt; (4 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;VSE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.3 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SWEEPS/adexl_qs_sweepsCOS.htm" target="_parent" title="Describes how to set variables and parameter sweeps in ADE XL."&gt;Variable and Parameter Sweeps in ADE XL&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SPECCOMP/adexl_qs_speccompCOS.htm" target="_parent" title="Describes how to use spec comparisons in ADE XL."&gt;Spec Comparisons in ADE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SPEC_RUN/adexl_qs_spec_run_614COS.htm" target="_parent" title="Describes how to set specifications and run simulations in ADE XL."&gt;Setting Specifications and Running Simulations in ADE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SETUP/adexl_qs_setup_614COS.htm" target="_parent" title="Describes how to setup multiple tests in ADE XL."&gt;Setting up Multiple Tests in ADE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_RESULTS/adexl_qs_results_614COS.htm" target="_parent" title="Describes how to utilize results panel views in ADE XL."&gt;Results Panel Views in ADE XL&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_RESIM/adexl_qs_resimCOS.htm" target="_parent" title="Describes how to perform incremental resimulation in ADE XL."&gt;Incremental Resimulation in ADE XL&lt;/a&gt; (2 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_PARAM/adexl_qs_param_614COS.htm" target="_parent" title="Describes how to use device instance parameterization in ADE XL."&gt;Device Instance Parameterization in ADE XL&lt;/a&gt; (2 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_MC/adexl_qs_mc_614COS.htm" target="_parent" title="Describes how to use Monte Carlo analysis in ADE XL."&gt;Monte Carlo Analysis in ADE XL&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_DATASHEET/adexl_qs_datasheet_614COS.htm" target="_parent" title="Describes how to create datasheets using ADE XL."&gt;Creating Datasheets in ADE XL&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_CORNERS/adexl_qs_corners_614COS.htm" target="_parent" title="Describes how to set up and simulate corners in ADE XL."&gt;Setting Up and Simulating Corners in ADE XL&lt;/a&gt; (4 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_CALC/adexl_qs_calc_614COS.htm" target="_parent" title="Describes how to use the ViVA calculator in ADE XL."&gt;ViVA Calculator Integration in ADE XL&lt;/a&gt; (1 min)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE XL&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEL/adelCOS.htm" target="_parent" title="Describes how to configure the ADE L user interface and apply advanced expression support."&gt;User Interface Configuration and Advanced Expression Support in ADE L&lt;/a&gt; (3 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;IC 6.1.4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_DependentExpressions/DependentExpressions-ver3COS.htm" target="_parent" title="Describes how to create expressions that are based on other expressions."&gt;Dependent Expressions in ADE L&lt;/a&gt; (5 mins)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;i&gt;ADE L&lt;/i&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;As if that isn&amp;#39;t enough to keep you busy, we&amp;#39;ve also posted some of the videos on YouTube.&amp;nbsp; That&amp;#39;s right, Cadence has its own &lt;a href="http://www.youtube.com/user/CadenceDesign" target="_blank"&gt;YouTube Channel&lt;/a&gt;.&amp;nbsp; Hit the Subscribe button, so the next time you&amp;#39;re standing in line at the DMV and feel a sudden need to know how to set up specifications in ADE XL, just pull out that smart phone and take a look.&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1179119" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: ADE XL -- Where Did My Data Go?</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/09/21/things-you-didn-t-know-about-virtuoso-ade-xl-data-storage.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/09/21/things-you-didn-t-know-about-virtuoso-ade-xl-data-storage.aspx</id><published>2010-09-22T00:00:00Z</published><updated>2010-09-22T00:00:00Z</updated><content type="html">&lt;p&gt;Last week I got to attend a &amp;quot;Social Media Summit&amp;quot; here at Cadence.&amp;nbsp; Jeepers, a &amp;quot;summit.&amp;quot;&amp;nbsp;&amp;nbsp; I feel so important.&amp;nbsp; Anyway, being the kind of person I am, one of the things that stuck in my mind was that they told us not to &amp;quot;tweet aggressively.&amp;quot;&amp;nbsp; Got it.&amp;nbsp; Should I ever decide to &amp;quot;tweet&amp;quot;, I promise to do so in a completely non-threatening manner.&amp;nbsp; Seriously though (since it&amp;#39;s quite likely our summit leaders are reading this) there was loads of great content in the meeting.&amp;nbsp; Thanks folks!&amp;nbsp; Hopefully I can make good use of some of the tips.&lt;/p&gt;&lt;p&gt;On to today&amp;#39;s ADE XL topic.&amp;nbsp; This article is concerned more with nuts-and-bolts and less with flashy user interfaces than usual, but hey, we&amp;#39;re engineers, right?&amp;nbsp; We like to know how things are put together.&amp;nbsp; So, let&amp;#39;s talk about what kinds of data ADE XL stores, where it keeps it and how you can control it.&lt;/p&gt;&lt;p&gt;&lt;b&gt;3 types of data&lt;/b&gt;&lt;/p&gt;&lt;p&gt;ADE XL divides the data it deals with into 3 categories.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Setup&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;This is the information you put into ADE XL. &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the past several posts, I&amp;#39;ve told you how to &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/05/things-you-didn-t-know-about-virtuoso-ade-xl-test-setup.aspx?postID=787890"&gt;set up tests&lt;/a&gt; and &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/25/things-you-didn-t-know-about-virtuoso-outputs-setup-in-ade-xl.aspx?postID=1125484"&gt;create output expressions&lt;/a&gt;.&amp;nbsp; These simulation setups are stored in the adexl view in a subdirectory called &amp;quot;test_states&amp;quot;, similar in structure to the ADE states directories you&amp;#39;re already familiar with.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I haven&amp;#39;t written anything here about specifications.&amp;nbsp; I think I&amp;#39;ll leave that as an exercise for the reader. (&lt;b&gt;Hint&lt;/b&gt;: In the Outputs Setup pane, next to one of your expressions, double-click in the column labeled &amp;quot;Spec&amp;quot;.)&amp;nbsp; Specifications, along with variables, parameters, sweeps and corners (each to be the subject of future articles) are collectively referred to as the &lt;b&gt;Setup DB&lt;/b&gt;.&amp;nbsp; This is stored in the adexl view you created when you selected &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/07/27/things-you-didn-t-know-about-virtuoso-ade-xl.aspx?postID=556596"&gt;Launch-&amp;gt;ADE XL&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Waveforms and netlists&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;You know what this is -- the output generated by the simulator.&amp;nbsp; PSF, SST2, PSF XL, etc.&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Results&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;The ADE XL &lt;b&gt;Results DB&lt;/b&gt; contains the values for all your output expressions -- essentially everything that gets evaluated after the simulation is finished.&amp;nbsp;&amp;nbsp; It&amp;#39;s organized in a format to easily generate those big tables you see when you run sweeps and corners.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;Environment Variables&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The locations for storing the waveform files and the Results DB are controlled by 3 environment variables. (I&amp;#39;ll use the syntax you&amp;#39;d need for setting these in your .cdsinit file.)&lt;/p&gt;&lt;p&gt;&lt;i&gt;projectDir&lt;/i&gt;&amp;nbsp;&amp;nbsp;&lt;i&gt; envSetVal(&amp;quot;asimenv.startup&amp;quot; &amp;quot;projectDir&amp;quot; &amp;lsquo;string &amp;quot;&amp;lt;path&amp;gt;&amp;quot;)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;You may already be using this variable.&amp;nbsp; This is the same way you set the location for the simulation output in ADE L.&amp;nbsp; This defaults to $HOME/simulation.&lt;/p&gt;&lt;p&gt;&lt;i&gt;saveResDir&amp;nbsp;&amp;nbsp; envSetVal(&amp;quot;adexl.results&amp;quot; &amp;quot;saveResDir&amp;quot; &amp;lsquo;string &amp;quot;&amp;lt;path&amp;gt;&amp;quot;)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;If specified, this controls where the waveforms and netlist directories get saved. &lt;/p&gt;&lt;p&gt;&lt;i&gt;saveDir&amp;nbsp;&amp;nbsp; envSetVal(&amp;quot;adexl.results&amp;quot; &amp;quot;saveDir&amp;quot; &amp;lsquo;string &amp;quot;&amp;lt;path&amp;gt;&amp;quot;)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;If specified, this controls where the ADE XL Results DB gets saved.&amp;nbsp; This defaults to a subdirectory called, appropriately enough, &amp;quot;results&amp;quot; in the adexl view.&lt;/p&gt;&lt;p&gt;That said, here&amp;#39;s a handy little table illustrating where things get saved when any of these variables are set.&lt;/p&gt;&lt;table cellpadding="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;&lt;b&gt;saveDir&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;&lt;b&gt;saveResDir&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;&lt;b&gt;Results DB&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;&lt;b&gt;Waveforms/Netlists&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;not set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;not set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;adexl view&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;projectDir&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;not set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;adexl view&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;saveResDir&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;not set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;saveDir&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;saveDir&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;set&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;saveDir&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;saveResDir&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;(If you are working with an adexl view in read-only mode, and you don&amp;#39;t set the saveDir variable, the Results DB will be saved to the projectDir).&lt;/p&gt;&lt;p&gt;&lt;b&gt;Interactive Control&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In ADE XL, the &lt;b&gt;Options-&amp;gt;Save...&lt;/b&gt; dialog has section at the bottom where you can specify where you want to save the Simulation Results (Waveforms) and the ADE XL Results Database.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Bonus Tip: Copying ADE XL Views&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Use the Library Manager to copy adexl views&lt;/u&gt; (or cells or libraries which contain adexl views).&amp;nbsp; Set the following in your .cdsinit file in order to make the copy work correctly:&lt;/p&gt;&lt;p&gt;&lt;i&gt;envSetVal(&amp;quot;ddserv.lib&amp;quot; &amp;quot;enableCopyInDFII&amp;quot; &amp;lsquo;boolean t)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;envSetVal(&amp;quot;cdsLibManager.copyGlobals&amp;quot; &amp;quot;mpsRadio&amp;quot; &amp;lsquo;toggle t)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Then, if you want to copy just the &lt;b&gt;Setup DB&lt;/b&gt;, just do a regular copy in the Library Manager.&lt;/p&gt;&lt;p&gt;If you want to copy both the &lt;b&gt;Setup DB and the Results DB&lt;/b&gt;, select &lt;i&gt;Update Instances-&amp;gt;Of New Copies Only&lt;/i&gt; when you do the copy.&lt;/p&gt;&lt;p&gt;If you want to copy &lt;b&gt;all 3 types of data&lt;/b&gt; (Setup DB, Results DB and Waveforms), set the additional variable:&amp;nbsp; envSetVal(&amp;quot;adexl.cpupdtr&amp;quot; &amp;quot;copyResultsData&amp;quot; &amp;lsquo;boolean t) and copy as in the previous example.&lt;/p&gt;&lt;p&gt;That&amp;#39;s all for now.&amp;nbsp; Hopefully I haven&amp;#39;t confused anyone too much.&amp;nbsp; If I have, leave a comment and we&amp;#39;ll try to sort it out...&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1178913" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: Outputs Setup in ADE XL</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/25/things-you-didn-t-know-about-virtuoso-outputs-setup-in-ade-xl.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/08/25/things-you-didn-t-know-about-virtuoso-outputs-setup-in-ade-xl.aspx</id><published>2010-08-25T20:00:00Z</published><updated>2010-08-25T20:00:00Z</updated><content type="html">&lt;p&gt;Continuing on our exploration of ADE XL (see &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/07/27/things-you-didn-t-know-about-virtuoso-ade-xl.aspx" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/05/things-you-didn-t-know-about-virtuoso-ade-xl-test-setup.aspx" target="_blank"&gt;here&lt;/a&gt; for previous articles), today let&amp;#39;s take a look at the Outputs area in the center of the screen.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Any output signals or expressions which appear in the ADE XL Test Editor (or the ADE L window if you created the setup in there) will show up automatically in the Outputs Setup tab.&amp;nbsp; You can still work with them the same way you always have by bringing up the Test Editor (RMB on the test name in the Data View Assistant and select Open Test Editor...).&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;But I&amp;#39;m not here to tell you how to do things the same way you&amp;#39;ve always done them...&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Let&amp;#39;s start by taking a look at the row of icons at the top of the Outputs Setup tab.&amp;nbsp; The first one on the left is a pulldown that allows you to add various types of outputs and measurements to each test.&amp;nbsp; So if you want to add an expression, select the appropriate test and choose &amp;quot;&lt;b&gt;Expression&lt;/b&gt;&amp;quot;.&amp;nbsp; A new blank line of type &amp;quot;&lt;b&gt;expr&lt;/b&gt;&amp;quot; will show up at the bottom of the pane.&amp;nbsp; Now, double-click in the field under the column &amp;quot;&lt;i&gt;Expression/Signal/File.&lt;/i&gt;&amp;quot;&amp;nbsp; You&amp;#39;ll be able to type into the field, and you&amp;#39;ll also see 2 cryptically labelled buttons.&amp;nbsp; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Just an aside here...whenever you see a button, icon or even a piece of text that you don&amp;#39;t understand in Virtuoso, try hovering your mouse over it for a second.&amp;nbsp; Hopefully, you will be rewarded with a &lt;b&gt;pink box&lt;/b&gt; containing a &lt;b&gt;tooltip&lt;/b&gt; telling you what that button does.&amp;nbsp; We&amp;#39;d like these tooltips to be helpful and usually they are.&amp;nbsp; But sometimes the tooltips are missing and sometimes they&amp;#39;re downright silly.&amp;nbsp; Let us know about those, so we can fix them...or at least share a good laugh...&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Anyway, back to adding an expression.&amp;nbsp; In case you didn&amp;#39;t catch the hint, hover your mouse over the 2 buttons in the &amp;quot;&lt;i&gt;Expression/Signal/File&lt;/i&gt;&amp;quot; field to see what they do.&amp;nbsp; Now, use one of them (hint: &lt;b&gt;&amp;quot;...&amp;quot;&lt;/b&gt;) to open the calculator.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I&amp;#39;m not going to get into how to use the calculator in this article.&amp;nbsp; I did an &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/12/03/things-you-didn-t-know-about-virtuoso-viva-part-4-and-final.aspx" target="_blank"&gt;article on it&lt;/a&gt; late last year and I&amp;#39;ll probably fill up one or two more later this year as well.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Let&amp;#39;s fast forward to the part where you&amp;#39;ve got an expression in the calculator buffer that you want to get it back into ADE XL.&amp;nbsp; Go back to the ADE XL window and click on the other mysterious icon in the &amp;quot;&lt;i&gt;Expression/Signal/File&lt;/i&gt;&amp;quot; field (hint: &lt;b&gt;&amp;quot;&amp;lt;&amp;quot;&lt;/b&gt;) to pull the contents of the calculator buffer into the field.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Tip:&lt;/b&gt; There&amp;#39;s another way to do this if you&amp;#39;ve already got the calculator open.&amp;nbsp; To save yourself some window hopping, verify that the test name showing in the &amp;quot;Test&amp;quot; pulldown at the top of the calculator is the one you want to work with, then select &lt;b&gt;Tools-&amp;gt;Send to ADE XL Test&lt;/b&gt; from the calculator banner menu.&amp;nbsp; This automatically creates a new expression for that test in the Outputs Setup tab and sends the contents of the calculator buffer to populate it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Dependent Expressions&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Earlier this year &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/10/things-you-didn-t-know-about-virtuoso-ic-6-1-4-ade-enhancements.aspx" target="_blank"&gt;I wrote about&lt;/a&gt; the exciting news that dependent expressions are now supported in IC 6.1.4 for ADE L.&amp;nbsp; Well, that goes for ADE XL as well.&amp;nbsp; If you want to build an expression which is built from other expressions, all you have to do is use the name of the expression (which, of course, you can assign in the Name column of the Outputs Setup panel) and off you go.&lt;/p&gt;&lt;p&gt;This works for creating multiple expressions within the same test.&amp;nbsp; To build expressions using results from multiple tests, you use what we refer to as...&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Combinatorial Expressions&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;To create an output expression using results from multiple tests, just &lt;b&gt;drag&lt;/b&gt; the desired expressions (one at a time) starting from any field in the line containing that expression in the Outputs Setup pane and &lt;b&gt;drop&lt;/b&gt; them into the calculator buffer.&amp;nbsp; When you drop in an expression, you&amp;#39;ll see that it has morphed into a different syntax:&amp;nbsp; &lt;i&gt;calcVal(&amp;quot;expression_name&amp;quot; &amp;quot;test_name&amp;quot;).&lt;/i&gt;&amp;nbsp; You can use the calculator as usual to build the expression and then use either of the 2 methods described above to get it back into ADE XL. &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Bonus Tip&lt;/b&gt;: You can create combinatorial expressions for &lt;b&gt;variables&lt;/b&gt; in the same way, by dragging from the Outputs Setup pane into the desired Value field in the Global Variables or Design Variables sections of the Data View or Variables and Parameters Assistants (we&amp;#39;ll talk more about variables in a future article).&amp;nbsp; &lt;/p&gt;&lt;p&gt;In this way, you can set a design variable value, such as a voltage or current source based on results from another test.&lt;/p&gt;&lt;p&gt;Obviously, you&amp;#39;ll need to avoid creating a cyclic dependency when you do this (a variable value which depends on results from a test which uses that variable).&amp;nbsp; ADE XL will scold you if you try.&lt;/p&gt;&lt;/blockquote&gt;&lt;a href="http://www.flickr.com/photos/cadence_design/4926726605/" title="combinatorial by cadencedesign, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4134/4926726605_59c60fec3f.jpg" alt="combinatorial" style="width:517px;height:402px;" width="500" height="375" /&gt;&lt;/a&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Quick ways to create more output expressions&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Sometimes you might need to use the same (or similar) expressions in several tests.&amp;nbsp; To do this, simply RMB over the expression you want to use in another test, select &lt;b&gt;Copy to Test&lt;/b&gt; and choose the test(s) you want to copy it to.&amp;nbsp; You can also use Ctrl-Select or Shift-Select to grab multiple expressions and copy them all to another test.&amp;nbsp; Of course you can edit them as desired after you copy them. &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: Double-click on an expression in the Outputs Setup pane and click that &amp;quot;...&amp;quot; icon I mentioned above to push the expression into the calculator buffer if you want to edit it more easily.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Ctrl-C and Ctrl-V also work to copy just the contents of a particular field from one place to another.&lt;/p&gt;&lt;p&gt;Well, I thought I&amp;#39;d have time for a lot more in this article, but it&amp;#39;ll have to wait until next time.&amp;nbsp; As always, leave a comment if you find any tips of your own to share or if there are any topics you&amp;#39;d like to see discussed further.&lt;/p&gt;&lt;p&gt;Stacy&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1125484" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso IC 6.1.3" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC+6.1.3/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="Analog simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /></entry><entry><title>Analog Design vs. Automation -- Why Are They At Odds?</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/17/analog-design-vs-automation-why-are-they-at-odds.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/08/17/analog-design-vs-automation-why-are-they-at-odds.aspx</id><published>2010-08-17T23:00:00Z</published><updated>2010-08-17T23:00:00Z</updated><content type="html">&lt;p&gt;Back in 2002 and 2003 there was a lot of talk about analog
synthesis being the &amp;quot;next new thing&amp;quot; to close the productivity gap between
analog and digital designers. Well, I hope you didn&amp;#39;t hold your breath for this!&lt;/p&gt;

&lt;p&gt;That promise failed mostly because analog design was still a
custom design challenge, relying on innovation to provide differentiation in
the final application. Standardizing analog design, or constraining the design
to a fixed set of rules, never worked in reality, and innovation was squashed in
the process. &lt;/p&gt;

&lt;p&gt;Also, new designs are typically bigger, better and faster
than previous generations, and a fully automated solution provides little more
than derivatives of what already exists (assuming these derivatives&amp;nbsp;work).&lt;/p&gt;

&lt;p&gt;However, the challenge never went away, and over the past
seven years there have been a number of different approaches to try and move
analog design out of the critical path. These seem to focus mostly on offering
premade IP or speeding up the core verification tools used, such as simulation,
extraction and DRC/LVS. &lt;/p&gt;

&lt;p&gt;For custom design to be truly effective and productive,
these improvements are certainly needed,&amp;nbsp;but a number of additional
capabilities are necessary to facilitate the innovation of the designer. The
answer lies in &amp;quot;Assisted Design,&amp;quot; which I like to think of as analogous to
adding power steering to your design flow. The designer is left in control, but
the effort to move a design from point A to point B is reduced. Here,
automation has a part to play and can be used to augment the flow, without
replacing it.&lt;/p&gt;

&lt;p&gt;There are a number of capabilities that fit into this space
that support the &amp;quot;power assisted&amp;quot; flow, some of which you may already be using.
I&amp;#39;ll introduce them here and in future blogs I&amp;#39;ll go into more detail. If there
is a topic in this area you want covered, let me know.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Sweeps and Tuning&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;This is a commonly used tool that can simply vary the design,
assess the impact on the design goals, and manually find the optimum solution.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Feasibility Analysis&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;Early in the design creation process, feasibility analysis
can be used to quickly see if a design has potential before more extensive
investment in simulation is made.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Sensitivity Analysis&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;For any design solution, it&amp;#39;s possible to quickly explore
the design&amp;#39;s sensitivity to processing variability and environmental conditions
and even the sizes of the devices used in the design.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Design Finishing&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;This involves pulling a design into compliance over all the
required conditions, and can be quite time consuming where a large numbers of
corners are concerned.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Yield Improvement&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;Understanding the manufacturing margin is becoming more
critical as greater performance is being demanded from existing foundry
processes. For some applications, high-yielding designs up to six sigma margins
are required.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Parasitic Analysis&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;The performance of the final implementation can be quite
different from the idealized view presented in a schematic. The earlier the
layout effects can be assessed, the less iterations are needed between the
electrical designer and layout designer. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Design Constraints (not to be confused with Design Rules)&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;As we know them, design rules are actually process rules and
can also be sometimes called constraints. Here, I am referring to
the&amp;nbsp;implementation requirements that are specific to a design&amp;#39;s
configuration.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Self Documentation&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;Documentation is often left until the last minute, but is
still required to sign off a design.&lt;/p&gt;

&lt;p&gt;Automation in the custom design flow often leaves designers
worried over loss of control or concerned over wasting a lot of time. Future
blogs will explore how automation technology can be embraced in a practical
flow that supports the designer&amp;#39;s creative process and assists in meeting
productivity goals. &lt;/p&gt;

&lt;p&gt;--Nigel Bleasdale&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=986190" width="1" height="1"&gt;</content><author><name>Nigel</name><uri>http://www.cadence.com/Community/members/Nigel.aspx</uri></author><category term="Circuit Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Circuit+Design/default.aspx" /><category term="Parasitic analysis" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Parasitic+analysis/default.aspx" /><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="optimization" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/optimization/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="ADE-GXL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx" /><category term="Bleasdale" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Bleasdale/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: ADE XL Test Setup</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/08/05/things-you-didn-t-know-about-virtuoso-ade-xl-test-setup.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/08/05/things-you-didn-t-know-about-virtuoso-ade-xl-test-setup.aspx</id><published>2010-08-06T00:00:00Z</published><updated>2010-08-06T00:00:00Z</updated><content type="html">&lt;p&gt;In my last &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/07/27/things-you-didn-t-know-about-virtuoso-ade-xl.aspx" target="_blank"&gt;post&lt;/a&gt;, I left you in suspense, with your mouse hovering over the words &amp;quot;&lt;b&gt;Click to add test&lt;/b&gt;&amp;quot; in ADE XL.&amp;nbsp; Clicking on this button will bring up the &lt;b&gt;ADE XL Test Editor&lt;/b&gt; window (which should look suspiciously familiar) and a dialog asking you to point to the design you want to use.&amp;nbsp; This design does not have to be the same cellview as the adexl view you&amp;#39;re working with.&amp;nbsp; It can be any design you want to simulate.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;ADE XL Test Editor&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Now take a look at the ADE XL Test Editor.&amp;nbsp; &lt;u&gt;DON&amp;#39;T PANIC&lt;/u&gt;.&amp;nbsp; It&amp;#39;s exactly the same as the good old friendly ADE L window.&amp;nbsp; You set up your test in exactly the same way you do it in ADE L.&amp;nbsp; If you have an existing state, load it here.&amp;nbsp; If not, use the &lt;b&gt;Setup, Analyses, Variables&lt;/b&gt; and &lt;b&gt;Outputs&lt;/b&gt; menus to create your simulation setup.&amp;nbsp; &lt;/p&gt;&lt;p&gt;The ADE XL Test Editor also includes all the features and enhancements discussed in my previous posts (&lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/09/10/things-you-didn-t-know-about-virtuoso-ade.aspx" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/10/things-you-didn-t-know-about-virtuoso-ic-6-1-4-ade-enhancements.aspx?postID=26784" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: If you put the following in your .cdsinit file, the Test Editor window will also include the Run button, so you can test out your setup without stepping out of your comfort zone--&lt;/p&gt;&lt;p&gt;&lt;i&gt;envSetVal(&amp;quot;adexl.testEditor&amp;quot; &amp;quot;showAllMenus&amp;quot; &amp;#39;boolean t)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Ok, let&amp;#39;s step out of that comfort zone, shall we?&amp;nbsp; Why do you want that extra window anyway?&amp;nbsp; Close it and let&amp;#39;s move along.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;You don&amp;#39;t need the Test Editor&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Back in ADE XL, you&amp;#39;ll see the test you just added in the Tests section of the &lt;b&gt;Data View Assistant&lt;/b&gt; (upper left corner of the main window).&amp;nbsp; By default, the test will be named something like &lt;i&gt;myLib:myCell:1&lt;/i&gt;.&amp;nbsp; The :1 suffix will increment if you add other tests with the same library and cell name.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: I don&amp;#39;t know about you, but I usually find the default test names to be annoyingly long, so I like to &lt;b&gt;rename&lt;/b&gt; them to something more meaningful to me.&amp;nbsp; To do this, we&amp;#39;ll employ a technique I&amp;#39;ll call &amp;quot;edit in place&amp;quot;.&amp;nbsp; First, click on the name of the test in the Data View Assistant. It will look like it&amp;#39;s selected.&amp;nbsp; Now click again and you&amp;#39;ll be in edit mode.&amp;nbsp; Note I didn&amp;#39;t say &amp;quot;double-click&amp;quot; (That would open the Test Editor window and we&amp;#39;re done with that...).&amp;nbsp; Just click and then click again--there&amp;#39;s a difference.&amp;nbsp; &lt;/p&gt;&lt;p&gt;You can see lots of information about the test right in the Data View Assistant.&amp;nbsp; By expanding the tree, you can see the simulator, the analyses and the design variables for each test.&amp;nbsp; Hover over the test name and you&amp;#39;ll get a gigantic tooltip which will show you the lib/cell/view for that test (among other things).&amp;nbsp; Click the &lt;b&gt;RMB (right mouse button)&lt;/b&gt; and you&amp;#39;ll be able to directly access pretty much every element of the test setup (temperature, model libraries, options, etc.).&amp;nbsp; &lt;/p&gt;&lt;p&gt;Information about the outputs from the test can be seen and modified in the &lt;b&gt;Outputs Setup&lt;/b&gt; pane (the big area in the middle of the window).&amp;nbsp; &lt;b&gt;RMB&lt;/b&gt; in that area and you&amp;#39;ll see all the entries relating to setting up outputs to be saved and plotted, adding expressions as well as access to the &amp;quot;&lt;b&gt;Save All&lt;/b&gt;&amp;quot; and &amp;quot;&lt;b&gt;Printing/Plotting Options&lt;/b&gt;&amp;quot; dialogs.&amp;nbsp; We&amp;#39;ll talk more about this area in detail in a later article.&lt;/p&gt;&lt;p&gt;There&amp;#39;s no need to open the Test Editor window again.&amp;nbsp; Really.&amp;nbsp; Why do you need another window?&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/cadence_design/4864702878/" title="adexlrmb by cadencedesign, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4137/4864702878_c40df04319.jpg" alt="adexlrmb" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Dude, where&amp;#39;s my schematic?&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;RMB on the test name in the Data View Assistant and select &amp;quot;&lt;b&gt;Open Design in Tab&lt;/b&gt;&amp;quot; to do just that (open the design corresponding to that test in a new tab).&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: By default, the design will be opened in &amp;quot;read&amp;quot; mode.&amp;nbsp; To open automatically in edit mode, put the following line in your .cdsinit file:&lt;/p&gt;&lt;p&gt;&lt;i&gt;envSetVal(&amp;quot;adexl.gui&amp;quot; &amp;quot;openDesignAccessMode&amp;quot; &amp;#39;cyclic &amp;quot;w&amp;quot;)&lt;/i&gt;&lt;/p&gt;&lt;p&gt;By the way, ADE XL is pretty smart about opening the schematic when you need it.&amp;nbsp; Executing any command that needs you to point to something on the schematic will automatically open it (outputs to be plotted, initial conditions, etc.).&amp;nbsp; Not only that, but it pays attention to which test your mouse was pointing to when the command was invoked and opens the correct schematic for that test.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Multi-Test Setup&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Now that we&amp;#39;ve got one test set up, why not add more?&amp;nbsp; Surely you do more than one simulation?&amp;nbsp; This is where ADE XL really starts to shine.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: If you want to use the same schematic with a different ADE state, RMB over the test name corresponding to that schematic and select &lt;b&gt;Create Test Copy&lt;/b&gt;.&amp;nbsp; You&amp;#39;ll get a duplicate copy of the test for which you can load a new state or edit as desired.&lt;/p&gt;&lt;p&gt;A single ADE XL view can contain any number of tests for different schematics using different sub-blocks and different simulators.&amp;nbsp; The &lt;b&gt;checkboxes&lt;/b&gt; in the Data View Assistant can be used to enable/disable each test.&amp;nbsp; Even if you think you&amp;#39;re totally finished with one testbench, just disable it.&amp;nbsp; Guess what, you&amp;#39;ll probably end up needing to run it again eventually when you get that email letting you know that a new model file has just been released.&amp;nbsp;&amp;nbsp;It sure would be handy not to have to go digging through the Library Manager to find all the tests you ran on that block 3 weeks ago.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;b&gt;Tip:&lt;/b&gt; Using multiple tests in ADE XL also enables you to share &lt;b&gt;variables&lt;/b&gt; (so they only need to be changed in one place), copy output expressions from one test to another (&lt;b&gt;RMB-&amp;gt;Copy to Test...&lt;/b&gt; in the Outputs Setup pane) and even (&lt;i&gt;spoiler alert&lt;/i&gt;) create expressions which combine results from more than one test (more on that next time).&lt;/p&gt;&lt;p&gt;Stacy Whiteman &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=787890" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: ADE XL</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/07/27/things-you-didn-t-know-about-virtuoso-ade-xl.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/07/27/things-you-didn-t-know-about-virtuoso-ade-xl.aspx</id><published>2010-07-28T04:00:00Z</published><updated>2010-07-28T04:00:00Z</updated><content type="html">&lt;p&gt;I know, it&amp;#39;s been a long time since my last post.&amp;nbsp; You see, we&amp;#39;ve finally arrived at a topic near and dear to my heart -- ADE XL.&amp;nbsp; The reason for my hesitation in approaching this topic is not that it&amp;#39;s difficult, but rather that there&amp;#39;s so much to talk about that it&amp;#39;s hard to know where to start.&amp;nbsp; It&amp;#39;s a bit like trying to write a guidebook for the Louvre.&amp;nbsp; The place is enormous.&amp;nbsp; Do you describe the building itself?&amp;nbsp; The Antiquities?&amp;nbsp; the Renaissance?&amp;nbsp; That crazy looking glass pyramid?&amp;nbsp; &lt;/p&gt;&lt;p&gt;I plan this to be a series of articles on all the great features of ADE XL.&amp;nbsp; There&amp;#39;s plenty to write about, but for those of you already familiar with the subject, please use the&amp;nbsp;comments to&amp;nbsp;give me feedback&amp;nbsp;on any aspects of ADE XL you&amp;#39;d like to know more about and I&amp;#39;ll be sure to include any &amp;quot;things you didn&amp;#39;t know&amp;quot; that I can think of.&lt;/p&gt;&lt;p&gt;Well, I guess the guidebook won&amp;#39;t make any sense unless you know what the Louvre is, so it&amp;#39;s probably best to start with the basics.&amp;nbsp; (BTW, I&amp;#39;m really not trying to compare ADE XL to the Louvre.&amp;nbsp; That would be silly.&amp;nbsp; Besides, you don&amp;#39;t have to wait in line nearly as long to use ADE XL -- nor do you have to wear comfortable shoes.)&lt;/p&gt;&lt;p&gt;&lt;b&gt;What&amp;#39;s in it for me?&amp;nbsp; Glad you asked...&lt;/b&gt;&lt;/p&gt;&lt;p&gt;During the design of a circuit block, you may have a half dozen testbenches, each with several different measurements.&amp;nbsp; Then you need to run each of those over dozens or hundreds of corner conditions and parametric sweeps.&amp;nbsp; And don&amp;#39;t forget Monte Carlo, which is a common requirement for most designers today.&amp;nbsp; Once you&amp;#39;ve run all those hundreds of simulations, you could be looking at an enormous, complex snarl of data.&lt;/p&gt;&lt;p&gt;Not only do you as a designer need to sort through and evaluate all that data, but you also need to present it to your manager in a coherent format he or she can easily understand (and, of course, be duly impressed by your superhuman circuit design skills).&amp;nbsp; Then, heaven forbid, a device model or circuit spec changes and you have to do the whole thing over again.&amp;nbsp; Are you confused yet?&lt;/p&gt;&lt;p&gt;I like to think of ADE XL as&amp;nbsp;a means to reach the optimum place on the information/confusion curve.&amp;nbsp; You know that place where you&amp;#39;ve got plenty of information to solve your problem, but not so much that you can no longer remember what the problem was.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;b&gt;First, a few basic definitions&lt;/b&gt;&lt;/p&gt;&lt;p&gt;ADE XL is centered around the concept of &lt;b&gt;tests&lt;/b&gt;.&amp;nbsp; A &lt;b&gt;test&lt;/b&gt; is something that you are already using every day.&amp;nbsp; It&amp;#39;s nothing more than a circuit schematic that you&amp;#39;re using to do some sort of simulation.&amp;nbsp; A typical use for ADE XL is to group together all the simulations (or &amp;quot;&lt;b&gt;tests&lt;/b&gt;&amp;quot;) you need to do on a particular circuit block.&amp;nbsp; Or you could use ADE XL to group a bunch of (possibly similar) simulations for different sub-blocks in your design.&amp;nbsp; Or (and this is probably the most common usage of ADE XL today -- if only because it is the closest thing to The Way We&amp;#39;ve Always Done It) you can use it for just one &lt;b&gt;test&lt;/b&gt; (simulation) that you want to run over corners and Monte Carlo.&amp;nbsp; In any case, you know best how you want to organize your work.&lt;/p&gt;&lt;p&gt;ADE XL stores its information just as other Virtuoso applications -- in a particular type of cellview.&amp;nbsp; An &lt;b&gt;adexl view&lt;/b&gt; can be created under any cell and contain any number of tests which reference that cell and/or other cells.&amp;nbsp; It can be seen in the Library Manager and can be managed like any other cellview.&lt;/p&gt;&lt;p&gt;Just as in ADE L, you can create and use design &lt;b&gt;variables&lt;/b&gt; in ADE XL.&amp;nbsp; These &lt;b&gt;variables&lt;/b&gt; can be shared &lt;b&gt;globally&lt;/b&gt; among all your tests, or they can be unique to an individual test.&amp;nbsp; In addition to the types of variables you&amp;#39;re used to using (i.e. using a variable name in the property value of a schematic instance), don&amp;#39;t forget the new &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/09/10/things-you-didn-t-know-about-virtuoso-ade.aspx?postID=20689" target="_blank"&gt;VAR() syntax&lt;/a&gt; which allows you to parameterize pretty much anything in the simulation environment such as model file name/section or transient stop time.&lt;/p&gt;&lt;p&gt;In addition to variables, as defined above, ADE XL allows you to create &lt;b&gt;parameters&lt;/b&gt;, in which you can directly change the values of schematic instance properties &lt;u&gt;without having to edit the schematic&lt;/u&gt;.&amp;nbsp; This is done using the Variables and Parameters Assistant.&amp;nbsp; I&amp;#39;ll discuss this capability in detail in a later article, so just file this definition away for future reference.&lt;/p&gt;&lt;p&gt;Variables and parameters are what you use in ADE XL to run &lt;b&gt;sweeps &lt;/b&gt;(sometimes referred to as &lt;b&gt;point sweeps&lt;/b&gt;).&amp;nbsp; &lt;b&gt;Sweeps&lt;/b&gt; are most simply defined as lists (2,4,6) or min:step:max &lt;b&gt;ranges&lt;/b&gt; (1u:1u:20u), but more&amp;nbsp;complex &lt;b&gt;sweep ranges&lt;/b&gt; can also be defined (center/span%, log steps etc.).&amp;nbsp; These &lt;b&gt;sweep ranges&lt;/b&gt; are also basic elements in running more advanced analyses like sensitivity and optimization (more on that in later articles).&lt;/p&gt;&lt;p&gt;I&amp;#39;m sure you&amp;#39;re all familiar with running simulations over &lt;b&gt;corners&lt;/b&gt;.&amp;nbsp; However, it&amp;#39;s interesting that every customer I visit seems to have a different definition of what constitutes a &amp;quot;&lt;b&gt;corner&lt;/b&gt;&amp;quot; for their particular design flow.&amp;nbsp; So in ADE XL, we&amp;#39;ve got a pretty broad definition of &lt;b&gt;corners&lt;/b&gt;.&amp;nbsp; &lt;b&gt;Corners&lt;/b&gt; can include not only temperature, supply voltage and process model, but also any combination of design &lt;b&gt;variables&lt;/b&gt; and &lt;b&gt;parameters&lt;/b&gt; (as defined above).&amp;nbsp; &lt;/p&gt;&lt;p&gt;The mechanisms for setting up and viewing simulation outputs and measurements in ADE XL is very similar to that of ADE L (with a few extra features we&amp;#39;ll talk about later).&amp;nbsp;&amp;nbsp;Additionally, in &amp;nbsp;ADE XL, you can apply a &lt;b&gt;specification&lt;/b&gt; to any scalar output (an output expression that evaluates to a single number).&amp;nbsp; This is a numerical target value, range or tolerance, to which the simulation results will be compared.&amp;nbsp; &lt;b&gt;Specifications&lt;/b&gt; are useful not only for quick visualization of design performance, but also used for optimization and yield analysis.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Enough with the glossary, how do I start the darn thing?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I suppose I probably should at least tell you that.&amp;nbsp; Just open a schematic and select &lt;b&gt;Launch-&amp;gt;ADE XL&lt;/b&gt;.&amp;nbsp; You&amp;#39;ll feast your eyes on the &amp;quot;&lt;b&gt;Welcome to ADE XL&lt;/b&gt;&amp;quot; home screen, which is intended to guide you through what you need to do next (hint:&amp;nbsp;&lt;b&gt;&amp;quot;To define Tests, click here&amp;quot;&lt;/b&gt;).&amp;nbsp; &lt;/p&gt;&lt;p&gt;Also note the assistant in the upper left, called &lt;b&gt;&amp;quot;Data View&lt;/b&gt;&amp;quot;.&amp;nbsp; We&amp;#39;ll be using this a lot.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/cadence_design/4835813093/" title="ADEXL_Welcome by cadencedesign, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4108/4835813093_4e5d9c5816.jpg" alt="ADEXL_Welcome" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/cadence_design/4835587491/" title="ADEXL_Welcome by cadencedesign, on Flickr"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I think I&amp;#39;ll leave you in suspense for now, but you can watch some introductory videos on ADE XL &lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SETUP/adexl_qs_setup_614COS.htm" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SPEC_RUN/adexl_qs_spec_run_614COS.htm" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;&lt;p&gt;So &lt;a href="http://www.cadence.com/Community/search/SearchResults.aspx?&amp;amp;u=49392&amp;amp;un=stacyw&amp;amp;Scope=Blogs" target="_blank"&gt;watch this spot&lt;/a&gt; over the next few posts,&amp;nbsp;and as always, feel free to comment on things you&amp;#39;d like to see discussed, or things you&amp;#39;ve found that others can benefit from.&lt;/p&gt;&lt;p&gt;Stacy&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=556596" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="Virtuoso IC 6.1.3" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC+6.1.3/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /></entry><entry><title>ARM And Cadence Get To The “Core” Of Mixed-Signal Design</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/06/08/arm-and-cadence-get-to-the-core-of-mixed-signal-design.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/06/08/arm-and-cadence-get-to-the-core-of-mixed-signal-design.aspx</id><published>2010-06-09T01:00:00Z</published><updated>2010-06-09T01:00:00Z</updated><content type="html">&lt;p&gt;An increasing number of analog and mixed-signal designs in automotive, power management, wireless, medical, and industrial applications require digital control. But designing a state machine, and integrating the increasing amount of logic gates that implements it, has been challenging for analog designers. They often start implementing some digital functionality using a custom methodology, but soon the growing gate count becomes overwhelming and requires digital skills.&lt;/p&gt;&lt;p&gt;Analog designers then find they need a more complete digital flow for the digital block design. This flow must work smoothly in conjunction with an analog-centric flow for top-level design and full-chip integration. The increasing size of digital logic requires formal verification, test insertion, and automation for low power techniques. The amount of digital logic might increase to the point that a digital-centric methodology is more suitable for full-chip integration, with analog functionality designed separately and integrated as black boxes. &lt;/p&gt;&lt;p&gt;Integrating a core processor within analog and mixed-signal designs is an attractive alternative for digital control.&amp;nbsp; The processor architecture offers a high level of flexibility through programmability and scalability, thus realizing more advanced designs and meeting more complex specs. The benefits outweigh an initial investment in architectural development and a design methodology shift.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Cortex-M0 Targets Mixed-Signal Applications&lt;/b&gt;&lt;/p&gt;&lt;p&gt;ARM recently released the &lt;a href="http://www.arm.com/products/processors/cortex-m/cortex-m0.php"&gt;Cortex-M0 processor core&lt;/a&gt; targeting mixed-signal applications. It has a 32-bit architecture, compact instruction set, very small silicon footprint (base configuration is just about 12K gates) and is power efficient. In a typical application it is accompanied by a memory block, memory bus interface, peripheral&amp;nbsp; interfaces (GPIO, I&lt;sup&gt;2&lt;/sup&gt;C, UART, SPI, USB) and standard analog/mixed-signal IP (PLL, ADC, DAC). As such it is suitable for integration within analog sensors, RF transceivers, power regulators, LED drivers, barcode scanners, motor controllers, or similar applications. &lt;/p&gt;&lt;p&gt;At the end of last month, ARM organized a Cortex-M0 workshop in Paris, France, and invited Cadence to present design solutions. Judging by number of attendees and their strong interest, the future of analog and mixed-signal design lies in its integration with processor cores. Almost thirty companies from the region came to learn how to design mixed-signal applications with the Cortex-M0 processor core. &lt;/p&gt;&lt;p&gt;The Cadence mixed-signal solution spans different design styles and supports diverse applications while leveraging common technologies. For example, verification of the mixed-signal designs with embedded Cortex-M0 core can be done from either the schematic driven Virtuoso-ADE environment or the command-driven Incisive environment. Both use the same high performance, tightly integrated simulation engines including those for SPICE, RF, behavioral, RTL and gate-level simulation. This ensures consistency of results while analog and digital designers work in their preferred use models. &lt;/p&gt;&lt;p&gt;Similarly, physical implementation and signoff for analog-centric designs is done in Virtuoso for the high level of control required in crafting analog circuits, with a seamless integration to the Encounter Digital Implementation System for digital block implementation. If a design requires a digital-centric environment, Encounter offers the full strength of digital design automation and low power design techniques, with the ability to integrate analog blocks previously done in Virtuoso as hard macros. Both analog and digital centric design environments leverage Virtuoso-Encounter interoperability based on industry standard OpenAccess (OA) for sharing design data and constraints. The implementation solution extends to IC/package co-design through Virtuoso and an interoperable flow with the Allegro package and board design environment. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Bringing Digital Capabilities to Analog Designers&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Many analog/mixed-signal design teams are facing the need for digital design capabilities for the first time. They might be intimidated by complexity and price of digital design tools they need to apply for a relatively small logic gate count, as compared to mainstream digital. Cadence has conveniently packaged digital capabilities for Virtuoso users who need a digital solution for limited-size digital block implementation. &lt;/p&gt;&lt;p&gt;The &lt;a href="http://www.cadence.com/products/di/vdi/pages/default.aspx"&gt;Virtuoso Digital Implementation&lt;/a&gt; package contains logic synthesis, placement, clock tree synthesis, timing optimization, routing, extraction and static timing analysis. This is the same Encounter technology but is limited to 50K instances, sufficient for most mixed-signal designs with Cortex-M0. Moreover, two Virtuoso Digital Implementation licenses can be combined to double the capacity, and there&amp;#39;s a smooth path to the full Encounter configuration if digital design needs increase. &lt;/p&gt;&lt;p&gt;In addition to flows, Cadence offers highly experienced mixed-signal methodology and design services, and a complete ecosystem from IP providers to foundries.&lt;/p&gt;&lt;p&gt;With Cortex-M0, ARM has offered a simple but powerful processor core for mixed-signal applications. The Cadence mixed-signal solution enables designers to smoothly realize designs in silicon, with high design productivity, schedule predictability and project profitability. Offerings from both companies lower the barrier for adoption of processor cores in analog and mixed-signal applications, and I believe many designers will take advantage of them.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Note: The ARM workshop in Paris was first in serious of similar workshops. The next one is planned for middle of July in Zurich. Please contact your local ARM or Cadence representative for this or possible future workshop in your region.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Mladen Nizic&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=62853" width="1" height="1"&gt;</content><author><name>nizic</name><uri>http://www.cadence.com/Community/members/nizic.aspx</uri></author><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="ARM" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ARM/default.aspx" /><category term="Cortex-M0" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Cortex-M0/default.aspx" /><category term="Cortex" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Cortex/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: It's Video Time!</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/04/01/grab-the-popcorn-it-s-video-time.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/04/01/grab-the-popcorn-it-s-video-time.aspx</id><published>2010-04-01T13:00:00Z</published><updated>2010-04-01T13:00:00Z</updated><content type="html">&lt;p&gt;Just a quick post to let you know that there have recently been a whole truckload of videos added to the Cadence Online Support Video Library.&amp;nbsp; (Some shameless self-promotion here--I created many of them...).&amp;nbsp; Simply go to &lt;a href="http://support.cadence.com/"&gt;http://support.cadence.com&lt;/a&gt; (registration required) and choose &lt;b&gt;Resources-&amp;gt;Video Library&lt;/b&gt;.&amp;nbsp; You may want to set up your product preferences to only view those product areas you&amp;#39;re interested in.&amp;nbsp; And be sure to sign up for email notifications for your favorite products so you can get all the latest solutions and updates sent to you right away.&lt;/p&gt;&lt;p&gt;Many thanks to our Tech Pubs and CS folks for getting these posted for all to see.&lt;/p&gt;&lt;p&gt;There are videos on how to use many of the features in ADE XL (Analog Design Environment), VSE L and XL (Virtuoso Schematic Editor).&amp;nbsp;&amp;nbsp; Here is just a sampling.&amp;nbsp; There are many more.&amp;nbsp; Also check out Samir&amp;#39;s excellent new video on &lt;a target="_blank" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/29/video-demo-your-maiden-voyage-across-ocean.aspx?postID=46613"&gt;how to get started using OCEAN&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_VSE_ACCESS/vse_access_614COS.htm"&gt;VSE: Design Data Access&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Bookmarks, tabs, recently-opened files list, Go toolbar, double-click hierarchy navigation, Library Manager customization, thumbnails&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SPEC_RUN/adexl_qs_spec_run_614COS.htm"&gt;ADE XL: Setting Specifications &amp;amp; Running Simulations&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Specification types, Run toolbar, viewing specs in Results panel, output formatting (digits, units, notation--IC 614), using the Evaluate button&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_CORNERS/adexl_qs_corners_614COS.htm"&gt;ADE XL: Setting Up &amp;amp; Simulating Corners&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Creating temp. &amp;amp; voltage corners, creating and using model groups, running corners &amp;amp; sweeps, working with simulation history results, viewing corners results, plotting waveforms from individual corners&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_SPECCOMP/adexl_qs_speccompCOS.htm"&gt;ADE XL: Spec Comparison&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Comparing 2 corners runs after a change in the circuit, comparing results from 2 swept parameter values across corners&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_RESIM/adexl_qs_resimCOS.htm"&gt;ADE XL: Incremental Resimulation&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Add a value to a parameter sweep without rerunning original values, rerun only failed corners&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;b&gt;&lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_ADEXL_QS_MC/adexl_qs_mc_614COS.htm"&gt;ADE XL: Monte Carlo Analysis&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Monte Carlo options, specify DUT, Yield view, histograms, scatter plots, Detail view, print stat. params., create stat. corner&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So grab some popcorn, put your feet up, relax and enjoy the show!&lt;/p&gt;&lt;p&gt;--Stacy&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=50460" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /></entry><entry><title>Video Demo: Your Maiden Voyage Across OCEAN </title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/29/video-demo-your-maiden-voyage-across-ocean.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/03/29/video-demo-your-maiden-voyage-across-ocean.aspx</id><published>2010-03-29T20:30:00Z</published><updated>2010-03-29T20:30:00Z</updated><content type="html">&lt;p&gt;I still remember my first encounter with OCEAN. It was 2002 and my co-worker had asked me to run a simple test for him.&amp;nbsp; I sat in my cube, ruffling through our user guides, trying to quickly learn just enough to do the task at hand.&amp;nbsp; The story ended happily,&amp;nbsp; but I sure would have saved some time and frustration had I seen the following video.&amp;nbsp; So for you OCEAN neophytes out there, here&amp;rsquo;s a nutshell video to get you out of the gates running. I cover the basics of OCEAN and OCEAN-XL and walk through some examples. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;br /&gt;
If video fails to play click &lt;a href="http://www.youtube.com/p/5B2C4696127DA603&amp;amp;amp;hl=en_US&amp;amp;amp;fs=1" target="_blank"&gt;here&lt;/a&gt;.


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
Some additional points:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;You aren&amp;rsquo;t required to run a simulation in OCEAN. You can use it to only perform automated netlisting or carry out measurements on existing results.&lt;br /&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;The standalone ocean session equivalent of the .cdsinit is the .oceanrc, so be ready to copy your .cdsinit.&lt;br /&gt;&lt;br /&gt;And here are two more excellent solutions that demonstrate some of OCEAN&amp;rsquo;s capabilities:&lt;/p&gt;&lt;p&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11390018" target="_blank" title="How to run parametric analysis over corners using Ocean?"&gt;&lt;span&gt;How to run parametric analysis over corners using Ocean? &lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:ViewSolution;solutionNumber=11177378" target="_blank" title="How to print and plot gds after a DC Sweep?"&gt;How to print and plot gds after a DC Sweep? &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Samir Jafferali &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=46613" width="1" height="1"&gt;</content><author><name>AMSamirj</name><uri>http://www.cadence.com/Community/members/AMSamirj.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="SKILL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx" /><category term="Spectre" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Spectre/default.aspx" /><category term="ADE" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx" /><category term="ADE-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx" /><category term="OCEAN-XL" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/OCEAN-XL/default.aspx" /><category term="OCEAN" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/OCEAN/default.aspx" /></entry><entry><title>Exceed On Demand And Virtuoso IC6.1</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/22/exceed-on-demand-and-virtuoso-ic6-1.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/03/22/exceed-on-demand-and-virtuoso-ic6-1.aspx</id><published>2010-03-22T18:35:00Z</published><updated>2010-03-22T18:35:00Z</updated><content type="html">

&lt;p&gt;Many of our customers use our &lt;a href="http://www.cadence.com/products/cic/Pages/default.aspx" target="_blank"&gt;Virtuoso&lt;/a&gt; software in combination with the 
windows emulation product from OpenText named &amp;quot;Exceed on Demand&amp;quot;. &amp;nbsp; To maximize performance between the two 
tools, we have some recommendations:&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Steve_Lewis/xconfig_eod6.jpg"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Steve_Lewis/xconfig_eod6.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;


&lt;p&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;For IC6.1.4 and Exceed on Demand 7&lt;/b&gt;&lt;/i&gt;, these setting will cause 
problems between the two programs.&amp;nbsp; You should change the settings to the 
following:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;

&lt;/p&gt;
&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Steve_Lewis/xconfig_eod7_614.jpg"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Steve_Lewis/xconfig_eod7_614.jpg" border="0" alt="" /&gt;&lt;/a&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Steve Lewis&lt;/p&gt;

&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=28662" width="1" height="1"&gt;</content><author><name>NewYorkSteve</name><uri>http://www.cadence.com/Community/members/NewYorkSteve.aspx</uri></author><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="Cusstom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Cusstom+IC+Design/default.aspx" /><category term="OpenText" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/OpenText/default.aspx" /><category term="Exceed on Demand" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Exceed+on+Demand/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: IC 6.1.4 ADE Enhancements</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/10/things-you-didn-t-know-about-virtuoso-ic-6-1-4-ade-enhancements.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/03/10/things-you-didn-t-know-about-virtuoso-ic-6-1-4-ade-enhancements.aspx</id><published>2010-03-10T14:00:00Z</published><updated>2010-03-10T14:00:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;m not going to beat around the bush here.&amp;nbsp; I could tell you about all the things that are new in ADE (Analog Design Environment) in IC 6.1.4.&amp;nbsp; I could tell you about the fact that the individual subwindows are now resizeable, rearrangeable (is that a word?), undockable and tabbable (I know that&amp;#39;s not a word, but it&amp;#39;s fun to say) just like the &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/09/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-Managing-Your-Real-Estate-_2D00_-Part-1.aspx" target="_blank"&gt;assistants in the main Virtuoso window&lt;/a&gt;.&amp;nbsp; I could tell you that the Parametric Analysis UI has been redesigned.&amp;nbsp; I could also remind you to read my earlier post about all the &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/09/10/things-you-didn-t-know-about-virtuoso-ade.aspx?postID=20689" target="_blank"&gt;new features added to ADE&lt;/a&gt; in previous IC 6.1 releases.&lt;/p&gt;&lt;p&gt;But I won&amp;#39;t.&amp;nbsp; Why?&amp;nbsp; Because there is one new feature in ADE in IC 6.1.4 that tops all the others in terms of fulfilling widespread long-awaited user requests.&amp;nbsp; Dependent expressions.&amp;nbsp; Being able to use the name of one expression in others expressions based on it instead of having to repeat the entire definition of the first expression.&amp;nbsp; No longer do you have to go cross-eyed trying to parse enormous paragraph-long expressions.&amp;nbsp; Break them up into smaller, more sensible expressions and build from there.&amp;nbsp; It&amp;#39;s logical, it&amp;#39;s intuitive and it&amp;#39;s here today in IC 6.1.4.&lt;/p&gt;&lt;p&gt;There is a great video available &lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:VideoViewer;src=wp;q=Video/Custom_IC_Design/IC614_DependentExpressions/DependentExpressions-ver3COS.htm" target="_blank"&gt;here&lt;/a&gt; in the Cadence Online Support Video Library showing you how this works.&amp;nbsp;&amp;nbsp;I have a&amp;nbsp;favorite example I use in demos.&amp;nbsp; The original expression (which was created in IC 6.1.3) looks like:&lt;/p&gt;&lt;p&gt;((1 - (average((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;))) / ((value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 4.3e-09) + value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 1.23e-08) + value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 2.03e-08) + value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 2.83e-08) + value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 3.63e-08) + value((VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)) 4.43e-08)) / 6))) * 100)&lt;/p&gt;&lt;p&gt;Egads!&amp;nbsp; That&amp;nbsp;33 sets of parentheses (hopefully in the right places), and&amp;nbsp;7 repetitions of the expression (VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;)).&amp;nbsp; Not to mention I&amp;#39;m also interested in the values of several of the subexpressions individually (so those will have to be repeated again on their own).&lt;/p&gt;&lt;p&gt;So now in IC 6.1.4 that above expression can be created as:&lt;/p&gt;&lt;p&gt;((1 - (GainDiffAvg / GainDiffErr6Avg)) * 100)&lt;/p&gt;&lt;p&gt;&amp;nbsp;where:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;GainDiffAvg = average(GainDiff)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;GainDiff = (VT(&amp;quot;/OUTM&amp;quot;) - VT(&amp;quot;/INM&amp;quot;))&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;GainDiffErr6Avg = ((GainDiff_4p3 + GainDiff_12p3 + GainDiff_20p3 + GainDiff_28p3 + GainDiff_36p3 + GainDiff_44p3) / 6)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;GainDiff_4p3 = value(GainDiff 4.3e-09), etc.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Granted, it&amp;#39;s still pretty involved, but by breaking up the expression into more manageable bits, it&amp;#39;s a whole lot easier to see what&amp;#39;s going on (and to make sure you&amp;#39;ve got it right).&lt;/p&gt;&lt;p&gt;Expressions can be added in any order and can be based on any number of other expressions.&amp;nbsp; No cyclic dependencies, please.&lt;/p&gt;&lt;p&gt;Hopefully, this improvement will help make it a bit easier to create the measurements your really interested in.&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=26784" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="Virtuoso Analog Design Environment" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx" /></entry><entry><title>Things You Didn't Know About Virtuoso: Thumbnails</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/03/things-you-didn-t-know-about-virtuoso-thumbnails.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/03/03/things-you-didn-t-know-about-virtuoso-thumbnails.aspx</id><published>2010-03-03T14:00:00Z</published><updated>2010-03-03T14:00:00Z</updated><content type="html">&lt;p&gt;Boy, you must think we&amp;#39;re a few sandwiches short of a picnic over here at Cadence.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A couple of months ago we&amp;nbsp;came out with this great new &lt;a href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:DocumentViewer;src=wp;q=Articles/CICAnnounce614.html" target="_blank"&gt;Virtuoso software release (IC 6.1.4)&lt;/a&gt;.&amp;nbsp; So, despite my best efforts to get you to use the &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/05/12/Things-you-didn_2700_t-know-about-Virtuoso_3A00_-Introduction.aspx" target="_blank"&gt;recently-opened files list&lt;/a&gt; or to &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/05/19/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-Tabs-and-Bookmarks.aspx" target="_blank"&gt;create bookmarks&lt;/a&gt;, the first thing you did after starting virtuoso was open the Library Manager.&amp;nbsp; (Don&amp;#39;t try to deny it, I know you did...).&amp;nbsp; &lt;/p&gt;&lt;p&gt;So there&amp;#39;s the Library Manager with your libraries all neatly &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/07/28/things-you-didn-t-know-about-virtuoso-library-manager.aspx" target="_blank"&gt;grouped and color-coordinated&lt;/a&gt;, and down in the lower right corner of the window, there&amp;#39;s now a little black square.&amp;nbsp; You say to yourself, &amp;quot;Wow, that&amp;#39;s the one new feature I was hoping for in this new release...a little black square in the corner of the Library Manager.&amp;nbsp; Thanks, Cadence!&amp;quot;.&amp;nbsp; (Actually, you probably thought something not so suitable for a family-friendly blog such as this.)&amp;nbsp; &lt;/p&gt;&lt;p&gt;Well, before you run off and start tweeting all your friends about how Cadence has had another brain fart, read on a bit and let me tell you how to unlock the magic of that little black box.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Thumbnails&lt;/b&gt;, my friends.&amp;nbsp; Thumbnails are the wave of the future.&amp;nbsp; And thumbnails are&amp;nbsp;what that little black box is for.&amp;nbsp; But first you&amp;#39;ve got to create them and that&amp;#39;s why the box is empty right now.&lt;/p&gt;&lt;p&gt;So, to create thumbnails for the cellviews in your library, just &lt;a href="http://www.cadence.com/Community/blogs/cic/archive/2009/06/23/Things-You-Didn_2700_t-Know-About-Virtuoso_3A00_-RMB_2C00_-OMG_2100_-_3B002D002900_.aspx" target="_blank"&gt;RMB&lt;/a&gt; over a library name or a cell name or a schematic, symbol or layout view name and select &amp;quot;&lt;b&gt;Update Thumbnails&lt;/b&gt;&amp;quot; (or select &lt;b&gt;Edit-&amp;gt;Update Thumbnails&lt;/b&gt; from the main menu).&amp;nbsp; &lt;/p&gt;&lt;p&gt;Now the little box will contain a small image of the cellview so you&amp;#39;ll know it&amp;#39;s the right one without having to open it.&amp;nbsp; These thumbnails will also appear when you use the &lt;b&gt;File-&amp;gt;Open...&lt;/b&gt; form to browse for a cellview.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;a href="http://www.flickr.com/photos/cadence_design/4402072159/" title="Thumbnails by cadencedesign, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4034/4402072159_5c21173ce6.jpg" alt="Thumbnails" width="500" height="375" /&gt;&lt;/a&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;So, now that we&amp;#39;ve begun exploring the wondrous diminuitive world of thumbnails, leave a comment to let us know where else you think thumbnails might be useful in the future...&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=26455" width="1" height="1"&gt;</content><author><name>stacyw</name><uri>http://www.cadence.com/Community/members/stacyw.aspx</uri></author><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="Virtuoso" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx" /><category term="IC 6.1.4" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx" /><category term="IC 6.1" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx" /><category term="thumbnails" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/thumbnails/default.aspx" /></entry><entry><title>Analog Behavioral Modeling - What Language Do You Speak?</title><link rel="alternate" type="text/html" href="http://www.cadence.com/Community/blogs/cic/archive/2010/03/02/analog-behavioral-modeling-what-language-do-you-speak.aspx" /><id>http://www.cadence.com/Community/blogs/cic/archive/2010/03/02/analog-behavioral-modeling-what-language-do-you-speak.aspx</id><published>2010-03-02T14:00:00Z</published><updated>2010-03-02T14:00:00Z</updated><content type="html">&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;An increasing number of mixed-signal design teams are contemplating adding analog behavioral modeling to their repertoire in order to achieve reasonable simulation speeds.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Utilizing analog behavioral models can yield simulation performance improvements that can make full chip verification a reality.&lt;span&gt;&amp;nbsp; &lt;/span&gt;This approach can be several magnitudes faster than transistor-level; however, the actual performance improvement is greatly dependent on the level of detail in the model, as well as, the language of choice.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Analog behavioral models are generally written in one of the languages below:&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; &lt;blockquote&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;a href="http://www.designers-guide.org/VerilogAMS/" target="_blank"&gt;&lt;b&gt;Verilog-AMS&lt;/b&gt;&lt;/a&gt; &amp;ndash; A derivative of Verilog, it includes analog and mixed-signal extensions in order to define the behavior of analog and mixed-signal systems, providing both continuous-time and event-driven modeling&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;a href="http://www.cadence.com/rl/Resources/application_notes/real_number_appNote.pdf" target="_blank"&gt;&lt;b&gt;Wreal&lt;/b&gt;&lt;/a&gt; &amp;ndash; An extension of the Verilog-AMS modeling language allowing analog block operation as a real data flow model&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;a href="http://www.vhdl.org/verilog-ams/htmlpages/public-docs/lrm/VerilogA/verilog-a-lrm-1-0.pdf" target="_blank"&gt;&lt;b&gt;Verilog-A&lt;/b&gt;&lt;/a&gt; &amp;ndash; An extension of Verilog to describe analog and non-electrical behavior as a continuous-time subset&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;a href="http://www.eda.org/twiki/bin/view.cgi/P10761/WebHome" target="_blank"&gt;&lt;b&gt;VHDL-AMS (IEEE1076.1)&lt;/b&gt;&lt;/a&gt; &amp;ndash; similar in concept to Verilog-AMS, providing analog and mixed-signal extensions in order to define the behavior of analog and mixed-signal systems&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;   &lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; &lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;One of the biggest challenges in the creation of analog behavioral models is; whose job is it?&lt;span&gt;&amp;nbsp; &lt;/span&gt;The analog designer is the most familiar with the circuit performance and specific behaviors, however, many analog designers typically are not programmers and familiar with the languages mentioned above.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The digital designer, who also tends to be the full chip verification engineer, is most familiar with programming languages, but lacks the analog specific circuit knowledge.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Therefore, a blend of both skill sets is required or a conscience effort for both designers to work together.&lt;span&gt;&amp;nbsp; &lt;/span&gt;One must continually make the tradeoff of effort versus benefit when deciding to create an analog behavioral model.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Some of the questions that come to mind are: Can I re-use it?&lt;span&gt;&amp;nbsp; &lt;/span&gt;How long will it take me to create a high quality model?&lt;span&gt;&amp;nbsp; &lt;/span&gt;What performance gains can I expect?&lt;/font&gt;&lt;/p&gt;&lt;font face="Times New Roman" size="3"&gt;&amp;nbsp;&lt;/font&gt; &lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Finally, as you consider adding analog behavioral modeling to your design repertoire; consider your modeling goals and language.&lt;span&gt;&amp;nbsp; &lt;/span&gt;A performance model needs to capture specific circuit behavior and can affect your effort versus benefit equation, while a functional model requires you to only capture the 1&lt;sup&gt;st&lt;/sup&gt; order effects that are needed to verify the circuit functionality.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Model On!&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;"&gt;Greg Curtis&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=26404" width="1" height="1"&gt;</content><author><name>MS Guy</name><uri>http://www.cadence.com/Community/members/MS-Guy.aspx</uri></author><category term="Circuit Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Circuit+Design/default.aspx" /><category term="Block-level simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Block-level+simulation/default.aspx" /><category term="Custom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx" /><category term="AMS Simulation" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/AMS+Simulation/default.aspx" /><category term="mixed-signal simulators" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal+simulators/default.aspx" /><category term="MMSIM" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/MMSIM/default.aspx" /><category term="analog" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx" /><category term="Cusstom IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Cusstom+IC+Design/default.aspx" /><category term="mixed-signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed-signal/default.aspx" /><category term="mixed signal" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/mixed+signal/default.aspx" /><category term="Custim IC Design" scheme="http://www.cadence.com/Community/blogs/cic/archive/tags/Custim+IC+Design/default.aspx" /></entry></feed>
