<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.cadence.com/Community/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Custom IC Design</title><link>http://www.cadence.com/Community/blogs/cic/default.aspx</link><description>The Custom IC Design blog is tailored...</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Things You Didn't Know About Virtuoso: Rapid Adoption Kits</title><link>http://www.cadence.com/Community/blogs/cic/archive/2012/05/22/things-you-didn-t-know-about-virtuoso-rapid-adoption-kits.aspx</link><pubDate>Tue, 22 May 2012 23:26:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1311256</guid><dc:creator>stacyw</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1311256</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2012/05/22/things-you-didn-t-know-about-virtuoso-rapid-adoption-kits.aspx#comments</comments><description>&lt;p&gt;This post isn&amp;#39;t directly about tips and tricks for getting the most out of Virtuoso, but it is about a new source of information and hands-on guidance to help you put those tips and tricks into action.&lt;/p&gt;&lt;p&gt;They&amp;#39;re called Rapid Adoption Kits, or--to use the obligatory Three Letter Acronym (TLA)--RAKs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What is a Rapid Adoption Kit?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RAKs are collateral packages&amp;nbsp;for a particular product area or flow which are designed to help you learn to use the tools as quickly and efficiently as possible.&amp;nbsp; They center around a hands-on workshop database with a step-by-step manual so you can dive right in and start pushing buttons.&amp;nbsp; They&amp;#39;re easy to set up and let you move at your own pace.&lt;/p&gt;&lt;p&gt;Depending on the subject, other material may be included, such as videos or application notes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Where can you find them?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Go to &lt;a href="http://support.cadence.com/"&gt;http://support.cadence.com&lt;/a&gt; and select &lt;strong&gt;Resources-&amp;gt;Rapid Adoption Kits&lt;/strong&gt; from the menus at the top.&amp;nbsp; For Virtuoso, click on&lt;strong&gt; Virtuoso Custom IC and Sign-off Flow.&amp;nbsp; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What&amp;#39;s available?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As of today, there are 3 RAKs available.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Layout Design in IC 6.1.5&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This material highlights new features and explores some basic functionality with Virtuoso Schematic Editor L/XL and Virtuoso Layout Suite L/XL in the 6.1.5 release. You will take a design from concept through implementation and learn how Virtuoso 6.1.5 capabilities can help you generate designs more efficiently&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;IC 6.1.5 Constraint Driven Custom Design&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What you will learn: Use the Constraint Management System; use the Circuit Prospector for assisted constraint capture; verify constraints to ensure that design intent is met in layout; use the module generation (MODGEN) capability for precision Pcell-based array generation; perform constraint-driven wire editing; perform constraint-aware editing; perform special net automated routing (differential pair, shielding, etc.); perform full custom/analog placement.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Virtuoso Visualization &amp;amp; Analysis (ViVA)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What you will learn: View, configure, and export design data in a variety of formats quickly and easily; interactively analyze and annotate waveform data for design documentation; create and evaluate complex mathematical expressions, and save them for later reuse; how to efficiently handle gigabyte transient data files. &lt;/p&gt;&lt;p&gt;More Rapid Adoption Kits will be rolling out as time goes on.&amp;nbsp; Give one a spin and let us know what you think!&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=1311256" width="1" height="1"&gt;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/workshop/default.aspx">workshop</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Constraint-driven/default.aspx">Constraint-driven</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Connectivity-driven/default.aspx">Connectivity-driven</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Layout+Suite+XL/default.aspx">Virtuoso Layout Suite XL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx">analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx">Virtuoso IC6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Viva/default.aspx">Viva</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Rapid+Adoption+Kit/default.aspx">Rapid Adoption Kit</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/RAKs/default.aspx">RAKs</category></item><item><title>Things You Didn't Know About Virtuoso: Change is Here to Stay</title><link>http://www.cadence.com/Community/blogs/cic/archive/2012/04/05/things-you-didn-t-know-about-virtuoso-parameterization.aspx</link><pubDate>Thu, 05 Apr 2012 13:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1309561</guid><dc:creator>stacyw</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1309561</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2012/04/05/things-you-didn-t-know-about-virtuoso-parameterization.aspx#comments</comments><description>&lt;p&gt;Speaking of variation -- and isn&amp;#39;t &lt;a target="_blank" href="http://www.cadence.com/Community/blogs/cic/archive/2011/06/16/virtuoso-analog-design-environment-xl-make-friends-with-variation.aspx?postID=1277891"&gt;everyone&lt;/a&gt; these days -- something strikes me in reading about all the powerful and elegant features of corners management and statistical analysis.&amp;nbsp; After all the simulations are run and the results are presented, unless you&amp;#39;ve managed to hit a bullseye on the first design you tried (good luck with that), you&amp;#39;re probably going to have to &lt;strong&gt;change&lt;/strong&gt; something in the circuit in order to turn all those lights green.&amp;nbsp;&amp;nbsp;(Of course, you&amp;#39;ll only see that lovely green coloring --or the not-so-desirable yellow and red coloring--if&amp;nbsp;you&amp;#39;re using &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;searchHash=6f4d323db35040c09ef7eb31ba94aebf"&gt;specifications&lt;/a&gt; in ADE XL).&lt;/p&gt;&lt;p&gt;We&amp;#39;ll talk in a later article about the features that will help you figure out what circuit values to change.&amp;nbsp; Today I want to focus on &lt;strong&gt;how&lt;/strong&gt; to change them.&amp;nbsp; &lt;/p&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/change.jpeg"&gt;&lt;img src="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/change.jpeg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;You could use the brute force method -- select devices on the schematic, edit their values, save the schematic, then resimulate.&amp;nbsp; It&amp;#39;s fairly tedious and you have no record of what combinations you&amp;#39;ve tried.&amp;nbsp; I&amp;#39;ll bet you&amp;#39;re jotting down notes on little pieces of paper to keep track, aren&amp;#39;t you?&lt;/p&gt;&lt;p&gt;Or you could get a bit fancier and edit the schematic to assign design variables to critical device properties.&amp;nbsp; That allows you to change those variable values from within ADE XL&amp;nbsp;using all its different analysis types.&amp;nbsp; A very useful approach, but you still have to edit the schematic to set everything up and then edit it again once you&amp;#39;ve settled on the correct device values.&lt;/p&gt;&lt;p&gt;Which brings me to the subject of this article -- an Extremely Useful Feature in ADE XL which is also, sadly, one of the least known.&amp;nbsp;ADE XL allows you to change the values of device instance parameters &lt;strong&gt;without having to edit the schematic&lt;/strong&gt;.&amp;nbsp; You can then easily run sweeps and corner simulations, do sensitivity analysis and circuit optimization without touching your schematics. And ADE XL&amp;#39;s simulation history enables you to keep track of what experiments you&amp;#39;ve tried and what the results were.&amp;nbsp; And yes, it takes care of triggering the callbacks at the appropriate time so the netlist is accurate. &lt;/p&gt;&lt;p&gt;Let&amp;#39;s take a look at how to do this...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Creating Parameters&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Parameters are created using the &lt;strong&gt;Variables and Parameters Assistant (VPA).&lt;/strong&gt;&amp;nbsp; Because the parameters are associated with device instance properties, you need open the VPA from a schematic.&amp;nbsp; Start with an ADE XL setup, then use either File-&amp;gt;Open... or &lt;strong&gt;RMB-&amp;gt;Open Design in Tab&lt;/strong&gt; on the test name in the Data View Assistant (and possibly descend the hierarchy) to get to the schematic containing the devices whose values you want to vary.&amp;nbsp; Now open the Variables and Parameters Assistant.&lt;/p&gt;&lt;p&gt;Devices you select in the schematic will show up in the top half of the VPA with their editable CDF properties.&amp;nbsp; Select one or more of these properties -- for example, length and finger width -- and &lt;strong&gt;RMB-&amp;gt;Create Parameter&lt;/strong&gt;.&amp;nbsp; At the bottom of the VPA (and in the &lt;strong&gt;Parameters&lt;/strong&gt; section of the Data View Assistant), you&amp;#39;ll see something that looks like &amp;quot;M7/l&amp;quot; and &amp;quot;M7/fw&amp;quot;.&amp;nbsp; If you hover over them, you can see that it keeps track of the library/cellname/view of the schematic they come from (in case you parameterize &amp;quot;M7&amp;quot; in multiple blocks).&amp;nbsp; These can now be treated just like any other variables.&amp;nbsp; &lt;/p&gt;&lt;p&gt;You can change their values.&amp;nbsp; You can assign them a list of values (1u,2u,3u) or a range of values (1u:1u:10u) to perform a sweep.&amp;nbsp; You can access them in the Corners UI to change their values in corners simulations.&amp;nbsp; You can use them in Sensitivity Analysis to better understand their impact on each circuit specification.&amp;nbsp; You can use Global or Local Optimization to vary the values in order to find a design that meets all your specs across corners.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Parameter Relationships&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The VPA also has 2 buttons at the top that let you create matching and ratio relationships between parameters.&amp;nbsp; Simply select the devices in the schematic, expand one of them in the top part of the VPA, select the properties you want to be matched amongst the devices, and click the &amp;quot;&lt;strong&gt;Match&lt;/strong&gt; &lt;strong&gt;Parameters&lt;/strong&gt;&amp;quot; button at the top (sort of looks like 2 blue boxes with a red equals sign between them).&amp;nbsp; In the bottom section of the VPA, you will see that one device will have a value (e.g. M7/fw = 2u) and the other(s) will be matched to it (e.g. M6/fw = M7/fw@ ).&amp;nbsp; Now you only have to vary the value on one device and the others will vary with it.&lt;/p&gt;&lt;p&gt;Similarly, the &amp;quot;&lt;strong&gt;Ratio Matched Parameters&lt;/strong&gt;&amp;quot; button (looks like &amp;quot;1:n&amp;quot;) will create a ratioed relationship based on the lowest value.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What&amp;#39;s Next?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Once you start using these handy&lt;a href="http://www.cadence.com/Community/CSSharedFiles/blogs/cic/Stacy_Whiteman/change.jpeg"&gt;&lt;/a&gt; parameterization techniques, you can quickly find yourself&amp;nbsp;awash in results from all your &amp;quot;what-if&amp;quot; simulations.&amp;nbsp;Next time, I&amp;#39;ll talk about some convenient ways of managing all these different sets of parameter values.&amp;nbsp; &lt;/p&gt;&lt;p&gt;For now, we&amp;#39;ll skip ahead to the ultimate goal of this whole exercise -- you&amp;#39;ve found a circuit design that meets all your specifications across all the required corner and statistical conditions.&amp;nbsp; Hooray!&amp;nbsp;&amp;nbsp; Now, it&amp;#39;s time to edit your schematic to capture those golden device values.&amp;nbsp; But you don&amp;#39;t have to manually edit the properties of each transistor to do that.&amp;nbsp; Just look at the ADE XL Result panel and&amp;nbsp;find those good simulation results (it&amp;#39;s easy--they&amp;#39;re the ones that are all green!).&amp;nbsp; Now RMB-&amp;gt;click on the grey line just above those results and select &lt;strong&gt;Backannotate.&amp;nbsp; &lt;/strong&gt;The values will be written back to the appropriate devices on the schematic, including any matching or ratioing relationships you had made, and triggering any relevant callbacks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;For More Information&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Details about how to create and work with device instance parameterization can be found in the &lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:DocumentViewer;src=pubs;q=adexl/adexl6.1.5/adexlTOC.html"&gt;ADE XL User Guide&lt;/a&gt;, the &lt;a target="_blank" href="http://support.cadence.com/wps/mypoc/cos?uri=deeplinkmin:DocumentViewer;src=dt;q=ccic_design_entry/ADEXLQuickStart_615.pdf"&gt;ADE XL Quick Start&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/IC614_ADEXL_QS_PARAM/adexl_qs_param_614COS.htm;searchHash=ec7ae49a70c8bc3a4847e1e6649f5db1"&gt;this video&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Stacy Whiteman&lt;/p&gt;&lt;img src="http://www.cadence.com/Community/aggbug.aspx?PostID=1309561" width="1" height="1"&gt;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.4/default.aspx">IC 6.1.4</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx">Virtuoso Analog Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx">IC 6.1</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx">analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx">ADE</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx">ADE-XL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+simulation/default.aspx">Analog simulation</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-GXL/default.aspx">ADE-GXL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx">IC 6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx">Virtuoso IC6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx">custom/analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx">Analog Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx">Analog  Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx">IC615</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Variability+Aware+Design/default.aspx">Variability Aware Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/variability/default.aspx">variability</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/change/default.aspx">change</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/variation/default.aspx">variation</category></item><item><title>SKILL for the Skilled: Introduction to Classes -- Part 5</title><link>http://www.cadence.com/Community/blogs/cic/archive/2012/02/10/u-nder-construction-skill-for-the-skilled-introduction-to-classes-part-5.aspx</link><pubDate>Fri, 10 Feb 2012 14:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1305299</guid><dc:creator>Team SKILL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1305299</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2012/02/10/u-nder-construction-skill-for-the-skilled-introduction-to-classes-part-5.aspx#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx">SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx">Team SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx">programming</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx">LISP</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx">SKILL++</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx">object orientation</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx">Sudoku</category></item><item><title>Things You Didn't Know About Virtuoso: Measurements Across Corners</title><link>http://www.cadence.com/Community/blogs/cic/archive/2012/02/09/things-you-didn-t-know-about-virtuoso-we-re-in-your-corner.aspx</link><pubDate>Thu, 09 Feb 2012 20:56:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1307870</guid><dc:creator>stacyw</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1307870</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2012/02/09/things-you-didn-t-know-about-virtuoso-we-re-in-your-corner.aspx#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx">Virtuoso Analog Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1/default.aspx">IC 6.1</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx">ADE-XL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx">IC 6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx">Virtuoso IC6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx">custom/analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Corners+analysis/default.aspx">Corners analysis</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx">Analog  Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx">IC615</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/corners/default.aspx">corners</category></item><item><title>Things You Didn't Know About Virtuoso: We've Got You Cornered</title><link>http://www.cadence.com/Community/blogs/cic/archive/2012/01/26/things-you-didn-t-know-about-virtuoso-we-ve-got-you-cornered.aspx</link><pubDate>Thu, 26 Jan 2012 17:26:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1307412</guid><dc:creator>stacyw</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1307412</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2012/01/26/things-you-didn-t-know-about-virtuoso-we-ve-got-you-cornered.aspx#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+Analog+Design+Environment/default.aspx">Virtuoso Analog Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx">analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE/default.aspx">ADE</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ADE-XL/default.aspx">ADE-XL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx">IC 6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso+IC6.1.5/default.aspx">Virtuoso IC6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/custom_2F00_analog/default.aspx">custom/analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog+Design+Environment/default.aspx">Analog Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Analog++Design+Environment/default.aspx">Analog  Design Environment</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx">IC615</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/corners/default.aspx">corners</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/corner+analysis/default.aspx">corner analysis</category></item><item><title>Improved IDF Tool Automatically Fixes Design Rule Violations in Virtuoso</title><link>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</link><pubDate>Tue, 13 Dec 2011 19:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1306101</guid><dc:creator>Hiro Ishikawa</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1306101</wfw:commentRss><comments>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#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx">analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx">IC 6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/error+correction/default.aspx">error correction</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+layout/default.aspx">IC layout</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC615/default.aspx">IC615</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/design+rule+violations/default.aspx">design rule violations</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/layout+correction/default.aspx">layout correction</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/interactive+design+fixing/default.aspx">interactive design fixing</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/layout+optimization/default.aspx">layout optimization</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IDF/default.aspx">IDF</category></item><item><title>Cadence is the OpenText Connectivity Partner of the Year</title><link>http://www.cadence.com/Community/blogs/cic/archive/2011/11/28/cadence-is-the-opentext-connectivity-partner-of-the-year.aspx</link><pubDate>Mon, 28 Nov 2011 22:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1305768</guid><dc:creator>NewYorkSteve</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1305768</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2011/11/28/cadence-is-the-opentext-connectivity-partner-of-the-year.aspx#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/analog/default.aspx">analog</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/OpenText/default.aspx">OpenText</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Exceed+on+Demand/default.aspx">Exceed on Demand</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/ExceedOn+Demand/default.aspx">ExceedOn Demand</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/connectivity+partner/default.aspx">connectivity partner</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/remote+access/default.aspx">remote access</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Open+Text/default.aspx">Open Text</category></item><item><title>SKILL for the Skilled: Introduction to Classes -- Part 4</title><link>http://www.cadence.com/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx</link><pubDate>Mon, 14 Nov 2011 15:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1292969</guid><dc:creator>Team SKILL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1292969</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2011/11/14/under-construction-skill-for-the-skilled-introduction-to-classes-part-4.aspx#comments</comments><description> 

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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx">SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx">Team SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx">programming</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx">LISP</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx">SKILL++</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx">object orientation</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx">Sudoku</category></item><item><title>A Moment to Mourn -- John McCarthy, Father of Lisp</title><link>http://www.cadence.com/Community/blogs/cic/archive/2011/10/31/a-moment-to-mourn.aspx</link><pubDate>Mon, 31 Oct 2011 18:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1304870</guid><dc:creator>Team SKILL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1304870</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2011/10/31/a-moment-to-mourn.aspx#comments</comments><description>&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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx">SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx">LISP</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/John+McCarthy/default.aspx">John McCarthy</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/McCarthy/default.aspx">McCarthy</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/software+development/default.aspx">software development</category></item><item><title>SKILL for the Skilled: Introduction to Classes -- Part 3</title><link>http://www.cadence.com/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx</link><pubDate>Mon, 17 Oct 2011 13:00:00 GMT</pubDate><guid isPermaLink="false">75bcbcf9-38a3-4e2e-b84b-26c8c46a9500:1292968</guid><dc:creator>Team SKILL</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.cadence.com/Community/blogs/cic/rsscomments.aspx?PostID=1292968</wfw:commentRss><comments>http://www.cadence.com/Community/blogs/cic/archive/2011/10/17/under-construction-skill-for-the-skilled-introduction-to-classes-part-3.aspx#comments</comments><description> 

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;</description><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Custom+IC+Design/default.aspx">Custom IC Design</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Virtuoso/default.aspx">Virtuoso</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL/default.aspx">SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Team+SKILL/default.aspx">Team SKILL</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/programming/default.aspx">programming</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/LISP/default.aspx">LISP</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/SKILL_2B002B00_/default.aspx">SKILL++</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/IC+6.1.5/default.aspx">IC 6.1.5</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/object+orientation/default.aspx">object orientation</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/classes/default.aspx">classes</category><category domain="http://www.cadence.com/Community/blogs/cic/archive/tags/Sudoku/default.aspx">Sudoku</category></item></channel></rss>
