Sorry if this post gets long, but I've been working on this for a few days now and would like to get this to work with as much performance as possible.
Currently using: IC6.1.6-64b.500.6
So I'm trying to create a script that plots all the necessary plots needed to do a design using the gm/Id methodology. I created an Ocean script that works just fine with ADE L and now I would like it to work in ADE XL as there are massive performance benefits (multiple jobs, corners, etc.). My issues are as follows:
1. Searching around, I found:
Accessing ADEXL outputs from Ocean
Which explained to me how to get the outputs from a run of ADE XL in Ocean but I would like to be able to plot all the waveforms of a given expression without having to both individually eval() the expression for each point and corner and then have to plot each individual waveform. Right now my code looks something like this:
foreach( point rdb->points() foreach( corner point->corners() foreach( test corner->tests() openResults( test->resultsDir )
; eval() output expressions ; create list of waveforms closeResults( test->resultsDir ) ) ))
; Switch to subwindow 1
for( i 0 listLength-1 ocnYvsYplot( ?wavex nth( i gmoveridList ) ?wavey nth( i normidList ) ))
; Switch to subwindow 2
; more plotting
Using this method, it takes time for all the for and foreach loops to resolve and I'm fairly sure there is a more optimal way of doing this. Can anyone show me how?
2. Not really an issue, per se, but going through the help docs, and rdb->help('all), I found that there is structure for rdb->corner( someCorner )->output( someOutput ). However, for me, rdb->corner( someCorner )->outputs() always returns empty. Why is this? It seems to me that this would be the most obvious way to get the waveforms I'm looking for (say gm/id) and from there get some pseudo code that looks like this:
gmoverid = rdb->corner( someCorner )->output( gmoverid )
normid = rdb->corner( someCorner )->output( normid )
; more outputs
ocnYvsYplot( ?wavex gmoverid ?wavey normid )
; more YvsY plots
This makes sense to me, since in ADE/Ocean L, simply calling the following is enough to get a plot of normid vs (gm/id) for ALL swept parameters in a given corner.
id = (- getData(TP0:id ?result "dc"))
gm = getData(TP0:gm ?result "dc")
gmoverid = (gm / id)
normid = (id / (VAR("WP") / VAR("LP")))
Honestly, the whole issue with issue 1 is caused by the behavior in issue 2. So if there is a way of fixing issue 2, issue 1 would probably be moot.
Thank you for reading and I hope my questions are clear.
To answer my own questions, I found that the famCreateFamily() and famAddValue() are the much better options for both creating a list of waveforms to be plotted and plotting said families of waveforms. Apparently the plot() and awvPlotWaveform() functions have undocumented behavior that allows them to accept not just a family object as input but also nested families as well. (undocumented in the sense the neither functions' documentation page lists that it accepts families as inputs) Going by this, it appears that the oxyYvsYplot() and plot() functions must also accept families and cadence is actually creating families for the signals behind the scene, when doing a parametric sweep, and that is what is being passed to those functions.
One more, and in my opinion important, note: all references in the forums, that I've found, on how to plot one waveform against another refer either to ocnYvsYplot for the case of ADE L or that one must manually use the "Y vs Y" option in ADE XL plots in order to get a similar behavior in ADE XL. There is, in fact, a function called waveVsWave() that completely avoids all the issues with both of these methods and will in fact work in ADE L/XL.
Lastly, I still don't know why I can't get rdb->outputs() to return anything other than "nil". I've tried using openResults() and that didn't work. I found a brief reference to a function called ocnxlOpenResults() (here) but I can find no documentation of such a function nor can I called it. I did briefly get rdb->outputs() to return what I expected, but I can't reproduce what exactly I did to cause that. If anyone can help me or point me to an example that shows how this is done, I'd very much appreciate it.
Other than that, I hope whom ever finds this won't have to go through the same hardship.