• 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. Ocean/Calculator expressions and their units

Stats

  • Locked Locked
  • Replies 12
  • Subscribers 126
  • Views 11951
  • 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

Ocean/Calculator expressions and their units

MicheleA
MicheleA over 13 years ago

Hi all,

I know it's not advised to put more than one questions per post, however I hope I'll structure this such that there won't be no confusion.

Main Topic

I am defining some expressions I would like to assess in my designs. To this end, I use the calculator in conjunction with some "ocean" script...Actually I just write expressions and define variables on a plain text file, but the idea is to expand on that with plotting functions and maybe output to file.

So let's say I have an AC sim. I then define some curves as follows:

 

twoPi = 44.0/7.0

vtank = VF("/tank_pos")-VF("/tank_neg")

itank = IF("/Vgen/MINUS")

icap = IF("/Cprobe/PLUS")

icapfix = IF("/Cfprobe/PLUS")

iind = IF("/Lprobe/PLUS")

runfreq = xval(vtank)

Ytank = itank/vtank

Zcap = vtank/icap

Zcapfix = vtank/icapfix

Zind = vtank/iind

cap = 1/(-twoPi*runfreq*imag(Zcap))

 

Now, it all works good if I copy/paste these definitions in the CIW, then ask --> plot(cap)

The issue I have with this is that now the Y-axis shows "freq" units...

cap value in femtohertz?

I observed that runfreq, defined as xval, is still correct. But if I do 1/runfreq, what I get is something with units of 1/(1/Hz), instead of s.

So probably here's where it loses it. Anyways, I see two possibilities here:

 

  1. I am doing it wrong
  2. I am doing it right

 

If 1 holds, then what's the right approach for something like this?

If 2 holds, do I have a way of "forcing" units onto expressions?

--------------------------------------------------------------------------------------------- END ----------------------------------------------------------------------------------------- 

Side Topic

 I find it more comfortable to write my expressions in the text editor rather than inputting them in the output definition box of ADE or ADE-XL. Is there a way of having the environment read my definitions as a file, and then just output the final expressions? In the (simple) case at hand, I would have defined all expressions as above, and plot them either from the CIW or directly from the file...

 

Thanks for your help!!

 Michele

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 13 years ago

    Hi Michele,

    The units are maintained by each calculator expression working on a waveform - but it doesn't really do a reduction - it's not that smart.

    You can change the units using these functions:

    /* abSetUnits.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Oct 08, 2009 
    Modified   
    By         
    
    abSetUnits(waveform "s")
    
    sets the units on a waveform to be seconds.
    
    abRegSetUnitsSpecialFunction()
    
    registers a function in the calculator to alter the units on a 
    waveform.
    
    ***************************************************
    
    SCCS Info: @(#) abSetUnits.il 03/12/12.12:58:38 1.2
    
    */
    
    /****************************************************************
    *                                                               *
    *                    (abSetUnits wave units)                    *
    *                                                               *
    * Sets the units on a waveform, or all the members of a family. *
    * If it is just a value, pass straight through (can't set units *
    *                         on a number).                         *
    *                                                               *
    ****************************************************************/
    
    (defun abSetUnits (wave units)
      (cond 
        ((drIsWaveform wave)
         (putpropq (drGetWaveformYVec wave) units units)
         wave
         )
        ((famIsFamily wave)
         (famMap 'abSetUnits wave units)
         )
        )
      )
    
    /***************************************************************
    *                                                              *
    *                    (abCreateSetUnitsForm)                    *
    *                                                              *
    *  Set up a form for the special function on the calculator,   *
    *  which gives choices for the units. It needs to be cyclic,   *
    *   because if it's a type in field, quotes don't get added    *
    *                      around the units.                       *
    *                                                              *
    ***************************************************************/
    
    (defun abCreateSetUnitsForm ()
      (let (units)
        (setq units (ahiCreateCyclicField
                      ?name 'units
                      ?prompt "Units"
                      ?choices '("V" "A" "s" "W" "dB" "Wb" "C" "Hz")
                      ?value "V"
                      ))
        (calCreateSpecialFunctionsForm
          'abSetUnitsForm
          (list 
            (list units 0:0  180:20 140)
            )
          )
        ))
    
    /*****************************************************************
    *                                                                *
    *                 (abSetUnitsSpecialFunctionCB)                  *
    *                                                                *
    * Callback for the abSetUnits special function, which constructs *
    *           the buffer input from the form and stack.            *
    *                                                                *
    *****************************************************************/
    
    (defun abSetUnitsSpecialFunctionCB ()
      (calCreateSpecialFunction
       ?formSym 'abSetUnitsForm
       ?formInitProc 'abCreateSetUnitsForm
       ?formTitle "Set Units"
       ?formCallback 
       "(calSpecialFunctionInput 'abSetUnits '(units))"
       ))
    
    
    /***************************************************************
    *                                                              *
    *                (abRegSetUnitsSpecialFunction)                *
    *                                                              *
    *                Register the special function                 *
    *                                                              *
    ***************************************************************/
    
    (defun abRegSetUnitsSpecialFunction ()
      (calRegisterSpecialFunction
       (list "abSetUnits..." 'abSetUnitsSpecialFunctionCB))
      t
      )
     

     

    And for the x-axis:

    /* abSetXUnits.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Jul 13, 2012 
    Modified   
    By         
    
    abSetXUnits(waveform "s")
    
    sets the units on the X axis a waveform to be seconds.
    
    abRegSetXUnitsSpecialFunction()
    
    registers a function in the calculator to alter the units on a 
    waveform.
    
    This is based on abSetUnits, but does it for the X axis.
    
    ***************************************************
    
    SCCS Info: @(#) abSetXUnits.il 07/13/12.17:53:47 1.1
    
    */
    
    /****************************************************************
    *                                                               *
    *                   (abSetXUnits wave units)                    *
    *                                                               *
    * Sets the units on a waveform, or all the members of a family. *
    * If it is just a value, pass straight through (can't set units *
    *                         on a number).                         *
    *                                                               *
    ****************************************************************/
    
    (defun abSetXUnits (wave units)
      (cond 
        ((drIsWaveform wave)
         (putpropq (drGetWaveformXVec wave) units units)
         wave
         )
        ((famIsFamily wave)
         (famMap 'abSetXUnits wave units)
         )
        )
      )
    
    /***************************************************************
    *                                                              *
    *                   (abCreateSetXUnitsForm)                    *
    *                                                              *
    *  Set up a form for the special function on the calculator,   *
    *  which gives choices for the units. It needs to be cyclic,   *
    *   because if it's a type in field, quotes don't get added    *
    *                      around the units.                       *
    *                                                              *
    ***************************************************************/
    
    (defun abCreateSetXUnitsForm ()
      (let (units)
        (setq units (ahiCreateCyclicField
                      ?name 'units
                      ?prompt "Units"
                      ?choices '("V" "A" "s" "W" "dB" "Wb" "C" "Hz")
                      ?value "s"
                      ))
        (calCreateSpecialFunctionsForm
          'abSetXUnitsForm
          (list 
            (list units 0:0  180:20 140)
            )
          )
        ))
    
    /*****************************************************************
    *                                                                *
    *                (abSetXUnitsSpecialFunctionCB)                  *
    *                                                                *
    *       Callback for the abSetXUnits special function, which     *
    *       constructs the buffer input from the form and stack.     *
    *                                                                *
    *****************************************************************/
    
    (defun abSetXUnitsSpecialFunctionCB ()
      (calCreateSpecialFunction
       ?formSym 'abSetXUnitsForm
       ?formInitProc 'abCreateSetXUnitsForm
       ?formTitle "Set Units"
       ?formCallback 
       "(calSpecialFunctionInput 'abSetXUnits '(units))"
       ))
    
    
    /***************************************************************
    *                                                              *
    *               (abRegSetXUnitsSpecialFunction)                *
    *                                                              *
    *                Register the special function                 *
    *                                                              *
    ***************************************************************/
    
    (defun abRegSetXUnitsSpecialFunction ()
      (calRegisterSpecialFunction
       (list "abSetXUnits..." 'abSetXUnitsSpecialFunctionCB))
      t
      )

     

    And for your side topic - you can do this using an OCEAN script measurement in ADE XL. If instead of adding an expression to the output pane, you can add an OCEAN script. In this ocean script you can call the function  axlAddOutputs() at the top to define which outputs your script will output (it can output several), and call axlOutputResult() to output a specific result - you can call this through your script - so you can write a long script and just periodically output the things you want.

    Regards,

    Andrew.

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

    Hi Michele,

    The units are maintained by each calculator expression working on a waveform - but it doesn't really do a reduction - it's not that smart.

    You can change the units using these functions:

    /* abSetUnits.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Oct 08, 2009 
    Modified   
    By         
    
    abSetUnits(waveform "s")
    
    sets the units on a waveform to be seconds.
    
    abRegSetUnitsSpecialFunction()
    
    registers a function in the calculator to alter the units on a 
    waveform.
    
    ***************************************************
    
    SCCS Info: @(#) abSetUnits.il 03/12/12.12:58:38 1.2
    
    */
    
    /****************************************************************
    *                                                               *
    *                    (abSetUnits wave units)                    *
    *                                                               *
    * Sets the units on a waveform, or all the members of a family. *
    * If it is just a value, pass straight through (can't set units *
    *                         on a number).                         *
    *                                                               *
    ****************************************************************/
    
    (defun abSetUnits (wave units)
      (cond 
        ((drIsWaveform wave)
         (putpropq (drGetWaveformYVec wave) units units)
         wave
         )
        ((famIsFamily wave)
         (famMap 'abSetUnits wave units)
         )
        )
      )
    
    /***************************************************************
    *                                                              *
    *                    (abCreateSetUnitsForm)                    *
    *                                                              *
    *  Set up a form for the special function on the calculator,   *
    *  which gives choices for the units. It needs to be cyclic,   *
    *   because if it's a type in field, quotes don't get added    *
    *                      around the units.                       *
    *                                                              *
    ***************************************************************/
    
    (defun abCreateSetUnitsForm ()
      (let (units)
        (setq units (ahiCreateCyclicField
                      ?name 'units
                      ?prompt "Units"
                      ?choices '("V" "A" "s" "W" "dB" "Wb" "C" "Hz")
                      ?value "V"
                      ))
        (calCreateSpecialFunctionsForm
          'abSetUnitsForm
          (list 
            (list units 0:0  180:20 140)
            )
          )
        ))
    
    /*****************************************************************
    *                                                                *
    *                 (abSetUnitsSpecialFunctionCB)                  *
    *                                                                *
    * Callback for the abSetUnits special function, which constructs *
    *           the buffer input from the form and stack.            *
    *                                                                *
    *****************************************************************/
    
    (defun abSetUnitsSpecialFunctionCB ()
      (calCreateSpecialFunction
       ?formSym 'abSetUnitsForm
       ?formInitProc 'abCreateSetUnitsForm
       ?formTitle "Set Units"
       ?formCallback 
       "(calSpecialFunctionInput 'abSetUnits '(units))"
       ))
    
    
    /***************************************************************
    *                                                              *
    *                (abRegSetUnitsSpecialFunction)                *
    *                                                              *
    *                Register the special function                 *
    *                                                              *
    ***************************************************************/
    
    (defun abRegSetUnitsSpecialFunction ()
      (calRegisterSpecialFunction
       (list "abSetUnits..." 'abSetUnitsSpecialFunctionCB))
      t
      )
     

     

    And for the x-axis:

    /* abSetXUnits.il
    
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Jul 13, 2012 
    Modified   
    By         
    
    abSetXUnits(waveform "s")
    
    sets the units on the X axis a waveform to be seconds.
    
    abRegSetXUnitsSpecialFunction()
    
    registers a function in the calculator to alter the units on a 
    waveform.
    
    This is based on abSetUnits, but does it for the X axis.
    
    ***************************************************
    
    SCCS Info: @(#) abSetXUnits.il 07/13/12.17:53:47 1.1
    
    */
    
    /****************************************************************
    *                                                               *
    *                   (abSetXUnits wave units)                    *
    *                                                               *
    * Sets the units on a waveform, or all the members of a family. *
    * If it is just a value, pass straight through (can't set units *
    *                         on a number).                         *
    *                                                               *
    ****************************************************************/
    
    (defun abSetXUnits (wave units)
      (cond 
        ((drIsWaveform wave)
         (putpropq (drGetWaveformXVec wave) units units)
         wave
         )
        ((famIsFamily wave)
         (famMap 'abSetXUnits wave units)
         )
        )
      )
    
    /***************************************************************
    *                                                              *
    *                   (abCreateSetXUnitsForm)                    *
    *                                                              *
    *  Set up a form for the special function on the calculator,   *
    *  which gives choices for the units. It needs to be cyclic,   *
    *   because if it's a type in field, quotes don't get added    *
    *                      around the units.                       *
    *                                                              *
    ***************************************************************/
    
    (defun abCreateSetXUnitsForm ()
      (let (units)
        (setq units (ahiCreateCyclicField
                      ?name 'units
                      ?prompt "Units"
                      ?choices '("V" "A" "s" "W" "dB" "Wb" "C" "Hz")
                      ?value "s"
                      ))
        (calCreateSpecialFunctionsForm
          'abSetXUnitsForm
          (list 
            (list units 0:0  180:20 140)
            )
          )
        ))
    
    /*****************************************************************
    *                                                                *
    *                (abSetXUnitsSpecialFunctionCB)                  *
    *                                                                *
    *       Callback for the abSetXUnits special function, which     *
    *       constructs the buffer input from the form and stack.     *
    *                                                                *
    *****************************************************************/
    
    (defun abSetXUnitsSpecialFunctionCB ()
      (calCreateSpecialFunction
       ?formSym 'abSetXUnitsForm
       ?formInitProc 'abCreateSetXUnitsForm
       ?formTitle "Set Units"
       ?formCallback 
       "(calSpecialFunctionInput 'abSetXUnits '(units))"
       ))
    
    
    /***************************************************************
    *                                                              *
    *               (abRegSetXUnitsSpecialFunction)                *
    *                                                              *
    *                Register the special function                 *
    *                                                              *
    ***************************************************************/
    
    (defun abRegSetXUnitsSpecialFunction ()
      (calRegisterSpecialFunction
       (list "abSetXUnits..." 'abSetXUnitsSpecialFunctionCB))
      t
      )

     

    And for your side topic - you can do this using an OCEAN script measurement in ADE XL. If instead of adding an expression to the output pane, you can add an OCEAN script. In this ocean script you can call the function  axlAddOutputs() at the top to define which outputs your script will output (it can output several), and call axlOutputResult() to output a specific result - you can call this through your script - so you can write a long script and just periodically output the things you want.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

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