<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Circuit Design &#187; Digital Professional</title>
	<atom:link href="http://www.circuitdesign.info/blog/category/digital-professional/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.circuitdesign.info/blog</link>
	<description>Tutorials and Insights in Electronics and Circuit Design</description>
	<lastBuildDate>Mon, 26 Jul 2010 04:56:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<atom:link rel='hub' href='http://www.circuitdesign.info/blog/?pushpress=hub'/>
		<item>
		<title>Median vs Mean</title>
		<link>http://www.circuitdesign.info/blog/2009/12/median-vs-mean/</link>
		<comments>http://www.circuitdesign.info/blog/2009/12/median-vs-mean/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 05:35:59 +0000</pubDate>
		<dc:creator>Poojan Wagh</dc:creator>
				<category><![CDATA[Analog Professional]]></category>
		<category><![CDATA[Digital Professional]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[five nines]]></category>
		<category><![CDATA[six sigma]]></category>

		<guid isPermaLink="false">http://www.circuitdesign.info/blog/2009/12/median-vs-mean/</guid>
		<description><![CDATA[I’ve been doing some statistical measurements lately (more to follow). It occurs to me that while most people measure the mean of a set of measurements, the median is more useful. If the distribution is Gaussian, the mean and median are equal. (Mean is defined as Cannot render equation. Use Firefox instead. where Cannot render [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been doing some statistical measurements lately (more to follow). It occurs to me that while most people measure the mean of a set of measurements, the median is more useful.</p>
<p><span id="more-807"></span>If the distribution is Gaussian, the mean and median are equal.</p>
<p style="text-align: center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151a.jpg"><img class="aligncenter" style="float: none; margin-left: auto; margin-right: auto; border-width: 0px;" src="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151a_thumb.jpg" border="0" alt="scan0151a" width="244" height="128" /></a></p>
<p>(Mean is defined as <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/3c7e0a17650a17a3bb7f292252641d82.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/3c7e0a17650a17a3bb7f292252641d82.png'>Cannot render equation. Use Firefox instead.</object></object> where <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/078376930c9985774961ee63c5615a07.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/078376930c9985774961ee63c5615a07.png'>Cannot render equation. Use Firefox instead.</object></object> is the probability distribution function (PDF) of <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.png'>Cannot render equation. Use Firefox instead.</object></object>—that is, it’s a average of X, weighted with the probability density of <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.png'>Cannot render equation. Use Firefox instead.</object></object>. The median defined as <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/e3fdb80b7fdc0fde4ae04a51c1f26c07.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/e3fdb80b7fdc0fde4ae04a51c1f26c07.png'>Cannot render equation. Use Firefox instead.</object></object>—that is, the point where <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/02129bb861061d1a052c592e2dc6b383.png'>Cannot render equation. Use Firefox instead.</object></object> is equally likely to be lower than or greater than (50% probability).)</p>
<p>Many times in engineering and process control, we keep track of the mean and standard deviation. One of the reasons is that if the thing we’re trying to control is Gaussian, the mean/median and standard deviation give us good design criteria to minimize failure: if we allow our system to tolerate <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.png'>Cannot render equation. Use Firefox instead.</object></object> 3 standard deviations (<object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/05a7cb6dcd495968d896fa1ef2ab6ae0.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/05a7cb6dcd495968d896fa1ef2ab6ae0.png'>Cannot render equation. Use Firefox instead.</object></object>) around the mean/median, then it has a 99.7% chance of success (0.3% chance of failure).</p>
<p>However, we can generalize this: if we wanted to be more lax, we could only design (or require) the system to tolerate <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.png'>Cannot render equation. Use Firefox instead.</object></object> 2 standard deviations (4.5% failure). In some cases, systems are designed to tolerate <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/b9b583bf45b3ed4f9bc001eba7a8f126.png'>Cannot render equation. Use Firefox instead.</object></object> 4 standard deviations (0.006% failure). So, one can design the system to tolerate <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/99033ff13e14ca2dbdcdcffe6dfbc31c.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/99033ff13e14ca2dbdcdcffe6dfbc31c.png'>Cannot render equation. Use Firefox instead.</object></object>, where <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8ce4b16b22b58894aa86c421e8759df3.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8ce4b16b22b58894aa86c421e8759df3.png'>Cannot render equation. Use Firefox instead.</object></object> is some factor (3, 2, 4 for example) that determines the probability of failure.</p>
<p>However, what if the distribution is bimodal? Take for example, two modes of operation (each more or less Gaussian):</p>
<p style="text-align: center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151b.jpg"><img class="aligncenter" style="float: none; margin-left: auto; margin-right: auto; border-width: 0px;" src="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151b_thumb.jpg" border="0" alt="scan0151b" width="244" height="134" /></a></p>
<p>Due to the asymmetric distribution, the mean and median are now not the same. In this case, we could posit that some secondary mode (or external factor) causes that second hump. Let’s call the main hump the primary mode and the smaller hump the secondary mode. If things are behaving “normally” we get the first hump, but some failure or aberration causes the second hump.</p>
<p>However, what if the system was more sensitive to this failure (secondary mode). Then, we’d see something like:</p>
<p><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151c.jpg"><img class="aligncenter" style="float: none; margin-left: auto; margin-right: auto; border-width: 0px;" src="http://www.circuitdesign.info/blog/wp-content/uploads/2009/12/scan0151c_thumb.jpg" border="0" alt="scan0151c" width="244" height="127" /></a>Notice what happened? The median stayed exactly the same. However the mean mislabeled “average”) moved proportionally to that secondary hump. Incidentally, the standard deviation (<object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/e773536932c61c7ee11944cefde49e30.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/e773536932c61c7ee11944cefde49e30.png'>Cannot render equation. Use Firefox instead.</object></object>) also moved proportionally to the distance between the two humps—but let’s focus on the fact that the mean just changed.</p>
<p>The question you’re probably asking is “what’s so bad about that”? Well, if you’re computing six-sigma-like design criteria, you’re taking <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/d313ed41f8c285fd35c299d68427065d.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/d313ed41f8c285fd35c299d68427065d.png'>Cannot render equation. Use Firefox instead.</object></object>. Recall, however, that we could pick any factor <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8ce4b16b22b58894aa86c421e8759df3.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8ce4b16b22b58894aa86c421e8759df3.png'>Cannot render equation. Use Firefox instead.</object></object> depending on the probability of failure we want (I should say want to avoid). So, when both the average and the standard deviation change, how can we be sure we’re getting the right value for <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/34664d934b3f58901d9bd9605d4c5148.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/34664d934b3f58901d9bd9605d4c5148.png'>Cannot render equation. Use Firefox instead.</object></object>?</p>
<p>The nice thing about picking the median as the average is that it doesn’t depend on the magnitude of the secondary mode—only on the probability of the secondary mode. The magnitude of failure impacts the standard deviation. I like to view these (median and standard deviation) sas two independent metrics that tell different stories.</p>
<p>Another thing to note is that one could view the 2nd illustration above as an input to a nonlinear amplifier (for example) and the 3rd illustration as the output. That’s another nice thing about the median: it commutes with a monotonic nonlinearity. That is, if <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8fa14cdd754f91cc6554c9e71929cce7.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/8fa14cdd754f91cc6554c9e71929cce7.png'>Cannot render equation. Use Firefox instead.</object></object> is monotonic, and <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/45c6a14fb8855c9641193ef1125d70f8.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/45c6a14fb8855c9641193ef1125d70f8.png'>Cannot render equation. Use Firefox instead.</object></object>, then <object type='image/svg+xml' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/019084ec241802157ba9a929941e07c4.svg'><object type='image/png' class='mathml_backup' data='http://www.circuitdesign.info/blog/wp-content/uploads/asciimathml/019084ec241802157ba9a929941e07c4.png'>Cannot render equation. Use Firefox instead.</object></object>. So, we don’t have to worry so much that we’re measuring the correct independent variable. Our median will give us the same information (albeit in a different, nonlinear domain).</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.circuitdesign.info/blog/2009/12/median-vs-mean/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean&amp;desc=I%E2%80%99ve%20been%20doing%20some%20statistical%20measurements%20lately%20%28more%20to%20follow%29.%20It%20occurs%20to%20me%20that%20while%20most%20people%20measure%20the%20mean%20of%20a%20set%20of%20measurements%2C%20the%20median%20is%20more%20useful.%0D%0A%0D%0AIf%20the%20distribution%20is%20Gaussian%2C%20the%20mean%20and%20median%20are%20equal.%0D%0A%0D%0A%28Mean%20is%20defined%20as%20%60mu_X%20%3D%20int%20X%20p%28X%29%20dX%60%20where" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;bm_description=Median+vs+Mean&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/&amp;title=Median+vs+Mean" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.circuitdesign.info/blog/2009/12/median-vs-mean/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Median+vs+Mean+-+http://www.circuitdesign.info/v&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.circuitdesign.info/blog/2009/12/median-vs-mean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Non-Radix-2 FFT in Cadence/Ocean/Skill/Spectre &#124; Using Cadence IPC to talk to Matlab (or anything else)</title>
		<link>http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/</link>
		<comments>http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 14:43:53 +0000</pubDate>
		<dc:creator>Poojan Wagh</dc:creator>
				<category><![CDATA[Analog Professional]]></category>
		<category><![CDATA[Digital Professional]]></category>
		<category><![CDATA[cadence]]></category>
		<category><![CDATA[FFT]]></category>
		<category><![CDATA[IPC]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[Ocean]]></category>
		<category><![CDATA[Skill]]></category>

		<guid isPermaLink="false">http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/</guid>
		<description><![CDATA[Introduction I had been working on a pulse-width-modulation (PWM) design. It was a pseudo-digital implementation, in that the output was clocked by a high-speed clock. The actual switching rate was much lower than this clock. I wanted to simulate this design in Cadence/Spectre by running a transient and then taking an FFT. However, I ran [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>I had been working on a pulse-width-modulation (PWM) design. It was a pseudo-digital implementation, in that the output was clocked by a high-speed clock. The actual switching rate was much lower than this clock. I wanted to simulate this design in Cadence/Spectre by running a transient and then taking an FFT.</p>
<p>However, I ran into a bit of a snag: the quantization clock and my input clock rates were defined by the design, and they weren&#8217;t up to me. Moreover, these weren&#8217;t related by a power of 2. Unfortunately, Cadence Ocean (Skill) commands only allow for a radix-2 (power of 2 length) FFT. So, I was stuck. I needed a way to do a non-radix-2 FFT in Cadence. Here&#8217;s how I solved it using Matlab and getting Cadence and Matlab to talk (in a limited fashion).</p>
<p><span id="more-648"></span>What I ended up doing was writing some Skill IPC (inter-process communication) code that:</p>
<ol>
<li>Dumped the time-domain data to a text file on disk (in Cadence/Skill)</li>
<li>Read the time-domain data using Matlab</li>
<li>Perform the FFT (in Matlab)</li>
<li>Write the frequency-domain data to a text file (in Matlab)</li>
<li>Read the frequency-domain data (in Cadence/Skill)</li>
<li>Plot FFT and compute SNR/SNDR (in Cadence/Skill)</li>
</ol>
<h2>The scripts</h2>
<p>These files are copyright Poojan Wagh, 2009. They are released under the GPL. See http://www.gnu.org/licenses/gpl.txt.</p>
<p>These files come with absolutely no warranty, expressed or implied. Use at your own risk. If these scripts destroy your entire design database, that&#8217;s your fault for using them.</p>
<h3>The Ocean Script</h3>
<p>Here&#8217;s the ocean script I used. It&#8217;s called text.txt, because it is actually contained as a cell-view (text file type). Here&#8217;s a run-through of the code:</p>
<pre>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; copy this into CIW:
; runscript( "pwm3_sim" "reg0650_tran_paw" "ocean_ultrasim_getsndr_baseline" )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</pre>
<p>I&#8217;ve defined runscript() as a function which loads and executes a text-file cell-view.</p>
<pre>; Copyright (c) 2009 Poojan Wagh
; Released under GPL (http://www.gnu.org/licenses/gpl.txt)
; $Revision: 1511 $
library = "pwm3_sim"
cell = "reg0650_tran_paw"
view = "config_baseline"
proc= "typ"
cap = "typ"
res = "typ"</pre>
<p>library, cell, view, proc (typ/wcs/bcs), etc. are all defined as skill variables for easier changing &#038; for future corner simulation</p>
<pre>lsfqueue =  nil
jobname = "reg0650_tran_paw_baseline"</pre>
<p>In case we want to use LSF for load-balancing</p>
<pre>wad = getShellEnvVar("WORKAREA_DIR")
dumpfile = strcat(wad "/matfft/reg0650_tran_paw_baseline.pwm")</pre>
<p>WORKAREA_DIR is the area where cadence is started. The PWM dump-out file will be in a <code>mattfft</code> subdirectory of it.</p>
<pre>runit = t;
plotpsd = t;</pre>
<p>runit determines whether we run the simulation or just plot the FFT/SNR/SNDR. plotpsd determines if we plot the power spectral density (PSD) or not (mostly for debugging).</p>
<pre>;;;;;;;;;  Max Amplitude
inputmag =1.8;
vidc = 0.0;
fR = 460k;
ncs = 36;
fQ = ncs*fR;</pre>
<p>inputmag is how high of an input signal we are sending to the PWM modulator. fR is the switching rate. fQ is the sampling rate. Note that fR=36*fQ, so this we don&#8217;t want a radix-2 FFT. Doing a radix-2 FFT would result in spectral leakage (and corrupt our SNR measurement).</p>
<pre>;Changes 1024 pts **************************************
ncyc = 1024;
kcyc = 512;
simtime = (ncyc+kcyc)/fR
fbin = fR/ncyc;
fin = 13*fbin;
bw = round(20E3/fbin)*fbin;</pre>
<p>I run the simulation for a total of $$\over{ncyc+kcyc}{fR}$$ cycles of fR. However, I throw away the first kcyc cycles to allow for startup transients.</p>
<pre>; procedures used in this script:
; write a command to matlab
procedure( writemat(mipc cmd )
  ipcWaitForProcess(mipc)
  ipcWriteProcess(mipc sprintf(nil "disp 'Executing %s'\n" cmd));
  ipcWaitForProcess(mipc)
  ipcWriteProcess(mipc sprintf(nil "%s\n" cmd));
  )</pre>
<p>This (above) is a little wrapper skill function that sends a command to Matlab. I made it so that it also displays the command being executed in Cadence (for debugging).</p>
<p>The following function computes the PSD by sending commands to Matlab</p>
<pre>; compute psd from matlab
procedure( matpsd( dumpfile fR ncs ncyc)
  let( (fin psdfile fswfile freqvec psdvec persist matlog)
    printf("Starting matlab to compute PSD\n")
    sprintf(matlog "%s.log" dumpfile)
    printf("Matlab log file: %s\n" matlog)
    workareadir = getShellEnvVar("WORKAREA_DIR")
    mipc = ipcBeginProcess(strcat("cd " workareadir "/matfft &#038;& matlab -nodisplay -logfile " matlog))
    writemat(mipc "clear all");
    writemat(mipc "global ncs dt fsw")
    writemat(mipc sprintf(nil "fsw = %g" fR));
    writemat(mipc sprintf(nil "ncs = %u" ncs));
    writemat(mipc sprintf(nil "ncyc = %u" ncyc));
    writemat(mipc "dt = 1/(fsw*ncs)");
    writemat(mipc sprintf(nil "[yout, xin] = readpwm('%s');" dumpfile))
    writemat(mipc "[Py, freq] = getpsd(sign(yout), ncs*fsw, ncs*ncyc);");
    sprintf(psdfile "%s.psd" dumpfile);
    writemat(mipc sprintf(nil "fout = fopen('%s', 'w')" psdfile))
    writemat(mipc "fprintf(fout, '%.12g %.12g\\n', [freq(:) Py(:)]')")
    writemat(mipc "fclose(fout)")
    writemat(mipc "exit");
    printf("Waiting for Matlab to finish");
    ; wait for matlab to finish:
    while( ipcIsAliveProcess(mipc)
      printf(".")
      ipcSleep(1)
    )
    fin = infile(psdfile);
    freqvec = nil;
    psdvec = nil
    printf("Reading results from Matlab\n");
    while( fscanf(fin "%f %f" frq psd)
      if(!freqvec then
        freqvec = drCreateVec('double list(frq))
      else
        drAddElem(freqvec frq);
      )
      if(!psdvec then
        psdvec = drCreateVec('double list(psd))
      else
        drAddElem(psdvec psd)
      )
    )
    close(fin);
    psdpwm = drCreateWaveform(freqvec psdvec)
  ) ; let
  psdpwm        ; return psdpwm
) ; procedure</pre>
<p>You&#8217;ll notice that the skill variables <em>are actually sent to matlab</em>, not hard-coded anywhere. So, changing the variable assignments in the skill/ocean file will be reflected in Matlab. Several Matlab helper functions are used:</p>
<ul>
<li>readpwm reads the text file</li>
<li>getpsd computes the psd
<ul>
<li>bh4 defines a minimum 4-term blackman-harris window; when I wrote this script, it was not available in Matlab</li>
<li></li>
</ul>
</li>
</ul>
<p>Each of these Matlab <code>.m</code> files are included in the attached tarball. In addition, I define a few Ocean/Skill helper functions:</p>
<p>sumpsd sums up spectral power over a frequency range (fstart to fend):</p>
<pre>procedure( sumpsd( psd fstart fend)
  if(fstart &lt; fend then
    integ( clip(psd fstart fend) )
  else
    0.0
  )
)</pre>
<p>getpow gets the spectral power of a tone centered at fc and takes into account spectral growth around fc by speclobew bins of the FFT:</p>
<pre>; get power of signal centered at fc
procedure( getpow( psd fc fbin )
  let( list( (speclobew 5) )
    sumpsd(psd fc-speclobew*fbin fc+speclobew*fbin)
  )
)</pre>
<p>Define simulator, output directory, etc:</p>
<pre>simulator( 'UltraSim )
resultsDir( strcat( wad "/simulation/" library "/" cell "/" view "/" simulator() ) )</pre>
<p>In case we want to use LSF for load-sharing:</p>
<pre>if(lsfqueue then
  hostMode( 'distributed )
else
  hostMode( 'local )
  )</pre>
<p>Define the test bench cell to be simulated (in read-only mode):</p>
<pre>design(	library cell view "r" )</pre>
<p>Define model files. Note that the <em>proc</em>,<em>cap</em>, etc. Skill variables are used:</p>
<pre>printf("$Revision: 1511 $ Using rev1e model files\n")
modelFile(
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" "base")
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" strcat(proc "_fet"))
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" strcat(proc "_bjt"))
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" strcat(cap  "_capacitor"))
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" strcat(res  "_resistor"))
    list("/pdk_dir/amsmodels/spectre/rev1e.scs" strcat(proc "_diode"))
)</pre>
<p>Define the simulation time and analysis options:</p>
<pre>sprintf(sstop, "%.12g", simtime);
analysis('tran ?stop sstop  ?saveOP t  ?write "spectre.ic"
		?writefinal "spectre.fc"  ?method "gear2"  ?strobeperiod "1.0/fQ"  ?maxstepU "1.0/(16*fQ)"  )</pre>
<p>Define design variables. Note that these are assigned from the Skill variables, so changing just the skill variables at the top of the file propage down through the design netlist and into matlab</p>
<pre>desVar(	  "fR" fR	)
desVar(	  "vdd" 2.5	)
desVar(	  "vidc" vidc	)
desVar(	  "inputmag" inputmag	)
desVar(	  "fin" fin	)
desVar(	  "fQ" "36*fR"	)</pre>
<p>UltraSim simulation options:</p>
<pre>option(	'tol  "0.001"
	'dc  "spectre DC (3)"
	'scale  ""
	'wf_format  "PSF"
	'pn_method  "keep"
	'analog  "off"
	'speed  "Extreme Accuracy (1)"
	'sim_mode  "Analog (A)"
)

saveOption('UsimOptionDepth "20")
saveOption('UsimOptionAllAnalogNV t)
saveOption('UsimOptionProbeAnalog t)
temp( 27 )</pre>
<p>Actually run the simulation:</p>
<pre>; either this:
if(runit then
  startrun = getCurrentTime()
  if(lsfqueue then
    run( ?queue lsfqueue ?block t ?jobName jobname)
  else
    run()
  )
  endrun = getCurrentTime()
  runtime = compareTime(endrun, startrun);
  printf("Run took %d hours %d minutes %d seconds\n" floor(runtime/60/60) mod(floor(runtime/60), 60) mod(runtime, 60));
else
  openResults(resultsDir());
)
selectResults( 'tran )</pre>
<p>Dump out the time-domain file:</p>
<pre>if(dumpfile then
  printf("dumping to file %s\n" dumpfile)
  ocnPrint(v("/PWM_P")-v("/PWM_M") ?output dumpfile ?precision 12 ?numberNotation `none)
)</pre>
<p>Compute the PSD through Matlab</p>
<pre>if(plotpsd then
  psdpwm = matpsd( dumpfile fR ncs ncyc )
  ; PSig = sumpsd(psdpwm fin-5*fbin fin+5*fbin)     ; Signal Power
  PSig = getpow(psdpwm fin fbin)                                        ; Signal Power
  PND = sumpsd(psdpwm 0 min(bw fin-6*fbin)) + sumpsd(psdpwm fin+6*fbin bw) ; Noise Power
  PN = PND;
  exbw = 0;
  ; for SNR measurement, exclude odd-mode distortion
  ; from 3*fin to bw
  for( k 1 floor(bw/2/fin)
    fex1 = (2*k+1)*fin-5*fbin
    fex2 = min(bw (2*k+1)*fin+5*fbin)
    psdex = sumpsd(psdpwm fex1 fex2);
    ; printf("k = %u Excluding distortion from %f kHz to %f kHz (%g - %g)\n" 2*k+1 fex1 fex2 PN psdex)
    PN = PN - psdex;
    exbw = exbw + (fex2-fex1);
    ; printf("Excluding distortion from %f kHz to %f kHz (%f kHz)\n" fex1/1.0k fex2/1.0k (fex2-fex1)/1.0k);
  )
  PN = PN / (1 - exbw/bw)           ;compensate for frequencies we have excluded
                                    ;(assuming white noise)
  SNDR = PSig/PND;
  SNR = PSig/PN;
  SNDRdB = db10(SNDR);
  SNRdB = db10(SNR);
  printf("SNDR [%s/%s/%s]= %.2f dB\n" library cell view SNDRdB);
  printf("SNR [%s/%s/%s]= %.2f dB\n" library cell view SNRdB);
  sprintf(wintitle "PSD of Digitized PWM [%s/%s/%s] SNDR = %.0f dB NSR = %.0f dB" library cell view SNDRdB SNRdB)
  plot(db10(clip(psdpwm, fin-5*fbin, fin+5*fbin)) db10(psdpwm) ?expr list("Desired Signal" wintitle))
  xLimit(list(0 bw))
)</pre>
<p>I use <a title="VI Improved: my text editor of choice (but definitely not for everyone)" href="http://www.vim.org/" target="_blank">vim</a> <img src='http://www.circuitdesign.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>; vim: ft=ocean</pre>
<h3>ReadPWM</h3>
<p>This little matlab function reads the text file and assigns variables in Matlab:</p>
<pre>function [yout, xin] = readpwm(filename)
  [time, pwm, xin] = textread(filename, '%f %f %f', -1, 'headerlines', 5);
  yout = pwm;</pre>
<h3>GetPSD</h3>
<p>This matlab function gets the PSD from the time-domain data:</p>
<pre>% function [ypsd, freq] = getpsd(x, fs, [psdlen])
%   return psd ypsd and frequency scaling of signal x
%   with sample rate fs and psd length psdlen.
%   copied from getpsd.m
function [ypsd, freq] = getpsd(x, fs, psdlen)
  x = x(:)';
  if(nargin > 2)
    if(psdlen &lt; length(x))
      y = x(1:psdlen).*bh4(psdlen);
    else
      y = x .* bh4(length(x));
    end
  end
  ypsd = abs(psd(y, psdlen)).^2;
  freq = (0:psdlen-1)*fs/psdlen;</pre>
<p>Note that it also does the limiting function (using only the last <em>psdlen</em> values in the time-domain data).</p>
<h3>BH4</h3>
<p>Minimum 4-term blackman-harris window:</p>
<pre>function [bh] = bh4(N)
% w = bh4(N)
%
%    Generates Blackman-Harris window of length N
%
a0=0.35875;
a1=0.48829;
a2=0.14128;
a3=0.01168;
theta = (0:N-1)*2*pi/N;
bh=a0-a1*cos(theta)+a2*cos(2*theta)-a3*cos(3*theta);</pre>
<h3>The Tarball</h3>
<p>All the above scripts are contained <a rel="attachment wp-att-649" href="http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/matfft/">matfft</a>.</p>
<h2>IPC</h2>
<p>All of the above was done using Cadence IPC. This is basically a set of functions that let you remote-control another command. The standard input/output (stdin/stdout) of the child process is connected to the Cadence instance. Using ipcReadProcess in Cadence reads the child&#8217;s stdout. Using ipcWriteProcess writes to the child&#8217;s stdout. In theory, one could run any Matlab program from Cadence using this method.</p>
<p>However, one could read/write to <em>any</em> text-mode program using this method. For a while, I thought about using <a title="Open-source C FFT libraries" href="http://www.fftw.org/" target="_blank">FFTW</a> and coding a small C program to compute the above FFT&#8217;s. The same C program could be controlled using IPC. However, I wasn&#8217;t getting paid to program (<a title="I'm programming now, since I'm moving into software" href="http://poojanblog.com/blog/2008/11/im-leaving-motorola/" target="_blank">at the time</a>), and I already had most of the functions already in Matlab.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29&amp;desc=Introduction%0D%0AI%20had%20been%20working%20on%20a%20pulse-width-modulation%20%28PWM%29%20design.%20It%20was%20a%20pseudo-digital%20implementation%2C%20in%20that%20the%20output%20was%20clocked%20by%20a%20high-speed%20clock.%20The%20actual%20switching%20rate%20was%20much%20lower%20than%20this%20clock.%20I%20wanted%20to%20simulate%20this%20design%20in%20Cadence%2FSpectre%20by%20running%20a%20transien" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;bm_description=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/&amp;title=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Matlab+%28or+anything+else%29" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Non-Radix-2+FFT+in+Cadence%2FOcean%2FSkill%2FSpectre+%7C+Using+Cadence+IPC+to+talk+to+Ma%5B..%5D+-+http://www.circuitdesign.info/z&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.circuitdesign.info/blog/2009/01/non-radix-2-fft-in-cadenceoceanskillspectre-using-cadenc-ipc-to-talk-to-matlab-or-anything-else/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>You want latches? We got latches &#124; Flip-Flop Design</title>
		<link>http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/</link>
		<comments>http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 01:24:52 +0000</pubDate>
		<dc:creator>Poojan Wagh</dc:creator>
				<category><![CDATA[Digital Professional]]></category>
		<category><![CDATA[CMOS]]></category>
		<category><![CDATA[divider]]></category>
		<category><![CDATA[fully custom]]></category>
		<category><![CDATA[memory]]></category>

		<guid isPermaLink="false">http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/</guid>
		<description><![CDATA[The two inverters chasing their tail to the right of the input inverters represent a memory unit (i.e. a latch). When one output is high the other one is forced low. This low output then reinforces the first output being high. These two inverters form a positive feedback system.]]></description>
			<content:encoded><![CDATA[<p>I received a request to go through the design of a flip-flop. Every flip-flop I have designed has been a master-slave D flip-flop, built out of two D latches. I’ll start with a basic CMOS latch and go into more optimized latch topologies.</p>
<h3>Update 2008-12-19</h3>
<p>This post probably didn&#8217;t make sense to many of you. I was representing C-bar (negation of C) by an underline. Unfortunately, WordPress (or maybe my theme) wasn&#8217;t rendering this underline, so $$\overline{C}$$ didn&#8217;t look any different from $$C$$. I&#8217;ve (obviously) rectified this ambiguity through the magic of <a href="http://wordpress.org/extend/plugins/latex/" title="Latex for WordPress (WordPress plugin)">Latex</a>. If there are any errors now, they are solely my fault. (Let me know.)</p>
<p><span id="more-505"></span></p>
<p>Consider the cross-coupled inverters shown below:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113a.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113a-thumb.jpg" border="0" alt="scan0113a" width="244" height="161" /></a></p>
<p>The two inverters chasing their tail to the right of the input inverters represent a memory unit (i.e. a latch). When one output is high the other one is forced low. This low output then reinforces the first output being high. These two inverters form a positive feedback system.</p>
<p>I will represent almost all circuits as fully differential. That is generally how I’ve encountered these structures, and it also more general. If one wants a single-ended version, simply lop off one of the input structures (but keep the cross-coupled inverters).</p>
<p>This system has two stable states: the top output high (at supply) and the bottom output low (at ground) or vice versa. One additional trait of these cross-coupled inverters is that it takes a bit of effort to flip them from one state to the other. One must essentially cause the top output to go from high to low by overcoming the inverter driving the top output. In other words, the input inverters (on the left) must be sized larger than the cross-coupled inverters.</p>
<p>Our desire, however, is not to have the state change at random. We want the latch state to change only upon the transition of an external clock. This can easily be accomplished by passing the input inverter’s output through a transmission gate controlled by the clocks $$C$$ and $$\overline{C}$$.</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113b.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113b-thumb.jpg" border="0" alt="scan0113b" width="244" height="115" /></a></p>
<p>Now, we have a true latch. I won’t repeat <a title="Flip-Flop" href="http://en.wikipedia.org/wiki/Flip_flop" target="_blank">Wikipedia in analyzing a flip-flop as two successive latches triggered on opposite phases of the clock signal</a>.</p>
<p>Now, let’s look closer at the inverter and T-gate combination in more detail:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0114a.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0114a-thumb.jpg" border="0" alt="scan0114a" width="244" height="131" /></a></p>
<p>The PMOS controlled by $$\overline{C}$$ does very little when the output of the inverter is low. It is basically there for pull up. Similarly, when the inverter output is high, the NMOS controlled by $$C$$ does very little; it is basically there to pull $$\overline{out}$$ low. As a result, we can lose the connections between the PMOS and NMOS in the T-gate and incorporate the T-gate into the inverter:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113c.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0113c-thumb.jpg" border="0" alt="scan0113c" width="244" height="212" /></a></p>
<p>This structure has the advantage of allowing an contactless diffusion between the series PMOS devices and another contactless diffusion between the series NMOS devices, as I illustrated in the <a title="MOS Diffusion Parasitics" href="http://www.circuitdesign.info/blog/2008/12/mos-diffusion-parasitics/" target="_blank">MOS diffusion parasitics article</a>.</p>
<p>Another manipulation we can perform on this structure is to reverse the roles of input gates and clock gates (switching the connections of $$in$$/$$\overline{in}$$ and $$C$$/$$\overline{C}$$):</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0115b.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0115b-thumb.jpg" border="0" alt="scan0115b" width="243" height="244" /></a></p>
<p>Note that while both PMOS clock devices (driven by $$\overline{C}$$) are turned on, only one is actively pulling up an output. For example, the PMOS devices on the left pulls $$\overline{out}$$ up when $$in$$ is low. However, the upper right PMOS device (driven by $$\overline{C}$$) does nothing because the PMOS in series with it is off ($$\overline{in}$$ is high).</p>
<p>I will draw this structure as a gated inverter in the future:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0116a.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0116a-thumb.jpg" border="0" alt="scan0116a" width="148" height="244" /></a></p>
<p>Up to this point, the input structure has always had to fight the memory effect of the cross-coupled inverters. Essentially, the input structure must inject enough current into the cross-coupled inverters to force them to switch states. This contention can result in considerable power draw. This power draw can be alleviated by gating the cross-coupled inverters (enabled on the opposite phase than that of the input structures):</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0117b.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0117b-thumb.jpg" border="0" alt="scan0117b" width="244" height="221" /></a></p>
<p>Finally, the PMOS clock devices  can be combined into one device; and the NMOS clock devices (driven by $$C$$) can be combined into one device. <span style="#808080;">I have omitted the cross-coupled inverter devices for brevity</span>:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0114b.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0114b-thumb.jpg" border="0" alt="scan0114b" width="244" height="222" /></a></p>
<p>Doing so has the benefit the PMOS clock device can be twice as large while maintaining the same capacitive load on $$\overline{C}$$. Similarly, the NMOS clock signal $$C$$ can see the sum of the device widths from the previous configuration yet whichever NMOS is on ($$in$$ or $$\overline{in}$$) is now in series with a device twice as wide.</p>
<p>Finally, one can omit some level of gating by <em>pre-charging</em> the latch. That is, instead of waiting for the input to determine whether we pull the output high or not, we pull the output high during the first half of every cycle. During the second half, we pull down <em>only if the input should really be low</em>. The following flip-flop structure achieves this pre-charging. Once again, I have omitted the cross-coupled structures:</p>
<p style="center;"><a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0117a.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0117a-thumb.jpg" border="0" alt="scan0117a" width="244" height="181" /></a></p>
<p>The first stage’s PMOS pulls up whenever $$\overline{C}$$ is low on every cycle. Then, on the next half-cycle (when $$C$$ is high) the NMOS pulls down only when $$in$$ is high. Since the first stage only has one PMOS device (rather than two in series), the pull-up action is faster. Since we want to clock the second latch stage on the opposite phase (to form a full flip-flop), we need to invert the pre-charge and pre-charge low (rather than high).</p>
<p>The main problem with the pre-charge architecture as shown is that the first stage (for example) pulls up on every cycle even when the input $$in$$ is always high (and the output should be low). This represent a great deal of charging and discharging on the output of the first stage and thus dissipates power. However, this represents a fundamental trade-off: that one can gain increased speed at the expense of power.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design&amp;desc=The%20two%20inverters%20chasing%20their%20tail%20to%20the%20right%20of%20the%20input%20inverters%20represent%20a%20memory%20unit%20%28i.e.%20a%20latch%29.%20When%20one%20output%20is%20high%20the%20other%20one%20is%20forced%20low.%20This%20low%20output%20then%20reinforces%20the%20first%20output%20being%20high.%20These%20two%20inverters%20form%20a%20positive%20feedback%20system." rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;bm_description=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/&amp;title=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=You+want+latches%3F+We+got+latches+%7C+Flip-Flop+Design+-+http://www.circuitdesign.info/p&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.circuitdesign.info/blog/2008/12/you-want-latches-we-got-latches-flip-flop-design/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Minimizing leakage for high-performance CMOS circuits</title>
		<link>http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/</link>
		<comments>http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 04:26:53 +0000</pubDate>
		<dc:creator>Poojan Wagh</dc:creator>
				<category><![CDATA[Digital Professional]]></category>
		<category><![CDATA[body bias]]></category>
		<category><![CDATA[leakage]]></category>
		<category><![CDATA[regulator]]></category>
		<category><![CDATA[submicron]]></category>

		<guid isPermaLink="false">http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/</guid>
		<description><![CDATA[I was asked a question on how to reduce leakage for digital circuits. I started by detailing process options that effect leakage, each effective both leakage and circuit performance. In this article, I will detail two methods to reduce leakage while maintaining circuit performance. I assume that the circuit at hand requires the highest performance [...]]]></description>
			<content:encoded><![CDATA[<p>I was asked a question on how to reduce leakage for digital circuits. I started by <a title="Typical CMOS Device/Process Options" href="http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/" target="_blank">detailing process options that effect leakage</a>, each effective both leakage and circuit performance. In this article, I will detail two methods to reduce leakage while maintaining circuit performance. I assume that the circuit at hand requires the highest performance in some active mode but must greatly reduce its leakage in a standby mode.<span id="more-458"></span></p>
<h2>Supply Switch</h2>
<p>The simplest method to reduce leakage in standby is to provide a switch to supply that opens during standby. Since the sea of digital devices are then disconnected from supply, their gates cannot be at supply and therefore their gate leakage goes away. In this case, I have represented the sea of gates as an inverter, with its supply and ground connections explicitly shown:<br />
<img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0119-thumb.jpg" border="0" alt="scan0119" width="244" height="159" /></p>
<p>The bigger concern is active operation. The PMOS switch has some finite on-resistance. Current spikes during the transition of the digital circuits will cause voltage spikes on the supply of the digital circuit as Ohmic loss builds through the PMOS switch. In effect, the PMOS switch reduces the pull-up capability of every gate in the digital circuitry:</p>
<p>This transient supply droop can be alleviated by sufficient bypassing. The problem and solution follow identically <a title="Load Capacitance" href="http://www.circuitdesign.info/blog/2008/06/quick-regulator-design-part-1-load-capacitance/" target="_blank">my previous post on supply regulation</a> <span style="color: #808080;">except that in that case of a feedback regulator, the low on-resistance is more frequency-dependent than with the PMOS switch</span>. To keep the static supply droop under control, the PMOS switch should be made adequately wide. Doing so can cause the supply switch to have a size on the order of the entire digital circuit area.</p>
<h2>Reverse Body Bias</h2>
<p>The back-gate or body can also be used to reduce leakage. Essentially, leakage gets reduced when the threshold is increased—decreased (increased in magnitude) for PMOS devices. Biasing the body below the source for NMOS or above the source for PMOS can increase the magnitude of the threshold voltage.</p>
<p>To do so, we allow two connections for the body. I have picked the PMOS case for the body switching because typically, there is one ground available but two supplies (a higher-voltage I/O supply and a lower-voltage core supply):<br />
<a href="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0118.jpg"><img class="aligncenter" style="0px" src="http://www.circuitdesign.info/blog/wp-content/uploads/2008/12/scan0118-thumb.jpg" border="0" alt="scan0118" width="210" height="244" /></a></p>
<p>When the enable <strong>EN</strong> signal is asserted high, <strong><span style="text-decoration: underline;">EN</span></strong> will be low and therefore turn on the PMOS device that ties the body of the core circuit’s PMOS device to VDDCORE. When <strong>EN</strong> is deasserted low, <strong><span style="text-decoration: underline;">EN</span></strong> will be pulled high and turn off this connection. In its place, the secondary PMOS device will pull the core body connection to VDDIO, effectively increasing the magnitude of the Vt of the core PMOS device, and thus reducing leakage in the inverter.</p>
<p>The main difficulty with the above technique is that it requires a separate connection for the PMOS body. Typically, in standard cell logic, the body is directly connected to supply.</p>
<p>There is also a risk that if these body-connecting PMOS devices have too large of an on-resistance, they can cause latch-up. Care should be taken to ensure that the on-resistances of these deices are low. However, the size of the resulting PMOS devices in this case would still be much less than that required of an equivalent PMOS supply switch.</p>
<p>One of the main benefits of the reverse body bias technique is that it allows for circuits which hold state (static memory cells). <span style="color: #808080;">This is out of my range of experience, but </span>it may also improve the required refresh rates on dynamic memory cells, too—thus slowing down refresh clock rates and therefore greatly reducing power.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits&amp;desc=I%20was%20asked%20a%20question%20on%20how%20to%20reduce%20leakage%20for%20digital%20circuits.%20I%20started%20by%20detailing%20process%20options%20that%20effect%20leakage%2C%20each%20effective%20both%20leakage%20and%20circuit%20performance.%20In%20this%20article%2C%20I%20will%20detail%20two%20methods%20to%20reduce%20leakage%20while%20maintaining%20circuit%20performance.%20I%20assume%20that%20the" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;bm_description=Minimizing+leakage+for+high-performance+CMOS+circuits&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/&amp;title=Minimizing+leakage+for+high-performance+CMOS+circuits" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Minimizing+leakage+for+high-performance+CMOS+circuits+-+http://www.circuitdesign.info/1k&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Typical CMOS device/process options</title>
		<link>http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/</link>
		<comments>http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 20:14:46 +0000</pubDate>
		<dc:creator>Poojan Wagh</dc:creator>
				<category><![CDATA[Digital Professional]]></category>

		<guid isPermaLink="false">http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/</guid>
		<description><![CDATA[I received an inquiry on how to reduce leakage. I will cover how to do so in a future article. However, before I do, let’s go over some process options that effect leakage. Core Devices Typically, foundries offer a few variations of there processes. I will call them general purpose (GP) and low power (LP). [...]]]></description>
			<content:encoded><![CDATA[<p>I received an inquiry on how to reduce leakage. I will cover how to do so in a future article. However, before I do, let’s go over some process options that effect leakage.<span id="more-454"></span></p>
<h2>Core Devices</h2>
<p>Typically, foundries offer a few variations of there processes. I will call them general purpose (GP) and low power (LP). They differ in what I call the core devices, after which a process is usually named—for example, <em>CMOS090</em> (90 nm) or <em>TSMC 0.18μm</em>.</p>
<h3>GP</h3>
<p>The GP represents the state of the art and usually drives large digital IC’s, including general purpose microprocessors and DSP’s. The traits of the GP process are a lower threshold and supply voltage, and possibly smaller effective gate length.</p>
<h3>LP</h3>
<p>The LP is usually a variant of the GP process optimized to reduce leakage (at the expense of speed). The LP option is usually used for highly integrated analog &#038; RF CMOS IC’s, such as radios (RF transceivers), ADC’s, etc. Typically, the LP allows for a slightly higher supply voltage and sometimes has a slightly larger effective gate length. However, the main trait of the LP process is that the threshold is increased a bit from the GP process to allow for lower leakage. <span style="color: #808080;">I’m not entirely sure if the higher supply voltage and gate length are intentional or are a byproduct of the higher threshold.</span></p>
<h2>I/O Devices</h2>
<p>Almost universally, all modern processes offer an “I/O” device. This is essentially a device from a prior process node (1.8 V, 2.5 V, or 3.3 V) with a larger gate length (0.18 um, 0.25 um, or 0.35 um). They are provided from a digital perspective as devices for pad drivers etc. However, they usually form the workhorse of analog/RF IC’s <span style="color: #808080;">especially at baseband</span>.</p>
<h2>Device options</h2>
<p>In both the GP and LP flavors, there are additional device options <span style="color: #808080;">not necessarily universally, but usually</span>:</p>
<ul>
<li>High-Vt: a core device with the threshold increased for lower leakage. <span style="color: #808080;">This is also useful for larger output range on a diff pair—which depends on the input devices’ Vt—but usually an I/O device is even better.</span></li>
<li>Low-Vt: a core device with the threshold decreased for higher performance (at the expense of leakage)</li>
<li>Zero-Vt: a core device with a zero threshold voltage. This is useful for bypass switches and source followers.</li>
</ul>
<p>These devices usually require additional mask steps and therefore incur additional processing costs.</p>
<h2>Leakage</h2>
<p>Basically, to minimize leakage, one should use the device with the highest threshold voltage that gets the job done. In order of preference:</p>
<ol>
<li>I/O Device</li>
<li>High-Vt core device (if it is already available or if the expense makes sense)</li>
<li>Core (medium-Vt) devices</li>
</ol>
<p>Of course, each of these options have the implicit tradeoff of performance/speed at the expense of leakage. What do you do when you want performance during active operation and low leakage during a standby mode? I will detail two methods <a title="Minimizing leakage for high-performance CMOS circuits" href="http://www.circuitdesign.info/blog/2008/12/minimizing-leakage-for-high-performance-cmos-circuits/" target="_self">in a future article</a>.</p>
<p>Consider a free subscription: RSS (via a newsreader such as Google Reader, My Yahoo, Windows Live Mail, IE7, Firefox) or email (delivered to your email inbox).</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options&amp;desc=I%20received%20an%20inquiry%20on%20how%20to%20reduce%20leakage.%20I%20will%20cover%20how%20to%20do%20so%20in%20a%20future%20article.%20However%2C%20before%20I%20do%2C%20let%E2%80%99s%20go%20over%20some%20process%20options%20that%20effect%20leakage.%0D%0ACore%20Devices%0D%0ATypically%2C%20foundries%20offer%20a%20few%20variations%20of%20there%20processes.%20I%20will%20call%20them%20general%20purpose%20%28GP%29%20and%20low%20" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;bm_description=Typical+CMOS+device%2Fprocess+options&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/&amp;title=Typical+CMOS+device%2Fprocess+options" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Typical+CMOS+device%2Fprocess+options+-+http://www.circuitdesign.info/1c&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.circuitdesign.info/blog/2008/11/typical-cmos-deviceprocess-options/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
