• 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. family waveform expressions

Stats

  • Locked Locked
  • Replies 3
  • Subscribers 143
  • Views 15556
  • 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

family waveform expressions

markbeck
markbeck over 13 years ago

Greetings all,

I'm running IC6.1.500.6

I'm running into the problem where if I create a family waveform using the standard family waveform functions (famCreateFamily, famAddValue), it is creating plots that are not differentiated between each other in viva.

e.g.

a = family waveform created with famCreateFamily
b = family waveform created with famCreateFamily
c = 2*a
d = 2*b
plot(c d)

If I look at the plot that shows up, it lumps c and d waveforms into the same plot labeled  "(2*nil)"

I found that if I have a family waveform created with a getData() statement assigned to a variable (e.g. 'o_fam') I can pull it apart by using the command:

o_vec = drGetWaveformYVec(o_fam).

If I then query the o_vec, I can get something like:

o_vec->??
(units "" expression
    getData("/Q1C" ?resultsDir "/sim/fefan/bicmos8hp/beck_ma/TB_npn_distortion/spectre/__mod_VCB_tran_" ?result "tran")
)

If I try to pull-appart the family waveforms created with the famCreateFamily functions, I only get 'nil' when I query the y vector.

My assumption is that viva is looking at the expression embedded in the y vector and is grouping and labeling the waveforms based upon this.  

My question:
Is there a way to set the expression of a family waveform y-axis vector?

  • fam_wfm_problems.JPG
  • View
  • Hide
  • Cancel
  • Andrew Beckett
    Andrew Beckett over 13 years ago
    Mark,

    This is essentially a manifestation of the same problem you had earlier.

    I'll aim to respond properly tomorrow (off the network right now so can't do any testing).

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

    It should just be a matter of setting the expression property on the y-vector of the family. I don't know why that's not working for you, because it does for me:

    load("abMakeWaveform.il")

    xvals='(1.0 2.0 3.0 4.0)
    yvals='(-1 -3.0 2.0 5.0)
    w1=abMakeWaveform(yvals xvals)
    w2=abMakeWaveform(mapcar('add1 yvals) xvals)
    w3=abMakeWaveform(reverse(yvals) xvals)
    w4=abMakeWaveform(mapcar('times yvals yvals) xvals)
    a=famCreateFamily('temp 'double)
    famAddValue(a 27 w1)
    famAddValue(a 50 w2)
    drGetWaveformYVec(a)->expression="famA"
    b=famCreateFamily('temp 'double)
    famAddValue(b 27 w3)
    famAddValue(b 50 w4)
    drGetWaveformYVec(b)->expression="famB"
    plot(a b)

    This is using this code:

    /* abMakeWaveform.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Jul 14, 1999 
    Modified   Dec 10, 2007 
    By         A.D.Beckett
    
    A simple function to throw together waveforms for
    test purposes. Usage:
    
    abMakeWaveform('cos linRg(1 100 1)) => o_waveObj
    
    Returns a waveform with x axis 1 to 100, in 1 steps, with y
    axis the value of the x.
    
    A more complex example:
    
    abMakeWaveform(lambda((x) x*sin(x)) linRg(-40 40 0.1))
    
    Can be plotted in OCEAN using plot(var).
    
    Also supports the first argument being a list of y values:
    
    abMakeWaveform('(5 6 7) '(1 2 3))
    
    Note the lists must be equal length.
    
    An optional third argument which is the data type may be supplied,
    e.g. 'double (default) 'single etc. Finally a fourth argument
    may be given if the x-axis wants to be a different type. For example
    for bar graphs:
    
    abMakeWaveform('(1 -2 4) '("NOM" "SLOW" "FAST") 'double 'string)
    
    ***************************************************
    
    SCCS Info: @(#) abMakeWaveform.il 12/10/07.13:48:06 1.4
    
    */
    
    /***************************************************************
    *                                                              *
    * The generic function takes a function object, or the name of *
    *      a function (a symbol) and calls that function for       *
    *   each of the x values. This would be nice if it could be    *
    *    done as a method, but the problem is that you can only    *
    *   have a method specialised on user defined functions, not   *
    *                      binary functions.                       *
    *                                                              *
    ***************************************************************/
    
    (defgeneric abMakeWaveform (func xvalues @optional (yDataType 'double) 
        xDataType)
      (let (xVec yVec wave)
           (setq wave (drCreateEmptyWaveform))
           (unless xDataType (setq xDataType yDataType))
           (setq xVec (drCreateVec xDataType xvalues))
           (setq yVec (drCreateVec yDataType (mapcar func xvalues)))
           (drPutWaveformXVec wave xVec)
           (drPutWaveformYVec wave yVec)
           wave
           ))
    
    /****************************************************************
    *                                                               *
    * A method is defined to allow the first argument to be a list, *
    *               and do something different there.               *
    *                                                               *
    ****************************************************************/
    
    (defmethod abMakeWaveform ((yvalues list) xvalues @optional 
        (yDataType 'double) xDataType)
      (let (xVec yVec wave)
           (when
            (and (listp xvalues) (equal (length xvalues) (length yvalues)))
            (setq wave (drCreateEmptyWaveform))
            (unless xDataType (setq xDataType yDataType))
            (setq xVec (drCreateVec xDataType xvalues))
            (setq yVec (drCreateVec yDataType yvalues))
            (drPutWaveformXVec wave xVec)
            (drPutWaveformYVec wave yVec)
            wave
            )
           ))

     

    Andrew

     

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

    Ah.... I see what I was misunderstanding.  I didn't realize that when you accessed the Y vector with the drGetWaveformYVec() command, you were directly modifying the original waveform vector.

    This is exactly what I was looking for.

    Thanks,
    Mark

    • 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