• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. RDB Outputs empty and how to plot efficiently in SKILL/Ocean...

Stats

  • Locked Locked
  • Replies 4
  • Subscribers 143
  • Views 2539
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

RDB Outputs empty and how to plot efficiently in SKILL/Ocean XL

VMac
VMac over 6 years ago

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")))

ocnYvsYplot( ?wavex gmoverid ?wavey normid )

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.

  • Cancel
  • VMac
    VMac over 6 years ago

    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 ocnYvsYplot() 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.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • FormerMember
    FormerMember over 6 years ago in reply to VMac

    VMac I am doing exactly the same activity as you. I need to plot expressions from an ocean script such as; ocnxlOutputExpr( "waveVsWave(?x overdrive ?y gmoverid)" ?name "gmoverid Vs overdrive" ?plot t ?evalType 'point).  I am using Andrew Beckett's routine for post accessing the rdb;

    rdb=axlReadHistoryResDB(ocnxlGetCurrentHistory() ?session ocnxlGetSession())
    foreach(point rdb->points()
      printf("Point %d\n" point->id)
      foreach(corner point->corners()
        printf(" Corner %L\n" corner->name)
        foreach(test corner->tests()
          printf("  Test %L\n" test->name)
          foreach(output test->outputs()
            when(output->type=='expr
              ; take your pick
              ;printf("    Output %s = %s\n" output->name output->valueAsString())
              printf("    Output %s = %L\n" output->name output->value)
            )
          )
        )
      )
    )

    Which gives;

      Test "gmoverid:P"
        Output overdrive = "wave"
        Output gmoverid = "wave"
        Output Ft = "wave"
        Output gmoveridXFt = "wave"
        Output Av0 = "wave"
        Output gmoverid Vs overdrive = "wave"
        Output Ft Vs overdrive = "wave"
        Output gmoveridXFt Vs overdrive = "wave"
        Output Av0 Vs overdrive = "wave"
    (axlrdbd@0x4e95ad88)

    What commands do i use to plot these output objects? It was simple with L scripts!

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • VMac
    VMac over 6 years ago in reply to FormerMember

    The function i used to plot with is awvPlotWaveform(). Since it seems like you can access your RDB outputs, this should work for you without needing extra code.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • FormerMember
    FormerMember over 6 years ago in reply to VMac

    Hi VMac, i have had no success with plot() or awvPlotWaveform() at plotting these output wave objects. More steps may be required. See;

    https://community.cadence.com/cadence_technology_forums/f/custom-ic-skill/36685/accessing-adexl-outputs-from-ocean

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information