• 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. Mutation of function input parameter

Stats

  • Locked Locked
  • Replies 2
  • Subscribers 143
  • Views 8723
  • 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

Mutation of function input parameter

dragank
dragank over 3 years ago

Hi all.

I am not sure if the following is question for forum, but I have strange behavior of function's input parameter with name "which".

I am using Virtuoso IC6.1.8-64b.500.17

In the following function input parameter with name "which" is getting changed from time to time.

I caught mutation with printline-s which are here removed to make function shorter.

Code:

Function is always called with value "Vg" for input parameter "which", but after line

values0 = cadr(cj0)

from time to time it is getting altered.

Any help would be of great value.

Best regards,

Dragan

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

    Hi Dragan,

    There's not really enough to go on here. My first thought was that there's a built-in function called which but that shouldn't cause a problem here; in SKILL mode variables can match function names, and in SKILL++ using a variable called which would simply mask the function.

    Another possibility is that one of the functions you're calling - findCornersByValues or listsIntersection is setting a variable which internally without having declared it in a let. Because of dynamic scoping this can easily happen - for example if you do:

    defun(MyLowerFunction (a b)
      prod=a*b
      diff=a-b
      prod+diff
    )

    defun(MyUpperFunction (diff)
      let((prod result)
        prod=diff*diff
        printf("prod=%L diff=%L\n" prod diff)
        result=MyLowerFunction(diff 3)
        printf("prod=%L diff=%L result=%L\n" prod diff result)
      )

    )

    If you then call MyUpperFunction(4) it will output:

    prod=16 diff=4
    prod=12 diff=1 result=13

    The prod and diff assignments inside MyLowerFunction are altering the current dynamically scoped variables - essentially those local to MyUpperFunction (diff is local because its an argument, and prod is in the let). If MyLowerFunction had been called elsewhere, diff and prod may have ended up as global variables. Essentially with dynamic scoping each variable is like a stack - with the latest argument list or let putting a new placeholder for the value on a stack, and that is popped off when the scope ends.

    Of course, I'm completely guessing here because I can't see the entire code. However, given that your patchForLoadCornerNames function is failing to declare many local variables (cornerNames0, which0, values0, sameWhich, crnrNms, lI are all missing from the let), it's a distinct possibility that you're calling a downstream function that doesn't declare everything it should.

    Also, I'd say that it's bad practice to have your functions without prefixes - they could easily clash with those of another application which uses similar names. We suggest using an upper case prefix since Cadence doesn't use those. That's not going to be the problem here - I just thought I'd mention it.

    You might want to run your code through SKILL Lint in the SKILL Development Environment as it would catch these accidental global variables. Intentional global variables should also use a prefix - it will flag that though.

    However, as I said, all of this might be nothing to do with the problem; I don't know what the variable is changing from and to, and I don't have all the code. So you'd need to either provide the complete code and data to demonstrate the problem, or do that via customer support.

    Regards,

    Andrew

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

    Hi Dragan,

    There's not really enough to go on here. My first thought was that there's a built-in function called which but that shouldn't cause a problem here; in SKILL mode variables can match function names, and in SKILL++ using a variable called which would simply mask the function.

    Another possibility is that one of the functions you're calling - findCornersByValues or listsIntersection is setting a variable which internally without having declared it in a let. Because of dynamic scoping this can easily happen - for example if you do:

    defun(MyLowerFunction (a b)
      prod=a*b
      diff=a-b
      prod+diff
    )

    defun(MyUpperFunction (diff)
      let((prod result)
        prod=diff*diff
        printf("prod=%L diff=%L\n" prod diff)
        result=MyLowerFunction(diff 3)
        printf("prod=%L diff=%L result=%L\n" prod diff result)
      )

    )

    If you then call MyUpperFunction(4) it will output:

    prod=16 diff=4
    prod=12 diff=1 result=13

    The prod and diff assignments inside MyLowerFunction are altering the current dynamically scoped variables - essentially those local to MyUpperFunction (diff is local because its an argument, and prod is in the let). If MyLowerFunction had been called elsewhere, diff and prod may have ended up as global variables. Essentially with dynamic scoping each variable is like a stack - with the latest argument list or let putting a new placeholder for the value on a stack, and that is popped off when the scope ends.

    Of course, I'm completely guessing here because I can't see the entire code. However, given that your patchForLoadCornerNames function is failing to declare many local variables (cornerNames0, which0, values0, sameWhich, crnrNms, lI are all missing from the let), it's a distinct possibility that you're calling a downstream function that doesn't declare everything it should.

    Also, I'd say that it's bad practice to have your functions without prefixes - they could easily clash with those of another application which uses similar names. We suggest using an upper case prefix since Cadence doesn't use those. That's not going to be the problem here - I just thought I'd mention it.

    You might want to run your code through SKILL Lint in the SKILL Development Environment as it would catch these accidental global variables. Intentional global variables should also use a prefix - it will flag that though.

    However, as I said, all of this might be nothing to do with the problem; I don't know what the variable is changing from and to, and I don't have all the code. So you'd need to either provide the complete code and data to demonstrate the problem, or do that via customer support.

    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