• 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 Design
  3. wavescan waveforms -> CIW?

Stats

  • Locked Locked
  • Replies 9
  • Subscribers 124
  • Views 3404
  • 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

wavescan waveforms -> CIW?

markbeck
markbeck over 15 years ago

I'm trying to figure out if it's possible to create a key-binding that could be used to dump a group of wavescan waveforms to the CIW.  I know that it's possible to dump waveforms to the calculator, but I've got a bunch of custom skill code routines that work best in the CIW.  

This is for the times that I've copied around waveforms between wavescan windows and I want to do some calulations on them (without having to resort to the calculator).

Optimally, this function would return a list of waveforms to the CIW.  

 I've looked through the awv finder functions, but I can't find anything like this.  It's almost as though wavescan was designed to be one-way only.

Mark

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago

    I'm not entirely sure I know what it would mean to "dump to CIW"? I presume you would mean to assign it to some SKILL variable? How would it know what variable to assign to?

    However, you can send a waveform to the calculator (hit the "wave" button in the calculator) and then you can cut and paste the calculator expression and use it in the CIW - there's nothing particularly special about evaluating expressions in the calculator. You could then assign the expressions to variables.  You could do the same in the calculator buffer, by adding "varName=" to the beginning of an expression (captured from a waveform) and then hitting the "evaluate" button.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • markbeck
    markbeck over 15 years ago

     Basically, I'm trying to create a function that would just return a list of the waveforms that are in the current wavescan window.  

    You pointed out that I could just evaluate the expression that is placed in the calculator from the wavescan window in the CIW and get my waveform back. I didn't realize that this also worked when what was in the calculator was something like: "wave_132()"

    I found that the following function does what I wanted.

    procedure( GrabWS()
        let( (w_current l_wave t_wave t_expr)
            w_current = awvGetCurrentWindow()       
            l_wave = car(awvGetWaveNameList(w_current))
            l_wfm = foreach(mapcar t_wave l_wave
                sprintf(t_expr "wave_%L()" t_wave)           
                evalstring(t_expr)
            ); foreach
        );
    ); 

    Thanks,

    Mark

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    I don't think this would work reliably. It doesn't always generate a function to represent the waveform - it tries wherever possible to retrieve the original expression. I just tried something similar in IC613 with a quick example, and it didn't work.

    Because the graph is currently a separate process, it's a little more complicated, and so the data may not actually exist in the main Virtuoso session. There's almost certainly a function to get the data, but I think it will be private - probably wise given the changes coming in the waveform tools - we don't want to introduce unnecessary incompatibilities in user code.

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • markbeck
    markbeck over 15 years ago

     So would something like this work?

    procedure( GrabWS()
        let( (w_current
                    l_WNL
                    l_wave
                    l_func
                    x_index
                    t_wave t_expr)
            w_current = awvGetCurrentWindow()       
            l_WNL = awvGetWaveNameList(w_current)
            l_wave = car(l_WNL)
            l_func = cadr(l_WNL)   
            x_index = -1;       
            l_wfm = foreach(mapcar t_wave l_wave
                x_index = x_index + 1
                o_ret = errset(evalstring(nth(x_index l_func)))
                if(o_ret then
                    car(o_ret)
                else
                    sprintf(t_expr "wave_%L()" t_wave)           
                    evalstring(t_expr)
                ); if          
            ); foreach
        );
    ); GrabWS()

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    I don't think so. I'm just boarding a plane, so I can't check, but awvGetWaveNameList() returns the indices and _names_ of the waveforms. There's no particular reason why the name of the variable should evaluate to the waveform object, which appears to be what you're doing.

    For example, if I plotted signals from the results browser, I just got the signal name. Same would happen with ADE outputs. Doing an evalstring on such a name would most likely lead to a syntax error return 'unbound (off the top of my head, without testing).

    So, nice try, but I still don't think it will work reliably - it may work in a few specific cases though, if you plotted the signals from the calculator, as this tends to give the expression as the name of the waveform.

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago
    Sorry - spotted a mistake in my append. - meant to say "There's no particular reason why the name of the WAVEFORM should evaluate to the waveform object" (ie I should have said "waveform", not "variable")

    Regards,

    Andrew
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • markbeck
    markbeck over 14 years ago

     I realize I'm resurrecting an old thread, but I haven't found a solution to this.

    I'm now on version 6.14, but the situation hasn't improved.  

    Basic problem is that I've got a waveform plotted in a waveform viewer (e.g. viva)  and I want access to it in the CIW.  It is possible to copy the waveform from viva to the calculator, so I know that the data exists somewhere. However, how can I reliably get at the data through skill calls?

    awvGetWaveNameList() returns: list of numbers for the curves and list of corresponding names.

    Unfortunately, I've found that the returned list of numbers doesn't correspond to anything that I can use to grab that waveform.

     Has anything changed with the newer versions of Cadence or is there any planned future expansion to allow access to the waveforms?

    Thanks,

    Mark

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    Hi Mark,

    I don't think anything has changed yet with respect to this. I'm hoping that we'll have an overhaul of the SKILL API for interaction with the graph sometime after IC615 (once the new graph in ViVA has bedded down) - and hopefully this is something we can add then (it will be simpler as in IC615 it's a single process, rather than split between the main Virtuoso and separate Java process).

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • ebecheto
    ebecheto over 14 years ago
    following lines shows how to externally plot the data ie. with gnuplot. Unfortunately, I was not able to differenciate from wavescan whether the data are Transient, AC, ... So you will only have data stored in the file if the curve is a transient curve. Hope it helps foreach(mapcar subWin awvGetSubwindowList(w_id) awvSetCurrentSubwindow( w_id subWin ) foreach( mapcar courbe cadr(awvGetWaveNameList( w_id)) rexCompile("/") file=sprintf(nil "./dat_%s" rexReplace(courbe "_" 1) ) rexCompile("(") file=sprintf(nil "%s" rexReplace(file "_" 1) ) rexCompile(")") file=sprintf(nil "%s" rexReplace(file "_" 1) ) awvPrintWaveform( ?output file VT(courbe) ?format "engineering") cmd=sprintf(nil "cat %s|sed \"s/time/\\#time/\" > %s.txt" file file) cmd=sprintf(nil "%s\n rm %s" cmd file) cmd=sprintf(nil "%s\n echo \"plot '%s.txt' \" > %s.gp" cmd file file) cmd=sprintf(nil "%s\n echo \"gnuplot %s.gp -persist\"" cmd file ) ;; cmd=sprintf(nil "%s\n wc -l %s.txt| 1 " cmd file) (system cmd) ))
    • 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